diff --git a/pr-preview/pr-273/.buildinfo b/pr-preview/pr-273/.buildinfo deleted file mode 100644 index 62e25f8bf..000000000 --- a/pr-preview/pr-273/.buildinfo +++ /dev/null @@ -1,4 +0,0 @@ -# Sphinx build info version 1 -# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 4f582035e47e08d9f60659599fd5ed68 -tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/pr-preview/pr-273/.doctrees/api/api.doctree b/pr-preview/pr-273/.doctrees/api/api.doctree deleted file mode 100644 index fd52acfe1..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/api.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/configs.doctree b/pr-preview/pr-273/.doctrees/api/configs.doctree deleted file mode 100644 index 8d9639c05..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/configs.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/data.doctree b/pr-preview/pr-273/.doctrees/api/data.doctree deleted file mode 100644 index c0dc62dba..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/data.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/datagrabbers.doctree b/pr-preview/pr-273/.doctrees/api/datagrabbers.doctree deleted file mode 100644 index d360f0ec7..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/datagrabbers.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/datareaders.doctree b/pr-preview/pr-273/.doctrees/api/datareaders.doctree deleted file mode 100644 index 0084ae30b..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/datareaders.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/index.doctree b/pr-preview/pr-273/.doctrees/api/index.doctree deleted file mode 100644 index 4b6bb7ab5..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/index.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/markers.doctree b/pr-preview/pr-273/.doctrees/api/markers.doctree deleted file mode 100644 index fffc03ddb..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/markers.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/nilearn.doctree b/pr-preview/pr-273/.doctrees/api/nilearn.doctree deleted file mode 100644 index 198511e4e..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/nilearn.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/onthefly.doctree b/pr-preview/pr-273/.doctrees/api/onthefly.doctree deleted file mode 100644 index 6bfa3f235..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/onthefly.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/pipeline.doctree b/pr-preview/pr-273/.doctrees/api/pipeline.doctree deleted file mode 100644 index 353404434..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/pipeline.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/preprocessing.doctree b/pr-preview/pr-273/.doctrees/api/preprocessing.doctree deleted file mode 100644 index 9a8706741..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/preprocessing.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/stats.doctree b/pr-preview/pr-273/.doctrees/api/stats.doctree deleted file mode 100644 index 7bb92a596..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/stats.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/storage.doctree b/pr-preview/pr-273/.doctrees/api/storage.doctree deleted file mode 100644 index b45b63eef..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/storage.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/testing.doctree b/pr-preview/pr-273/.doctrees/api/testing.doctree deleted file mode 100644 index 5d794e91b..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/testing.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/api/utils.doctree b/pr-preview/pr-273/.doctrees/api/utils.doctree deleted file mode 100644 index b7b6d3213..000000000 Binary files a/pr-preview/pr-273/.doctrees/api/utils.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/index.doctree b/pr-preview/pr-273/.doctrees/auto_examples/index.doctree deleted file mode 100644 index 8b4282f04..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/index.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/norun_hcpfc_pearson.doctree b/pr-preview/pr-273/.doctrees/auto_examples/norun_hcpfc_pearson.doctree deleted file mode 100644 index 2c56410c0..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/norun_hcpfc_pearson.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/norun_ukbvm_gmd.doctree b/pr-preview/pr-273/.doctrees/auto_examples/norun_ukbvm_gmd.doctree deleted file mode 100644 index c6456776f..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/norun_ukbvm_gmd.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/run_compute_parcel_mean.doctree b/pr-preview/pr-273/.doctrees/auto_examples/run_compute_parcel_mean.doctree deleted file mode 100644 index 929e8cf9c..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/run_compute_parcel_mean.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/run_datagrabber_bids_datalad.doctree b/pr-preview/pr-273/.doctrees/auto_examples/run_datagrabber_bids_datalad.doctree deleted file mode 100644 index 9adb2910b..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/run_datagrabber_bids_datalad.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/run_ets_rss_marker.doctree b/pr-preview/pr-273/.doctrees/auto_examples/run_ets_rss_marker.doctree deleted file mode 100644 index d0b6298db..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/run_ets_rss_marker.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/run_junifer_julearn.doctree b/pr-preview/pr-273/.doctrees/auto_examples/run_junifer_julearn.doctree deleted file mode 100644 index 7b9a9c464..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/run_junifer_julearn.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/run_run_gmd_mean.doctree b/pr-preview/pr-273/.doctrees/auto_examples/run_run_gmd_mean.doctree deleted file mode 100644 index fc690969b..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/run_run_gmd_mean.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/auto_examples/sg_execution_times.doctree b/pr-preview/pr-273/.doctrees/auto_examples/sg_execution_times.doctree deleted file mode 100644 index f56b7740c..000000000 Binary files a/pr-preview/pr-273/.doctrees/auto_examples/sg_execution_times.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/builtin.doctree b/pr-preview/pr-273/.doctrees/builtin.doctree deleted file mode 100644 index dea713650..000000000 Binary files a/pr-preview/pr-273/.doctrees/builtin.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/contribution.doctree b/pr-preview/pr-273/.doctrees/contribution.doctree deleted file mode 100644 index 0aed5e72c..000000000 Binary files a/pr-preview/pr-273/.doctrees/contribution.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/environment.pickle b/pr-preview/pr-273/.doctrees/environment.pickle deleted file mode 100644 index df570ea3b..000000000 Binary files a/pr-preview/pr-273/.doctrees/environment.pickle and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/coordinates.doctree b/pr-preview/pr-273/.doctrees/extending/coordinates.doctree deleted file mode 100644 index 8a2f8ff5f..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/coordinates.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/datagrabber.doctree b/pr-preview/pr-273/.doctrees/extending/datagrabber.doctree deleted file mode 100644 index eecc273fb..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/datagrabber.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/dependencies.doctree b/pr-preview/pr-273/.doctrees/extending/dependencies.doctree deleted file mode 100644 index 84ff68007..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/dependencies.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/extension.doctree b/pr-preview/pr-273/.doctrees/extending/extension.doctree deleted file mode 100644 index 9cb9f82f6..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/extension.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/index.doctree b/pr-preview/pr-273/.doctrees/extending/index.doctree deleted file mode 100644 index 6876c34ab..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/index.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/marker.doctree b/pr-preview/pr-273/.doctrees/extending/marker.doctree deleted file mode 100644 index 5b7576ffc..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/marker.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/masks.doctree b/pr-preview/pr-273/.doctrees/extending/masks.doctree deleted file mode 100644 index 46ef1aeb7..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/masks.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/parcellations.doctree b/pr-preview/pr-273/.doctrees/extending/parcellations.doctree deleted file mode 100644 index 669907491..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/parcellations.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/extending/preprocessor.doctree b/pr-preview/pr-273/.doctrees/extending/preprocessor.doctree deleted file mode 100644 index abe3db4e5..000000000 Binary files a/pr-preview/pr-273/.doctrees/extending/preprocessor.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/faq.doctree b/pr-preview/pr-273/.doctrees/faq.doctree deleted file mode 100644 index 524f83a7b..000000000 Binary files a/pr-preview/pr-273/.doctrees/faq.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/help.doctree b/pr-preview/pr-273/.doctrees/help.doctree deleted file mode 100644 index 137fa19bb..000000000 Binary files a/pr-preview/pr-273/.doctrees/help.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/index.doctree b/pr-preview/pr-273/.doctrees/index.doctree deleted file mode 100644 index 82cb4be0c..000000000 Binary files a/pr-preview/pr-273/.doctrees/index.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/installation.doctree b/pr-preview/pr-273/.doctrees/installation.doctree deleted file mode 100644 index 44a181bea..000000000 Binary files a/pr-preview/pr-273/.doctrees/installation.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/maintaining.doctree b/pr-preview/pr-273/.doctrees/maintaining.doctree deleted file mode 100644 index 260498a6f..000000000 Binary files a/pr-preview/pr-273/.doctrees/maintaining.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/starting.doctree b/pr-preview/pr-273/.doctrees/starting.doctree deleted file mode 100644 index 5fbed4587..000000000 Binary files a/pr-preview/pr-273/.doctrees/starting.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/data.doctree b/pr-preview/pr-273/.doctrees/understanding/data.doctree deleted file mode 100644 index 941d8b702..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/data.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/datagrabber.doctree b/pr-preview/pr-273/.doctrees/understanding/datagrabber.doctree deleted file mode 100644 index 9d9c26eb2..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/datagrabber.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/datareader.doctree b/pr-preview/pr-273/.doctrees/understanding/datareader.doctree deleted file mode 100644 index 6f3f7adce..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/datareader.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/index.doctree b/pr-preview/pr-273/.doctrees/understanding/index.doctree deleted file mode 100644 index 24ea9ab05..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/index.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/marker.doctree b/pr-preview/pr-273/.doctrees/understanding/marker.doctree deleted file mode 100644 index 4312f7f54..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/marker.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/pipeline.doctree b/pr-preview/pr-273/.doctrees/understanding/pipeline.doctree deleted file mode 100644 index cb1adc8e8..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/pipeline.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/preprocess.doctree b/pr-preview/pr-273/.doctrees/understanding/preprocess.doctree deleted file mode 100644 index e307c75f7..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/preprocess.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/understanding/storage.doctree b/pr-preview/pr-273/.doctrees/understanding/storage.doctree deleted file mode 100644 index 233db86bd..000000000 Binary files a/pr-preview/pr-273/.doctrees/understanding/storage.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/using/codeless.doctree b/pr-preview/pr-273/.doctrees/using/codeless.doctree deleted file mode 100644 index 6387b392a..000000000 Binary files a/pr-preview/pr-273/.doctrees/using/codeless.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/using/index.doctree b/pr-preview/pr-273/.doctrees/using/index.doctree deleted file mode 100644 index e1f129336..000000000 Binary files a/pr-preview/pr-273/.doctrees/using/index.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/using/masks.doctree b/pr-preview/pr-273/.doctrees/using/masks.doctree deleted file mode 100644 index d896bb5fc..000000000 Binary files a/pr-preview/pr-273/.doctrees/using/masks.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/using/queueing.doctree b/pr-preview/pr-273/.doctrees/using/queueing.doctree deleted file mode 100644 index 5e541ca60..000000000 Binary files a/pr-preview/pr-273/.doctrees/using/queueing.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/using/running.doctree b/pr-preview/pr-273/.doctrees/using/running.doctree deleted file mode 100644 index 44d6959bd..000000000 Binary files a/pr-preview/pr-273/.doctrees/using/running.doctree and /dev/null differ diff --git a/pr-preview/pr-273/.doctrees/whats_new.doctree b/pr-preview/pr-273/.doctrees/whats_new.doctree deleted file mode 100644 index 7741dda3a..000000000 Binary files a/pr-preview/pr-273/.doctrees/whats_new.doctree and /dev/null differ diff --git a/pr-preview/pr-273/_downloads/0129f8507efff39850cf153c51edb3ab/run_ets_rss_marker.py b/pr-preview/pr-273/_downloads/0129f8507efff39850cf153c51edb3ab/run_ets_rss_marker.py deleted file mode 100644 index 7cf155102..000000000 --- a/pr-preview/pr-273/_downloads/0129f8507efff39850cf153c51edb3ab/run_ets_rss_marker.py +++ /dev/null @@ -1,77 +0,0 @@ -""" - -Extracting root sum of squares from edge-wise timeseries. -========================================================= -This example uses a ``RSSETSMarker`` to compute root sum of squares -of the edge-wise timeseries using the Schaefer parcellation -(100 rois and 200 rois, 17 Yeo networks) for a 4D nifti BOLD file. - -Authors: Leonard Sasse, Sami Hamdan, Nicolas Nieto, Synchon Mandal - -License: BSD 3 clause - -""" - -import tempfile - -import junifer.testing.registry # noqa: F401 -from junifer.api import collect, run -from junifer.storage import SQLiteFeatureStorage -from junifer.utils import configure_logging - - -############################################################################### -# Set the logging level to info to see extra information: -configure_logging(level="INFO") - -############################################################################## -# Define the DataGrabber interface -datagrabber = { - "kind": "SPMAuditoryTestingDataGrabber", -} - -############################################################################### -# Define the markers interface -markers = [ - { - "name": "Schaefer100x17_RSSETS", - "kind": "RSSETSMarker", - "parcellation": "Schaefer100x17", - }, - { - "name": "Schaefer200x17_RSSETS", - "kind": "RSSETSMarker", - "parcellation": "Schaefer200x17", - }, -] - -############################################################################### -# Create a temporary directory for junifer feature extraction: -# At the end you can read the extracted data into a ``pandas.DataFrame``. -with tempfile.TemporaryDirectory() as tmpdir: - # Define the storage interface - storage = { - "kind": "SQLiteFeatureStorage", - "uri": f"{tmpdir}/test.sqlite", - } - # Run the defined junifer feature extraction pipeline - run( - workdir=tmpdir, - datagrabber=datagrabber, - markers=markers, - storage=storage, - elements=["sub001"], # we calculate for one subject only - ) - # Collect extracted features data - collect(storage=storage) - # Create storage object to read in extracted features - db = SQLiteFeatureStorage(uri=storage["uri"]) - - # List all the features - print(db.list_features()) - # Read extracted features - df_vbm = db.read_df(feature_name="BOLD_Schaefer100x17_RSSETS") - -############################################################################### -# Now we take a look at the dataframe -df_vbm.head() diff --git a/pr-preview/pr-273/_downloads/042dd4fe6bffbb0ea320b529af464ace/run_run_gmd_mean.py b/pr-preview/pr-273/_downloads/042dd4fe6bffbb0ea320b529af464ace/run_run_gmd_mean.py deleted file mode 100644 index 277ba8f42..000000000 --- a/pr-preview/pr-273/_downloads/042dd4fe6bffbb0ea320b529af464ace/run_run_gmd_mean.py +++ /dev/null @@ -1,53 +0,0 @@ -""" -UKB VBM GMD Extraction -====================== - -Authors: Federico Raimondo - -License: BSD 3 clause -""" -import tempfile - -import junifer.testing.registry # noqa: F401 -from junifer.api import run - - -datagrabber = { - "kind": "OasisVBMTestingDataGrabber", -} - -markers = [ - { - "name": "Schaefer1000x7_TrimMean80", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "trim_mean", - "method_params": {"proportiontocut": 0.2}, - }, - { - "name": "Schaefer1000x7_Mean", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "mean", - }, - { - "name": "Schaefer1000x7_Std", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "std", - }, -] - -storage = { - "kind": "SQLiteFeatureStorage", -} - -with tempfile.TemporaryDirectory() as tmpdir: - uri = f"{tmpdir}/test.sqlite" - storage["uri"] = uri - run( - workdir="/tmp", - datagrabber=datagrabber, - markers=markers, - storage=storage, - ) diff --git a/pr-preview/pr-273/_downloads/04a7e637e66cd7d7b36569a7cb7e70b5/norun_ukbvm_gmd.py b/pr-preview/pr-273/_downloads/04a7e637e66cd7d7b36569a7cb7e70b5/norun_ukbvm_gmd.py deleted file mode 100644 index 31ae34e27..000000000 --- a/pr-preview/pr-273/_downloads/04a7e637e66cd7d7b36569a7cb7e70b5/norun_ukbvm_gmd.py +++ /dev/null @@ -1,43 +0,0 @@ -""" -UKB VBM GMD Extraction -====================== - -Authors: Federico Raimondo - -License: BSD 3 clause -""" - - -from junifer.api import run - - -markers = [ - { - "name": "Schaefer1000x7_TrimMean80", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "trim_mean", - "method_params": {"proportiontocut": 0.2}, - }, - { - "name": "Schaefer1000x7_Mean", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "mean", - }, - { - "name": "Schaefer1000x7_Std", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "std", - }, -] - -run( - workdir="/tmp", - datagrabber="JuselessUKBVBM", - elements=("sub-1627474", "ses-2"), - markers=markers, - storage="SQLDataFrameStorage", - storage_params={"outpath": "/data/project/juniferexample"}, -) diff --git a/pr-preview/pr-273/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/pr-preview/pr-273/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip deleted file mode 100644 index 16d3119e2..000000000 Binary files a/pr-preview/pr-273/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip and /dev/null differ diff --git a/pr-preview/pr-273/_downloads/35c7ed013e0aac743386dbe5f567501f/run_junifer_julearn.ipynb b/pr-preview/pr-273/_downloads/35c7ed013e0aac743386dbe5f567501f/run_junifer_julearn.ipynb deleted file mode 100644 index b12609753..000000000 --- a/pr-preview/pr-273/_downloads/35c7ed013e0aac743386dbe5f567501f/run_junifer_julearn.ipynb +++ /dev/null @@ -1,158 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Run junifer and julearn.\n\nThis example uses a ParcelAggregation marker to compute the mean of each parcel\nusing the Schaefer parcellation (100 rois, 7 Yeo networks) for a 3D nifti to\nextract some features for machine learning using julearn to predict some other\ndata.\n\nAuthors: Leonard Sasse, Sami Hamdan, Nicolas Nieto, Synchon Mandal\n\nLicense: BSD 3 clause\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import tempfile\n\nimport nilearn\nimport pandas as pd\nfrom julearn import run_cross_validation, PipelineCreator\n\nimport junifer.testing.registry # noqa: F401\nfrom junifer.api import collect, run\nfrom junifer.storage.sqlite import SQLiteFeatureStorage\nfrom junifer.utils import configure_logging" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Set the logging level to info to see extra information:\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "configure_logging(level=\"INFO\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define the markers you want:\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "marker_dicts = [\n {\n \"name\": \"Schaefer100x17_TrimMean80\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer100x17\",\n \"method\": \"trim_mean\",\n \"method_params\": {\"proportiontocut\": 0.2},\n },\n {\n \"name\": \"Schaefer200x17_Mean\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer200x17\",\n \"method\": \"mean\",\n },\n]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define target and confounds for julearn machine learning:\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "y = \"age\"\nconfound = \"sex\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Load the VBM phenotype data for machine learning data:\n- Fetch the Oasis dataset\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "oasis_dataset = nilearn.datasets.fetch_oasis_vbm()\nage = oasis_dataset.ext_vars[y][:10]\nsex = (\n pd.Series(oasis_dataset.ext_vars[\"mf\"][:10])\n .map(lambda x: 1 if x == \"F\" else 0)\n .values\n)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a temporary directory for junifer feature extraction:\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "with tempfile.TemporaryDirectory() as tmpdir:\n storage = {\"kind\": \"SQLiteFeatureStorage\", \"uri\": f\"{tmpdir}/test.sqlite\"}\n # run the defined junifer feature extraction pipeline\n run(\n workdir=\"/tmp\",\n datagrabber={\"kind\": \"OasisVBMTestingDataGrabber\"},\n markers=marker_dicts,\n storage=storage,\n )\n\n # read in extracted features and add confounds and targets\n # for julearn run cross validation\n collect(storage)\n db = SQLiteFeatureStorage(uri=storage[\"uri\"])\n\n df_vbm = db.read_df(feature_name=\"VBM_GM_Schaefer200x17_Mean\")\n oasis_subjects = [x[0] for x in df_vbm.index]\n df_vbm.index = oasis_subjects" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Using julearn for machine learning:\nWe predict the age given our vbm features and sex as a confound.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "X = list(df_vbm.columns)\ndf_vbm[y] = age\ndf_vbm[confound] = sex\n\nX_types = {\n \"features\": X,\n \"confound\": confound,\n}\n\ncreator = PipelineCreator(problem_type=\"regression\", apply_to=\"features\")\ncreator.add(\"zscore\", apply_to=[\"features\", \"confound\"])\ncreator.add(\"confound_removal\", apply_to=\"features\", confounds=\"confound\")\ncreator.add(\"ridge\")\n\nscores = run_cross_validation(\n X=X + [confound],\n y=y,\n X_types=X_types,\n data=df_vbm,\n model=creator,\n cv=3,\n)\nprint(scores)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Interpretation of results:\nDoing machine learning with only 10 datapoints is not meaningful.\nThis explains the big variation in scores\nfor different cross-validation folds.\n\n" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/pr-preview/pr-273/_downloads/38a3ca477b4260f36bb72dbc46764f45/run_ets_rss_marker.ipynb b/pr-preview/pr-273/_downloads/38a3ca477b4260f36bb72dbc46764f45/run_ets_rss_marker.ipynb deleted file mode 100644 index 54f4722eb..000000000 --- a/pr-preview/pr-273/_downloads/38a3ca477b4260f36bb72dbc46764f45/run_ets_rss_marker.ipynb +++ /dev/null @@ -1,133 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Extracting root sum of squares from edge-wise timeseries.\nThis example uses a ``RSSETSMarker`` to compute root sum of squares\nof the edge-wise timeseries using the Schaefer parcellation\n(100 rois and 200 rois, 17 Yeo networks) for a 4D nifti BOLD file.\n\nAuthors: Leonard Sasse, Sami Hamdan, Nicolas Nieto, Synchon Mandal\n\nLicense: BSD 3 clause\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import tempfile\n\nimport junifer.testing.registry # noqa: F401\nfrom junifer.api import collect, run\nfrom junifer.storage import SQLiteFeatureStorage\nfrom junifer.utils import configure_logging" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Set the logging level to info to see extra information:\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "configure_logging(level=\"INFO\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define the DataGrabber interface\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "datagrabber = {\n \"kind\": \"SPMAuditoryTestingDataGrabber\",\n}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Define the markers interface\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "markers = [\n {\n \"name\": \"Schaefer100x17_RSSETS\",\n \"kind\": \"RSSETSMarker\",\n \"parcellation\": \"Schaefer100x17\",\n },\n {\n \"name\": \"Schaefer200x17_RSSETS\",\n \"kind\": \"RSSETSMarker\",\n \"parcellation\": \"Schaefer200x17\",\n },\n]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Create a temporary directory for junifer feature extraction:\nAt the end you can read the extracted data into a ``pandas.DataFrame``.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "with tempfile.TemporaryDirectory() as tmpdir:\n # Define the storage interface\n storage = {\n \"kind\": \"SQLiteFeatureStorage\",\n \"uri\": f\"{tmpdir}/test.sqlite\",\n }\n # Run the defined junifer feature extraction pipeline\n run(\n workdir=tmpdir,\n datagrabber=datagrabber,\n markers=markers,\n storage=storage,\n elements=[\"sub001\"], # we calculate for one subject only\n )\n # Collect extracted features data\n collect(storage=storage)\n # Create storage object to read in extracted features\n db = SQLiteFeatureStorage(uri=storage[\"uri\"])\n\n # List all the features\n print(db.list_features())\n # Read extracted features\n df_vbm = db.read_df(feature_name=\"BOLD_Schaefer100x17_RSSETS\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we take a look at the dataframe\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "df_vbm.head()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/pr-preview/pr-273/_downloads/674f52258bfb2a74cae86006ef74ffc6/norun_ukbvm_gmd.ipynb b/pr-preview/pr-273/_downloads/674f52258bfb2a74cae86006ef74ffc6/norun_ukbvm_gmd.ipynb deleted file mode 100644 index 63f211af9..000000000 --- a/pr-preview/pr-273/_downloads/674f52258bfb2a74cae86006ef74ffc6/norun_ukbvm_gmd.ipynb +++ /dev/null @@ -1,43 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# UKB VBM GMD Extraction\n\nAuthors: Federico Raimondo\n\nLicense: BSD 3 clause\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from junifer.api import run\n\n\nmarkers = [\n {\n \"name\": \"Schaefer1000x7_TrimMean80\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer1000x7\",\n \"method\": \"trim_mean\",\n \"method_params\": {\"proportiontocut\": 0.2},\n },\n {\n \"name\": \"Schaefer1000x7_Mean\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer1000x7\",\n \"method\": \"mean\",\n },\n {\n \"name\": \"Schaefer1000x7_Std\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer1000x7\",\n \"method\": \"std\",\n },\n]\n\nrun(\n workdir=\"/tmp\",\n datagrabber=\"JuselessUKBVBM\",\n elements=(\"sub-1627474\", \"ses-2\"),\n markers=markers,\n storage=\"SQLDataFrameStorage\",\n storage_params={\"outpath\": \"/data/project/juniferexample\"},\n)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/pr-preview/pr-273/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/pr-preview/pr-273/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip deleted file mode 100644 index 30f7f4df3..000000000 Binary files a/pr-preview/pr-273/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip and /dev/null differ diff --git a/pr-preview/pr-273/_downloads/7bdf714a1446ae07ef3fa9d23e9b27c3/run_datagrabber_bids_datalad.py b/pr-preview/pr-273/_downloads/7bdf714a1446ae07ef3fa9d23e9b27c3/run_datagrabber_bids_datalad.py deleted file mode 100644 index ce1488636..000000000 --- a/pr-preview/pr-273/_downloads/7bdf714a1446ae07ef3fa9d23e9b27c3/run_datagrabber_bids_datalad.py +++ /dev/null @@ -1,70 +0,0 @@ -""" -Generic BIDS DataGrabber for datalad. -===================================== - -This example uses a generic BIDS DataGraber to get the data from a BIDS dataset -store in a datalad remote sibling. - -Authors: Federico Raimondo - -License: BSD 3 clause -""" - -from junifer.datagrabber import PatternDataladDataGrabber -from junifer.utils import configure_logging - - -############################################################################### -# Set the logging level to info to see extra information -configure_logging(level="INFO") - - -############################################################################### -# The BIDS DataGrabber requires three parameters: the types of data we want, -# the specific pattern that matches each type, and the variables that will be -# replaced in the patterns. -types = ["T1w", "BOLD"] -patterns = { - "T1w": { - "pattern": "{subject}/anat/{subject}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "pattern": "{subject}/func/{subject}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, -} -replacements = ["subject"] -############################################################################### -# Additionally, a datalad-based DataGrabber requires the URI of the remote -# sibling and the location of the dataset within the remote sibling. -repo_uri = "https://gin.g-node.org/juaml/datalad-example-bids" -rootdir = "example_bids" - -############################################################################### -# Now we can use the DataGrabber within a `with` context. -# One thing we can do with any DataGrabber is iterate over the elements. -# In this case, each element of the DataGrabber is one session. -with PatternDataladDataGrabber( - rootdir=rootdir, - types=types, - patterns=patterns, - uri=repo_uri, - replacements=replacements, -) as dg: - for elem in dg: - print(elem) - -############################################################################### -# Another feature of the DataGrabber is the ability to get a specific -# element by its name. In this case, we index `sub-01` and we get the file -# paths for the two types of data we want (T1w and BOLD). -with PatternDataladDataGrabber( - rootdir=rootdir, - types=types, - patterns=patterns, - uri=repo_uri, - replacements=replacements, -) as dg: - sub01 = dg["sub-01"] - print(sub01) diff --git a/pr-preview/pr-273/_downloads/8a40bf470242f11236aa845a28ca568a/run_run_gmd_mean.ipynb b/pr-preview/pr-273/_downloads/8a40bf470242f11236aa845a28ca568a/run_run_gmd_mean.ipynb deleted file mode 100644 index c21229aba..000000000 --- a/pr-preview/pr-273/_downloads/8a40bf470242f11236aa845a28ca568a/run_run_gmd_mean.ipynb +++ /dev/null @@ -1,43 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# UKB VBM GMD Extraction\n\nAuthors: Federico Raimondo\n\nLicense: BSD 3 clause\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "import tempfile\n\nimport junifer.testing.registry # noqa: F401\nfrom junifer.api import run\n\n\ndatagrabber = {\n \"kind\": \"OasisVBMTestingDataGrabber\",\n}\n\nmarkers = [\n {\n \"name\": \"Schaefer1000x7_TrimMean80\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer1000x7\",\n \"method\": \"trim_mean\",\n \"method_params\": {\"proportiontocut\": 0.2},\n },\n {\n \"name\": \"Schaefer1000x7_Mean\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer1000x7\",\n \"method\": \"mean\",\n },\n {\n \"name\": \"Schaefer1000x7_Std\",\n \"kind\": \"ParcelAggregation\",\n \"parcellation\": \"Schaefer1000x7\",\n \"method\": \"std\",\n },\n]\n\nstorage = {\n \"kind\": \"SQLiteFeatureStorage\",\n}\n\nwith tempfile.TemporaryDirectory() as tmpdir:\n uri = f\"{tmpdir}/test.sqlite\"\n storage[\"uri\"] = uri\n run(\n workdir=\"/tmp\",\n datagrabber=datagrabber,\n markers=markers,\n storage=storage,\n )" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/pr-preview/pr-273/_downloads/9c18fc617bcd4554f37a08e058947c6a/run_junifer_julearn.py b/pr-preview/pr-273/_downloads/9c18fc617bcd4554f37a08e058947c6a/run_junifer_julearn.py deleted file mode 100644 index c1435b682..000000000 --- a/pr-preview/pr-273/_downloads/9c18fc617bcd4554f37a08e058947c6a/run_junifer_julearn.py +++ /dev/null @@ -1,123 +0,0 @@ -""" -Run junifer and julearn. -======================== - -This example uses a ParcelAggregation marker to compute the mean of each parcel -using the Schaefer parcellation (100 rois, 7 Yeo networks) for a 3D nifti to -extract some features for machine learning using julearn to predict some other -data. - -Authors: Leonard Sasse, Sami Hamdan, Nicolas Nieto, Synchon Mandal - -License: BSD 3 clause -""" - -import tempfile - -import nilearn -import pandas as pd -from julearn import run_cross_validation, PipelineCreator - -import junifer.testing.registry # noqa: F401 -from junifer.api import collect, run -from junifer.storage.sqlite import SQLiteFeatureStorage -from junifer.utils import configure_logging - - -############################################################################### -# Set the logging level to info to see extra information: -configure_logging(level="INFO") - - -############################################################################### -# Define the markers you want: - -marker_dicts = [ - { - "name": "Schaefer100x17_TrimMean80", - "kind": "ParcelAggregation", - "parcellation": "Schaefer100x17", - "method": "trim_mean", - "method_params": {"proportiontocut": 0.2}, - }, - { - "name": "Schaefer200x17_Mean", - "kind": "ParcelAggregation", - "parcellation": "Schaefer200x17", - "method": "mean", - }, -] - - -############################################################################### -# Define target and confounds for julearn machine learning: -y = "age" -confound = "sex" - - -############################################################################### -# Load the VBM phenotype data for machine learning data: -# - Fetch the Oasis dataset -oasis_dataset = nilearn.datasets.fetch_oasis_vbm() -age = oasis_dataset.ext_vars[y][:10] -sex = ( - pd.Series(oasis_dataset.ext_vars["mf"][:10]) - .map(lambda x: 1 if x == "F" else 0) - .values -) - - -############################################################################### -# Create a temporary directory for junifer feature extraction: -with tempfile.TemporaryDirectory() as tmpdir: - storage = {"kind": "SQLiteFeatureStorage", "uri": f"{tmpdir}/test.sqlite"} - # run the defined junifer feature extraction pipeline - run( - workdir="/tmp", - datagrabber={"kind": "OasisVBMTestingDataGrabber"}, - markers=marker_dicts, - storage=storage, - ) - - # read in extracted features and add confounds and targets - # for julearn run cross validation - collect(storage) - db = SQLiteFeatureStorage(uri=storage["uri"]) - - df_vbm = db.read_df(feature_name="VBM_GM_Schaefer200x17_Mean") - oasis_subjects = [x[0] for x in df_vbm.index] - df_vbm.index = oasis_subjects - - -############################################################################### -# Using julearn for machine learning: -# We predict the age given our vbm features and sex as a confound. -X = list(df_vbm.columns) -df_vbm[y] = age -df_vbm[confound] = sex - -X_types = { - "features": X, - "confound": confound, -} - -creator = PipelineCreator(problem_type="regression", apply_to="features") -creator.add("zscore", apply_to=["features", "confound"]) -creator.add("confound_removal", apply_to="features", confounds="confound") -creator.add("ridge") - -scores = run_cross_validation( - X=X + [confound], - y=y, - X_types=X_types, - data=df_vbm, - model=creator, - cv=3, -) -print(scores) - -############################################################################### -# Interpretation of results: -# Doing machine learning with only 10 datapoints is not meaningful. -# This explains the big variation in scores -# for different cross-validation folds. diff --git a/pr-preview/pr-273/_downloads/a8a9c21c2e94466a6617dd3cbdf8509f/norun_hcpfc_pearson.py b/pr-preview/pr-273/_downloads/a8a9c21c2e94466a6617dd3cbdf8509f/norun_hcpfc_pearson.py deleted file mode 100644 index 83f88aeed..000000000 --- a/pr-preview/pr-273/_downloads/a8a9c21c2e94466a6617dd3cbdf8509f/norun_hcpfc_pearson.py +++ /dev/null @@ -1,81 +0,0 @@ -""" -HCP FC Extraction -====================== - -Authors: Leonard Sasse -License: BSD 3 clause -""" - - -from junifer.api import run - - -datagrabber = { - "kind": "HCPOpenAccess", - "modality": "fMRI", - "preprocessed": "ICA+FIX", - "space": "volumetric", -} - -custom_confound_strategy = { - "filter": "butterworth", - "detrend": True, - "high_pass": 0.01, - "low_pass": 0.08, - "standardize": True, - "confounds": ["csf", "wm", "gsr"], - "derivatives": True, - "squares": True, - "other": [], -} - -markers = [ - { - "name": "Power264_FCPearson", - "kind": "FunctionalConnectivity", - "parcellation": "Power264", - "method": "Pearson", - "confound_strategy": "Params36", - }, - { - "name": "Schaefer400x17_FCPearson", - "kind": "FunctionalConnectivity", - "parcellation": "Schaefer400x17", - "method": "Pearson", - "confound_strategy": "Params24", - }, - { - "name": "Power264_FCSpearman", - "kind": "FunctionalConnectivity", - "parcellation": "Power264", - "method": "Spearman", - "confound_strategy": "ICAAROMA", - }, - { - "name": "Schaefer400x17_FCSpearman", - "kind": "FunctionalConnectivity", - "parcellation": "Schaefer400x17", - "method": "Spearman", - "confound_strategy": "path/to/predefined/confound_file.tsv", - }, - { - "name": "Schaefer400x17_FCSpearman", - "kind": "FunctionalConnectivity", - "parcellation": "Schaefer400x17", - "method": "Spearman", - "confound_strategy": custom_confound_strategy, - }, -] - -storage = { - "kind": "SQLiteFeatureStorage", - "uri": "/data/project/juniferexample", -} - -run( - workdir="/tmp", - datagrabber=datagrabber, - elements=[("100408", "REST1", "LR")], - markers=markers, - storage=storage, -) diff --git a/pr-preview/pr-273/_downloads/ae8b74fda4d8d226fc88ec2d6eed37f3/run_datagrabber_bids_datalad.ipynb b/pr-preview/pr-273/_downloads/ae8b74fda4d8d226fc88ec2d6eed37f3/run_datagrabber_bids_datalad.ipynb deleted file mode 100644 index c44d0020b..000000000 --- a/pr-preview/pr-273/_downloads/ae8b74fda4d8d226fc88ec2d6eed37f3/run_datagrabber_bids_datalad.ipynb +++ /dev/null @@ -1,133 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Generic BIDS DataGrabber for datalad.\n\nThis example uses a generic BIDS DataGraber to get the data from a BIDS dataset\nstore in a datalad remote sibling.\n\nAuthors: Federico Raimondo\n\nLicense: BSD 3 clause\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from junifer.datagrabber import PatternDataladDataGrabber\nfrom junifer.utils import configure_logging" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Set the logging level to info to see extra information\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "configure_logging(level=\"INFO\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "The BIDS DataGrabber requires three parameters: the types of data we want,\nthe specific pattern that matches each type, and the variables that will be\nreplaced in the patterns.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "types = [\"T1w\", \"BOLD\"]\npatterns = {\n \"T1w\": {\n \"pattern\": \"{subject}/anat/{subject}_T1w.nii.gz\",\n \"space\": \"native\",\n },\n \"BOLD\": {\n \"pattern\": \"{subject}/func/{subject}_task-rest_bold.nii.gz\",\n \"space\": \"MNI152NLin6Asym\",\n },\n}\nreplacements = [\"subject\"]" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Additionally, a datalad-based DataGrabber requires the URI of the remote\nsibling and the location of the dataset within the remote sibling.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "repo_uri = \"https://gin.g-node.org/juaml/datalad-example-bids\"\nrootdir = \"example_bids\"" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Now we can use the DataGrabber within a `with` context.\nOne thing we can do with any DataGrabber is iterate over the elements.\nIn this case, each element of the DataGrabber is one session.\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "with PatternDataladDataGrabber(\n rootdir=rootdir,\n types=types,\n patterns=patterns,\n uri=repo_uri,\n replacements=replacements,\n) as dg:\n for elem in dg:\n print(elem)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Another feature of the DataGrabber is the ability to get a specific\nelement by its name. In this case, we index `sub-01` and we get the file\npaths for the two types of data we want (T1w and BOLD).\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "with PatternDataladDataGrabber(\n rootdir=rootdir,\n types=types,\n patterns=patterns,\n uri=repo_uri,\n replacements=replacements,\n) as dg:\n sub01 = dg[\"sub-01\"]\n print(sub01)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/pr-preview/pr-273/_downloads/c1da12f6e22b8ea8de3cd5add55a3fa8/run_compute_parcel_mean.py b/pr-preview/pr-273/_downloads/c1da12f6e22b8ea8de3cd5add55a3fa8/run_compute_parcel_mean.py deleted file mode 100644 index 0a82dab96..000000000 --- a/pr-preview/pr-273/_downloads/c1da12f6e22b8ea8de3cd5add55a3fa8/run_compute_parcel_mean.py +++ /dev/null @@ -1,57 +0,0 @@ -""" -Computer Parcel Aggregation. -============================ - -This example uses the ``ParcelAggregation`` marker to compute the mean of each -parcel using the Schaefer parcellations (100 rois, 7 Yeo networks) for both 3D -and 4D NIfTI. - -Authors: Federico Raimondo, Synchon Mandal - -License: BSD 3 clause -""" - -from junifer.testing.datagrabbers import ( - OasisVBMTestingDataGrabber, - SPMAuditoryTestingDataGrabber, -) -from junifer.datareader import DefaultDataReader -from junifer.markers import ParcelAggregation -from junifer.utils import configure_logging - - -############################################################################### -# Set the logging level to info to see extra information -configure_logging(level="INFO") - -############################################################################### -# Perform parcel aggregation on VBM GM data (3D) from OASIS dataset -with OasisVBMTestingDataGrabber() as dg: - # Get the first element - element = dg.get_elements()[0] - # Read the element - element_data = DefaultDataReader().fit_transform(dg[element]) - # Initialize marker - marker = ParcelAggregation(parcellation="Schaefer100x7", method="mean") - # Compute feature - feature = marker.fit_transform(element_data) - # Print the output - print(feature.keys()) - print(feature["VBM_GM"]["data"].shape) # Shape is (1 x parcels) - -############################################################################### -# Perform parcel aggregation on BOLD data (4D) from SPM Auditory dataset -with SPMAuditoryTestingDataGrabber() as dg: - # Get the first element - element = dg.get_elements()[0] - # Read the element - element_data = DefaultDataReader().fit_transform(dg[element]) - # Initialize marker - marker = ParcelAggregation( - parcellation="Schaefer100x7", method="mean", on="BOLD" - ) - # Compute feature - feature = marker.fit_transform(element_data) - # Print the output - print(feature.keys()) - print(feature["BOLD"]["data"].shape) # Shape is (timepoints x parcels) diff --git a/pr-preview/pr-273/_downloads/d4b93e64dc3a5e1a169ea5a14bbbd17e/norun_hcpfc_pearson.ipynb b/pr-preview/pr-273/_downloads/d4b93e64dc3a5e1a169ea5a14bbbd17e/norun_hcpfc_pearson.ipynb deleted file mode 100644 index 392c4da64..000000000 --- a/pr-preview/pr-273/_downloads/d4b93e64dc3a5e1a169ea5a14bbbd17e/norun_hcpfc_pearson.ipynb +++ /dev/null @@ -1,43 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# HCP FC Extraction\n\nAuthors: Leonard Sasse\nLicense: BSD 3 clause\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from junifer.api import run\n\n\ndatagrabber = {\n \"kind\": \"HCPOpenAccess\",\n \"modality\": \"fMRI\",\n \"preprocessed\": \"ICA+FIX\",\n \"space\": \"volumetric\",\n}\n\ncustom_confound_strategy = {\n \"filter\": \"butterworth\",\n \"detrend\": True,\n \"high_pass\": 0.01,\n \"low_pass\": 0.08,\n \"standardize\": True,\n \"confounds\": [\"csf\", \"wm\", \"gsr\"],\n \"derivatives\": True,\n \"squares\": True,\n \"other\": [],\n}\n\nmarkers = [\n {\n \"name\": \"Power264_FCPearson\",\n \"kind\": \"FunctionalConnectivity\",\n \"parcellation\": \"Power264\",\n \"method\": \"Pearson\",\n \"confound_strategy\": \"Params36\",\n },\n {\n \"name\": \"Schaefer400x17_FCPearson\",\n \"kind\": \"FunctionalConnectivity\",\n \"parcellation\": \"Schaefer400x17\",\n \"method\": \"Pearson\",\n \"confound_strategy\": \"Params24\",\n },\n {\n \"name\": \"Power264_FCSpearman\",\n \"kind\": \"FunctionalConnectivity\",\n \"parcellation\": \"Power264\",\n \"method\": \"Spearman\",\n \"confound_strategy\": \"ICAAROMA\",\n },\n {\n \"name\": \"Schaefer400x17_FCSpearman\",\n \"kind\": \"FunctionalConnectivity\",\n \"parcellation\": \"Schaefer400x17\",\n \"method\": \"Spearman\",\n \"confound_strategy\": \"path/to/predefined/confound_file.tsv\",\n },\n {\n \"name\": \"Schaefer400x17_FCSpearman\",\n \"kind\": \"FunctionalConnectivity\",\n \"parcellation\": \"Schaefer400x17\",\n \"method\": \"Spearman\",\n \"confound_strategy\": custom_confound_strategy,\n },\n]\n\nstorage = {\n \"kind\": \"SQLiteFeatureStorage\",\n \"uri\": \"/data/project/juniferexample\",\n}\n\nrun(\n workdir=\"/tmp\",\n datagrabber=datagrabber,\n elements=[(\"100408\", \"REST1\", \"LR\")],\n markers=markers,\n storage=storage,\n)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/pr-preview/pr-273/_downloads/ef059f4719b06b8d88553c134bac43b4/run_compute_parcel_mean.ipynb b/pr-preview/pr-273/_downloads/ef059f4719b06b8d88553c134bac43b4/run_compute_parcel_mean.ipynb deleted file mode 100644 index e8886bef5..000000000 --- a/pr-preview/pr-273/_downloads/ef059f4719b06b8d88553c134bac43b4/run_compute_parcel_mean.ipynb +++ /dev/null @@ -1,97 +0,0 @@ -{ - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "\n# Computer Parcel Aggregation.\n\nThis example uses the ``ParcelAggregation`` marker to compute the mean of each\nparcel using the Schaefer parcellations (100 rois, 7 Yeo networks) for both 3D\nand 4D NIfTI.\n\nAuthors: Federico Raimondo, Synchon Mandal\n\nLicense: BSD 3 clause\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "from junifer.testing.datagrabbers import (\n OasisVBMTestingDataGrabber,\n SPMAuditoryTestingDataGrabber,\n)\nfrom junifer.datareader import DefaultDataReader\nfrom junifer.markers import ParcelAggregation\nfrom junifer.utils import configure_logging" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Set the logging level to info to see extra information\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "configure_logging(level=\"INFO\")" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perform parcel aggregation on VBM GM data (3D) from OASIS dataset\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "with OasisVBMTestingDataGrabber() as dg:\n # Get the first element\n element = dg.get_elements()[0]\n # Read the element\n element_data = DefaultDataReader().fit_transform(dg[element])\n # Initialize marker\n marker = ParcelAggregation(parcellation=\"Schaefer100x7\", method=\"mean\")\n # Compute feature\n feature = marker.fit_transform(element_data)\n # Print the output\n print(feature.keys())\n print(feature[\"VBM_GM\"][\"data\"].shape) # Shape is (1 x parcels)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "Perform parcel aggregation on BOLD data (4D) from SPM Auditory dataset\n\n" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "with SPMAuditoryTestingDataGrabber() as dg:\n # Get the first element\n element = dg.get_elements()[0]\n # Read the element\n element_data = DefaultDataReader().fit_transform(dg[element])\n # Initialize marker\n marker = ParcelAggregation(\n parcellation=\"Schaefer100x7\", method=\"mean\", on=\"BOLD\"\n )\n # Compute feature\n feature = marker.fit_transform(element_data)\n # Print the output\n print(feature.keys())\n print(feature[\"BOLD\"][\"data\"].shape) # Shape is (timepoints x parcels)" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3", - "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.11.8" - } - }, - "nbformat": 4, - "nbformat_minor": 0 -} \ No newline at end of file diff --git a/pr-preview/pr-273/_images/junifer_logo.png b/pr-preview/pr-273/_images/junifer_logo.png deleted file mode 100644 index 2665f6040..000000000 Binary files a/pr-preview/pr-273/_images/junifer_logo.png and /dev/null differ diff --git a/pr-preview/pr-273/_images/sphx_glr_norun_hcpfc_pearson_thumb.png b/pr-preview/pr-273/_images/sphx_glr_norun_hcpfc_pearson_thumb.png deleted file mode 100644 index 8a5fed589..000000000 Binary files a/pr-preview/pr-273/_images/sphx_glr_norun_hcpfc_pearson_thumb.png and /dev/null differ diff --git a/pr-preview/pr-273/_images/sphx_glr_norun_ukbvm_gmd_thumb.png b/pr-preview/pr-273/_images/sphx_glr_norun_ukbvm_gmd_thumb.png deleted file mode 100644 index 8a5fed589..000000000 Binary files a/pr-preview/pr-273/_images/sphx_glr_norun_ukbvm_gmd_thumb.png and /dev/null differ diff --git a/pr-preview/pr-273/_images/sphx_glr_run_compute_parcel_mean_thumb.png b/pr-preview/pr-273/_images/sphx_glr_run_compute_parcel_mean_thumb.png deleted file mode 100644 index 8a5fed589..000000000 Binary files a/pr-preview/pr-273/_images/sphx_glr_run_compute_parcel_mean_thumb.png and /dev/null differ diff --git a/pr-preview/pr-273/_images/sphx_glr_run_datagrabber_bids_datalad_thumb.png b/pr-preview/pr-273/_images/sphx_glr_run_datagrabber_bids_datalad_thumb.png deleted file mode 100644 index 8a5fed589..000000000 Binary files a/pr-preview/pr-273/_images/sphx_glr_run_datagrabber_bids_datalad_thumb.png and /dev/null differ diff --git a/pr-preview/pr-273/_images/sphx_glr_run_ets_rss_marker_thumb.png b/pr-preview/pr-273/_images/sphx_glr_run_ets_rss_marker_thumb.png deleted file mode 100644 index 8a5fed589..000000000 Binary files a/pr-preview/pr-273/_images/sphx_glr_run_ets_rss_marker_thumb.png and /dev/null differ diff --git a/pr-preview/pr-273/_images/sphx_glr_run_junifer_julearn_thumb.png b/pr-preview/pr-273/_images/sphx_glr_run_junifer_julearn_thumb.png deleted file mode 100644 index 8a5fed589..000000000 Binary files a/pr-preview/pr-273/_images/sphx_glr_run_junifer_julearn_thumb.png and /dev/null differ diff --git a/pr-preview/pr-273/_images/sphx_glr_run_run_gmd_mean_thumb.png b/pr-preview/pr-273/_images/sphx_glr_run_run_gmd_mean_thumb.png deleted file mode 100644 index 8a5fed589..000000000 Binary files a/pr-preview/pr-273/_images/sphx_glr_run_run_gmd_mean_thumb.png and /dev/null differ diff --git a/pr-preview/pr-273/_sources/api/api.rst.txt b/pr-preview/pr-273/_sources/api/api.rst.txt deleted file mode 100644 index b9c3e1685..000000000 --- a/pr-preview/pr-273/_sources/api/api.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ -API Functions -============= - -Main API functions ------------------- - -.. automodule:: junifer.api - :members: - :imported-members: - - -Decorators ----------- - -.. automodule:: junifer.api.decorators - :members: - :imported-members: - - -Queue Context -------------- - -.. automodule:: junifer.api.queue_context - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/configs.rst.txt b/pr-preview/pr-273/_sources/api/configs.rst.txt deleted file mode 100644 index e237fa772..000000000 --- a/pr-preview/pr-273/_sources/api/configs.rst.txt +++ /dev/null @@ -1,10 +0,0 @@ -Configs -======= - -Juseless --------- - -.. automodule:: junifer.configs.juseless.datagrabbers - :members: - :imported-members: - :special-members: None diff --git a/pr-preview/pr-273/_sources/api/data.rst.txt b/pr-preview/pr-273/_sources/api/data.rst.txt deleted file mode 100644 index 0ddfd5c7e..000000000 --- a/pr-preview/pr-273/_sources/api/data.rst.txt +++ /dev/null @@ -1,26 +0,0 @@ -Parcellations -============= - -.. automodule:: junifer.data.parcellations - :members: - - -Coordinates -=========== - -.. automodule:: junifer.data.coordinates - :members: - - -Masks -===== - -.. automodule:: junifer.data.masks - :members: - - -Template Spaces -=============== - -.. automodule:: junifer.data.template_spaces - :members: diff --git a/pr-preview/pr-273/_sources/api/datagrabbers.rst.txt b/pr-preview/pr-273/_sources/api/datagrabbers.rst.txt deleted file mode 100644 index ad7496ce6..000000000 --- a/pr-preview/pr-273/_sources/api/datagrabbers.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -Data Grabbers -============= - -.. automodule:: junifer.datagrabber - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/datareaders.rst.txt b/pr-preview/pr-273/_sources/api/datareaders.rst.txt deleted file mode 100644 index 28e3d7e62..000000000 --- a/pr-preview/pr-273/_sources/api/datareaders.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -DataReaders -=========== - -.. automodule:: junifer.datareader - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/index.rst.txt b/pr-preview/pr-273/_sources/api/index.rst.txt deleted file mode 100644 index f5812db0d..000000000 --- a/pr-preview/pr-273/_sources/api/index.rst.txt +++ /dev/null @@ -1,49 +0,0 @@ -API Reference -============= - -Pipeline Elements ------------------ - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - datagrabbers - datareaders - preprocessing - markers - storage - -Utilities ---------- - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - data - stats - pipeline - api - utils - testing - onthefly - -Configs -------- - -.. toctree:: - :maxdepth: 3 - :caption: Contents: - - configs - - -External --------- - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - nilearn.rst diff --git a/pr-preview/pr-273/_sources/api/markers.rst.txt b/pr-preview/pr-273/_sources/api/markers.rst.txt deleted file mode 100644 index 90d25495d..000000000 --- a/pr-preview/pr-273/_sources/api/markers.rst.txt +++ /dev/null @@ -1,14 +0,0 @@ -Markers -======= - -.. automodule:: junifer.markers - :members: - :imported-members: - - -Complexity ----------- - -.. automodule:: junifer.markers.complexity - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/nilearn.rst.txt b/pr-preview/pr-273/_sources/api/nilearn.rst.txt deleted file mode 100644 index 100ef9fb5..000000000 --- a/pr-preview/pr-273/_sources/api/nilearn.rst.txt +++ /dev/null @@ -1,8 +0,0 @@ -Nilearn -======= - -This package provides re-implementations of some of the functions in `nilearn`_. - -.. automodule:: junifer.external.nilearn - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/onthefly.rst.txt b/pr-preview/pr-273/_sources/api/onthefly.rst.txt deleted file mode 100644 index c5599e560..000000000 --- a/pr-preview/pr-273/_sources/api/onthefly.rst.txt +++ /dev/null @@ -1,8 +0,0 @@ -On-the-fly -========== - -This package provides functions for quick transform operations on stored data. - -.. automodule:: junifer.onthefly - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/pipeline.rst.txt b/pr-preview/pr-273/_sources/api/pipeline.rst.txt deleted file mode 100644 index bef920d5f..000000000 --- a/pr-preview/pr-273/_sources/api/pipeline.rst.txt +++ /dev/null @@ -1,12 +0,0 @@ -Pipeline -======== - -.. automodule:: junifer.pipeline - :members: - :imported-members: - -Registry -======== - -.. automodule:: junifer.pipeline.registry - :members: diff --git a/pr-preview/pr-273/_sources/api/preprocessing.rst.txt b/pr-preview/pr-273/_sources/api/preprocessing.rst.txt deleted file mode 100644 index 036fddb53..000000000 --- a/pr-preview/pr-273/_sources/api/preprocessing.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -Pre-processing -============== - -.. automodule:: junifer.preprocess - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/stats.rst.txt b/pr-preview/pr-273/_sources/api/stats.rst.txt deleted file mode 100644 index e2243f729..000000000 --- a/pr-preview/pr-273/_sources/api/stats.rst.txt +++ /dev/null @@ -1,5 +0,0 @@ -Stats -===== - -.. automodule:: junifer.stats - :members: diff --git a/pr-preview/pr-273/_sources/api/storage.rst.txt b/pr-preview/pr-273/_sources/api/storage.rst.txt deleted file mode 100644 index 3b442b4ea..000000000 --- a/pr-preview/pr-273/_sources/api/storage.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -Storage -======= - -.. automodule:: junifer.storage - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/api/testing.rst.txt b/pr-preview/pr-273/_sources/api/testing.rst.txt deleted file mode 100644 index 0e25f04b3..000000000 --- a/pr-preview/pr-273/_sources/api/testing.rst.txt +++ /dev/null @@ -1,5 +0,0 @@ -Testing -======= - -.. automodule:: junifer.testing.datagrabbers - :members: diff --git a/pr-preview/pr-273/_sources/api/utils.rst.txt b/pr-preview/pr-273/_sources/api/utils.rst.txt deleted file mode 100644 index ad7755127..000000000 --- a/pr-preview/pr-273/_sources/api/utils.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -Utils -===== - -.. automodule:: junifer.utils - :members: - :imported-members: diff --git a/pr-preview/pr-273/_sources/auto_examples/index.rst.txt b/pr-preview/pr-273/_sources/auto_examples/index.rst.txt deleted file mode 100644 index ecdc7e5f8..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/index.rst.txt +++ /dev/null @@ -1,168 +0,0 @@ -:orphan: - -Examples -======== - -The following are a set of examples. - - - -.. raw:: html - -
- - -.. raw:: html - -
- -.. only:: html - - .. image:: /auto_examples/images/thumb/sphx_glr_norun_ukbvm_gmd_thumb.png - :alt: - - :ref:`sphx_glr_auto_examples_norun_ukbvm_gmd.py` - -.. raw:: html - -
UKB VBM GMD Extraction
-
- - -.. raw:: html - -
- -.. only:: html - - .. image:: /auto_examples/images/thumb/sphx_glr_run_datagrabber_bids_datalad_thumb.png - :alt: - - :ref:`sphx_glr_auto_examples_run_datagrabber_bids_datalad.py` - -.. raw:: html - -
Generic BIDS DataGrabber for datalad.
-
- - -.. raw:: html - -
- -.. only:: html - - .. image:: /auto_examples/images/thumb/sphx_glr_run_run_gmd_mean_thumb.png - :alt: - - :ref:`sphx_glr_auto_examples_run_run_gmd_mean.py` - -.. raw:: html - -
UKB VBM GMD Extraction
-
- - -.. raw:: html - -
- -.. only:: html - - .. image:: /auto_examples/images/thumb/sphx_glr_run_compute_parcel_mean_thumb.png - :alt: - - :ref:`sphx_glr_auto_examples_run_compute_parcel_mean.py` - -.. raw:: html - -
Computer Parcel Aggregation.
-
- - -.. raw:: html - -
- -.. only:: html - - .. image:: /auto_examples/images/thumb/sphx_glr_run_ets_rss_marker_thumb.png - :alt: - - :ref:`sphx_glr_auto_examples_run_ets_rss_marker.py` - -.. raw:: html - -
Extracting root sum of squares from edge-wise timeseries.
-
- - -.. raw:: html - -
- -.. only:: html - - .. image:: /auto_examples/images/thumb/sphx_glr_norun_hcpfc_pearson_thumb.png - :alt: - - :ref:`sphx_glr_auto_examples_norun_hcpfc_pearson.py` - -.. raw:: html - -
HCP FC Extraction
-
- - -.. raw:: html - -
- -.. only:: html - - .. image:: /auto_examples/images/thumb/sphx_glr_run_junifer_julearn_thumb.png - :alt: - - :ref:`sphx_glr_auto_examples_run_junifer_julearn.py` - -.. raw:: html - -
Run junifer and julearn.
-
- - -.. raw:: html - -
- - -.. toctree:: - :hidden: - - /auto_examples/norun_ukbvm_gmd - /auto_examples/run_datagrabber_bids_datalad - /auto_examples/run_run_gmd_mean - /auto_examples/run_compute_parcel_mean - /auto_examples/run_ets_rss_marker - /auto_examples/norun_hcpfc_pearson - /auto_examples/run_junifer_julearn - - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-gallery - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download all examples in Python source code: auto_examples_python.zip ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download all examples in Jupyter notebooks: auto_examples_jupyter.zip ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/norun_hcpfc_pearson.rst.txt b/pr-preview/pr-273/_sources/auto_examples/norun_hcpfc_pearson.rst.txt deleted file mode 100644 index 01ae18f3f..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/norun_hcpfc_pearson.rst.txt +++ /dev/null @@ -1,134 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/norun_hcpfc_pearson.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_norun_hcpfc_pearson.py: - - -HCP FC Extraction -====================== - -Authors: Leonard Sasse -License: BSD 3 clause - -.. GENERATED FROM PYTHON SOURCE LINES 8-82 - -.. code-block:: default - - - - from junifer.api import run - - - datagrabber = { - "kind": "HCPOpenAccess", - "modality": "fMRI", - "preprocessed": "ICA+FIX", - "space": "volumetric", - } - - custom_confound_strategy = { - "filter": "butterworth", - "detrend": True, - "high_pass": 0.01, - "low_pass": 0.08, - "standardize": True, - "confounds": ["csf", "wm", "gsr"], - "derivatives": True, - "squares": True, - "other": [], - } - - markers = [ - { - "name": "Power264_FCPearson", - "kind": "FunctionalConnectivity", - "parcellation": "Power264", - "method": "Pearson", - "confound_strategy": "Params36", - }, - { - "name": "Schaefer400x17_FCPearson", - "kind": "FunctionalConnectivity", - "parcellation": "Schaefer400x17", - "method": "Pearson", - "confound_strategy": "Params24", - }, - { - "name": "Power264_FCSpearman", - "kind": "FunctionalConnectivity", - "parcellation": "Power264", - "method": "Spearman", - "confound_strategy": "ICAAROMA", - }, - { - "name": "Schaefer400x17_FCSpearman", - "kind": "FunctionalConnectivity", - "parcellation": "Schaefer400x17", - "method": "Spearman", - "confound_strategy": "path/to/predefined/confound_file.tsv", - }, - { - "name": "Schaefer400x17_FCSpearman", - "kind": "FunctionalConnectivity", - "parcellation": "Schaefer400x17", - "method": "Spearman", - "confound_strategy": custom_confound_strategy, - }, - ] - - storage = { - "kind": "SQLiteFeatureStorage", - "uri": "/data/project/juniferexample", - } - - run( - workdir="/tmp", - datagrabber=datagrabber, - elements=[("100408", "REST1", "LR")], - markers=markers, - storage=storage, - ) - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** (0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_norun_hcpfc_pearson.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: norun_hcpfc_pearson.py ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: norun_hcpfc_pearson.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/norun_ukbvm_gmd.rst.txt b/pr-preview/pr-273/_sources/auto_examples/norun_ukbvm_gmd.rst.txt deleted file mode 100644 index 4743c4c4e..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/norun_ukbvm_gmd.rst.txt +++ /dev/null @@ -1,96 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/norun_ukbvm_gmd.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_norun_ukbvm_gmd.py: - - -UKB VBM GMD Extraction -====================== - -Authors: Federico Raimondo - -License: BSD 3 clause - -.. GENERATED FROM PYTHON SOURCE LINES 9-44 - -.. code-block:: default - - - - from junifer.api import run - - - markers = [ - { - "name": "Schaefer1000x7_TrimMean80", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "trim_mean", - "method_params": {"proportiontocut": 0.2}, - }, - { - "name": "Schaefer1000x7_Mean", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "mean", - }, - { - "name": "Schaefer1000x7_Std", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "std", - }, - ] - - run( - workdir="/tmp", - datagrabber="JuselessUKBVBM", - elements=("sub-1627474", "ses-2"), - markers=markers, - storage="SQLDataFrameStorage", - storage_params={"outpath": "/data/project/juniferexample"}, - ) - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** (0 minutes 0.000 seconds) - - -.. _sphx_glr_download_auto_examples_norun_ukbvm_gmd.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: norun_ukbvm_gmd.py ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: norun_ukbvm_gmd.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/run_compute_parcel_mean.rst.txt b/pr-preview/pr-273/_sources/auto_examples/run_compute_parcel_mean.rst.txt deleted file mode 100644 index 990563d57..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/run_compute_parcel_mean.rst.txt +++ /dev/null @@ -1,232 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/run_compute_parcel_mean.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_run_compute_parcel_mean.py: - - -Computer Parcel Aggregation. -============================ - -This example uses the ``ParcelAggregation`` marker to compute the mean of each -parcel using the Schaefer parcellations (100 rois, 7 Yeo networks) for both 3D -and 4D NIfTI. - -Authors: Federico Raimondo, Synchon Mandal - -License: BSD 3 clause - -.. GENERATED FROM PYTHON SOURCE LINES 13-23 - -.. code-block:: default - - - from junifer.testing.datagrabbers import ( - OasisVBMTestingDataGrabber, - SPMAuditoryTestingDataGrabber, - ) - from junifer.datareader import DefaultDataReader - from junifer.markers import ParcelAggregation - from junifer.utils import configure_logging - - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 24-25 - -Set the logging level to info to see extra information - -.. GENERATED FROM PYTHON SOURCE LINES 25-27 - -.. code-block:: default - - configure_logging(level="INFO") - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:14:20,582 - JUNIFER - INFO - ===== Lib Versions ===== - 2024-04-08 12:14:20,582 - JUNIFER - INFO - numpy: 1.26.4 - 2024-04-08 12:14:20,582 - JUNIFER - INFO - scipy: 1.11.4 - 2024-04-08 12:14:20,582 - JUNIFER - INFO - pandas: 2.1.4 - 2024-04-08 12:14:20,582 - JUNIFER - INFO - nilearn: 0.10.2 - 2024-04-08 12:14:20,582 - JUNIFER - INFO - nibabel: 5.2.1 - 2024-04-08 12:14:20,582 - JUNIFER - INFO - junifer: 0.0.5.dev11 - 2024-04-08 12:14:20,582 - JUNIFER - INFO - ======================== - - - - -.. GENERATED FROM PYTHON SOURCE LINES 28-29 - -Perform parcel aggregation on VBM GM data (3D) from OASIS dataset - -.. GENERATED FROM PYTHON SOURCE LINES 29-42 - -.. code-block:: default - - with OasisVBMTestingDataGrabber() as dg: - # Get the first element - element = dg.get_elements()[0] - # Read the element - element_data = DefaultDataReader().fit_transform(dg[element]) - # Initialize marker - marker = ParcelAggregation(parcellation="Schaefer100x7", method="mean") - # Compute feature - feature = marker.fit_transform(element_data) - # Print the output - print(feature.keys()) - print(feature["VBM_GM"]["data"].shape) # Shape is (1 x parcels) - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - /opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/nilearn/datasets/struct.py:852: UserWarning: `legacy_format` will default to `False` in release 0.11. Dataset fetchers will then return pandas dataframes by default instead of recarrays. - warnings.warn(_LEGACY_FORMAT_MSG) - 2024-04-08 12:14:20,587 - JUNIFER - INFO - Getting element sub-01 - 2024-04-08 12:14:20,587 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0001_MR1/mwrc1OAS1_0001_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:14:20,587 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:14:20,588 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:14:20,588 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:14:20,588 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:14:20,588 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:14:20,588 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:14:20,588 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:14:20,589 - JUNIFER - INFO - At least one of the parcellation files are missing. Fetching using nilearn. - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_100Parcels_7Networks_order.txt ... - ...done. (0 seconds, 0 min) - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_100Parcels_7Networks_order_FSLMNI152_2mm.nii.gz ... - ...done. (0 seconds, 0 min) - 2024-04-08 12:14:20,674 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:14:20,704 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:14:21,749 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:14:21,845 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsj0y2np_0/Schaefer100x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsj0y2np_0/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp87hfp6w1/parcellations1nbdurxi/Schaefer100x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:14:23,226 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:14:24,172 - JUNIFER - INFO - No storage specified, returning dictionary - dict_keys(['VBM_GM']) - (1, 100) - - - - -.. GENERATED FROM PYTHON SOURCE LINES 43-44 - -Perform parcel aggregation on BOLD data (4D) from SPM Auditory dataset - -.. GENERATED FROM PYTHON SOURCE LINES 44-58 - -.. code-block:: default - - with SPMAuditoryTestingDataGrabber() as dg: - # Get the first element - element = dg.get_elements()[0] - # Read the element - element_data = DefaultDataReader().fit_transform(dg[element]) - # Initialize marker - marker = ParcelAggregation( - parcellation="Schaefer100x7", method="mean", on="BOLD" - ) - # Compute feature - feature = marker.fit_transform(element_data) - # Print the output - print(feature.keys()) - print(feature["BOLD"]["data"].shape) # Shape is (timepoints x parcels) - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:14:24,173 - JUNIFER - INFO - Getting element sub001 - - Dataset created in /home/runner/nilearn_data/spm_auditory - - Data absent, downloading... - Downloading data from https://www.fil.ion.ucl.ac.uk/spm/download/data/MoAEpilot/MoAEpilot.zip ... - Downloaded 1646592 of 34212021 bytes (4.8%, 20.0s remaining) Downloaded 8347648 of 34212021 bytes (24.4%, 6.3s remaining) Downloaded 11804672 of 34212021 bytes (34.5%, 5.8s remaining) Downloaded 15491072 of 34212021 bytes (45.3%, 4.9s remaining) Downloaded 19333120 of 34212021 bytes (56.5%, 3.9s remaining) Downloaded 23248896 of 34212021 bytes (68.0%, 2.9s remaining) Downloaded 27197440 of 34212021 bytes (79.5%, 1.8s remaining) Downloaded 31137792 of 34212021 bytes (91.0%, 0.8s remaining) ...done. (11 seconds, 0 min) - Extracting data from /home/runner/nilearn_data/spm_auditory/sub001/MoAEpilot.zip..... done. - 2024-04-08 12:14:38,041 - JUNIFER - INFO - Reading BOLD from /tmp/tmpfe4hitzl/sub001_bold.nii.gz - 2024-04-08 12:14:38,041 - JUNIFER - INFO - BOLD is type NIFTI - 2024-04-08 12:14:38,042 - JUNIFER - INFO - Reading T1w from /tmp/tmpfe4hitzl/sub001_T1w.nii.gz - 2024-04-08 12:14:38,042 - JUNIFER - INFO - T1w is type NIFTI - 2024-04-08 12:14:38,042 - JUNIFER - INFO - Computing BOLD - 2024-04-08 12:14:38,043 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:14:38,043 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:14:38,043 - JUNIFER - INFO - resolution: 3.0 - 2024-04-08 12:14:38,043 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:14:38,043 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:14:38,044 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:14:38,073 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:14:39,124 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:14:39,220 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsr5hylyll/Schaefer100x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsr5hylyll/MNI152Lin_T1w_3.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp87hfp6w1/parcellationsma6qtj5u/Schaefer100x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:14:40,604 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:14:43,239 - JUNIFER - INFO - No storage specified, returning dictionary - dict_keys(['BOLD']) - (96, 100) - - - - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** (0 minutes 22.662 seconds) - - -.. _sphx_glr_download_auto_examples_run_compute_parcel_mean.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: run_compute_parcel_mean.py ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: run_compute_parcel_mean.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/run_datagrabber_bids_datalad.rst.txt b/pr-preview/pr-273/_sources/auto_examples/run_datagrabber_bids_datalad.rst.txt deleted file mode 100644 index 4a53e01bc..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/run_datagrabber_bids_datalad.rst.txt +++ /dev/null @@ -1,232 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/run_datagrabber_bids_datalad.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_run_datagrabber_bids_datalad.py: - - -Generic BIDS DataGrabber for datalad. -===================================== - -This example uses a generic BIDS DataGraber to get the data from a BIDS dataset -store in a datalad remote sibling. - -Authors: Federico Raimondo - -License: BSD 3 clause - -.. GENERATED FROM PYTHON SOURCE LINES 12-17 - -.. code-block:: default - - - from junifer.datagrabber import PatternDataladDataGrabber - from junifer.utils import configure_logging - - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 18-19 - -Set the logging level to info to see extra information - -.. GENERATED FROM PYTHON SOURCE LINES 19-22 - -.. code-block:: default - - configure_logging(level="INFO") - - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:00:37,551 - JUNIFER - INFO - ===== Lib Versions ===== - 2024-04-08 12:00:37,551 - JUNIFER - INFO - numpy: 1.26.4 - 2024-04-08 12:00:37,551 - JUNIFER - INFO - scipy: 1.11.4 - 2024-04-08 12:00:37,551 - JUNIFER - INFO - pandas: 2.1.4 - 2024-04-08 12:00:37,551 - JUNIFER - INFO - nilearn: 0.10.2 - 2024-04-08 12:00:37,551 - JUNIFER - INFO - nibabel: 5.2.1 - 2024-04-08 12:00:37,551 - JUNIFER - INFO - junifer: 0.0.5.dev11 - 2024-04-08 12:00:37,551 - JUNIFER - INFO - ======================== - - - - -.. GENERATED FROM PYTHON SOURCE LINES 23-26 - -The BIDS DataGrabber requires three parameters: the types of data we want, -the specific pattern that matches each type, and the variables that will be -replaced in the patterns. - -.. GENERATED FROM PYTHON SOURCE LINES 26-38 - -.. code-block:: default - - types = ["T1w", "BOLD"] - patterns = { - "T1w": { - "pattern": "{subject}/anat/{subject}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "pattern": "{subject}/func/{subject}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - } - replacements = ["subject"] - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 39-41 - -Additionally, a datalad-based DataGrabber requires the URI of the remote -sibling and the location of the dataset within the remote sibling. - -.. GENERATED FROM PYTHON SOURCE LINES 41-44 - -.. code-block:: default - - repo_uri = "https://gin.g-node.org/juaml/datalad-example-bids" - rootdir = "example_bids" - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 45-48 - -Now we can use the DataGrabber within a `with` context. -One thing we can do with any DataGrabber is iterate over the elements. -In this case, each element of the DataGrabber is one session. - -.. GENERATED FROM PYTHON SOURCE LINES 48-58 - -.. code-block:: default - - with PatternDataladDataGrabber( - rootdir=rootdir, - types=types, - patterns=patterns, - uri=repo_uri, - replacements=replacements, - ) as dg: - for elem in dg: - print(elem) - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:00:37,552 - JUNIFER - INFO - `datadir` is None, creating a temporary directory - 2024-04-08 12:00:37,552 - JUNIFER - INFO - `datadir` set to /tmp/tmpvhqllezb/datadir - sub-02 - sub-06 - sub-07 - sub-05 - sub-03 - sub-01 - sub-09 - sub-04 - sub-08 - - - - -.. GENERATED FROM PYTHON SOURCE LINES 59-62 - -Another feature of the DataGrabber is the ability to get a specific -element by its name. In this case, we index `sub-01` and we get the file -paths for the two types of data we want (T1w and BOLD). - -.. GENERATED FROM PYTHON SOURCE LINES 62-71 - -.. code-block:: default - - with PatternDataladDataGrabber( - rootdir=rootdir, - types=types, - patterns=patterns, - uri=repo_uri, - replacements=replacements, - ) as dg: - sub01 = dg["sub-01"] - print(sub01) - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:00:42,540 - JUNIFER - INFO - `datadir` is None, creating a temporary directory - 2024-04-08 12:00:42,540 - JUNIFER - INFO - `datadir` set to /tmp/tmp0_2s8ov_/datadir - 2024-04-08 12:00:45,783 - JUNIFER - INFO - Getting element sub-01 - {'T1w': {'space': 'native', 'path': PosixPath('/tmp/tmp0_2s8ov_/datadir/example_bids/sub-01/anat/sub-01_T1w.nii.gz'), 'meta': {'datagrabber': {'class': 'PatternDataladDataGrabber', 'patterns': {'T1w': {'pattern': '{subject}/anat/{subject}_T1w.nii.gz', 'space': 'native'}, 'BOLD': {'pattern': '{subject}/func/{subject}_task-rest_bold.nii.gz', 'space': 'MNI152NLin6Asym'}}, 'replacements': ['subject'], 'confounds_format': None, 'types': ['T1w', 'BOLD'], 'uri': 'https://gin.g-node.org/juaml/datalad-example-bids', 'datalad_dirty': False, 'datalad_commit_id': '522dfb203afcd2cd55799bf347f9b211919a7338', 'datalad_id': 'fec92475-d9c0-4409-92ba-f041b6a12c40'}, 'dependencies': set(), 'element': {'subject': 'sub-01'}}}, 'BOLD': {'space': 'MNI152NLin6Asym', 'path': PosixPath('/tmp/tmp0_2s8ov_/datadir/example_bids/sub-01/func/sub-01_task-rest_bold.nii.gz'), 'meta': {'datagrabber': {'class': 'PatternDataladDataGrabber', 'patterns': {'T1w': {'pattern': '{subject}/anat/{subject}_T1w.nii.gz', 'space': 'native'}, 'BOLD': {'pattern': '{subject}/func/{subject}_task-rest_bold.nii.gz', 'space': 'MNI152NLin6Asym'}}, 'replacements': ['subject'], 'confounds_format': None, 'types': ['T1w', 'BOLD'], 'uri': 'https://gin.g-node.org/juaml/datalad-example-bids', 'datalad_dirty': False, 'datalad_commit_id': '522dfb203afcd2cd55799bf347f9b211919a7338', 'datalad_id': 'fec92475-d9c0-4409-92ba-f041b6a12c40'}, 'dependencies': set(), 'element': {'subject': 'sub-01'}}}} - - - - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** (0 minutes 9.379 seconds) - - -.. _sphx_glr_download_auto_examples_run_datagrabber_bids_datalad.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: run_datagrabber_bids_datalad.py ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: run_datagrabber_bids_datalad.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/run_ets_rss_marker.rst.txt b/pr-preview/pr-273/_sources/auto_examples/run_ets_rss_marker.rst.txt deleted file mode 100644 index 4c9edc207..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/run_ets_rss_marker.rst.txt +++ /dev/null @@ -1,338 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/run_ets_rss_marker.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_run_ets_rss_marker.py: - - -Extracting root sum of squares from edge-wise timeseries. -========================================================= -This example uses a ``RSSETSMarker`` to compute root sum of squares -of the edge-wise timeseries using the Schaefer parcellation -(100 rois and 200 rois, 17 Yeo networks) for a 4D nifti BOLD file. - -Authors: Leonard Sasse, Sami Hamdan, Nicolas Nieto, Synchon Mandal - -License: BSD 3 clause - -.. GENERATED FROM PYTHON SOURCE LINES 14-23 - -.. code-block:: default - - - import tempfile - - import junifer.testing.registry # noqa: F401 - from junifer.api import collect, run - from junifer.storage import SQLiteFeatureStorage - from junifer.utils import configure_logging - - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 24-25 - -Set the logging level to info to see extra information: - -.. GENERATED FROM PYTHON SOURCE LINES 25-27 - -.. code-block:: default - - configure_logging(level="INFO") - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:14:43,346 - JUNIFER - INFO - ===== Lib Versions ===== - 2024-04-08 12:14:43,346 - JUNIFER - INFO - numpy: 1.26.4 - 2024-04-08 12:14:43,346 - JUNIFER - INFO - scipy: 1.11.4 - 2024-04-08 12:14:43,346 - JUNIFER - INFO - pandas: 2.1.4 - 2024-04-08 12:14:43,346 - JUNIFER - INFO - nilearn: 0.10.2 - 2024-04-08 12:14:43,346 - JUNIFER - INFO - nibabel: 5.2.1 - 2024-04-08 12:14:43,346 - JUNIFER - INFO - junifer: 0.0.5.dev11 - 2024-04-08 12:14:43,346 - JUNIFER - INFO - ======================== - - - - -.. GENERATED FROM PYTHON SOURCE LINES 28-29 - -Define the DataGrabber interface - -.. GENERATED FROM PYTHON SOURCE LINES 29-33 - -.. code-block:: default - - datagrabber = { - "kind": "SPMAuditoryTestingDataGrabber", - } - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 34-35 - -Define the markers interface - -.. GENERATED FROM PYTHON SOURCE LINES 35-48 - -.. code-block:: default - - markers = [ - { - "name": "Schaefer100x17_RSSETS", - "kind": "RSSETSMarker", - "parcellation": "Schaefer100x17", - }, - { - "name": "Schaefer200x17_RSSETS", - "kind": "RSSETSMarker", - "parcellation": "Schaefer200x17", - }, - ] - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 49-51 - -Create a temporary directory for junifer feature extraction: -At the end you can read the extracted data into a ``pandas.DataFrame``. - -.. GENERATED FROM PYTHON SOURCE LINES 51-75 - -.. code-block:: default - - with tempfile.TemporaryDirectory() as tmpdir: - # Define the storage interface - storage = { - "kind": "SQLiteFeatureStorage", - "uri": f"{tmpdir}/test.sqlite", - } - # Run the defined junifer feature extraction pipeline - run( - workdir=tmpdir, - datagrabber=datagrabber, - markers=markers, - storage=storage, - elements=["sub001"], # we calculate for one subject only - ) - # Collect extracted features data - collect(storage=storage) - # Create storage object to read in extracted features - db = SQLiteFeatureStorage(uri=storage["uri"]) - - # List all the features - print(db.list_features()) - # Read extracted features - df_vbm = db.read_df(feature_name="BOLD_Schaefer100x17_RSSETS") - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Validating Marker Collection - 2024-04-08 12:14:43,347 - JUNIFER - INFO - DataGrabber output type: ['BOLD', 'T1w'] - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Validating Data Reader: - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Data Reader output type: ['BOLD', 'T1w'] - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Validating Marker: Schaefer100x17_RSSETS - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Marker output type: ['timeseries'] - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Validating storage for Schaefer100x17_RSSETS - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Validating Marker: Schaefer200x17_RSSETS - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Marker output type: ['timeseries'] - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Validating storage for Schaefer200x17_RSSETS - 2024-04-08 12:14:43,347 - JUNIFER - INFO - Getting element sub001 - 2024-04-08 12:14:45,819 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:14:45,819 - JUNIFER - INFO - Reading BOLD from /tmp/tmpnrdatt2a/sub001_bold.nii.gz - 2024-04-08 12:14:45,819 - JUNIFER - INFO - BOLD is type NIFTI - 2024-04-08 12:14:45,820 - JUNIFER - INFO - Reading T1w from /tmp/tmpnrdatt2a/sub001_T1w.nii.gz - 2024-04-08 12:14:45,820 - JUNIFER - INFO - T1w is type NIFTI - 2024-04-08 12:14:45,820 - JUNIFER - INFO - Fitting marker Schaefer100x17_RSSETS - 2024-04-08 12:14:45,820 - JUNIFER - INFO - Computing BOLD - 2024-04-08 12:14:45,821 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:14:45,821 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:14:45,821 - JUNIFER - INFO - resolution: 3.0 - 2024-04-08 12:14:45,821 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:14:45,821 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:14:45,821 - JUNIFER - INFO - At least one of the parcellation files are missing. Fetching using nilearn. - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_100Parcels_17Networks_order.txt ... - ...done. (0 seconds, 0 min) - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz ... - ...done. (0 seconds, 0 min) - 2024-04-08 12:14:45,907 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:14:45,937 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:14:46,983 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:14:47,079 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations0dy326zs/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellations0dy326zs/MNI152Lin_T1w_3.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp87hfp6w1/parcellations0_pp6jqj/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:14:48,519 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:14:51,141 - JUNIFER - INFO - Storing in - 2024-04-08 12:14:51,158 - JUNIFER - INFO - Fitting marker Schaefer200x17_RSSETS - 2024-04-08 12:14:51,159 - JUNIFER - INFO - Computing BOLD - 2024-04-08 12:14:51,159 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:14:51,159 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:14:51,159 - JUNIFER - INFO - resolution: 3.0 - 2024-04-08 12:14:51,159 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:14:51,159 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:14:51,159 - JUNIFER - INFO - At least one of the parcellation files are missing. Fetching using nilearn. - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_200Parcels_17Networks_order.txt ... - ...done. (0 seconds, 0 min) - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz ... - ...done. (0 seconds, 0 min) - 2024-04-08 12:14:51,243 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:14:51,275 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:14:52,320 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:14:52,417 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationss3161fxx/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellationss3161fxx/MNI152Lin_T1w_3.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp87hfp6w1/parcellationsr7zsj9gp/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:14:54,431 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:14:56,444 - JUNIFER - INFO - Storing in - 2024-04-08 12:14:56,463 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:14:56,464 - JUNIFER - INFO - Collecting data using SQLiteFeatureStorage - 2024-04-08 12:14:56,464 - JUNIFER - INFO - Collecting data from /tmp/tmpckj1v_gv/*test.sqlite - file: 0it [00:00, ?it/s] - feature: 0%| | 0/2 [00:00 -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
root_sum_of_squares_ets
subjecttimepoint
sub00101471.534513
178.624350
245.399273
369.362580
452.878724
-
- -
-
- - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** (0 minutes 13.174 seconds) - - -.. _sphx_glr_download_auto_examples_run_ets_rss_marker.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: run_ets_rss_marker.py ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: run_ets_rss_marker.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/run_junifer_julearn.rst.txt b/pr-preview/pr-273/_sources/auto_examples/run_junifer_julearn.rst.txt deleted file mode 100644 index 47252e70f..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/run_junifer_julearn.rst.txt +++ /dev/null @@ -1,694 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/run_junifer_julearn.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_run_junifer_julearn.py: - - -Run junifer and julearn. -======================== - -This example uses a ParcelAggregation marker to compute the mean of each parcel -using the Schaefer parcellation (100 rois, 7 Yeo networks) for a 3D nifti to -extract some features for machine learning using julearn to predict some other -data. - -Authors: Leonard Sasse, Sami Hamdan, Nicolas Nieto, Synchon Mandal - -License: BSD 3 clause - -.. GENERATED FROM PYTHON SOURCE LINES 14-27 - -.. code-block:: default - - - import tempfile - - import nilearn - import pandas as pd - from julearn import run_cross_validation, PipelineCreator - - import junifer.testing.registry # noqa: F401 - from junifer.api import collect, run - from junifer.storage.sqlite import SQLiteFeatureStorage - from junifer.utils import configure_logging - - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 28-29 - -Set the logging level to info to see extra information: - -.. GENERATED FROM PYTHON SOURCE LINES 29-32 - -.. code-block:: default - - configure_logging(level="INFO") - - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:14:56,674 - JUNIFER - INFO - ===== Lib Versions ===== - 2024-04-08 12:14:56,674 - JUNIFER - INFO - numpy: 1.26.4 - 2024-04-08 12:14:56,674 - JUNIFER - INFO - scipy: 1.11.4 - 2024-04-08 12:14:56,674 - JUNIFER - INFO - pandas: 2.1.4 - 2024-04-08 12:14:56,674 - JUNIFER - INFO - nilearn: 0.10.2 - 2024-04-08 12:14:56,674 - JUNIFER - INFO - nibabel: 5.2.1 - 2024-04-08 12:14:56,674 - JUNIFER - INFO - junifer: 0.0.5.dev11 - 2024-04-08 12:14:56,674 - JUNIFER - INFO - ======================== - - - - -.. GENERATED FROM PYTHON SOURCE LINES 33-34 - -Define the markers you want: - -.. GENERATED FROM PYTHON SOURCE LINES 34-52 - -.. code-block:: default - - - marker_dicts = [ - { - "name": "Schaefer100x17_TrimMean80", - "kind": "ParcelAggregation", - "parcellation": "Schaefer100x17", - "method": "trim_mean", - "method_params": {"proportiontocut": 0.2}, - }, - { - "name": "Schaefer200x17_Mean", - "kind": "ParcelAggregation", - "parcellation": "Schaefer200x17", - "method": "mean", - }, - ] - - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 53-54 - -Define target and confounds for julearn machine learning: - -.. GENERATED FROM PYTHON SOURCE LINES 54-58 - -.. code-block:: default - - y = "age" - confound = "sex" - - - - - - - - - -.. GENERATED FROM PYTHON SOURCE LINES 59-61 - -Load the VBM phenotype data for machine learning data: -- Fetch the Oasis dataset - -.. GENERATED FROM PYTHON SOURCE LINES 61-70 - -.. code-block:: default - - oasis_dataset = nilearn.datasets.fetch_oasis_vbm() - age = oasis_dataset.ext_vars[y][:10] - sex = ( - pd.Series(oasis_dataset.ext_vars["mf"][:10]) - .map(lambda x: 1 if x == "F" else 0) - .values - ) - - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - /opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/nilearn/datasets/struct.py:852: UserWarning: `legacy_format` will default to `False` in release 0.11. Dataset fetchers will then return pandas dataframes by default instead of recarrays. - warnings.warn(_LEGACY_FORMAT_MSG) - - - - -.. GENERATED FROM PYTHON SOURCE LINES 71-72 - -Create a temporary directory for junifer feature extraction: - -.. GENERATED FROM PYTHON SOURCE LINES 72-92 - -.. code-block:: default - - with tempfile.TemporaryDirectory() as tmpdir: - storage = {"kind": "SQLiteFeatureStorage", "uri": f"{tmpdir}/test.sqlite"} - # run the defined junifer feature extraction pipeline - run( - workdir="/tmp", - datagrabber={"kind": "OasisVBMTestingDataGrabber"}, - markers=marker_dicts, - storage=storage, - ) - - # read in extracted features and add confounds and targets - # for julearn run cross validation - collect(storage) - db = SQLiteFeatureStorage(uri=storage["uri"]) - - df_vbm = db.read_df(feature_name="VBM_GM_Schaefer200x17_Mean") - oasis_subjects = [x[0] for x in df_vbm.index] - df_vbm.index = oasis_subjects - - - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Validating Marker Collection - 2024-04-08 12:14:56,688 - JUNIFER - INFO - DataGrabber output type: ['VBM_GM'] - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Validating Data Reader: - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Data Reader output type: ['VBM_GM'] - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Validating Marker: Schaefer100x17_TrimMean80 - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Marker output type: ['vector'] - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Validating storage for Schaefer100x17_TrimMean80 - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Validating Marker: Schaefer200x17_Mean - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Marker output type: ['vector'] - 2024-04-08 12:14:56,688 - JUNIFER - INFO - Validating storage for Schaefer200x17_Mean - /opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/nilearn/datasets/struct.py:852: UserWarning: `legacy_format` will default to `False` in release 0.11. Dataset fetchers will then return pandas dataframes by default instead of recarrays. - warnings.warn(_LEGACY_FORMAT_MSG) - 2024-04-08 12:14:56,692 - JUNIFER - INFO - Getting element sub-01 - 2024-04-08 12:14:56,692 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:14:56,692 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0001_MR1/mwrc1OAS1_0001_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:14:56,692 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:14:56,693 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:14:56,693 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:14:56,693 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:14:56,693 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:14:56,693 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:14:56,694 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:14:56,694 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:14:56,695 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:14:56,724 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:14:57,776 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:14:57,873 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsfkpeo4km/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsfkpeo4km/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpb029b2ja/parcellationso58y65r_/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:14:59,273 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:00,222 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:00,252 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:00,252 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:00,252 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:00,252 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:00,252 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:00,252 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:00,252 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:00,253 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:00,284 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:01,330 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:01,428 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsmodx_tbr/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsmodx_tbr/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpb029b2ja/parcellationsy9dqwxst/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:03,449 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:04,398 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:04,445 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:04,445 - JUNIFER - INFO - Getting element sub-02 - 2024-04-08 12:15:04,445 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:04,445 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0002_MR1/mwrc1OAS1_0002_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:04,446 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:04,446 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:04,446 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:04,447 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:04,447 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:04,447 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:04,447 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:04,447 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:04,448 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:04,478 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:05,531 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:05,627 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsnotw221o/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsnotw221o/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp7epbiu6g/parcellationsywru3wh6/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:07,021 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:07,969 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:07,999 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:07,999 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:08,000 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:08,000 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:08,000 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:08,000 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:08,000 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:08,001 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:08,031 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:09,083 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:09,180 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsvwmvyb_n/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsvwmvyb_n/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp7epbiu6g/parcellations43s5y33s/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:11,181 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:12,152 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:12,199 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:12,199 - JUNIFER - INFO - Getting element sub-03 - 2024-04-08 12:15:12,199 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:12,199 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0003_MR1/mwrc1OAS1_0003_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:12,199 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:12,200 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:12,200 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:12,201 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:12,201 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:12,201 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:12,201 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:12,201 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:12,202 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:12,231 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:13,284 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:13,380 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsisugjj0n/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsisugjj0n/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp_n5yd0wl/parcellationsxkaffw_q/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:14,765 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:15,723 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:15,753 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:15,753 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:15,754 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:15,754 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:15,754 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:15,754 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:15,754 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:15,755 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:15,785 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:16,832 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:16,932 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsnq4sx43n/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsnq4sx43n/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp_n5yd0wl/parcellationsqw9jekr4/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:18,948 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:19,900 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:19,947 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:19,947 - JUNIFER - INFO - Getting element sub-04 - 2024-04-08 12:15:19,948 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:19,948 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0004_MR1/mwrc1OAS1_0004_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:19,948 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:19,948 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:19,949 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:19,949 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:19,949 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:19,949 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:19,949 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:19,949 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:19,950 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:19,980 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:21,030 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:21,127 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsnuuim68h/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsnuuim68h/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpi2c8cztg/parcellationssaxnu9tg/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:22,515 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:23,452 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:23,481 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:23,482 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:23,482 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:23,482 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:23,482 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:23,482 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:23,482 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:23,483 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:23,513 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:24,565 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:24,662 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations_1ciycav/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellations_1ciycav/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpi2c8cztg/parcellations0iq8r58e/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:26,665 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:27,623 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:27,670 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:27,670 - JUNIFER - INFO - Getting element sub-05 - 2024-04-08 12:15:27,670 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:27,670 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0005_MR1/mwrc1OAS1_0005_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:27,671 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:27,671 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:27,671 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:27,672 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:27,672 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:27,672 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:27,672 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:27,672 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:27,673 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:27,703 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:28,754 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:28,850 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsuxhzg98o/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsuxhzg98o/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmph1lo_vmm/parcellations1z6lc4ql/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:30,234 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:31,189 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:31,219 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:31,219 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:31,219 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:31,219 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:31,219 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:31,219 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:31,219 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:31,221 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:31,251 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:32,291 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:32,389 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations_4es1d0f/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellations_4es1d0f/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmph1lo_vmm/parcellationsh81aibfz/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:34,392 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:35,355 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:35,401 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:35,401 - JUNIFER - INFO - Getting element sub-06 - 2024-04-08 12:15:35,401 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:35,401 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0006_MR1/mwrc1OAS1_0006_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:35,401 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:35,402 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:35,402 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:35,403 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:35,403 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:35,403 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:35,403 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:35,403 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:35,404 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:35,433 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:36,469 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:36,567 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsp0su18f9/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsp0su18f9/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpsz4r8zn1/parcellationst5c64ax2/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:37,948 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:38,910 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:38,940 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:38,940 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:38,940 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:38,940 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:38,940 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:38,940 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:38,940 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:38,942 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:38,972 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:40,009 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:40,106 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations09awn_i5/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellations09awn_i5/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpsz4r8zn1/parcellationsd36qesmo/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:42,121 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:43,087 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:43,134 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:43,134 - JUNIFER - INFO - Getting element sub-07 - 2024-04-08 12:15:43,134 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:43,134 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0007_MR1/mwrc1OAS1_0007_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:43,134 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:43,135 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:43,135 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:43,136 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:43,136 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:43,136 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:43,136 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:43,136 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:43,137 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:43,166 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:44,200 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:44,296 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsxzy_wt_2/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsxzy_wt_2/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpl8mayfjq/parcellationsz5g8nw6i/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:45,680 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:46,632 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:46,662 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:46,662 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:46,663 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:46,663 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:46,663 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:46,663 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:46,663 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:46,664 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:46,694 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:47,729 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:47,826 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations85w60yh4/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellations85w60yh4/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpl8mayfjq/parcellationsjobxbnkt/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:49,835 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:50,801 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:50,848 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:50,848 - JUNIFER - INFO - Getting element sub-08 - 2024-04-08 12:15:50,848 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:50,848 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0009_MR1/mwrc1OAS1_0009_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:50,848 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:50,849 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:50,849 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:50,849 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:50,849 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:50,849 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:50,850 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:50,850 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:50,851 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:50,880 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:51,910 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:52,006 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsfqw30c3e/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsfqw30c3e/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpcec0v44p/parcellationsq33qr21s/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:53,383 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:54,329 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:54,358 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:15:54,358 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:54,359 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:54,359 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:54,359 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:54,359 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:15:54,359 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:54,360 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:54,390 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:55,425 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:55,522 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsuk_8xk4q/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsuk_8xk4q/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpcec0v44p/parcellationsdx9eh8vs/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:15:57,529 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:15:58,499 - JUNIFER - INFO - Storing in - 2024-04-08 12:15:58,545 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:15:58,545 - JUNIFER - INFO - Getting element sub-09 - 2024-04-08 12:15:58,546 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:15:58,546 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0010_MR1/mwrc1OAS1_0010_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:15:58,546 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:15:58,546 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:15:58,546 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:15:58,547 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:15:58,547 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:15:58,547 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:15:58,547 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:15:58,547 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:15:58,548 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:15:58,578 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:15:59,617 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:15:59,713 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsdxkc72am/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsdxkc72am/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpitk3y05j/parcellations9c19_95r/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:16:01,100 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:16:02,086 - JUNIFER - INFO - Storing in - 2024-04-08 12:16:02,116 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:16:02,116 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:16:02,116 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:16:02,116 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:16:02,116 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:16:02,116 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:16:02,116 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:16:02,117 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:16:02,148 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:16:03,181 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:16:03,278 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsb4e2yuq7/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellationsb4e2yuq7/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpitk3y05j/parcellationsupnq5fju/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:16:05,296 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:16:06,284 - JUNIFER - INFO - Storing in - 2024-04-08 12:16:06,330 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:16:06,330 - JUNIFER - INFO - Getting element sub-10 - 2024-04-08 12:16:06,330 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:16:06,330 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0011_MR1/mwrc1OAS1_0011_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:16:06,330 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:16:06,331 - JUNIFER - INFO - Fitting marker Schaefer100x17_TrimMean80 - 2024-04-08 12:16:06,331 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:16:06,331 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:16:06,331 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:16:06,332 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:16:06,332 - JUNIFER - INFO - n_rois: 100 - 2024-04-08 12:16:06,332 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:16:06,333 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_100Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:16:06,362 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:16:07,399 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:16:07,495 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations906xhzmd/Schaefer100x17.nii.gz -r /tmp/tmp1m1i0723/parcellations906xhzmd/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpnyf0ry98/parcellationshqiol7km/Schaefer100x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:16:08,885 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:16:09,848 - JUNIFER - INFO - Storing in - 2024-04-08 12:16:09,877 - JUNIFER - INFO - Fitting marker Schaefer200x17_Mean - 2024-04-08 12:16:09,877 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:16:09,878 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:16:09,878 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:16:09,878 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:16:09,878 - JUNIFER - INFO - n_rois: 200 - 2024-04-08 12:16:09,878 - JUNIFER - INFO - yeo_networks: 17 - 2024-04-08 12:16:09,879 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_200Parcels_17Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:16:09,909 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:16:10,953 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:16:11,049 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations_uq0ii5s/Schaefer200x17.nii.gz -r /tmp/tmp1m1i0723/parcellations_uq0ii5s/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpnyf0ry98/parcellations9wkkqthe/Schaefer200x17_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:16:13,139 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:16:14,101 - JUNIFER - INFO - Storing in - 2024-04-08 12:16:14,147 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:16:14,147 - JUNIFER - INFO - Collecting data using SQLiteFeatureStorage - 2024-04-08 12:16:14,148 - JUNIFER - INFO - Collecting data from /tmp/tmpju0jxkwp/*test.sqlite - file: 0it [00:00, ?it/s] - feature: 0%| | 0/2 [00:00` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: run_junifer_julearn.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/run_run_gmd_mean.rst.txt b/pr-preview/pr-273/_sources/auto_examples/run_run_gmd_mean.rst.txt deleted file mode 100644 index add1cfa94..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/run_run_gmd_mean.rst.txt +++ /dev/null @@ -1,655 +0,0 @@ - -.. DO NOT EDIT. -.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. -.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: -.. "auto_examples/run_run_gmd_mean.py" -.. LINE NUMBERS ARE GIVEN BELOW. - -.. only:: html - - .. note:: - :class: sphx-glr-download-link-note - - :ref:`Go to the end ` - to download the full example code - -.. rst-class:: sphx-glr-example-title - -.. _sphx_glr_auto_examples_run_run_gmd_mean.py: - - -UKB VBM GMD Extraction -====================== - -Authors: Federico Raimondo - -License: BSD 3 clause - -.. GENERATED FROM PYTHON SOURCE LINES 9-54 - - - - -.. rst-class:: sphx-glr-script-out - - .. code-block:: none - - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Registering OasisVBMTestingDataGrabber in datagrabber - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Registering SPMAuditoryTestingDataGrabber in datagrabber - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Registering PartlyCloudyTestingDataGrabber in datagrabber - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Validating Marker Collection - 2024-04-08 12:00:47,024 - JUNIFER - INFO - DataGrabber output type: ['VBM_GM'] - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Validating Data Reader: - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Data Reader output type: ['VBM_GM'] - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Validating Marker: Schaefer1000x7_TrimMean80 - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Marker output type: ['vector'] - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Validating storage for Schaefer1000x7_TrimMean80 - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Validating Marker: Schaefer1000x7_Mean - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Marker output type: ['vector'] - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Validating storage for Schaefer1000x7_Mean - 2024-04-08 12:00:47,024 - JUNIFER - INFO - Validating Marker: Schaefer1000x7_Std - 2024-04-08 12:00:47,025 - JUNIFER - INFO - Marker output type: ['vector'] - 2024-04-08 12:00:47,025 - JUNIFER - INFO - Validating storage for Schaefer1000x7_Std - - Dataset created in /home/runner/nilearn_data/oasis1 - - Downloading data from https://www.nitrc.org/frs/download.php/6364/archive_dartel.tgz ... - Downloaded 29188096 of 905208634 bytes (3.2%, 30.5s remaining) Downloaded 78929920 of 905208634 bytes (8.7%, 21.3s remaining) Downloaded 129310720 of 905208634 bytes (14.3%, 18.3s remaining) Downloaded 179273728 of 905208634 bytes (19.8%, 16.5s remaining) Downloaded 229277696 of 905208634 bytes (25.3%, 15.0s remaining) Downloaded 279789568 of 905208634 bytes (30.9%, 13.7s remaining) Downloaded 329875456 of 905208634 bytes (36.4%, 12.4s remaining) Downloaded 379125760 of 905208634 bytes (41.9%, 11.3s remaining) Downloaded 430022656 of 905208634 bytes (47.5%, 10.1s remaining) Downloaded 482467840 of 905208634 bytes (53.3%, 8.9s remaining) Downloaded 536412160 of 905208634 bytes (59.3%, 7.7s remaining) Downloaded 587587584 of 905208634 bytes (64.9%, 6.6s remaining) Downloaded 616726528 of 905208634 bytes (68.1%, 6.2s remaining) Downloaded 669048832 of 905208634 bytes (73.9%, 5.0s remaining) Downloaded 700121088 of 905208634 bytes (77.3%, 4.4s remaining) Downloaded 726073344 of 905208634 bytes (80.2%, 4.0s remaining) Downloaded 753737728 of 905208634 bytes (83.3%, 3.4s remaining) Downloaded 779427840 of 905208634 bytes (86.1%, 2.9s remaining) Downloaded 803807232 of 905208634 bytes (88.8%, 2.4s remaining) Downloaded 851525632 of 905208634 bytes (94.1%, 1.3s remaining) Downloaded 884383744 of 905208634 bytes (97.7%, 0.5s remaining) ...done. (22 seconds, 0 min) - Extracting data from /home/runner/nilearn_data/oasis1/7088b0bf88f5650db26e32ec3afdd589/archive_dartel.tgz..... done. - /opt/hostedtoolcache/Python/3.11.8/x64/lib/python3.11/site-packages/nilearn/datasets/struct.py:852: UserWarning: `legacy_format` will default to `False` in release 0.11. Dataset fetchers will then return pandas dataframes by default instead of recarrays. - warnings.warn(_LEGACY_FORMAT_MSG) - 2024-04-08 12:01:15,292 - JUNIFER - INFO - Getting element sub-01 - 2024-04-08 12:01:15,292 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:01:15,292 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0001_MR1/mwrc1OAS1_0001_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:01:15,292 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:01:15,293 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:01:15,293 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:01:15,294 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:01:15,294 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:01:15,294 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:01:15,294 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:01:15,294 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:01:15,294 - JUNIFER - INFO - At least one of the parcellation files are missing. Fetching using nilearn. - - Dataset created in /home/runner/junifer/data/parcellations/schaefer_2018 - - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_1000Parcels_7Networks_order.txt ... - ...done. (0 seconds, 0 min) - Downloading data from https://raw.githubusercontent.com/ThomasYeoLab/CBIG/v0.14.3-Update_Yeo2011_Schaefer2018_labelname/stable_projects/brain_parcellation/Schaefer2018_LocalGlobal/Parcellations/MNI/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz ... - ...done. (0 seconds, 0 min) - 2024-04-08 12:01:15,389 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:01:15,425 - JUNIFER - INFO - Downloading xfm file for MNI152NLin6Asym to MNI152Lin from https://gin.g-node.org/juaml/human-template-xfms/raw/main/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:09:24,440 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - Downloading https://templateflow.s3.amazonaws.com/tpl-MNI152Lin/tpl-MNI152Lin_res-02_T1w.nii.gz - 0%| | 0.00/1.45M [00:00 - 2024-04-08 12:09:34,085 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:09:34,085 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:09:34,085 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:09:34,085 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:09:34,085 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:09:34,085 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:09:34,085 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:09:34,087 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:09:34,124 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:09:35,284 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:09:35,383 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsjz7w1qcj/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsjz7w1qcj/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpwekmg7i4/parcellationsgdsrpxjd/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:09:42,679 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:09:43,782 - JUNIFER - INFO - Storing in - 2024-04-08 12:09:43,943 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:09:43,943 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:09:43,944 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:09:43,944 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:09:43,944 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:09:43,944 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:09:43,944 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:09:43,946 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:09:43,982 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:09:45,141 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:09:45,240 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsvt1bh45f/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsvt1bh45f/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpwekmg7i4/parcellationspf0kxufe/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:09:52,548 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:09:53,670 - JUNIFER - INFO - Storing in - 2024-04-08 12:09:53,832 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:09:53,833 - JUNIFER - INFO - Getting element sub-02 - 2024-04-08 12:09:53,833 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:09:53,833 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0002_MR1/mwrc1OAS1_0002_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:09:53,833 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:09:53,834 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:09:53,834 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:09:53,834 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:09:53,834 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:09:53,834 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:09:53,834 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:09:53,834 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:09:53,836 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:09:53,872 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:09:55,031 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:09:55,130 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsizosbcyy/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsizosbcyy/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpq3thpv7a/parcellations5sstqldx/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:10:02,371 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:10:03,489 - JUNIFER - INFO - Storing in - 2024-04-08 12:10:03,644 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:10:03,644 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:10:03,644 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:10:03,644 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:10:03,644 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:10:03,644 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:10:03,644 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:10:03,646 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:10:03,684 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:10:04,838 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:10:04,937 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations65_sugl3/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellations65_sugl3/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpq3thpv7a/parcellationssdx7ect8/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:10:12,217 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:10:13,332 - JUNIFER - INFO - Storing in - 2024-04-08 12:10:13,492 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:10:13,492 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:10:13,492 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:10:13,493 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:10:13,493 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:10:13,493 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:10:13,493 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:10:13,495 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:10:13,533 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:10:14,695 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:10:14,794 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationso7t49oyl/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationso7t49oyl/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpq3thpv7a/parcellations9jlfcgbb/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:10:22,034 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:10:23,148 - JUNIFER - INFO - Storing in - 2024-04-08 12:10:23,309 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:10:23,309 - JUNIFER - INFO - Getting element sub-03 - 2024-04-08 12:10:23,309 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:10:23,310 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0003_MR1/mwrc1OAS1_0003_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:10:23,310 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:10:23,310 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:10:23,310 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:10:23,311 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:10:23,311 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:10:23,311 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:10:23,311 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:10:23,311 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:10:23,313 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:10:23,349 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:10:24,505 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:10:24,604 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsi5b81t09/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsi5b81t09/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmponqnbxru/parcellations1k6422j3/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:10:31,878 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:10:33,012 - JUNIFER - INFO - Storing in - 2024-04-08 12:10:33,167 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:10:33,167 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:10:33,168 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:10:33,168 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:10:33,168 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:10:33,168 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:10:33,168 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:10:33,170 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:10:33,207 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:10:34,371 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:10:34,470 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsocvagklf/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsocvagklf/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmponqnbxru/parcellationspirmlkgu/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:10:41,634 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:10:42,738 - JUNIFER - INFO - Storing in - 2024-04-08 12:10:42,894 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:10:42,894 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:10:42,895 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:10:42,895 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:10:42,895 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:10:42,895 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:10:42,895 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:10:42,897 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:10:42,934 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:10:44,102 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:10:44,201 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsc90o4s71/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsc90o4s71/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmponqnbxru/parcellations1d37ondb/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:10:51,441 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:10:52,567 - JUNIFER - INFO - Storing in - 2024-04-08 12:10:52,730 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:10:52,730 - JUNIFER - INFO - Getting element sub-04 - 2024-04-08 12:10:52,730 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:10:52,730 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0004_MR1/mwrc1OAS1_0004_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:10:52,730 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:10:52,731 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:10:52,731 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:10:52,732 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:10:52,732 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:10:52,732 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:10:52,732 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:10:52,732 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:10:52,734 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:10:52,770 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:10:53,934 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:10:54,034 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsufq7a2u2/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsufq7a2u2/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpeffnfy3u/parcellations9o4kjyvb/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:11:01,306 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:11:02,423 - JUNIFER - INFO - Storing in - 2024-04-08 12:11:02,576 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:11:02,576 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:11:02,577 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:11:02,577 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:11:02,577 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:11:02,577 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:11:02,577 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:11:02,579 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:11:02,615 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:11:03,781 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:11:03,880 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsqxtmv0g6/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsqxtmv0g6/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpeffnfy3u/parcellationsoloen7de/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:11:11,613 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:11:12,701 - JUNIFER - INFO - Storing in - 2024-04-08 12:11:12,860 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:11:12,860 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:11:12,860 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:11:12,860 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:11:12,860 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:11:12,860 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:11:12,860 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:11:12,862 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:11:12,898 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:11:14,071 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:11:14,169 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsa2ygyx6c/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsa2ygyx6c/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpeffnfy3u/parcellations44jj0xhh/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:11:21,395 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:11:22,502 - JUNIFER - INFO - Storing in - 2024-04-08 12:11:22,664 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:11:22,664 - JUNIFER - INFO - Getting element sub-05 - 2024-04-08 12:11:22,664 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:11:22,665 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0005_MR1/mwrc1OAS1_0005_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:11:22,665 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:11:22,665 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:11:22,665 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:11:22,666 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:11:22,666 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:11:22,666 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:11:22,666 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:11:22,666 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:11:22,668 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:11:22,703 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:11:23,869 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:11:23,968 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsy9xed4qw/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsy9xed4qw/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp8dffu0m9/parcellations_md7s9ts/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:11:31,317 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:11:32,446 - JUNIFER - INFO - Storing in - 2024-04-08 12:11:32,600 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:11:32,600 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:11:32,601 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:11:32,601 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:11:32,601 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:11:32,601 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:11:32,601 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:11:32,603 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:11:32,638 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:11:33,802 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:11:33,901 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsjlumxr00/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsjlumxr00/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp8dffu0m9/parcellationsarbzafcp/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:11:41,175 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:11:42,282 - JUNIFER - INFO - Storing in - 2024-04-08 12:11:42,441 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:11:42,441 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:11:42,441 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:11:42,442 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:11:42,442 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:11:42,442 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:11:42,442 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:11:42,443 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:11:42,483 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:11:43,657 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:11:43,757 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationshs8zwe9o/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationshs8zwe9o/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp8dffu0m9/parcellationsoq__0yin/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:11:51,039 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:11:52,159 - JUNIFER - INFO - Storing in - 2024-04-08 12:11:52,318 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:11:52,318 - JUNIFER - INFO - Getting element sub-06 - 2024-04-08 12:11:52,318 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:11:52,318 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0006_MR1/mwrc1OAS1_0006_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:11:52,318 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:11:52,319 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:11:52,319 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:11:52,319 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:11:52,320 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:11:52,320 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:11:52,320 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:11:52,320 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:11:52,321 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:11:52,357 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:11:53,522 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:11:53,622 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsj0368bop/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsj0368bop/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp7c2y078d/parcellationso60217t1/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:12:00,890 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:12:02,006 - JUNIFER - INFO - Storing in - 2024-04-08 12:12:02,161 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:12:02,161 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:12:02,161 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:12:02,161 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:12:02,161 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:12:02,161 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:12:02,161 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:12:02,163 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:12:02,201 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:12:03,373 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:12:03,472 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationstyvwnlwt/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationstyvwnlwt/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp7c2y078d/parcellations32b4l585/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:12:10,713 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:12:11,815 - JUNIFER - INFO - Storing in - 2024-04-08 12:12:11,973 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:12:11,973 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:12:11,974 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:12:11,974 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:12:11,974 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:12:11,974 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:12:11,974 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:12:11,976 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:12:12,014 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:12:13,183 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:12:13,282 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations89akj2w8/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellations89akj2w8/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp7c2y078d/parcellationsc5vxz2gh/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:12:20,476 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:12:21,583 - JUNIFER - INFO - Storing in - 2024-04-08 12:12:21,742 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:12:21,743 - JUNIFER - INFO - Getting element sub-07 - 2024-04-08 12:12:21,743 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:12:21,743 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0007_MR1/mwrc1OAS1_0007_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:12:21,743 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:12:21,744 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:12:21,744 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:12:21,744 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:12:21,744 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:12:21,744 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:12:21,744 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:12:21,744 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:12:21,746 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:12:21,782 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:12:22,949 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:12:23,048 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations9p4tltso/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellations9p4tltso/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpqnj8j5yc/parcellationsbtyozzjn/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:12:30,433 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:12:31,562 - JUNIFER - INFO - Storing in - 2024-04-08 12:12:31,717 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:12:31,717 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:12:31,717 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:12:31,717 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:12:31,717 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:12:31,717 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:12:31,717 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:12:31,719 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:12:31,756 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:12:32,932 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:12:33,031 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations_c9hi3r6/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellations_c9hi3r6/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpqnj8j5yc/parcellationsd6z7rxl2/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:12:40,242 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:12:41,369 - JUNIFER - INFO - Storing in - 2024-04-08 12:12:41,527 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:12:41,527 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:12:41,527 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:12:41,527 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:12:41,527 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:12:41,527 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:12:41,527 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:12:41,529 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:12:41,568 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:12:42,735 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:12:42,834 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellations696c_cr1/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellations696c_cr1/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpqnj8j5yc/parcellationsi2be9fg3/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:12:50,129 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:12:51,255 - JUNIFER - INFO - Storing in - 2024-04-08 12:12:51,416 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:12:51,417 - JUNIFER - INFO - Getting element sub-08 - 2024-04-08 12:12:51,417 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:12:51,417 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0009_MR1/mwrc1OAS1_0009_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:12:51,417 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:12:51,418 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:12:51,418 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:12:51,418 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:12:51,418 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:12:51,418 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:12:51,418 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:12:51,418 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:12:51,420 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:12:51,457 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:12:52,626 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:12:52,726 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsnty14cau/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsnty14cau/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpcqegth9s/parcellationshlufz8ev/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:13:00,135 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:13:01,268 - JUNIFER - INFO - Storing in - 2024-04-08 12:13:01,422 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:13:01,422 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:13:01,422 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:13:01,422 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:13:01,422 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:13:01,422 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:13:01,422 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:13:01,424 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:13:01,461 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:13:02,626 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:13:02,725 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsrjdrmo6n/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsrjdrmo6n/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpcqegth9s/parcellationsb3vrdsjq/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:13:10,068 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:13:11,170 - JUNIFER - INFO - Storing in - 2024-04-08 12:13:11,332 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:13:11,332 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:13:11,332 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:13:11,333 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:13:11,333 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:13:11,333 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:13:11,333 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:13:11,334 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:13:11,371 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:13:12,538 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:13:12,637 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsk76chrg_/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsk76chrg_/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpcqegth9s/parcellationsva0zcxm3/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:13:19,881 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:13:20,994 - JUNIFER - INFO - Storing in - 2024-04-08 12:13:21,156 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:13:21,156 - JUNIFER - INFO - Getting element sub-09 - 2024-04-08 12:13:21,156 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:13:21,156 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0010_MR1/mwrc1OAS1_0010_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:13:21,156 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:13:21,157 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:13:21,157 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:13:21,158 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:13:21,158 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:13:21,158 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:13:21,158 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:13:21,158 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:13:21,160 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:13:21,195 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:13:22,361 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:13:22,460 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationszgqdrexc/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationszgqdrexc/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp9vqwl_yi/parcellationsanppsimu/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:13:29,795 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:13:30,957 - JUNIFER - INFO - Storing in - 2024-04-08 12:13:31,110 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:13:31,110 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:13:31,110 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:13:31,110 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:13:31,110 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:13:31,110 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:13:31,110 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:13:31,112 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:13:31,145 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:13:32,320 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:13:32,419 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsq5_qremz/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsq5_qremz/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp9vqwl_yi/parcellationsrr1okd1k/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:13:39,751 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:13:40,878 - JUNIFER - INFO - Storing in - 2024-04-08 12:13:41,037 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:13:41,037 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:13:41,037 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:13:41,037 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:13:41,037 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:13:41,037 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:13:41,037 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:13:41,039 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:13:41,072 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:13:42,239 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:13:42,338 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsgtaav7e2/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsgtaav7e2/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmp9vqwl_yi/parcellationslj0sgw53/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:13:49,627 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:13:50,764 - JUNIFER - INFO - Storing in - 2024-04-08 12:13:50,924 - JUNIFER - INFO - Marker collection fitting done - 2024-04-08 12:13:50,925 - JUNIFER - INFO - Getting element sub-10 - 2024-04-08 12:13:50,925 - JUNIFER - INFO - Fitting pipeline - 2024-04-08 12:13:50,925 - JUNIFER - INFO - Reading VBM_GM from /home/runner/nilearn_data/oasis1/OAS1_0011_MR1/mwrc1OAS1_0011_MR1_mpr_anon_fslswapdim_bet.nii.gz - 2024-04-08 12:13:50,925 - JUNIFER - INFO - VBM_GM is type NIFTI - 2024-04-08 12:13:50,926 - JUNIFER - INFO - Fitting marker Schaefer1000x7_TrimMean80 - 2024-04-08 12:13:50,926 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:13:50,926 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:13:50,926 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:13:50,926 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:13:50,926 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:13:50,926 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:13:50,928 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:13:50,960 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:13:52,125 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:13:52,224 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsb3zxhk_z/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsb3zxhk_z/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpszs5dtn9/parcellations7woq2tbm/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:13:59,467 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:14:00,577 - JUNIFER - INFO - Storing in - 2024-04-08 12:14:00,731 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Mean - 2024-04-08 12:14:00,731 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:14:00,732 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:14:00,732 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:14:00,732 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:14:00,732 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:14:00,732 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:14:00,734 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:14:00,766 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:14:01,940 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:14:02,039 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsicuxxndl/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsicuxxndl/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpszs5dtn9/parcellationsk58spyo6/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:14:09,304 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:14:10,410 - JUNIFER - INFO - Storing in - 2024-04-08 12:14:10,568 - JUNIFER - INFO - Fitting marker Schaefer1000x7_Std - 2024-04-08 12:14:10,569 - JUNIFER - INFO - Computing VBM_GM - 2024-04-08 12:14:10,569 - JUNIFER - INFO - Fetching one of Schaefer parcellations. - 2024-04-08 12:14:10,569 - JUNIFER - INFO - Parcellation parameters: - 2024-04-08 12:14:10,569 - JUNIFER - INFO - resolution: 2.0 - 2024-04-08 12:14:10,569 - JUNIFER - INFO - n_rois: 1000 - 2024-04-08 12:14:10,569 - JUNIFER - INFO - yeo_networks: 7 - 2024-04-08 12:14:10,571 - JUNIFER - INFO - Loading parcellation /home/runner/junifer/data/parcellations/schaefer_2018/Schaefer2018_1000Parcels_7Networks_order_FSLMNI152_2mm.nii.gz - 2024-04-08 12:14:10,603 - JUNIFER - INFO - Found existing xfm file for MNI152NLin6Asym to MNI152Lin at /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 - 2024-04-08 12:14:11,770 - JUNIFER - INFO - Downloading template MNI152Lin in resolution 2 - 2024-04-08 12:14:11,869 - JUNIFER - INFO - antsApplyTransforms command to be executed: - antsApplyTransforms -d 3 -e 3 -n 'GenericLabel[NearestNeighbor]' -i /tmp/tmp1m1i0723/parcellationsqd30fin3/Schaefer1000x7.nii.gz -r /tmp/tmp1m1i0723/parcellationsqd30fin3/MNI152Lin_T1w_2.0.nii.gz -t /home/runner/junifer/data/xfms/MNI152NLin6Asym_to_MNI152Lin/MNI152NLin6Asym_to_MNI152Lin_Composite.h5 -o /tmp/tmpszs5dtn9/parcellationsodaf03d3/Schaefer1000x7_warped_from_MNI152NLin6Asym_to_MNI152Lin.nii.gz - 2024-04-08 12:14:19,202 - JUNIFER - INFO - antsApplyTransforms command succeeded with the following output: - b'' - 2024-04-08 12:14:20,306 - JUNIFER - INFO - Storing in - 2024-04-08 12:14:20,467 - JUNIFER - INFO - Marker collection fitting done - - - - - - -| - -.. code-block:: default - - import tempfile - - import junifer.testing.registry # noqa: F401 - from junifer.api import run - - - datagrabber = { - "kind": "OasisVBMTestingDataGrabber", - } - - markers = [ - { - "name": "Schaefer1000x7_TrimMean80", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "trim_mean", - "method_params": {"proportiontocut": 0.2}, - }, - { - "name": "Schaefer1000x7_Mean", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "mean", - }, - { - "name": "Schaefer1000x7_Std", - "kind": "ParcelAggregation", - "parcellation": "Schaefer1000x7", - "method": "std", - }, - ] - - storage = { - "kind": "SQLiteFeatureStorage", - } - - with tempfile.TemporaryDirectory() as tmpdir: - uri = f"{tmpdir}/test.sqlite" - storage["uri"] = uri - run( - workdir="/tmp", - datagrabber=datagrabber, - markers=markers, - storage=storage, - ) - - -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** (13 minutes 33.446 seconds) - - -.. _sphx_glr_download_auto_examples_run_run_gmd_mean.py: - -.. only:: html - - .. container:: sphx-glr-footer sphx-glr-footer-example - - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: run_run_gmd_mean.py ` - - .. container:: sphx-glr-download sphx-glr-download-jupyter - - :download:`Download Jupyter notebook: run_run_gmd_mean.ipynb ` - - -.. only:: html - - .. rst-class:: sphx-glr-signature - - `Gallery generated by Sphinx-Gallery `_ diff --git a/pr-preview/pr-273/_sources/auto_examples/sg_execution_times.rst.txt b/pr-preview/pr-273/_sources/auto_examples/sg_execution_times.rst.txt deleted file mode 100644 index bc26dc93d..000000000 --- a/pr-preview/pr-273/_sources/auto_examples/sg_execution_times.rst.txt +++ /dev/null @@ -1,25 +0,0 @@ - -:orphan: - -.. _sphx_glr_auto_examples_sg_execution_times: - - -Computation times -================= -**15:38.234** total execution time for **auto_examples** files: - -+-----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_run_run_gmd_mean.py` (``run_run_gmd_mean.py``) | 13:33.446 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_run_junifer_julearn.py` (``run_junifer_julearn.py``) | 01:19.572 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_run_compute_parcel_mean.py` (``run_compute_parcel_mean.py``) | 00:22.662 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_run_ets_rss_marker.py` (``run_ets_rss_marker.py``) | 00:13.174 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_run_datagrabber_bids_datalad.py` (``run_datagrabber_bids_datalad.py``) | 00:09.379 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_norun_hcpfc_pearson.py` (``norun_hcpfc_pearson.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_norun_ukbvm_gmd.py` (``norun_ukbvm_gmd.py``) | 00:00.000 | 0.0 MB | -+-----------------------------------------------------------------------------------------------------+-----------+--------+ diff --git a/pr-preview/pr-273/_sources/builtin.rst.txt b/pr-preview/pr-273/_sources/builtin.rst.txt deleted file mode 100644 index cc8d8eb40..000000000 --- a/pr-preview/pr-273/_sources/builtin.rst.txt +++ /dev/null @@ -1,746 +0,0 @@ -.. include:: links.inc - -.. _builtin: - -Built-in Pipeline Components -============================ - - -Data Grabber ------------- - -.. - Provide a list of the DataGrabbers that are implemented or planned. - Access: Valid options are - - Open - - Open with registration - - Restricted - - Type/config: this should mention whether the class is built-in in the - core of junifer or needs to be imported from a specific configuration in - the `junifer.configs` module. - - State: this should indicate the state of the dataset. Valid options are - - Planned - - In Progress - - Done - - Version added: If the status is "Done", the junifer version in which the - dataset was added. Else, a link to the Github issue or pull request - implementing the dataset. Links to github can be added by using the - following syntax: :gh:`` - -Available -~~~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Class - - Description - - Access - - Type/Config - - State - - Version Added - * - :class:`.DataladHCP1200` - - `HCP OpenAccess dataset `_ - - Open with registration - - Built-in - - Done - - 0.0.1 - * - :class:`.JuselessDataladUKBVBM` - - | UKB VBM dataset preprocessed with CAT. - | Available for Juseless only. - - Restricted - - ``junifer.configs.juseless`` - - Done - - 0.0.1 - * - :class:`.JuselessDataladCamCANVBM` - - | CamCAN VBM dataset preprocessed with CAT. - | Available for Juseless only. - - Restricted - - ``junifer.configs.juseless`` - - Done - - 0.0.1 - * - :class:`.DataladAOMICID1000` - - `AOMIC 1000 dataset `_ - - Open without registration - - Built-in - - Done - - 0.0.1 - * - :class:`.DataladAOMICPIOP1` - - `AOMIC PIOP1 dataset `_ - - Open without registration - - Built-in - - Done - - 0.0.1 - * - :class:`.DataladAOMICPIOP2` - - `AOMIC PIOP2 dataset `_ - - Open without registration - - Built-in - - Done - - 0.0.1 - * - :class:`.JuselessDataladAOMICID1000VBM` - - | AOMIC ID1000 VBM dataset. - | Available for Juseless only. - - Restricted - - ``junifer.configs.juseless`` - - Done - - 0.0.1 - * - :class:`.JuselessDataladIXIVBM` - - | `IXI VBM dataset `_. - | Available for Juseless only. - - Restricted - - ``junifer.configs.juseless`` - - Done - - 0.0.1 - * - :class:`.JuselessUCLA` - - | UCLA fMRIPrep dataset. - | Available for Juseless only. - - Restricted - - ``junifer.configs.juseless`` - - Done - - 0.0.1 - -Planned -~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Description - - Access - - Type/Config - - Reference - * - ENKI - - ENKI dataset for Juseless - - Restricted - - ``junifer.configs.juseless`` - - :gh:`47` - - -Preprocessor ------------- - -.. - Provide a list of the Preprocessors that are implemented or planned. - - State: this should indicate the state of the preprocessor. Valid options are - - Planned - - In Progress - - Done - - Version added: If the status is "Done", the junifer version in which the - preprocessor was added. Else, a link to the Github issue or pull request - implementing the preprocessor. Links to github can be added by using the - following syntax: :gh:`` - -Available -~~~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Class - - Description - - State - - Version Added - * - :class:`.fMRIPrepConfoundRemover` - - Remove confounds from ``fMRIPrep``-ed data - - Done - - 0.0.1 - * - :class:`.SpaceWarper` - - | Warp / transform data from one space to another - | (subject-native or other template spaces) - - Done - - 0.0.4 - * - ``Smoothing`` - - | Apply smoothing to data, particularly useful when dealing with - | ``fMRIPrep``-ed data - - In Progress - - :gh:`161` - - -.. - Planned - ~~~~~~~ - - -Marker ------- - -.. - Provide a list of the Markers that are implemented or planned. - - State: this should indicate the state of the marker. Valid options are - - Planned - - In Progress - - Done - - Version added: If the status is "Done", the junifer version in which the - marker was added. Else, a link to the Github issue or pull request - implementing the marker. Links to github can be added by using the - following syntax: :gh:`` - -Available -~~~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Class - - Description - - State - - Version Added - * - :class:`.ParcelAggregation` - - Apply parcellation and perform aggregation function - - Done - - 0.0.1 - * - :class:`.FunctionalConnectivityParcels` - - Compute functional connectivity over parcellation - - Done - - 0.0.1 - * - :class:`.CrossParcellationFC` - - Compute functional connectivity across two parcellations - - Done - - 0.0.1 - * - :class:`.SphereAggregation` - - Spherical aggregation using mean - - Done - - 0.0.1 - * - :class:`.FunctionalConnectivitySpheres` - - Compute functional connectivity over spheres placed on coordinates - - Done - - 0.0.1 - * - :class:`.RSSETSMarker` - - Compute root sum of squares of edgewise timeseries - - Done - - 0.0.1 - * - :class:`.ReHoParcels` - - Calculate regional homogeneity over parcellation - - Done - - 0.0.1 - * - :class:`.ReHoSpheres` - - Calculate regional homogeneity over spheres placed on coordinates - - Done - - 0.0.1 - * - :class:`.ALFFParcels` - - Calculate (f)ALFF and aggregate using parcellations - - Done - - 0.0.1 - * - :class:`.ALFFSpheres` - - Calculate (f)ALFF and aggregate using spheres placed on coordinates - - Done - - 0.0.1 - * - :class:`.EdgeCentricFCParcels` - - | Calculate edge-centric functional connectivity over parcellation, as - | found in - | `Jo et al. (2021) `_ - - Done - - 0.0.2 - * - :class:`.EdgeCentricFCSpheres` - - | Calculate edge-centric functional connectivity over spheres placed on - | coordinates, as found in - | `Jo et al. (2021) `_ - - Done - - 0.0.2 - * - :class:`.TemporalSNRParcels` - - Calculate temporal signal-to-noise ratio using parcellations - - Done - - 0.0.2 - * - :class:`.TemporalSNRSpheres` - - | Calculate temporal signal-to-noise ratio using spheres placed on - | coordinates - - Done - - 0.0.2 - * - :class:`.HurstExponent` - - | Calculate Hurst exponent of a time series as found in - | `Peng et al. (1995) `_ - - Done - - 0.0.4 - * - :class:`.MultiscaleEntropyAUC` - - | Calculate AUC of multiscale entropy of a time series as found in - | `Costa et al. (2002) `_ - - Done - - 0.0.4 - * - :class:`.PermEntropy` - - | Calculate permutation entropy of a time series as found in - | `Bandt at al. (2002) `_ - - Done - - 0.0.4 - * - :class:`.RangeEntropy` - - | Calculate range entropy of a time series as found in - | `Omidvarnia et al. (2018) `_ - - Done - - 0.0.4 - * - :class:`.RangeEntropyAUC` - - | Calculate AUC of range entropy of a time series as found in - | `Omidvarnia et al. (2018) `_ - - Done - - 0.0.4 - * - :class:`.SampleEntropy` - - | Calculate sample entropy of a time series as found in - | `Richman et al. (2000) `_ - - Done - - 0.0.4 - -Planned -~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Description - - Reference - * - Connectedness - - Compute connectedness - - :gh:`34` - -Parcellation ------------- - -.. - Provide a list of the Parcellations that are implemented or planned. - - Version added: The junifer version in which the parcellation was added. - -Available -~~~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Options - - Keys - - Template Spaces - - Version Added - - Publication - * - Schaefer - - ``n_rois``, ``yeo_networks`` - - | ``Schaefer900x7``, ``Schaefer1000x7``, ``Schaefer100x17``, - | ``Schaefer200x17``, ``Schaefer300x17``, ``Schaefer400x17``, - | ``Schaefer500x17``, ``Schaefer600x17``, ``Schaefer700x17``, - | ``Schaefer800x17``, ``Schaefer900x17``, ``Schaefer1000x17`` - - ``MNI152NLin6Asym`` - - 0.0.1 - - | Schaefer, A., Kong, R., Gordon, E.M. et al. - | Local-Global Parcellation of the Human Cerebral Cortex from - | Intrinsic Functional Connectivity MRI - | Cerebral Cortex, Volume 28(9), Pages 3095–3114 (2018). - | https://doi.org/10.1093/cercor/bhx179 - * - SUIT - - ``space`` - - ``SUITxMNI``, ``SUITxSUIT`` - - ``SUIT``, ``MNI152Lin6Asym`` - - 0.0.1 - - | Diedrichsen, J. - | A spatially unbiased atlas template of the human cerebellum. - | NeuroImage, Volume 33(1), Pages 127–138 (2006). - | https://doi.org/10.1016/j.neuroimage.2006.05.056 - * - Tian - - ``scale``, ``space``, ``magneticfield`` - - | ``TianxS1x3TxMNI6thgeneration``, ``TianxS1x7TxMNI6thgeneration``, - | ``TianxS2x3TxMNI6thgeneration``, ``TianxS2x7TxMNI6thgeneration``, - | ``TianxS3x3TxMNI6thgeneration``, ``TianxS3x7TxMNI6thgeneration``, - | ``TianxS4x3TxMNI6thgeneration``, ``TianxS4x7TxMNI6thgeneration``, - | ``TianxS1x3TxMNInonlinear2009cAsym``, - | ``TianxS2x3TxMNInonlinear2009cAsym``, - | ``TianxS3x3TxMNInonlinear2009cAsym``, - | ``TianxS4x3TxMNInonlinear2009cAsym`` - - ``MNI152NLin6Asym``, ``MNI152NLin2009cAsym`` - - 0.0.1 - - | Tian, Y., Margulies, D.S., Breakspear, M. et al. - | Topographic organization of the human subcortex - | unveiled with functional connectivity gradients. - | Nature Neuroscience, Volume 23, Pages 1421–1432 (2020). - | https://doi.org/10.1038/s41593-020-00711-6 - * - AICHA - - ``version`` - - ``AICHA_v1``, ``AICHA_v2`` - - ``MNI152Lin6Asym`` - - 0.0.3 - - | Joliot, M., Jobard, G., Naveau, M. et al. - | AICHA: An atlas of intrinsic connectivity of homotopic areas. - | Journal of Neuroscience Methods, Volume 254, Pages 46-59 (2015). - | https://doi.org/10.1016/j.jneumeth.2015.07.013 - * - Shen - - ``year``, ``n_rois`` - - | ``Shen_2013_50``, ``Shen_2013_100``, ``Shen_2013_150``, - | ``Shen_2015_268``, ``Shen_2019_368`` - - ``MNI152NLin2009cAsym`` - - 0.0.3 - - | Shen, X., Tokoglu, F., Papademetris, X., Constable, R.T. - | Groupwise whole-brain parcellation from resting-state fMRI data - | for network node identification. - | NeuroImage, Volume 82 (2013). - | https://doi.org/10.1016/j.neuroimage.2013.05.081. - | Finn, E.S., Shen, X., Scheinost, D., et al. - | Functional connectome fingerprinting: identifying individuals using - | patterns of brain connectivity. - | Nature Neuroscience, Volume 18(11), Pages 1664-1671 (2015). - | https://doi:10.1038/nn.4135 - * - Yan - - ``n_rois``, ``yeo_networks``, ``kong_networks`` - - | ``Yan100xYeo7``, ``Yan200xYeo7``, ``Yan300xYeo7``, - | ``Yan400xYeo7``, ``Yan500xYeo7``, ``Yan600xYeo7``, - | ``Yan700xYeo7``, ``Yan800xYeo7``, ``Yan900xYeo7``, - | ``Yan1000xYeo7``, - | ``Yan100xYeo17``, ``Yan200xYeo17``, ``Yan300xYeo17``, - | ``Yan400xYeo17``, ``Yan500xYeo17``, ``Yan600xYeo17``, - | ``Yan700xYeo17``, ``Yan800xYeo17``, ``Yan900xYeo17``, - | ``Yan1000xYeo17``, - | ``Yan100xKong17``, ``Yan200xKong17``, ``Yan300xKong17``, - | ``Yan400xKong17``, ``Yan500xKong17``, ``Yan600xKong17``, - | ``Yan700xKong17``, ``Yan800xKong17``, ``Yan900xKong17``, - | ``Yan1000xKong17`` - - ``MNI152NLin6Asym`` - - 0.0.3 - - | Yan, X., Kong, R., Xue, A., et al. - | Homotopic local-global parcellation of the human cerebral cortex from - | resting-state functional connectivity. - | NeuroImage, Volume 273 (2023). - | https://doi.org/10.1016/j.neuroimage.2023.120010 - * - Brainnetome - - ``threshold`` - - ``Brainnetome_thr0``, ``Brainnetome_thr25``, ``Brainnetome_thr50`` - - ``MNI152NLin6Asym`` - - 0.0.4 - - | Fan, L., Li, H., Zhuo, J., et al. - | The Human Brainnetome Atlas: A New Brain Atlas Based on Connectional - | Architecture - | Cerebral Cortex, Volume 26(8), Pages 3508–3526 (2016). - | https://doi.org/10.1093/cercor/bhw157 - - -Planned -~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Publication - * - Desikan-Killiany - - | Desikan, R.S., Ségonne, F., Fischl, B. et al. - | An automated labeling system for subdividing the human cerebral cortex - | on MRI scans into gyral based regions of interest. - | NeuroImage, Volume 31(3), Pages 968-980 (2006). - | http://doi.org/10.1016/j.neuroimage.2006.01.021 - * - Glasser - - | Glasser, M.F., Coalson, T.S., Robinson, E.C. et al. - | A multi-modal parcellation of human cerebral cortex. - | Nature (2016). - | http://doi.org/10.1038/nature18933 - * - AAL - - | Rolls, E.T., Huang, C.C., Lin, C.P., et al. - | Automated anatomical labelling atlas 3. - | NeuroImage, Volume 206 (2020). - | https://doi.org/10.1016/j.neuroimage.2019.116189 - * - Mindboggle 101 - - | Klein, A., & Tourville, J. - | 101 labeled brain images and a consistent human cortical labeling - | protocol. - | Frontiers in Neuroscience (2012). - | http://doi.org/10.3389/fnins.2012.00171/abstract - * - Destrieux - - | Destrieux, C., Fischl, B., Dale, A., & Halgren, E. - | Automatic parcellation of human cortical gyri and sulci using standard - | anatomical nomenclature. - | NeuroImage, Volume 53(1), Pages 1–15 (2010). - | http://doi.org/10.1016/j.neuroimage.2010.06.010. - * - Fan - - | Fan, L., Li, H., Zhuo, J. et al. - | The human brainnetome atlas: a new brain atlas based on connectional - | architecture. - | Cerebral cortex, Volume 26(8), Pages 3508-3526 (2016). - | https://doi.org/10.1093/cercor/bhw157 - * - Buckner - - | Buckner, R.L., Krienen, F.M., Castellanos, A., Diaz, J.C., Yeo, B.T.T. - | The organization of the human cerebellum estimated by intrinsic - | functional connectivity. - | Journal of Neurophysiology, Volume 106(5), Pages 2322–2345 (2011). - | https://doi.org/10.1152/jn.00339.2011 - | Yeo, B.T.T., Krienen, F.M., Sepulcre, J. et al. - | The organization of the human cerebral cortex estimated by intrinsic - | functional connectivity. - | Journal of Neurophysiology, Volume 106(3), Pages 1125–1165 (2011). - | https://doi.org/10.1152/jn.00338.2011 - - -Coordinates ------------ - -.. - Provide a list of the Coordinates that are implemented or planned. - - Version added: The junifer version in which the parcellation was added. - -Available -~~~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Keys - - Version Added - - Publication - * - Cognitive action control - - ``CogAC`` - - 0.0.1 - - | Cieslik, E.C., Mueller, V.I., Eickhoff, C.R., Langner, R., - | Eickhoff, S.B. - | Three key regions for supervisory attentional control: Evidence from - | neuroimaging meta-analyses. - | Neuroscience & Biobehavioral Reviews, Volume 48, Pages 22-34 (2015). - | https://doi.org/10.1016/j.neubiorev.2014.11.003. - * - Cognitive action regulation - - ``CogAR`` - - 0.0.1 - - | Langner, R., Leiberg, S., Hoffstaedter, F., Eickhoff, S.B. - | Towards a human self-regulation system: Common and distinct neural - | signatures of emotional and behavioural control. - | Neuroscience & Biobehavioral Reviews, Volume 90, Pages 400-410 (2018). - | https://doi.org/10.1016/j.neubiorev.2018.04.022. - * - Default mode network - - ``DMNBuckner`` - - 0.0.1 - - | Van Dijk, K.R., Hedden, T., Venkataraman, A. et al. - | Intrinsic functional connectivity as a tool for human connectomics: - | theory, properties, and optimization. - | Journal of neurophysiology, Volume 103(1), Pages 297-321 (2010). - | https://doi.org/10.1152/jn.00783.2009 - | Buckner, R.L., Andrews‐Hanna, J.R., & Schacter, D.L. - | The brain's default network: anatomy, function, and relevance to - | disease. - | Annals of the New York Academy of Sciences, Volume 1124(1), Pages 1-38 - | (2008). - | https://doi.org/10.1196/annals.1440.011 - * - Missing formal name - - ``extDMN`` - - 0.0.1 - - Missing publication details - * - Empathic processing - - ``Empathy`` - - 0.0.1 - - | Bzdok, D., Schilbach, L., Vogeley, K. et al. - | Parsing the neural correlates of moral cognition: ALE meta-analysis on - | morality, theory of mind, and empathy. - | Brain Structure and Function, Volume 217(4), Pages 783-796 (2012). - | https://doi.org/10.1007/s00429-012-0380-y - * - Extended social-affective default - - ``eSAD`` - - 0.0.1 - - | Amft, M., Bzdok, D., Laird, A.R. et al. - | Definition and characterization of an extended social-affective default - | network. - | Brain structure & function, Volume 220, Pages 1031–1049 (2015). - | https://doi.org/10.1007/s00429-013-0698-0 - * - Extended multiple-demand network - - ``eMDN`` - - 0.0.1 - - | Camilleri, J.A., Müller, V.I., Fox, P. et al. - | Definition and characterization of an extended multiple-demand network. - | NeuroImage, Volume 165, Pages 138-147 (2018). - | https://doi.org/10.1016/j.neuroimage.2017.10.020. - * - Motor execution - - ``Motor`` - - 0.0.1 - - | Witt, S.T., Laird, A.R., Meyerand, M.E. - | Functional neuroimaging correlates of finger-tapping task variations: - | An ALE meta-analysis, - | NeuroImage, Volume 42(1), Pages 343-356 (2008). - | https://doi.org/10.1016/j.neuroimage.2008.04.025. - * - Multitasking - - ``MultiTask`` - - 0.0.1 - - | Worringer, B., Langner, R., Koch, I. et al. - | Common and distinct neural correlates of dual-tasking and - | task-switching: a meta-analytic review and a neuro-cognitive processing - | model of human multitasking. - | Brain structure & function, Volume 224(5), Pages 1845–1869 (2019). - | https://doi.org/10.1007/s00429-019-01870-4 - * - Physiological stress - - ``PhysioStress`` - - 0.0.1 - - | Kogler, L., Müller, V.I., Chang, A. et al. - | Psychosocial versus physiological stress — Meta-analyses on - | deactivations and activations of the neural correlates of stress - | reactions. - | NeuroImage, Volume 119, Pages 235-251 (2015). - | https://doi.org/10.1016/j.neuroimage.2015.06.059. - * - Reward-related decision making - - ``Rew`` - - 0.0.1 - - | Liu, X., Hairston, J., Schrier, M., Fan, J. - | Common and distinct networks underlying reward valence and processing - | stages: A meta-analysis of functional neuroimaging studies. - | Neuroscience & Biobehavioral Reviews, Volume 35(5), Pages 1219-1236 - | (2011). - | https://doi.org/10.1016/j.neubiorev.2010.12.012. - * - Missing formal name - - ``Somatosensory`` - - 0.0.1 - - Missing publication details - * - Theory-of-mind cognition - - ``ToM`` - - 0.0.1 - - | Bzdok, D., Schilbach, L., Vogeley, K. et al. - | Parsing the neural correlates of moral cognition: ALE meta-analysis on - | morality, theory of mind, and empathy. - | Brain Structure and Function, Volume 217(4), Pages 783-796 (2012). - | https://doi.org/10.1007/s00429-012-0380-y - * - Vigilant attention - - ``VigAtt`` - - 0.0.1 - - | Langner, R., & Eickhoff, S.B. - | Sustaining attention to simple tasks: a meta-analytic review of the - | neural mechanisms of vigilant attention. - | Psychological bulletin, Volume 139 4, Pages 870-900 (2013). - | https://doi.org/10.1037/a0030694 - * - Working memory - - ``WM`` - - 0.0.1 - - | Rottschy, C., Langner, R., Dogan, I. et al. - | Modelling neural correlates of working memory: A coordinate-based - | meta-analysis. - | NeuroImage, Volume 60, Pages 830-846 (2012). - | https://doi.org/10.1016/j.neuroimage.2011.11.050. - * - Areal functional network from Power et al. (2011) - - ``Power2011`` - - 0.0.2 - - | Power, J. D., Cohen, A. L., Nelson, S. M. et al. - | Functional network organization of the human brain. - | Neuron, Volume 72(4), Pages 665–678 (2011). - | https://doi.org/10.1016/j.neuron.2011.09.006 - * - Brain maturity functional connections from Dosenbach et al. (2010) - - ``Dosenbach`` - - 0.0.2 - - | Dosenbach, N.U.F., Nardos, B., Cohen, A.L. et al. - | Prediction of Individual Brain Maturity Using fMRI - | Science, Volume 329(5997), Pages 1358-1361 (2010). - | https://doi.org/10.1126/science.1194144 - * - Areal functional network from Power et al. (2013) - - ``Power2013`` - - 0.0.4 - - | Power, J. D., Schlaggar, B. L., Lessov-Schlaggar, C. N., & - | Petersen, S. E. - | Evidence for hubs in human functional brain networks. - | Neuron, Volume 79(4), Pages 798–813 (2013). - | https://doi.org/10.1016/j.neuron.2013.07.035 - * - Autobiographical Memory from Spreng et al. (2009) - - ``AutobiographicalMemory`` - - 0.0.4 - - | Spreng, R. N., Mar, R. A., Kim, A. S. N. - | The Common Neural Basis of Autobiographical Memory, Prospection, - | Navigation, Theory of Mind, and the Default Mode: A Quantitative - | Meta-analysis. - | Journal of Cognitive Neuroscience, Volume 21(3), Pages 489–510 (2009). - | https://doi.org/10.1162/jocn.2008.21029 - - -Planned -~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Publication - * - Emotional scene and face processing (EmoSF) - - | Sabatinelli, D., Fortune, E.E., Li, Q. et al. - | Emotional perception: Meta-analyses of face and natural scene - | processing. - | NeuroImage, Volume 54(3), Pages 2524-2533 (2011). - | https://doi.org/10.1016/j.neuroimage.2010.10.011. - * - Perceptuo-motor network - - | Heckner, M.K., Cieslik, E.C., Eickhoff, S.B. et al. - | The Aging Brain and Executive Functions Revisited: Implications from - | Meta-analytic and Functional-Connectivity Evidence. - | Journal of Cognitive Neuroscience, Volume 33(9), Pages 1716–1752 (2021). - | https://doi.org/10.1162/jocn_a_01616 - - -Mask ----- - -.. - Provide a list of the masks that are implemented or planned. - - Version added: The junifer version in which the mask was added. - -Available -~~~~~~~~~ - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Keys - - Template Space - - Version Added - - Description - Publication - * - Vickery-Patil (Gray Matter) - - | ``GM_prob0.2`` - - ``MNI152Lin6Asym`` - - 0.0.1 - - | Vickery, Sam, & Patil, Kaustubh. (2022). - | Chimpanzee and Human Gray Matter Masks [Data set]. Zenodo. - | https://doi.org/10.5281/zenodo.6463123 - * - Vickery-Patil (Cortex + Basal Ganglia) - - | ``GM_prob0.2_cortex`` - - ``MNI152Lin6Asym`` - - 0.0.1 - - | Vickery, Sam, & Patil, Kaustubh. (2022). - | Chimpanzee and Human Gray Matter Masks [Data set]. Zenodo. - | https://doi.org/10.5281/zenodo.6463123 - * - ``junifer``'s custom brain mask - - | ``compute_brain_mask`` - - Adapts to the target data - - 0.0.2 - - | Compute the whole-brain, gray-matter or white-matter mask using - | the template and the resolution from the target image. The - | templates are obtained via ``templateflow``. - * - ``nilearn``'s mask computed from fMRI data - - | ``compute_epi_mask`` - - Adapts to the target data - - 0.0.2 - - | Compute a brain mask from fMRI data. This is based on an heuristic - | proposed by T.Nichols: find the least dense point of the histogram, - | between fractions ``lower_cutoff`` and ``upper_cutoff`` of the total - | image histogram. See :func:`nilearn.masking.compute_epi_mask` - * - ``nilearn``'s background mask - - | ``compute_background_mask`` - - Adapts to the target data - - 0.0.2 - - | Compute a brain mask for the images by guessing the value of the - | background from the border of the image. - | See :func:`nilearn.masking.compute_background_mask` - * - ``nilearn``'s ICBM152 template gray-matter mask - - | ``fetch_icbm152_brain_gm_mask`` - - ``MNI152NLin2009aAsym`` - - 0.0.2 - - | Compute a gray-matter mask from the asymmetrical ICBM152 2009 template, - | release a. - | See :func:`nilearn.datasets.fetch_icbm152_brain_gm_mask` - - -.. - Planned - ~~~~~~~ - -.. - helpful site for creating tables: https://rest-sphinx-memo.readthedocs.io/en/latest/ReST.html#tables diff --git a/pr-preview/pr-273/_sources/contribution.rst.txt b/pr-preview/pr-273/_sources/contribution.rst.txt deleted file mode 100644 index bbf8b6d56..000000000 --- a/pr-preview/pr-273/_sources/contribution.rst.txt +++ /dev/null @@ -1,263 +0,0 @@ -.. include:: links.inc - -.. _contribution_guidelines: - -Contributing -============ - -Setting up the local development environment --------------------------------------------- - -#. Fork the https://github.com/juaml/junifer repository on GitHub. If you - have never done this before, `follow the official guide - `_. -#. Clone your fork locally as described in the same guide but also add the - flag to sync the submodules as well by appending the following to the - clone command: - - .. code-block:: bash - - ... --recurse-submodules - -#. Install your local copy into a Python virtual environment. You can `read - this guide to learn more - `_ about them - and how to create one. - - .. code-block:: bash - - pip install -e ".[dev]" - -#. Create a branch for local development using the ``main`` branch as a - starting point. Use ``fix``, ``refactor``, or ``feat`` as a prefix. - - .. code-block:: bash - - git checkout main - git checkout -b / - - Now you can make your changes locally. - -#. Make sure you install git pre-commit hooks like so: - - .. code-block:: bash - - pre-commit install - -#. When making changes locally, it is helpful to ``git commit`` your work - regularly. On one hand to save your work and on the other hand, the smaller - the steps, the easier it is to review your work later. Please use `semantic - commit messages - `_. - - .. code-block:: bash - - git add . - git commit -m ": " - - In case, you want to commit some WIP (work-in-progress) code, please indicate - that in the commit message and use the flag ``--no-verify`` with - ``git commit`` like so: - - .. code-block:: bash - - git commit --no-verify -m "WIP: " - -#. When you're done making changes, check that your changes pass our test suite. - This is all included with ``tox``. - - .. code-block:: bash - - tox - - You can also run all ``tox`` tests in parallel. As of ``tox 3.7``, you can run - - .. code-block:: bash - - tox --parallel - -#. Push your branch to GitHub. - - .. code-block:: bash - - git push origin / - -#. Open the link displayed in the message when pushing your new branch in order - to submit a pull request. Please follow the template presented to you in the - web interface to complete your pull request. - - -GitHub Pull Request guidelines ------------------------------- - -Before you submit a pull request, check that it meets these guidelines: - -#. The pull request should include tests in the respective ``tests`` directory. - Except in rare circumstances, code coverage must not decrease (as reported - by codecov which runs automatically when you submit your pull request). -#. If the pull request adds functionality, the docs should be - updated. Consider creating a Python file that demonstrates the usage in - ``examples/`` directory. -#. Make sure to create a Draft Pull Request. If you are not sure how to do it, - check - `here `_. -#. Note the pull request ID assigned after completing the previous step and - create a short one-liner file of your contribution named as - ``.`` in ``docs/changes/newsfragments/``, ```` - being as per the following convention: - - * API change : ``change`` - * Bug fix : ``bugfix`` - * Enhancement : ``enh`` - * Feature : ``feature`` - * Documentation improvement : ``doc`` - * Miscellaneous : ``misc`` - * Deprecation and API removal : ``removal`` - - For example, a basic documentation improvement can be recorded in a file - ``101.doc`` with the content: - - .. code-block:: - - Fixed a typo in intro by `junifer's biggest fan`_ - -#. If it's your first contribution, also add yourself to - ``docs/changes/contributors.inc``. -#. The pull request will be tested against several Python versions. -#. Someone from the core team will review your work and guide you to a successful - contribution. - - -Running unit tests ------------------- - -junifer uses `pytest `_ for its -unit-tests and new features should in general always come with new -tests that make sure that the code runs as intended. - -To run all tests - -.. code-block:: bash - - tox -e test - - -Adding and building documentation ---------------------------------- - -Building the documentation requires some extra packages and can be installed by - -.. code-block:: bash - - pip install -e ".[docs]" - -To build the docs - -.. code-block:: bash - - cd docs - make local - -To view the documentation, open ``docs/_build/html/index.html``. - -In case you remove some files or change their filenames, you can run into -errors when using ``make local``. In this situation you can use ``make clean`` -to clean up the already build files and then re-run ``make local``. - -Also, we follow British English for the documentation. - - -Writing Examples ----------------- - -The format used for text is reST. Check the `sphinx reST reference`_ for more -details. The examples are run and displayed in HTML format using -`sphinx gallery`_. To add an example, just create a ``.py`` file that starts -either with ``plot_`` or ``run_``, depending on whether the example generates -a figure or not. - -The first lines of the example should be a Python block comment with a title, -a description of the example, authors and license name. - -The following is an example of how to start an example - -.. code-block:: python - - """ - Generic BIDS datagrabber for datalad. - ===================================== - - This example uses a generic BIDS datagraber to get the data from a BIDS dataset - store in a datalad remote sibling. - - Authors: Federico Raimondo - - License: BSD 3 clause - """ - -The rest of the script will be executed as normal Python code. In order to -render the output and embed formatted text within the code, you need to add -a 79 ``#`` (a full line) at the point in which you want to render and add text. -Each line of text shall be preceded with ``#``. The code that is not -commented will be executed. - -The following example will create texts and render the output between the -texts. - -.. code-block:: python - - from junifer.datagrabber import PatternDataladDataGrabber - from junifer.utils import configure_logging - - - ############################################################################### - # Set the logging level to info to see extra information - configure_logging(level="INFO") - - - ############################################################################### - # The BIDS datagrabber requires three parameters: the types of data we want, - # the specific pattern that matches each type, and the variables that will be - # replaced in the patterns. - types = ["T1w", "BOLD"] - patterns = { - "T1w": "{subject}/anat/{subject}_T1w.nii.gz", - "BOLD": "{subject}/func/{subject}_task-rest_bold.nii.gz", - } - replacements = ["subject"] - ############################################################################### - # Additionally, a datalad datagrabber requires the URI of the remote sibling - # and the location of the dataset within the remote sibling. - repo_uri = "https://gin.g-node.org/juaml/datalad-example-bids" - rootdir = "example_bids" - - ############################################################################### - # Now we can use the datagrabber within a `with` context - # One thing we can do with any datagrabber is iterate over the elements. - # In this case, each element of the datagrabber is one session. - with PatternDataladDataGrabber( - rootdir=rootdir, - types=types, - patterns=patterns, - uri=repo_uri, - replacements=replacements, - ) as dg: - for elem in dg: - print(elem) - - ############################################################################### - # Another feature of the datagrabber is the ability to get a specific - # element by its name. In this case, we index `sub-01` and we get the file - # paths for the two types of data we want (T1w and bold). - with PatternDataladDataGrabber( - rootdir=rootdir, - types=types, - patterns=patterns, - uri=repo_uri, - replacements=replacements, - ) as dg: - sub01 = dg["sub-01"] - print(sub01) - -Finally, when the example is done, you can run it as a normal Python script. -To generate the HTML, just build the docs. diff --git a/pr-preview/pr-273/_sources/extending/coordinates.rst.txt b/pr-preview/pr-273/_sources/extending/coordinates.rst.txt deleted file mode 100644 index f56c29708..000000000 --- a/pr-preview/pr-273/_sources/extending/coordinates.rst.txt +++ /dev/null @@ -1,130 +0,0 @@ -.. include:: ../links.inc - -.. _adding_coordinates: - -Adding Coordinates -================== - -Instead of using whole-brain parcellations to aggregate voxel-wise signals from -MR images (as for example in the :class:`.ParcelAggregation` marker), ``junifer`` -allows you to specify a set of coordinates around which to draw spheres to -aggregate (for example using the :class:`.SphereAggregation` marker) the MR -signals from individual voxels. Now, before you start specifying your own sets -of coordinates, check the coordinates that ``junifer`` already has -:ref:`built in `. If you simply want to use a well known set of -coordinates from the literature, there is a reasonable chance, that ``junifer`` -provides them already. - -If you checked the in-built coordinates, and they are not there already (for -example if you came up with your own set of coordinates), then ``junifer`` -provides an easy way for you to register them using the -:func:`.register_coordinates` function, so you can use your own set of -coordinates within a ``junifer`` pipeline. - -From the API reference, we can see that it has 4 positional arguments -(``name``, ``coordinates``, ``voi_names`` and ``space``) as well as one -optional keyword argument (``overwrite``). - -The ``name`` argument takes a string indicating the name you want to give to -this set of coordinates. This ``name`` can be used to obtain and operate on a -set of coordinates in ``junifer``. For example, you can obtain your coordinates -after registration by providing ``name`` to :func:`.load_coordinates`. We could -simply call it ``"my_set_of_coordinates"``, but likely you want a more -descriptive and more informative name most of the time. - -The ``coordinates`` argument takes the actual coordinates as a 2-dimensional -:class:`numpy.ndarray`. It contains one row for every location, and three -columns (one for each spatial dimension). That is, the first, second, and third -columns indicate the x-, y-, and z-coordinates in MNI space respectively. -The number of rows in the array correspond to the number of coordinates that -belong to this set. - -The ``voi_names`` argument takes a list of strings -indicating the names of each coordinate (i.e. volume-of-interest) in the -``coordinates`` array. Therefore, the length of this list should correspond to -the number of rows in the coordinates array. Now, we know everything we need to -know to register a set of coordinates. - -Lastly, we specify the ``space`` that the coordinates are in, for example, -``"MNI"`` or ``"native"`` (scanner-native space). - -Step 1: Prepare code to register a set of coordinates ------------------------------------------------------ - -Let's make a simple script to register our coordinates. We could simply call it -``register_custom_coordinates.py``. We may start by importing the appropriate -packages: - -.. code-block:: python - - from junifer.data import register_coordinates - import numpy as np - -For the sake of this example, we can create a set of coordinates that belong -to the Default Mode Network (DMN), and register this set of coordinates with -``junifer``. Note, that ``junifer`` already has a -:ref:`set of coordinates built-in ` ("DMNBuckner") that is associated -with the DMN. Here, we use the DMN coordinates used in a -`nilearn example `_. - -.. code-block:: python - - dmn_coords = np.array( - [[0, -52, 18], - [-46, -68, 32], - [46, -68, 32], - [1, 50, -5]] - ) - voi_names = [ - "Posterior Cingulate Cortex", - "Left Temporoparietal junction", - "Right Temporoparietal junction", - "Medial prefrontal cortex", - ] - -As you can see, we have four rows, and therefore four locations in the brain -associated with this set of coordinates. The variable ``voi_names`` reflects this -as it contains four strings indicating the name of each location. We can now -simply use this to register our coordinates: - -.. code-block:: python - - register_coordinates( - name="DMNCustom", - coordinates=dmn_coords, - voi_names=voi_names, - space="MNI" - ) - -Now, when we run this script, ``junifer`` registers these coordinates and we can -use them in subsequent analyses. Let's now consider how to use coordinate -registration in combination with -:ref:`codeless configuration using a YAML file `. - -Step 2: Add coordinate registration to the YAML file ----------------------------------------------------- - -In order to register your coordinates for a pipeline configured by a YAML file, -you can use the ``with`` keyword provided by ``junifer``: - -.. code-block:: yaml - - with: - - register_custom_coordinates.py - -Afterwards continue configuring the rest of your pipeline in this YAML file, -and you will be able to use this set of coordinates using the name you gave it -during registration (in our example "DMNCustom"). We can add a -:class:`.SphereAggregation` to demonstrate how this can be done: - -.. code-block:: yaml - - markers: - - name: DMNCustom_mean - kind: SphereAggregation - coords: DMNCustom - radius: 5 - method: mean - -This will aggregate signals from a sphere around each of our coordinates with a -radius of 5mm. diff --git a/pr-preview/pr-273/_sources/extending/datagrabber.rst.txt b/pr-preview/pr-273/_sources/extending/datagrabber.rst.txt deleted file mode 100644 index 5db379caa..000000000 --- a/pr-preview/pr-273/_sources/extending/datagrabber.rst.txt +++ /dev/null @@ -1,505 +0,0 @@ -.. include:: ../links.inc - -.. _extending_datagrabbers: - -Creating Data Grabbers -====================== - -Data Grabbers are the first step of the pipeline. Its purpose is to interpret -the structure of a dataset and provide two specific functionalities: - -#. Given an *element*, provide the path to each kind of data available for this - element (e.g. the path to the T1 image, the path to the T2 image, etc.) -#. Provide the list of *elements* available in the dataset. - -In this section, we will see how to create a DataGrabber for a dataset. Basic -aspects of DataGrabbers are covered in the -:ref:`Understanding Data Grabbers ` section. - -.. _extending_datagrabbers_think: - -Step 1: Think about the element -------------------------------- - -Like with any programming-related task, the first step is to think. When -creating a DataGrabber, we need to first define what an *element* is. -The *element* should be the smallest unit of data that can be processed. That -is, for each element, there should be a set of data that can be processed, but -only one of each *data type* (see :ref:`data_types`). - -For example, if we have a dataset from a fMRI study in which: - -a. both T1w and fMRI was acquired -b. 20 subjects went through an experiment twice -c. the experiment included resting-stage fMRI and a task named *stroop* - -then the *element* should be composed of 3 items: - -* ``subject``: The subject IDs, e.g. ``sub001``, ``sub002``, ... ``sub020`` -* ``session``: The session number, e.g. ``ses1``, ``ses2`` -* ``task``: The task performed, e.g. ``rest``, ``stroop`` - -If any of these items were not part of the element, then we will have more than -one ``T1w`` and / or ``BOLD`` image for each subject, which is not allowed. - -Importantly, nothing prevents that one image being part of two different -elements. For example, it is usually the case that the ``T1w`` image is not -acquired for each task, but once in the entire session. So in this case, the -``T1w`` image for the element (``sub001``, ``ses1``, ``rest``) will be the same -as the ``T1w`` image for the element (``sub001``, ``ses1``, ``stroop``). - -We will now continue this section using as an example, a dataset in BIDS format -in which 9 subjects (``sub-01`` to ``sub-09``) were scanned each during 3 -sessions (``ses-01``, ``ses-02``, ``ses-03``) and each session included a -``T1w`` and a ``BOLD`` image (resting-state), except for ``ses-03`` which was -only anatomical data. - -Step 2: Think about the dataset's structure -------------------------------------------- - -Now that we have our element defined, we need to think about the structure of -the dataset. Mainly, because the structure of the dataset will determine how -the DataGrabber needs to be implemented. - -``junifer`` provides a concrete class to deal with datasets that can be thought -in terms of *patterns*. A *pattern* is a string that contains placeholders that -are replaced by the actual values of the element. In our BIDS example, the path -to the T1w image of subject ``sub-01`` and session ``ses-01``, relative to the -dataset location, is ``sub-01/ses-01/anat/sub-01_ses-01_T1w.nii.gz``. By -replacing ``sub-01`` with ``sub-02``, we can obtain the T1w image of the first -session of the second subject. Indeed, the path to the T1w images can be -expressed as a pattern: - -``{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz`` - -where ``{subject}`` is the replacement for the subject id and ``{session}`` -is the replacement for the session id. - -Since it is a BIDS dataset, the same happens with the BOLD images. The path to -the BOLD images can be expressed as a pattern: - -``{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz`` - -This will be the norm in most of the datasets. If your dataset can be expressed -in terms of patterns, then follow :ref:`extending_datagrabbers_pattern`. -Otherwise, we recommend that you take time to re-think about your dataset -structure and why it does not have clear *patterns*. Feel free to open a -discussion in the `junifer Discussions`_ page. Most probably we can help you -get your dataset in order. - -If there is no other way, then you can follow :ref:`extending_datagrabbers_base` -to create a DataGrabber from scratch. - -.. _extending_datagrabbers_pattern: - -Step 3: Create a Data Grabber ------------------------------ - -Option A: Extending from PatternDataGrabber -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -The :class:`.PatternDataGrabber` class is a concrete class that has the -functionality of understanding patterns embedded in it. - -Before creating the DataGrabber, we need to define 3 variables: - -* ``types``: A list with the available :ref:`data_types` in our dataset. -* ``patterns``: A dictionary that specifies the pattern and some additional - information for each data type. -* ``replacements``: A list indicating which of the elements in the patterns - should be replaced by the values of the element. - -For example, in our BIDS example, the variables will be: - -.. code-block:: python - - types = ["T1w", "BOLD"] - patterns = { - "T1w": { - "pattern": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "pattern": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - } - replacements = ["subject", "session"] - -An additional fourth variable is the ``datadir``, which should be the path to -where the dataset is located. For example, if the dataset is located in -``/data/project/test/data``, then ``datadir`` should be -``/data/project/test/data``. Or, if we want to allow the user to specify the -location of the dataset, we can expose the variable in the constructor, as in -the following example. - -With the variables defined above, we can create our DataGrabber and name it -``ExampleBIDSDataGrabber``: - -.. code-block:: python - - from pathlib import Path - - from junifer.datagrabber import PatternDataGrabber - - - class ExampleBIDSDataGrabber(PatternDataGrabber): - - def __init__(self, datadir: str | Path) -> None: - types = ["T1w", "BOLD"] - patterns = { - "T1w": { - "pattern": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "pattern": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - } - replacements = ["subject", "session"] - super().__init__( - datadir=datadir, - types=types, - patterns=patterns, - replacements=replacements, - ) - -Our DataGrabber is ready to be used by ``junifer``. However, it is still unknown -to the library. We need to register it in the library. To do so, we need to -use the :func:`.register_datagrabber` decorator. - - -.. code-block:: python - - from pathlib import Path - - from junifer.api.decorators import register_datagrabber - from junifer.datagrabber import PatternDataGrabber - - - @register_datagrabber - class ExampleBIDSDataGrabber(PatternDataGrabber): - - def __init__(self, datadir: str | Path) -> None: - types = ["T1w", "BOLD"] - patterns = { - "T1w": { - "pattern": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "pattern": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - } - replacements = ["subject", "session"] - super().__init__( - datadir=datadir, - types=types, - patterns=patterns, - replacements=replacements, - ) - - -Now, we can use our DataGrabber in ``junifer``, by setting the ``datagrabber`` -kind in the yaml file to ``ExampleBIDSDataGrabber``. Remember that we still need -to set the ``datadir``. - -.. code-block:: yaml - - datagrabber: - kind: ExampleBIDSDataGrabber - datadir: /data/project/test/data - - -Optional: Using datalad -~~~~~~~~~~~~~~~~~~~~~~~ - -If you are using `datalad`_, you can use the :class:`.PatternDataladDataGrabber` -instead of the :class:`.PatternDataGrabber`. This class will not only -interpret patterns, but also use `datalad`_ to ``clone`` and ``get`` the data. - -The main difference between the two is that the ``datadir`` is not the actual -location of the dataset, but the location where the dataset will be cloned. It -can now be ``None``, which means that the data will be downloaded to a -temporary directory. To set the location of the dataset, you can use the -``uri`` argument in the constructor. Additionally, a ``rootdir`` argument can -be used to specify the path to the root directory of the dataset after doing -``datalad clone``. - -In the example, the dataset is hosted in Gin -(``https://gin.g-node.org/juaml/datalad-example-bids``). - -When we clone this dataset, we will see the following structure: - -.. code-block:: - - . - └── example_bids_ses - ├── sub-01 - │ ├── ses-01 - │ ├── ses-02 - │ └── ses-03 - ├── sub-02 - │ ├── ses-01 - │ ├── ses-02 - │ └── ses-03 - ├── sub-03 - ... - -So the patterns will start after ``example_bids_ses``. This is our ``rootdir``. - -Now we have our 2 additional variables: - -.. code-block:: python - - uri = "https://gin.g-node.org/juaml/datalad-example-bids" - rootdir = "example_bids_ses" - -And we can create our DataGrabber: - -.. code-block:: python - - from junifer.api.decorators import register_datagrabber - from junifer.datagrabber import PatternDataladDataGrabber - - - @register_datagrabber - class ExampleBIDSDataGrabber(PatternDataladDataGrabber): - - def __init__(self) -> None: - types = ["T1w", "BOLD"] - patterns = { - "T1w": { - "pattern": "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "pattern": "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - } - replacements = ["subject", "session"] - uri = "https://gin.g-node.org/juaml/datalad-example-bids" - rootdir = "example_bids_ses" - super().__init__( - datadir=None, - uri=uri, - rootdir=rootdir, - types=types, - patterns=patterns, - replacements=replacements, - ) - -This approach can be used directly from the YAML, like so: - -.. code-block:: yaml - - datagrabber: - - kind: PatternDataladDataGrabber - types: - - BOLD - - T1w - patterns: - BOLD: - pattern: "{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz" - space: MNI152NLin6Asym - T1w: - pattern: "{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz" - space: native - replacements: - - subject - - session - uri: "https://gin.g-node.org/juaml/datalad-example-bids" - rootdir: example_bids_ses - -.. _extending_datagrabbers_base: - -Option B: Extending from BaseDataGrabber -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -While we could not think of a use case in which the pattern-based DataGrabber -would not be suitable, it is still possible to create a DataGrabber extending -from the :class:`.BaseDataGrabber` class. - -In order to create a DataGrabber extending from :class:`.BaseDataGrabber`, we -need to implement the following methods: - -- ``get_item``: to get a single item from the dataset. -- ``get_elements``: to get the list of all elements present in the dataset -- ``get_element_keys``: to get the keys of the elements in the dataset. - -.. note:: - - The ``__init__`` method could also be implemented, but it is not mandatory. - This is required if the DataGrabber requires any extra parameter. - -We will now implement our BIDS example with this method. - -The first method, ``get_item``, needs to obtain a single -item from the dataset. Since this dataset requires two variables, ``subject`` -and ``session``, we will use them as parameters of ``get_item``: - -.. code-block:: python - - def get_item(self, subject: str, session: str) -> dict[str, dict[str, str]]: - out = { - "T1w": { - "path": f"{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "path": f"{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - } - return out - - -The second method, ``get_elements``, needs to return a list of all the elements -in the dataset. In this case, we know that the dataset contains 3 subjects and 3 -sessions, so we can create a list of all the possible combinations. However, we -need to remember that for session *ses-03* there is no BOLD data. - -.. code-block:: python - - from itertools import product - - - def get_elements(self) -> list[str]: - subjects = ["sub-01", "sub-02", "sub-03"] - sessions = ["ses-01", "ses-02"] - - # If we are not working on BOLD data, we can add "ses-03" - if "BOLD" not in self.types: - sessions.append("ses-03") - elements = [] - for subject, element in product(subjects, sessions): - elements.append({"subject": subject, "session": session}) - return elements - - -And finally, we can implement the ``get_element_keys`` method. This method needs -to return a list of the keys that represent each of the items in the element -tuple. As a rule of thumb, they should be the parameters of the ``get_item`` -method, in the same order. - -.. code-block:: python - - def get_element_keys(self) -> list[str]: - return ["subject", "session"] - - -So, to summarise, our DataGrabber will look like this: - -.. code-block:: python - - from junifer.api.decorators import register_datagrabber - from junifer.datagrabber import BaseDataGrabber - - - @register_datagrabber - class ExampleBIDSDataGrabber(BaseDataGrabber): - - def get_item(self, subject: str, session: str) -> dict[str, dict[str, str]]: - out = { - "T1w": { - "path": f"{subject}/{session}/anat/{subject}_{session}_T1w.nii.gz", - "space": "native", - }, - "BOLD": { - "path": f"{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - } - return out - - def get_elements(self) -> list[str]: - subjects = ["sub-01", "sub-02", "sub-03"] - sessions = ["ses-01", "ses-02"] - - # If we are not working on BOLD data, we can add "ses-03" - if "BOLD" not in self.types: - sessions.append("ses-03") - elements = [] - for subject in subjects: - for session in sessions: - elements.append({"subject": subject, "session": session}) - return elements - - def get_element_keys(self) -> list[str]: - return ["subject", "session"] - -Optional: Using datalad -~~~~~~~~~~~~~~~~~~~~~~~ - -If this dataset is in a datalad dataset, we can extend from -:class:`.DataladDataGrabber` instead of :class:`.BaseDataGrabber`. This will -allow us to use the datalad API to obtain the data. - -Step 4: Optional: Adding *BOLD confounds* ------------------------------------------ - -For some analyses, it is useful to have the confounds associated with the BOLD -data. This corresponds to the ``BOLD_confounds`` item in the -:ref:`Data Object ` (see :ref:`data_types`). However, the -``BOLD_confounds`` element does not only consists of a ``path``, but it requires -more information about the format of the confounds file. Thus, the -``BOLD_confounds`` element is a dictionary with the following keys: - -- ``path``: the path to the confounds file. -- ``format``: the format of the confounds file. Currently, this can be either - ``fmriprep`` or ``adhoc``. - -The ``fmriprep`` format corresponds to the format of the confounds files -generated by `fMRIPrep`_. The ``adhoc`` format corresponds to a format that is -not standardised. - -.. note:: - - The ``mappings`` key is only required if the ``format`` is ``adhoc``. If the - ``format`` is ``fmriprep``, the ``mappings`` key is not required. - -Currently, ``junifer`` provides only one confound remover step -(:class:`.fMRIPrepConfoundRemover`), which relies entirely on the ``fmriprep`` -confound variable names. Thus, if the confounds are not in ``fmriprep`` format, -the user will need to provide the mappings between the *ad-hoc* variable names -and the ``fmriprep`` variable names. This is done by specifying the ``adhoc`` -format and providing the mappings as a dictionary in the ``mappings`` key. - -In the following example, the confounds file has 3 variables that are not in the -``fmriprep`` format. Thus, we will provide the mappings for these variables to -the ``fmriprep`` format. For example, the ``get_item`` method could look like -this: - -.. code-block:: python - - def get_item( - self, subject: str, session: str - ) -> dict: - out = { - "BOLD": { - "path": f"{subject}/{session}/func/{subject}_{session}_task-rest_bold.nii.gz", - "space": "MNI152NLin6Asym", - }, - "BOLD_confounds": { - "path": f"{subject}/{session}/func/{subject}_{session}_confounds.tsv", - "format": "adhoc", - "mappings": { - "fmriprep": { - "variable1": "rot_x", - "variable2": "rot_z", - "variable3": "rot_y", - }, - }, - }, - } - -.. note:: - - Not all of the mappings need to be provided. For the moment, this is used - only by the :class:`.fMRIPrepConfoundRemover` step, which requires variables - based on the strategy selected. However, it is recommended to provide all the - mappings, as this will allow the user to choose different strategies with the - same dataset. diff --git a/pr-preview/pr-273/_sources/extending/dependencies.rst.txt b/pr-preview/pr-273/_sources/extending/dependencies.rst.txt deleted file mode 100644 index 1e44f3535..000000000 --- a/pr-preview/pr-273/_sources/extending/dependencies.rst.txt +++ /dev/null @@ -1,141 +0,0 @@ -.. include:: ../links.inc - -.. _specifying_dependencies: - -Specifying Dependencies -======================= - -This section describes how you can tackle different situations when writing -your custom Marker and / or Preprocessor and take care of the dependencies for -them. - -You might have already come across listing out dependencies for your -:ref:`custom Markers ` and / or -:ref:`custom Preprocessors `, if not, check them out -first. If you have already gone through them, you are already familiar with using -class attribute ``_DEPENDENCIES`` to keep track of its dependencies. ``junifer`` -is a bit more sophisticated about them and we will see here how you can make the -best use of them. - -.. _component_dependencies: - -Handling dependencies that come as Python packages --------------------------------------------------- - -You have already seen this case handled by having a class attribute -``_DEPENDENCIES`` whose value is a set of all the package names that the -component depends on. For example, for :class:`.RSSETSMarker`, we have: - -.. code-block:: python - - _DEPENDENCIES: ClassVar[Set[str]] = {"nilearn"} - -The type annotation is for documentation and static type checking purposes. -Although not required, we highly recommend you use them, your future self -and others who use it will thank you. - -.. _component_external_dependencies: - -Handling external dependencies from toolboxes ---------------------------------------------- - -You can also specify dependencies of external toolboxes like AFIN, FSL and ANTs, -by having a class attribute like so: - -.. code-block:: python - - _EXT_DEPENDENCIES: ClassVar[List[Dict[str, Union[str, List[str]]]]] = [ - { - "name": "afni", - "commands": ["3dReHo", "3dAFNItoNIFTI"], - }, - ] - -The above example is taken from the class which computes regional homogeneity -(ReHo) using AFNI. The general pattern is that you need to have the value of -``_EXT_DEPENDENCIES`` as a list of dictionary with two keys: - -* ``name`` (str) : lowercased name of the toolbox -* ``commands`` (list of str) : actual names of the commands you need to use - -This is simple but powerful as we will see in the following sub-sections. - -.. _component_conditional_dependencies: - -Handling conditional dependencies ---------------------------------- - -You might encounter situations where your Marker or Preprocessor needs to have -option for the user to either use a dependency that comes as a package or -use a dependency that relies on external toolboxes. With the foundation we laid -above, it is really simple to solve it while having validation before running -and letting the user know if some dependency is missing. - -Let's look at an actual implementation, in this case :class:`.SpaceWarper`, so -that it shows the problem a bit better and how we solve it: - -.. code-block:: python - - class SpaceWarper(BasePreprocessor): - # docstring - _CONDITIONAL_DEPENDENCIES: ClassVar[List[Dict[str, Union[str, Type]]]] = [ - { - "using": "fsl", - "depends_on": FSLWarper, - }, - { - "using": "ants", - "depends_on": ANTsWarper, - }, - ] - - def __init__( - self, using: str, reference: str, on: Union[List[str], str] - ) -> None: - # validation and setting up - - -Here, you see a new class attribute ``_CONDITIONAL_DEPENDENCIES`` which is a -list of dictionaries with two keys: - -* ``using`` (str) : lowercased name of the toolbox -* ``depends_on`` (object) : a class which implements the particular tool's use - -It is mandatory to have the ``using`` positional argument in the constructor in -this case as the validation starts with this and moves further. It is also -mandatory to only allow the value of ``using`` argument to be one of them -specified in the ``using`` key of ``_CONDITIONAL_DEPENDENCIES`` entries. - -For brevity, we only show the ``FSLWarper`` here but ``ANTsWarper`` looks very -similar. ``FSLWarper`` looks like this (only the relevant part is shown here): - -.. code-block:: python - - class FSLWarper: - # docstring - - _EXT_DEPENDENCIES: ClassVar[List[Dict[str, Union[str, List[str]]]]] = [ - { - "name": "fsl", - "commands": ["flirt", "applywarp"], - }, - ] - - _DEPENDENCIES: ClassVar[Set[str]] = {"numpy", "nibabel"} - - def preprocess( - self, - input: Dict[str, Any], - extra_input: Dict[str, Any], - ) -> Dict[str, Any]: - # implementation - -Here you can see the familiar ``_DEPENDENCIES`` and ``_EXT_DEPENDENCIES`` class -attributes. The validation process starts by looking up the ``using`` value of -the ``_CONDITIONAL_DEPENDENCIES`` entries and then retrieves the object pointed -by ``depends_on``. After that, the ``_DEPENDENCIES`` and ``_EXT_DEPENDENCIES`` -class attributes are checked. - -This might be a bit too much to get it right away so feel free to check the code -for a better understanding. You can also check ``ALFFBase`` for a Marker -having this pattern. diff --git a/pr-preview/pr-273/_sources/extending/extension.rst.txt b/pr-preview/pr-273/_sources/extending/extension.rst.txt deleted file mode 100644 index cc8a624f1..000000000 --- a/pr-preview/pr-273/_sources/extending/extension.rst.txt +++ /dev/null @@ -1,35 +0,0 @@ -.. include:: ../links.inc - -.. _extending_extension: - -Creating a ``junifer`` extension -================================ - -``junifer`` is designed to be easily extensible. Through the use of a registry -and decorators, you can easily add new functionality to ``junifer`` during -runtime. This is done by creating a new Python module and importing it before -running ``junifer``. - -A special consideration has to be made when using the -:ref:`code-less configuration`. In this case, the -``with`` statement can be used to import a module or run a Python file. - -In the following example, we instruct ``junifer`` to first import ``my_module`` -and then run the ``my_file.py`` file: - -.. code-block:: yaml - - with: - - my_module - - my_file.py - -Thus, the code from ``my_file.py`` will be executed before running ``junifer``. -This is the ideal place to include ``junifer`` extensions. - -.. important:: - - Some ``junifer`` commands will not consider files imported from files included - in the ``with`` statement. If ``my_file.py`` imports ``my_other_file.py``, - some of the ``junifer`` commands will not consider ``my_other_file.py``. Either - place all the code in one file or add multiple files to the ``with`` - statement. diff --git a/pr-preview/pr-273/_sources/extending/index.rst.txt b/pr-preview/pr-273/_sources/extending/index.rst.txt deleted file mode 100644 index ac441aa34..000000000 --- a/pr-preview/pr-273/_sources/extending/index.rst.txt +++ /dev/null @@ -1,32 +0,0 @@ -.. include:: ../links.inc - -.. _extending: - -Extending ``junifer`` -===================== - -While we aim to provide as many datasets and markers as possible, we are also -interested in allowing users to extend the functionality with their own -DataGrabbers, Preprocessors, Markers, etc., . - -It's not necessary to have the new functionality included in ``junifer`` before -the user can use them. The user can simply create a new Python file, code the -desired functionality and use it with ``junifer``. This is the first step towards -including the new functionality in the ``junifer`` pipeline. - -In this section we will show how to extend ``junifer``, by creating new -DataGrabbers, Preprocessors, Markers, etc., following the *junifer* way. - - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - extension - datagrabber - marker - preprocessor - dependencies - parcellations - coordinates - masks diff --git a/pr-preview/pr-273/_sources/extending/marker.rst.txt b/pr-preview/pr-273/_sources/extending/marker.rst.txt deleted file mode 100644 index 90a8d0c73..000000000 --- a/pr-preview/pr-273/_sources/extending/marker.rst.txt +++ /dev/null @@ -1,292 +0,0 @@ -.. include:: ../links.inc - -.. _extending_markers: - -Creating Markers -================ - -Computing a marker (a.k.a. *feature*) is the main goal of ``junifer``. While we -aim to provide as many Markers as possible, it might be the case that the Marker -you are looking for is not available. In this case, you can create your own Marker -by following this tutorial. - -Most of the functionality of a ``junifer`` Marker has been taken care by the -:class:`.BaseMarker` class. Thus, only a few methods are required: - -#. ``get_valid_inputs``: The method to obtain the list of valid inputs for the - Marker. This is used to check that the inputs provided by the user are - valid. This method should return a list of strings, representing - :ref:`data types `. -#. ``get_output_type``: The method to obtain the output type of the Marker. - This is used to check that the output of the Marker is compatible with the - storage. This method should return a string, representing - :ref:`storage types `. -#. ``compute``: The method that given the data, computes the Marker. -#. ``__init__``: The initialisation method, where the Marker is configured. - -As an example, we will develop a ``ParcelMean`` Marker, a Marker that first -applies a parcellation and then computes the mean of the data in each parcel. -This is a very simple example, but it will show you how to create a new Marker. - -.. _extending_markers_input_output: - -Step 1: Configure input and output ----------------------------------- - -This step is quite simple: we need to define the input and output of the Marker. -Based on the current :ref:`data types `, we can have ``BOLD``, -``VBM_WM`` and ``VBM_GM`` as valid inputs. - -.. code-block:: python - - def get_valid_inputs(self) -> list[str]: - return ["BOLD", "VBM_WM", "VBM_GM"] - -The output of the Marker depends on the input. For ``BOLD``, it will be -``timeseries``, while for the rest of the inputs, it will be ``vector``. Thus, -we can define the output as: - -.. code-block:: python - - def get_output_type(self, input_type: str) -> str: - if input_type == "BOLD": - return "timeseries" - else: - return "vector" - -.. _extending_markers_init: - -Step 2: Initialise the Marker ------------------------------ - -In this step we need to define the parameters of the Marker the user can provide -to configure how the Marker will behave. - -The parameters of the Marker are defined in the ``__init__`` method. The -:class:`.BaseMarker` class requires two optional parameters: - -1. ``name``: the name of the Marker. This is used to identify the Marker in the - configuration file. -2. ``on``: a list or string with the data types that the Marker will be applied - to. - -.. attention:: - - Only basic types (*int*, *bool* and *str*), lists, tuples and dictionaries - are allowed as parameters. This is because the parameters are stored in - JSON format, and JSON only supports these types. - -In this example, only parameter required for the computation is the name of the -parcellation to use. Thus, we can define the ``__init__`` method as follows: - -.. code-block:: python - - def __init__( - self, - parcellation: str, - on: str | list[str] | None = None, - name: str | None = None, - ) -> None: - self.parcellation = parcellation - super().__init__(on=on, name=name) - -.. caution:: - - Parameters of the Marker must be stored as object attributes without using - ``_`` as prefix. This is because any attribute that starts with ``_`` will - not be considered as a parameter and not stored as part of the metadata of - the Marker. - -.. _extending_markers_compute: - -Step 3: Compute the Marker --------------------------- - -In this step, we will define the method that computes the Marker. This method -will be called by ``junifer`` when needed, using the data provided by the -DataGrabber, as configured by the user. The method ``compute`` has two -arguments: - -* ``input``: a dictionary with the data to be used to compute the Marker. This - will be the corresponding element in the :ref:`Data Object` - already indexed. Thus, the dictionary has at least two keys: ``data`` and - ``path``. The first one contains the data, while the second one contains the - path to the data. The dictionary can also contain other keys, depending on the - data type. -* ``extra_input``: the rest of the :ref:`Data Object`. This is - useful if you want to use other data to compute the Marker - (e.g.: ``BOLD_confounds`` can be used to de-confound the ``BOLD`` data). - -Following the example, we will compute the mean of the data in each parcel using -:class:`nilearn.maskers.NiftiLabelsMasker`. Importantly, the output of the -compute function must be a dictionary. This dictionary will later be passed onto -the ``store`` method. - -.. hint:: - - To simplify the ``store`` method, define keys of the dictionary based on the - corresponding store functions in the :ref:`storage types `. - For example, if the output is a ``vector``, the keys of the dictionary should - be ``data`` and ``col_names``. - -.. code-block:: python - - from typing import Any - - from junifer.data import get_parcellation - from nilearn.maskers import NiftiLabelsMasker - - - def compute( - self, - input: dict[str, Any], - extra_input: dict[str, Any] | None = None, - ) -> dict[str, Any]: - # Get the data - data = input["data"] - - # Get the parcellation tailored for the target - t_parcellation, t_labels, _ = get_parcellation( - name=self.parcellation_name, - target_data=input, - extra_input=extra_input, - ) - - # Create a masker - masker = NiftiLabelsMasker( - labels_img=t_parcellation, - standardize=True, - memory="nilearn_cache", - verbose=5, - ) - - # mask the data - out_values = masker.fit_transform([data]) - - # Create the output dictionary - out = {"data": out_values, "col_names": t_labels} - - return out - - -.. _extending_markers_finalize: - -Step 4: Finalise the Marker ---------------------------- - -Once all of the above steps are done, we just need to give our Marker a name, -state its *dependencies* and register it using the ``@register_marker`` -decorator. - -The :ref:`dependencies ` are the core packages that are -required to compute the Marker. This will be later used to keep track of the -versions of the packages used to compute the Marker. To inform ``junifer`` -about the dependencies of a Marker, we need to define a ``_DEPENDENCIES`` -attribute in the class. This attribute must be a set, with the names of the -packages as strings. For example, the ``ParcelMean`` marker has the -following dependencies: - -.. code-block:: python - - _DEPENDENCIES = {"nilearn", "numpy"} - -Finally, we need to register the Marker using the ``@register_marker`` decorator. - -.. code-block:: python - - from typing import Any - - from junifer.api.decorators import register_marker - from junifer.data import get_parcellation - from junifer.markers.base import BaseMarker - from nilearn.maskers import NiftiLabelsMasker - - - @register_marker - class ParcelMean(BaseMarker): - - _DEPENDENCIES = {"nilearn", "numpy"} - - def __init__( - self, - parcellation: str, - on: str | list[str] | None = None, - name: str | None = None, - ) -> None: - self.parcellation = parcellation - super().__init__(on=on, name=name) - - def get_valid_inputs(self) -> list[str]: - return ["BOLD", "VBM_WM", "VBM_GM"] - - def get_output_type(self, input_type: str) -> str: - if input_type == "BOLD": - return "timeseries" - else: - return "vector" - - def compute( - self, - input: dict[str, Any], - extra_input: dict[str, Any] | None = None, - ) -> dict[str, Any]: - # Get the data - data = input["data"] - - # Get the parcellation tailored for the target - t_parcellation, t_labels, _ = get_parcellation( - name=self.parcellation_name, - target_data=input, - extra_input=extra_input, - ) - - # Create a masker - masker = NiftiLabelsMasker( - labels_img=t_parcellation, - standardize=True, - memory="nilearn_cache", - verbose=5, - ) - - # mask the data - out_values = masker.fit_transform([data]) - - # Create the output dictionary - out = {"data": out_values, "col_names": t_labels} - - return out - - -.. _extending_markers_template: - -Template for a custom Marker ----------------------------- - -.. code-block:: python - - from junifer.api.decorators import register_marker - from junifer.markers import BaseMarker - - - @register_marker - class TemplateMarker(BaseMarker): - - def __init__(self, on=None, name=None): - # TODO: add marker-specific parameters - super().__init__(on=on, name=name) - - def get_valid_inputs(self): - # TODO: Complete with the valid inputs - valid = [] - return valid - - def get_output_type(self, input_type): - # TODO: Return the valid output type for each input type - pass - - def compute(self, input, extra_input): - # TODO: compute the marker and create the output dictionary - - # Create the output dictionary - out = {"data": None, "col_names": None} - return out diff --git a/pr-preview/pr-273/_sources/extending/masks.rst.txt b/pr-preview/pr-273/_sources/extending/masks.rst.txt deleted file mode 100644 index 980d3475b..000000000 --- a/pr-preview/pr-273/_sources/extending/masks.rst.txt +++ /dev/null @@ -1,90 +0,0 @@ -.. include:: ../links.inc - -.. _adding_masks: - -Adding Masks -============ - -Many processing steps and Markers in ``junifer`` allow you to specify a binary -mask to select voxels you want to include in the analysis. There are a number -of masks :ref:`in-built in junifer already `, so check if any of them -suit your needs. Check how to use these masks :ref:`here `. Once -you know how to use these masks, and you checked whether the in-built masks -suit your needs, and you have found that they don't, you can come back here to -learn how to use your own masks. - -The principle is fairly simple and quite similar to :ref:`adding_parcellations` -and :ref:`adding_coordinates`. ``junifer`` provides a :func:`.register_mask` -function that lets you register your own custom masks. It consists of three -positional arguments (``name``, ``mask_path`` and ``space``) and one optional -keyword argument (``overwrite``). - -The ``name`` argument is a string indicating the name of the mask. This name -is used to refer to that mask in ``junifer`` internally in order to obtain the -actual mask data and perform operations on it. For example, using the name you -can load a mask after registration using the -:func:`.load_mask` function. - -The ``mask_path`` should contain the path to a valid NIfTI image with binary -voxel values (i.e. 0 or 1). This data can then be used by ``junifer`` to mask -other MR images. - -Lastly, we specify the ``space`` that the coordinates are in, for example, -``"MNI152NLin6Asym"`` or ``"native"`` (scanner-native space). - -Step 1: Prepare code to register a mask ---------------------------------------- - -A simple script called ``register_custom_mask.py`` to register a mask could -look as follows: - -.. code-block:: python - - from pathlib import Path - - from junifer.data import register_mask - - - # this path is only an example, of course use the correct path - # on your system: - mask_path = Path("..") / ".." / "my_custom_mask.nii.gz" - - register_mask(name="my_custom_mask", mask_path=mask_path, space="native") - -Simple, right? Now we just have to configure a YAML file to register this mask -so we can use it for :ref:`codeless configuration of junifer `. - -Step 2: Configure a YAML file for registration of a mask --------------------------------------------------------- - -In order to do this, we can use the ``with`` keyword provided by ``junifer``: - -.. code-block:: yaml - - with: - - register_custom_mask.py - -Then we can use this mask for any processing step or Marker that takes in a -mask as an argument. For example: - -.. code-block:: yaml - - markers: - - name: CustomMaskParcelAggregation_mean - kind: ParcelAggregation - parcellation: Schaefer200x17 - method: mean - masks: "my_custom_mask" - -Now, you can simply use this YAML file to run your pipeline. - -.. important:: - - It's important to keep in mind that if the paths given in - ``register_custom_mask.py`` are relative paths, they will be interpreted - by junifer as relative to the jobs directory (i.e. where ``junifer`` will - create submit files, logs directory and so on). For simplicity, you may just - want to use absolute paths to avoid confusion, yet using relative paths is - likely a better way to make your pipeline directory / repository more portable - and therefore more reproducible for others. Really, once you understand how - paths are interpreted by ``junifer``, it is quite easy. diff --git a/pr-preview/pr-273/_sources/extending/parcellations.rst.txt b/pr-preview/pr-273/_sources/extending/parcellations.rst.txt deleted file mode 100644 index 6c1a197cd..000000000 --- a/pr-preview/pr-273/_sources/extending/parcellations.rst.txt +++ /dev/null @@ -1,130 +0,0 @@ -.. include:: ../links.inc - -.. _adding_parcellations: - -Adding Parcellations -==================== - -Before you start adding your own parcellations, check whether ``junifer`` has -the parcellation :ref:`in-built already `. Perhaps, what is available -there will suffice to achieve your goals. However, of course ``junifer`` will not -have every parcellation available that you may want to use, and if so, it will -be nice to be able to add it yourself using a format that ``junifer`` understands. -Similarly, you may even be interested in creating your own custom parcellations -and then adding them to ``junifer``, so you can use ``junifer`` to obtain -different Markers to assess and validate your own parcellation. So, how can you do -this? - -Since both of these use-cases are quite common, and not being able to use your -favourite parcellation is of course quite a buzzkill, ``junifer`` actually -provides the easy-to-use :func:`.register_parcellation` function to do just that. -Let's try to understand the API reference and then use this function to register our -own parcellation. - -From the API reference, we can see that it has 4 positional arguments -(``name``, ``parcellation_path``, ``parcels_labels`` and ``space``) as well as -one optional keyword argument (``overwrite``). - -The ``name`` of the parcellation is up to you and will be the name that -``junifer`` will use to refer to this particular parcellation. You can think of -this as being similar to a key in a Python dictionary, i.e. a key that is used to -obtain and operate on the actual parcellation data. This ``name`` must always -be a string. For example, we could call our parcellation -``"my_custom_parcellation"`` (Note, that in a real-world use case this is -likely not a good name, and you should try to choose a meaningful name that -conveys as much relevant information about your parcellation as necessary). - -The ``parcellation_path`` must be a ``str`` or ``Path`` object indicating a -path to a valid NIfTI image, which contains integer labels indicating the -individual regions-of-interest (ROIs) of your parcellation. The background in -this parcellation should be indicated by 0, and the labels of ROIs should go -from 1 to N (where N is the total number of ROIs in your parcellation). Now, -we nearly have everything we need. - -We also want to make sure that we can associate each integer label with -a human readable name (i.e. the name for each ROI). This serves naming the -features that parcellation-based markers produce in an unambiguous way, such -that a user can easily identify which ROIs were used to produce a specific -feature (multiple ROIs, because some features consist of information from two -or more ROIs, as for example in functional connectivity). Therefore, we provide -junifer with a list of strings, that contains the names for each ROI. In this -list, the label at the i-th position indicates the i-th integer label (i.e. the -first label in this list corresponds to the first integer label in the -parcellation and so on). - -Lastly, we specify the ``space`` that the parcellation is in, for example, -``"MNI152NLin2009cAsym"`` or ``"native"`` (scanner-native space). - -Step 1: Prepare code to register a parcellation ------------------------------------------------ - -Now we know everything that we need to know to make sure ``junifer`` can use our -own parcellation to compute any parcellation-based Marker. A simple example could -look like this: - -.. code-block:: python - - from junifer.data import register_parcellation - - from pathlib import Path - import numpy as np - - # these are of course just example paths, replace it with your own: - path_to_parcellation = ( - Path("..") / ".." / "parcellations" / "my_custom_parcellation.nii.gz" - ) - path_to_labels = ( - Path("..") / ".." / "labels" / "my_custom_parcellation_labels.txt" - ) - - my_labels = list(np.loadtxt(path_to_labels, dtype=str)) - - register_parcellation( - name="my_custom_parcellation", - parcellation_path=path_to_parcellation, - parcels_labels=my_labels, - space="MNI152NLin2009cAsym" - ) - -We can run this code and it seems to work, however, how can we actually -include the custom parcellation in a ``junifer`` pipeline using a -:ref:`code-less YAML configuration `? - -Step 2: Add parcellation registration to the YAML file ------------------------------------------------------- - -In order to use the parcellation in a ``junifer`` pipeline configured by a YAML -file, we can save the above code in a Python file, say -``registering_my_parcellation.py``. We can then simply add this file using the -``with`` keyword provided by ``junifer``: - -.. code-block:: yaml - - with: - - registering_my_parcellation.py - -Afterwards continue configuring the rest of the pipeline in this YAML file, and -you will be able to use this parcellation using the name you gave the -parcellation when registering it. For example, we can add a -:class:`.ParcelAggregation` Marker to demonstrate how this can be done: - -.. code-block:: yaml - - markers: - - name: CustomParcellation_mean - kind: ParcelAggregation - parcellation: my_custom_parcellation - method: mean - -Now, you can simply use this YAML file to run your pipeline. - -.. important:: - - It's important to keep in mind that if the paths given in - ``registering_my_parcellation.py`` are relative paths, they will be interpreted - by ``junifer`` as relative to the jobs directory (i.e. where ``junifer`` will - create submit files, logs directory and so on). For simplicity, you may just - want to use absolute paths to avoid confusion, yet using relative paths is - likely a better way to make your pipeline directory / repository more portable - and therefore more reproducible for others. Really, once you understand how - these paths are interpreted by ``junifer``, it is quite easy. diff --git a/pr-preview/pr-273/_sources/extending/preprocessor.rst.txt b/pr-preview/pr-273/_sources/extending/preprocessor.rst.txt deleted file mode 100644 index e94c6f3df..000000000 --- a/pr-preview/pr-273/_sources/extending/preprocessor.rst.txt +++ /dev/null @@ -1,246 +0,0 @@ -.. include:: ../links.inc - -.. _extending_preprocessors: - -Creating Preprocessors -====================== - -As already mentioned in the introduction, ``junifer`` does not do traditional -MRI pre-processing but can perform minimal preprocessing of the data that the -DataGrabber provides, for example, smoothing after confound regression or -transforming data to subject-native space before feature extraction. While -there are a few Preprocessors available already and we are constantly adding -new ones, you might need something specific and then you can create your -own Preprocessor. - -While implementing your own Preprocessor, you need to always inherit from -:class:`.BasePreprocessor` and implement a few methods: - -#. ``get_valid_inputs``: This method should return a list of strings - representing the valid data types that the Preprocessor can work on. - Check :ref:`data types ` for reference. -#. ``get_output_type``: This method should just return the input as it - is unused as of now. -#. ``preprocess``: The method that given the data, preprocesses the data. -#. ``__init__``: The initialisation method, where the Preprocessor is - configured. - -As an example, we will develop a ``NilearnSmoothing`` Preprocessor, which -smoothens the data using :func:`nilearn.image.smooth_img`. This is often -desirable in cases where your data is preprocessed using ``fMRIPrep``, as -``fMRIPrep`` does not perform smoothing. - -.. _extending_preprocessors_input_output: - -Step 1: Configure input and output ----------------------------------- - -In this step, we define the input and output data types of the Preprocessor. -For input we can accept ``T1w``, ``T2w`` and ``BOLD`` -:ref:`data types `. - -.. code-block:: python - - ... - - def get_valid_inputs(self) -> list[str]: - return ["T1w", "T2w", "BOLD"] - - ... - -The output definition of the Preprocessor is unused now but is kept for -completeness. - -.. code-block:: python - - ... - - def get_output_type(self, input_type: str) -> str: - return input_type - - ... - -.. _extending_preprocessors_init: - -Step 2: Initialise the Preprocessor ------------------------------------ - -Now we need to define our Preprocessor class' constructor which is also how -you configure it. Our class will have the following arguments: - -1. ``fwhm``: The smoothing strength as a full-width at half maximum - (in millimetres). Since we depend on :func:`nilearn.image.smooth_img`, we - pass the value to it. -2. ``on``: The data type we want the Preprocessor to work on. If the user does - not specify, it will work on all the data types given by the - ``get_valid_inputs`` function. - -.. attention:: - - Only basic types (*int*, *bool* and *str*), lists, tuples and dictionaries - are allowed as parameters. This is because the parameters are stored in - JSON format, and JSON only supports these types. - -.. code-block:: python - - from typing import Literal - - from numpy.typing import ArrayLike - - - ... - - def __init__( - self, - fwhm: int | float | ArrayLike | Literal["fast"] | None, - on: str | list[str] | None = None, - ) -> None: - self.fwhm = fwhm - super().__init__(on=on) - - ... - -.. caution:: - - Parameters of the Preprocessor must be stored as object attributes without - using ``_`` as prefix. This is because any attribute that starts with ``_`` - will not be considered as a parameter and not stored as part of the metadata - of the Preprocessor. - -.. _extending_preprocessors_preprocess: - -Step 3: Preprocess the data ---------------------------- - -Finally, we will write the actual logic of the Preprocessor. This method will -be called by ``junifer`` when needed, using the data provided by the -DataGrabber, as configured by the user. The method ``preprocess`` has two -arguments: - -* ``input``: A dictionary with the data to be used by the Preprocessor. This - will be the corresponding element in the :ref:`Data Object` - already indexed. Thus, the dictionary has at least two keys: ``data`` and - ``path``. The first one contains the data, while the second one contains the - path to the data. The dictionary can also contain other keys, depending on the - data type. -* ``extra_input``: The rest of the :ref:`Data Object`. This is - useful if you want to use other data (e.g., ``Warp`` can be used to provide - the transformation matrix file for transformation to subject-native space). - -and it has two return values: - -* First is the ``input`` dictionary with necessary data modified. Usually, you - want to replace the ``input["data"]`` with the preprocessed data. -* Second is a dictionary just like ``input`` or ``extra_input`` but with only - specific key-value pairs which you would like to pass down to the Markers. - For example, if your Preprocessor computes some mask with the preprocessed - data, you could pass it through this which would be added and available - in the Marker step with the same key you pass here. Usually, you would - want to pass ``None``. - -.. code-block:: python - - from typing import Any - - from nilearn import image as nimg - - - ... - - def preprocess( - self, - input: dict[str, Any], - extra_input: dict[str, Any] | None = None, - ) -> tuple[dict[str, Any], dict[str, Any] | None]: - input["data"] = nimg.smooth_img(imgs=input["data"], fwhm=self.fwhm) - return input, None - - ... - -Step 4: Finalise the Preprocessor ---------------------------------- - -Now we just need to combine everything we have above and throw in a couple of -other stuff to get our Preprocessor ready. - -First, we specify the :ref:`dependencies ` for our -class, which are basically the packages that are required by the class. This is -used for validation before running to ensure all the packages are installed and -also to keep track of the dependencies and their versions in the metadata. We -define it using a class attribute like so: - -.. code-block:: python - - _DEPENDENCIES = {"nilearn"} - -Then, we just need to register the Preprocessor using ``@register_preprocessor`` -decorator and our final code should look like this: - -.. code-block:: python - - from typing import Any, Literal - - from junifer.api.decorators import register_preprocessor - from junifer.preprocess import BasePreprocessor - - from nilearn import image as nimg - from numpy.typing import ArrayLike - - - @register_preprocessor - class NilearnSmoothing(BasePreprocessor): - - _DEPENDENCIES = {"nilearn"} - - def __init__( - self, - fwhm: int | float | ArrayLike | Literal["fast"] | None, - on: str | list[str] | None = None, - ) -> None: - self.fwhm = fwhm - super().__init__(on=on) - - def get_valid_inputs(self) -> list[str]: - return ["T1w", "T2w", "BOLD"] - - def get_output_type(self, input_type: str) -> str: - return input_type - - def preprocess( - self, - input: dict[str, Any], - extra_input: dict[str, Any] | None = None, - ) -> tuple[dict[str, Any], dict[str, Any] | None]: - input["data"] = nimg.smooth_img(imgs=input["data"], fwhm=self.fwhm) - return input, None - - -.. _extending_preprocessors_template: - -Template for a custom Preprocessor ----------------------------------- - -.. code-block:: python - - from junifer.api.decorators import register_preprocessor - from junifer.preprocess import BasePreprocessor - - - @register_preprocessor - class TemplatePreprocessor(BasePreprocessor): - - def __init__(self, on=None): - # TODO: add preprocessor-specific parameters - super().__init__(on=on) - - def get_valid_inputs(self): - # TODO: Complete with the valid inputs - valid = [] - return valid - - def get_output_type(self, input_type): - return input_type - - def preprocess(self, input, extra_input): - # TODO: add the preprocessor logic - return input, None diff --git a/pr-preview/pr-273/_sources/faq.rst.txt b/pr-preview/pr-273/_sources/faq.rst.txt deleted file mode 100644 index 0a7a7a5dc..000000000 --- a/pr-preview/pr-273/_sources/faq.rst.txt +++ /dev/null @@ -1,31 +0,0 @@ -.. include:: links.inc - -FAQs -==== - -How do I contribute to junifer? -------------------------------- -Please follow the :ref:`contribution guidelines `. - - -How do I set up VSCode for contribution? ----------------------------------------- - -The :ref:`contribution guidelines ` -apply in general when using VSCode as your IDE as well. - -The following steps are specific to VSCode and you can choose to go with it: - -1. After forking the repository on GitHub, you can clone the forked repository - using the internal version control tool. - -2. We recommend using ``conda`` to create your virtual environment - - .. code-block:: bash - - conda env create -n -f conda-env.yml - conda activate - - The ``conda-env.yml`` can be found at the root of the repository. - -The required development tools should be installed and you should be good to go. diff --git a/pr-preview/pr-273/_sources/help.rst.txt b/pr-preview/pr-273/_sources/help.rst.txt deleted file mode 100644 index 39c65de0d..000000000 --- a/pr-preview/pr-273/_sources/help.rst.txt +++ /dev/null @@ -1,123 +0,0 @@ -.. include:: links.inc - -.. _help: - -Getting Help -============ - - | Help! I need somebody - | Help! not just anybody - | Help! you know I need someone - | Help! - - -- The Beatles, Help! - -This fragment of the song originally appeared in the 1965 film Help! and was -written by Lennon and McCartney, just a few years after the development of -Mark 1, the first commercial computer. Maybe just a random coincidence, or maybe -Lennon was just trying to write an email to McCartney. - -While the song might have been written with another meaning in mind, it is a good -way to describe the situation of many researchers who are presented with a new -toolbox. Indeed, the situation of many researchers is that the projects they are -working on are becoming more and more complex in terms of methods and data. Thus, -we *open up the doors* to new possibilities: - - | When I was younger, so much younger than today - | I never needed anybody's help in any way - | But now these days are gone, I'm not so self assured - | Now I find I've changed my mind and opened up the doors - - -- The Beatles, Help! - -The setback with modern research is that current methods are often more complex -and require more computing, which means that we need to learn concepts from -computer science, mathematics, statistics, etc. This is a good thing, but it -also means that we need to learn new tools and new ways of thinking, which can be -a bit overwhelming, to the point that we start relying more and more on other -researchers. In the end, we might feel like we lose our independence: - - | And now my life has changed in oh so many ways - | My independence seems to vanish in the haze - | But every now and then I feel so insecure - | I know that I just need you like I've never done before - - -- The Beatles, Help! - -We can continue with the song, but we think you get the point. The point is that -we will need help, and we will need to ask for it. We will need to ask for help -from our colleagues, from our supervisors, from our friends. - -We are a small team of researchers and developers, and we are not experts in -*everything at once*. Each one of us has a specific expertise, and we are trying -to use this expertise to create Junifer. When we conceived Junifer, we thought -of researchers' problems and tried to come up with the best way to help them, by -building a tool that is easy to understand, learn and use. Most importantly, we -made it to help. We are here to help you and your research. - -If you have any questions, problems and / or suggestions, please do not hesitate -to contact us. We will be happy to help you and we will be happy to hear from -you. - -Seems nice, no? But we have one condition: **help us help you**. - -Communication is the key for you to help us and in turn help you solve your -problems. We cannot know what you are trying to do, unless you tell us. -**The more detailed explanation you give us, the faster we can help you**. -We have opened several communication channels so that you can contact us in -the way that is most convenient for you. - -Some people prefer to **write, in detail, with code and figures**. If you are -one of those, use the `junifer Discussions`_. site on GitHub. This is a place -where you can ask questions, and where you can discuss topics such as -potential new features, or potential new methods. - -Some people do **not have a clear idea of what they want**, but they know that -they need help. This is not a problem, but it is a bit more involved. Since it -will require more frequent interactions to try to understand what you are trying -to do, we have the `junifer matrix channel`_ in which you can chat with us and -other junifer users. - -Finally, some people **prefer to communicate verbally**. If you are one of those, -you might want to join our *office hours*. Given that our agenda might vary, -office hours will be announced on the `junifer matrix channel`_ chat. Feel free -to join and just *listen in* if you are too shy to write. - -In short, these are the 3 communication channels to get help: - -#. Discussions on Github (`junifer Discussions`_): - - Pros: - - * You can write your question in detail. - * Your question will not get mixed with other conversations. - * Likely to be the fastest way to solve the issue in the long-run. - - Cons: - - * You need to write your question in detail. - -#. Chat (`junifer matrix channel`_): - - Pros: - - * You can ask questions in real-time. - * You can including code and figures in your question. - - Cons: - - * Real-time depends on the availability of the other users. - * It might be difficult to follow if several conversation happens at the same - time. - -#. Video Calls (*office hours*) - - Pros: - - * You can get real-time feedback. - * You will get our undivided attention (no overlapping discussions). - - Cons: - - * We can't read or write code, or even propose solutions for you to test. - * You will need to wait for the next *office hour*. diff --git a/pr-preview/pr-273/_sources/index.rst.txt b/pr-preview/pr-273/_sources/index.rst.txt deleted file mode 100644 index f267fcee9..000000000 --- a/pr-preview/pr-273/_sources/index.rst.txt +++ /dev/null @@ -1,56 +0,0 @@ -.. include:: links.inc - -.. image:: images/junifer_logo.png - :width: 300px - :alt: junifer logo - -Welcome to junifer's documentation! -=================================== - -junifer (JUelich NeuroImaging FEature extractoR) is a data handling and feature -extraction library targeted towards neuroimaging data specifically functional -MRI data. - -It is currently being developed and maintained at the Applied Machine Learning -(`AML`_) group at Forschungszentrum Juelich, Germany. Although the library is -designed for people working at Institute of Neuroscience and Medicine - Brain -and Behaviour (`INM-7`_), it is designed to be as modular as possible thus -enabling others to extend it easily. - -.. toctree:: - :numbered: 3 - :maxdepth: 2 - :caption: Contents: - - installation - starting - understanding/index.rst - using/index.rst - builtin - extending/index.rst - auto_examples/index.rst - api/index.rst - help - contribution - maintaining - faq - whats_new - - -Indices and tables -================== - -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` - - -Funding -======= - -We thank the `Helmholtz Imaging Platform `_, -`SMHB `_ and -`eBRAIN Health `_ (HORIZON-INFRA-2021-TECH-01) -for supporting development of ``junifer``. -(The funding sources had no role in the design, implementation and evaluation of -the pipeline.) diff --git a/pr-preview/pr-273/_sources/installation.rst.txt b/pr-preview/pr-273/_sources/installation.rst.txt deleted file mode 100644 index 26f78e902..000000000 --- a/pr-preview/pr-273/_sources/installation.rst.txt +++ /dev/null @@ -1,165 +0,0 @@ -.. include:: links.inc - -Installing ``junifer`` -====================== - -Depending on your use-case, ``junifer`` can be installed differently: - -* Install the :ref:`latest stable release `. This is the most suitable approach - for end users. -* Install from :ref:`latest development release `. This is the most suitable approach - for developers. - - -Either way, we strongly recommend using -`virtual environments `_. - - -.. _install_latest_release: - -Using a package manager ------------------------ - -Use ``pip`` to install ``junifer`` from `PyPI `_, like so: - -.. code-block:: bash - - pip install junifer - -You can also install via ``conda``, like so: - -.. code-block:: bash - - conda install -c conda-forge junifer - -.. attention:: - - Installation on macOS and Windows might fail via ``conda`` due to ``datalad``. - In that case, please refer to - `Datalad installation instructions - `_ for solutions. - In case the problem persists, please install it via ``pip`` as mentioned earlier. - -.. _install_development_git: - -From the source ---------------- - -Follow the `detailed contribution guidelines `_. - - -.. _installation_ext: - -Installing external dependencies -================================ - -Some preprocessors and markers will require optional external dependencies to -be installed. In this section you will find a list of all external dependencies -that are required for specific markers. - -.. important:: - - The Docker container wrappers add the commands required by ``junifer``. Using - these commands have some limitations, mostly related to handling files and - paths. ``junifer`` knows about this and uses these commands in the proper way. - Keep this in mind if you try to use the Docker wrappers outside of - ``junifer``. These caveats and limitations are not documented. - -AFNI ----- - -To install AFNI, you can always follow the `AFNI official instructions -`_. -Additionally, you can also follow the following steps to install and configure -the AFNI Docker container in your local system. - -1. Install Docker. You can follow the - `Docker official instructions `_. -2. Pull the AFNI Docker image from - `Docker Hub AFNI `_: - -.. code-block:: bash - - docker pull afni/afni_make_build - -3. Add the Junifer AFNI scripts to your PATH environment variable. Run the - following command: - -.. code-block:: bash - - junifer setup afni-docker - -Take the last line and copy it to your ``.bashrc`` or ``.zshrc`` file. - -Or, alternatively, you can execute this command which will update the -``~/.bashrc`` for you: - -.. code-block:: bash - - junifer setup afni-docker | grep "PATH=" | xargs | >> ~/.bashrc - -FSL ---- - -To install FSL, you can always follow the `FSL official instructions -`_. -Additionally, you can also follow the following steps to install and configure -the FSL Docker container in your local system. - -1. Install Docker. You can follow the - `Docker official instructions `_. -2. Pull the FSL Docker image from - `Docker Hub FSL `_: - -.. code-block:: bash - - docker pull brainlife/fsl - -3. Add the Junifer FSL scripts to your PATH environment variable. Run the - following command: - -.. code-block:: bash - - junifer setup fsl-docker - -Take the last line and copy it to your ``.bashrc`` or ``.zshrc`` file. - -Or, alternatively, you can execute this command which will update the -``~/.bashrc`` for you: - -.. code-block:: bash - - junifer setup fsl-docker | grep "PATH=" | xargs | >> ~/.bashrc - -ANTs ----- - -To install ANTs, you can always follow the `ANTs official instructions -`_. Additionally, you can also follow the -following steps to install and configure the ANTs Docker container in your -local system. - -1. Install Docker. You can follow the - `Docker official instructions `_. -2. Pull the ANTs Docker image from - `Docker Hub ANTs `_: - -.. code-block:: bash - - docker pull antsx/ants - -3. Add the Junifer ANTs scripts to your PATH environment variable. Run the - following command: - -.. code-block:: bash - - junifer setup ants-docker - -Take the last line and copy it to your ``.bashrc`` or ``.zshrc`` file. - -Or, alternatively, you can execute this command which will update the -``~/.bashrc`` for you: - -.. code-block:: bash - - junifer setup ants-docker | grep "PATH=" | xargs | >> ~/.bashrc diff --git a/pr-preview/pr-273/_sources/maintaining.rst.txt b/pr-preview/pr-273/_sources/maintaining.rst.txt deleted file mode 100644 index 2f0122b05..000000000 --- a/pr-preview/pr-273/_sources/maintaining.rst.txt +++ /dev/null @@ -1,87 +0,0 @@ -.. include:: links.inc - -Maintaining -=========== - -Versioning ----------- - -Version numbers are as follows: *MAJOR.MINOR.MICRO*. Additionally, -development version append *devN* where N is the distance (in commits) to -the last release. - -This is done automatically by `setuptools_scm`_. - -This plugin reads the latest tagged version from git and automatically -increments the *MICRO* segment and appends *devN*. This is considered a -pre-release. - -The CI scripts will publish every tag with the format *v.X.Y.Z* to PyPI as -version "X.Y.Z". Additionally, for every push to main, it will be published -as pre-release to PyPI. - -Releasing a new version ------------------------ - -Once the milestone is reached (all issues closed), it is time to do a new -release. Make sure you have -`towncrier `_ installed -before proceeding. - -#. Make sure you are in sync with the main branch. - - .. code-block:: bash - - git checkout main - git pull --rebase origin main - -#. Run the following to check changelog is properly generated: - - .. code-block:: bash - - towncrier build --draft - -#. Then, run: - - .. code-block:: bash - - towncrier - - to generate the proper changelog that should be reflected in - ``docs/whats_new.rst``. - -#. Commit the changes, make a PR and merge via a merge commit. - -#. Make sure you are in sync with the main branch. - - .. code-block:: bash - - git checkout main - git pull --rebase origin main - -#. Create tag (replace ``X.Y.Z`` with the proper version) on the merged PR's - merge commit. - - .. code-block:: bash - - git tag -a vX.Y.Z -m "Release X.Y.Z" - -#. Check that the build system is creating the proper version - - .. code-block:: bash - - SETUPTOOLS_SCM_DEBUG=1 python -m build --outdir dist/ . - -#. Push the tag - - .. code-block:: bash - - git push origin --follow-tags - -#. Optional: bump the *MAJOR* or *MINOR* segment of next release (replace - ``D.E.0`` with the proper version). - - .. code-block:: bash - - git tag -a vD.E.0.dev -m "Set next release to D.E.0" - git push origin --follow-tags diff --git a/pr-preview/pr-273/_sources/starting.rst.txt b/pr-preview/pr-273/_sources/starting.rst.txt deleted file mode 100644 index d09bcb20c..000000000 --- a/pr-preview/pr-273/_sources/starting.rst.txt +++ /dev/null @@ -1,157 +0,0 @@ -.. include:: links.inc - -.. _starting: - -First steps with ``junifer`` -============================ - -.. note:: - - To scroll the graph left and right, click on the graph and use the arrows on your keyboard. - -.. mermaid:: - - flowchart TD - start((( Start ))) - read_understanding(Read Understanding junifer) - start --> read_understanding - question_features{Can I compute\nthe features I want\nusing junifer?} - read_understanding --> question_features - question_features -->|Yes| read_using_final - question_features -->|I'm not sure| read_using - question_features -->|No| question_feature_type - read_using --> question_features - - read_using(Read Using junifer) - - question_feature_type{"What am I missing\nfrom junifer"} - question_feature_type --> missing_datagrabber - question_feature_type --> missing_preprocessing - question_feature_type --> missing_marker - question_feature_type --> missing_other - missing_datagrabber("A Dataset/DataGrabber") - missing_preprocessing("A Preprocessor") - missing_marker("A Marker") - missing_other("Something else") - - missing_datagrabber --> question_datagrabber_junifarm - question_datagrabber_junifarm{Is the\ndataset/datagrabber\nin juni-farm?} - question_datagrabber_junifarm -->|Yes| read_using_final - question_datagrabber_junifarm -->|No| read_extending_datagrabber_start - read_extending_datagrabber_start(Read Creating a junifer extension) - read_extending_datagrabber_start --> read_extending_datagrabber - read_extending_datagrabber(Read Creating Data Grabbers) - read_extending_datagrabber --> question_datagrabber_kind - question_datagrabber_kind{Is your dataset\na datalad one?} - question_datagrabber_kind -->|Yes| extend_datagrabber_datalad - question_datagrabber_kind -->|No| extend_datagrabber_pattern - extend_datagrabber_pattern(Use\nPatternDataGrabber) - extend_datagrabber_datalad(Use\nPatternDataladDataGrabber) - extend_datagrabber_pattern --> question_datagrabber_solved - extend_datagrabber_datalad --> question_datagrabber_solved - question_datagrabber_solved{Can you use\nyour data now?} - question_datagrabber_solved -->|Yes| question_contribute_datagrabber - question_datagrabber_solved -->|No| contact_help - question_contribute_datagrabber{Do you think\nyour DataGrabber\nis useful for other users?} - question_contribute_datagrabber -->|Yes| contribute_datagrabber - question_contribute_datagrabber -->|No| final_run - contribute_datagrabber(Create a\nDATASET REQUEST\nissue on GitHub) - contribute_datagrabber --> final_run - - missing_marker --> question_marker_junifarm - question_marker_junifarm{Is the marker\nin juni-farm?} - question_marker_junifarm -->|Yes| read_using_final - question_marker_junifarm -->|No| read_extending_marker_start - read_extending_marker_start(Read Creating a junifer extension) - read_extending_marker_start --> read_extending_marker - read_extending_marker(Read Creating Markers) - read_extending_marker --> question_marker_solved - question_marker_solved{Can you use\nyour marker now?} - question_marker_solved -->|Yes| question_contribute_marker - question_marker_solved -->|No| contact_help - question_contribute_marker{Do you think\nyour Marker\nis useful for other users?} - question_contribute_marker -->|Yes| contribute_marker - question_contribute_marker -->|No| final_run - contribute_marker(Create a\nMARKER REQUEST\nissue on GitHub) - contribute_marker --> final_run - - missing_preprocessing --> contact_help - - missing_mask{"A Mask?"} - missing_parcellation{"A Parcellation?"} - missing_coordinates{"Coordinates?"} - missing_other_other{"Something else?"} - missing_other --> missing_mask - missing_other --> missing_parcellation - missing_other --> missing_coordinates - missing_other --> missing_other_other - missing_other_other --> contact_help - - contact_help(((Contact the\njunifer team))) - - missing_mask --> read_adding_mask_start - read_adding_mask_start("Read Creating a junifer extension") - read_adding_mask_start --> read_adding_mask - read_adding_mask("Read Adding Masks") - read_adding_mask --> missing_other_solved - - missing_parcellation --> read_adding_parcellation_start - read_adding_parcellation_start("Read Creating a junifer extension") - read_adding_parcellation_start --> read_adding_parcellation - read_adding_parcellation("Read Adding Parcellations") - read_adding_parcellation --> missing_other_solved - - missing_coordinates --> read_adding_coordinates_start - read_adding_coordinates_start("Read Creating a junifer extension") - read_adding_coordinates_start --> read_adding_coordinates - read_adding_coordinates("Read Adding Coordinates") - read_adding_coordinates --> missing_other_solved - - missing_other_solved{Did you solve your issue?} - missing_other_solved -->|Yes| read_using_final - missing_other_solved -->|No| missing_other_contact - missing_other_contact(Contact the\njunifer team) - missing_other_contact --> missing_other_issue - missing_other_issue(((Submit a\nFEATURE REQUEST\nissue in GitHub))) - - read_using_final(Read Using junifer) - read_using_final --> final_yaml - final_yaml(Create/edit the YAML file) - final_yaml --> final_run - final_run(Use junifer run to test your YAML configuration) - final_run --> question_final_run_worked - question_final_run_worked{"Did it work?"} - question_final_run_worked -->|No| question_error_run - question_error_run{"Is it an issue\nwith my YAML file?"} - question_error_run -->|Yes| final_yaml - question_error_run -->|No| error_contact - error_contact(Contact the\njunifer team) - error_contact --> error_issue - error_issue(((Submit a\nBUG REPORT issue\nin GitHub))) - question_final_run_worked -->|Yes| final_queue - final_queue(Use junifer queue to compute your features) - final_queue --> final_magic - final_magic(((Let junifer do its magic!))) - - click read_understanding href "https://juaml.github.io/junifer/main/understanding/index.html" - click read_using href "https://juaml.github.io/junifer/main/using/index.html" - click read_using_final href "https://juaml.github.io/junifer/main/using/index.html" - click read_extending_datagrabber_start href "https://juaml.github.io/junifer/main/extending/extension.html" - click read_extending_datagrabber href "https://juaml.github.io/junifer/main/extending/datagrabber.html" - click read_extending_marker_start href "https://juaml.github.io/junifer/main/extending/extension.html" - click read_extending_marker href "https://juaml.github.io/junifer/main/extending/marker.html" - click read_adding_mask_start href "https://juaml.github.io/junifer/main/extending/extension.html" - click read_adding_mask href "https://juaml.github.io/junifer/main/extending/masks.html" - click read_adding_parcellation_start href "https://juaml.github.io/junifer/main/extending/extension.html" - click read_adding_parcellation href "https://juaml.github.io/junifer/main/extending/parcellations.html" - click read_adding_coordinates_start href "https://juaml.github.io/junifer/main/extending/extension.html" - click read_adding_coordinates href "https://juaml.github.io/junifer/main/extending/coordinates.html" - - click error_issue href "https://github.com/juaml/junifer/issues/new/choose" _blank - click missing_other_issue href "https://github.com/juaml/junifer/issues/new/choose" _blank - click contribute_marker href "https://github.com/juaml/junifer/issues/new/choose" _blank - click contribute_datagrabber href "https://github.com/juaml/junifer/issues/new/choose" _blank - - click error_contact href "https://juaml.github.io/junifer/main/help.html" - click contact_help href "https://juaml.github.io/junifer/main/help.html" - click missing_other_contact href "https://juaml.github.io/junifer/main/help.html" diff --git a/pr-preview/pr-273/_sources/understanding/data.rst.txt b/pr-preview/pr-273/_sources/understanding/data.rst.txt deleted file mode 100644 index f71c8bb0c..000000000 --- a/pr-preview/pr-273/_sources/understanding/data.rst.txt +++ /dev/null @@ -1,129 +0,0 @@ -.. include:: ../links.inc - -.. _data_object: - -The Data Object -=============== - -Description ------------ - -This is the *object* that traverses the steps of the pipeline. It is indeed a -dictionary of dictionaries. The first level of keys are the :ref:`data types ` -and the values are the corresponding information as dictionaries. - -.. code-block:: python - - {'BOLD': {...}, 'T1w': {...}} - -The second level of keys are the actual data. A special second-level key named -``meta`` is present in each step, that contains all the information on the -data type including source and previous transformation steps. - -The :ref:`Data Grabber ` step adds the ``path`` second-level key -which gives the path to the file containing the data. The ``meta`` key in this -step only contains information about the DataGrabber used. - -.. code-block:: python - - {'BOLD': {'meta': {'datagrabber': {'class': 'SPMAuditoryTestingDataGrabber', - 'types': ['BOLD', 'T1w']}, - 'dependencies': set(), - 'element': {'subject': 'sub001'}}, - 'path': PosixPath('/var/folders/dv/2lbr8f8j0q12zrx3mz3ll5m40000gp/T/tmpgxcyjfo1/sub001_bold.nii.gz')}, - 'T1w': {'meta': {'datagrabber': {'class': 'SPMAuditoryTestingDataGrabber', - 'types': ['BOLD', 'T1w']}, - 'dependencies': set(), - 'element': {'subject': 'sub001'}}, - 'path': PosixPath('/var/folders/dv/2lbr8f8j0q12zrx3mz3ll5m40000gp/T/tmpgxcyjfo1/sub001_T1w.nii.gz')}} - -The :ref:`Data Reader ` step adds the ``data`` second-level key -which is the actual data loaded into memory. The ``meta`` key in this step -adds information about the DataReader used to read the data. - -.. code-block:: python - - {'BOLD': {'data': , - 'meta': {'datagrabber': {'class': 'SPMAuditoryTestingDataGrabber', - 'types': ['BOLD', 'T1w']}, - 'datareader': {'class': 'DefaultDataReader'}, - 'dependencies': {'nilearn'}, - 'element': {'subject': 'sub001'}}, - 'path': PosixPath('/var/folders/dv/2lbr8f8j0q12zrx3mz3ll5m40000gp/T/tmpe49321ce/sub001_bold.nii.gz')}, - 'T1w': {'data': , - 'meta': {'datagrabber': {'class': 'SPMAuditoryTestingDataGrabber', - 'types': ['BOLD', 'T1w']}, - 'datareader': {'class': 'DefaultDataReader'}, - 'dependencies': set(), - 'element': {'subject': 'sub001'}}, - 'path': PosixPath('/var/folders/dv/2lbr8f8j0q12zrx3mz3ll5m40000gp/T/tmpe49321ce/sub001_T1w.nii.gz')}} - -The :ref:`Preprocess ` step, if used, modifies the ``data`` -second-level key's value and appends the ``meta`` key with information about -the preprocessor. - -The :ref:`Marker ` step removes the ``path`` second-level key, -replaces the ``data`` second-level key's value with the marker's computed value -and adds further keys needed for the storage, for example, ``col_names``. - -.. code-block:: python - - {'BOLD': {'col_names': ['root_sum_of_squares_ets'], - 'data': ..., - 'meta': {'datagrabber': {'class': 'SPMAuditoryTestingDataGrabber', - 'types': ['BOLD', 'T1w']}, - 'datareader': {'class': 'DefaultDataReader'}, - 'dependencies': {'nilearn'}, - 'element': {'subject': 'sub001'}, - 'marker': {'agg_method': 'mean', - 'agg_method_params': None, - 'class': 'RSSETSMarker', - 'masks': None, - 'name': 'RSSETSMarker', - 'parcellation': 'Schaefer100x17'}, - 'type': 'BOLD'}}} - -.. note:: - - You never directly interact with the *data object* but it's important to know - where and how the object is being manipulated to reason about your pipeline. - -.. _data_types: - -Data Types ----------- - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Description - - Example - * - ``T1w`` - - T1w image (3D) - - Preprocessed or Raw T1w image - * - ``T2w`` - - T2w image (3D) - - Preprocessed or Raw T2w image - * - ``BOLD`` - - BOLD image (4D) - - Preprocessed or Denoised BOLD image (fMRIPrep output) - * - ``BOLD_confounds`` - - BOLD image confounds (CSV/TSV file) - - Confounds that can be applied to the BOLD image. - * - ``VBM_GM`` - - VBM Gray Matter segmentation (3D) - - CAT output (`m0wp1` images) - * - ``VBM_WM`` - - VBM White Matter segmentation (3D) - - CAT output (`m0wp2` images) - * - ``fALFF`` - - Voxel-wise fALFF image (3D) - - fALFF computed with CONN toolbox - * - ``GCOR`` - - Global Correlation image (3D) - - GCOR computed with CONN toolbox - * - ``LCOR`` - - Local Correlation image (3D) - - LCOR computed with CONN toolbox diff --git a/pr-preview/pr-273/_sources/understanding/datagrabber.rst.txt b/pr-preview/pr-273/_sources/understanding/datagrabber.rst.txt deleted file mode 100644 index 8fce71e8d..000000000 --- a/pr-preview/pr-273/_sources/understanding/datagrabber.rst.txt +++ /dev/null @@ -1,65 +0,0 @@ -.. include:: ../links.inc - -.. _datagrabber: - -Data Grabber -============ - -Description ------------ - -The ``DataGrabber`` is an object that can provide an interface to datasets you -want to work with in ``junifer``. Every concrete implementation of a DataGrabber -is aware of a particular dataset's structure and thus allows you to fetch -specific elements of interest from the dataset. It adds the ``path`` key to each -:ref:`data type ` in the :ref:`Data object `. - -DataGrabbers are intended to be used as context managers. When used within a -context, a DataGrabber takes care of any pre and post steps for interacting with -the dataset, for example, downloading and cleaning up. As the interface -is consistent, you always use the same procedure to interact with the DataGrabber. - -For example, a concrete implementation of :class:`.DataladDataGrabber` can -provide ``junifer`` with data from a Datalad dataset. Of course, DataGrabbers are -not only meant to work with Datalad datasets but any dataset. - -If you are interested in using already provided DataGrabbers, please go to -:doc:`../builtin`. And, if you want to implement your own DataGrabber, you need -to provide concrete implementations of abstract base classes already provided. - -Base Classes ------------- - -In this section, we showcase different abstract and concrete base classes you -might want to use to implement your own DataGrabber. - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Name - - Description - * - :class:`.BaseDataGrabber` - - | The abstract base class providing you an interface to implement your - | own DataGrabber. You should try to avoid using this directly and - | instead use :class:`.PatternDataGrabber` or - | :class:`.DataladDataGrabber`. To build your own custom *low-level* - | DataGrabber, you need to override the ``get_elements_keys``, - | ``get_elements`` and ``get_item`` methods, and most of the time you - | should also override other existing methods like ``__enter__`` and - | ``__exit__``. - * - :class:`.PatternDataGrabber` - - | It implements functionality to help you define the pattern of the - | dataset you want to get. For example, you know that T1w images are - | found in a directory following the pattern: - | ``{subject}/anat/{subject}_T1w.nii.gz`` inside of the dataset. Now you - | can provide this to the :class:`.PatternDataGrabber` and it will be - | able to get the file. - * - :class:`.DataladDataGrabber` - - | It implements functionality to deal with Datalad datasets. Specifically, - | the ``__enter__`` and ``__exit__`` methods take care of cloning and - | removing the Datalad dataset. - * - :class:`.PatternDataladDataGrabber` - - | It is a combination of :class:`.PatternDataGrabber` and - | :class:`.DataladDataGrabber`. This is probably the class you are looking - | for when using Datalad datasets. diff --git a/pr-preview/pr-273/_sources/understanding/datareader.rst.txt b/pr-preview/pr-273/_sources/understanding/datareader.rst.txt deleted file mode 100644 index 9876515bc..000000000 --- a/pr-preview/pr-273/_sources/understanding/datareader.rst.txt +++ /dev/null @@ -1,48 +0,0 @@ -.. include:: ../links.inc - -.. _datareader: - -Data Reader -=========== - -Description ------------ - -The ``DataReader`` is an object that is responsible for actually reading data -files in ``junifer``. It reads the value of the key ``path`` for each -:ref:`data type ` in the :ref:`Data object ` and loads -them into memory. After reading the data into memory, it adds the key ``data`` -to the same level as ``path`` and the value is the actual data in the memory. - -DataReaders are meant to be used inside the DataGrabber context but you can -operate on them outside the context as long as the actual data is in the memory -and the Python runtime has not garbage-collected it. - -For data formats not supported by ``junifer`` yet, you can either make your own -DataReader or open an issue on `junifer Github`_ and we can help you out. - -File Formats ------------- - -We already provide a concrete implementation :class:`.DefaultDataReader` which -knows how to read the following file formats: - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - File extension - - File type - - Description - * - ``.nii`` - - NIfTI (uncompressed) - - Uncompressed NIfTI - * - ``.nii.gz`` - - NIfTI (compressed) - - Compressed NIfTI - * - ``.csv`` - - CSV - - Comma-separated values file - * - ``.tsv`` - - TSV - - Tab-separated values file diff --git a/pr-preview/pr-273/_sources/understanding/index.rst.txt b/pr-preview/pr-273/_sources/understanding/index.rst.txt deleted file mode 100644 index 0757a3065..000000000 --- a/pr-preview/pr-273/_sources/understanding/index.rst.txt +++ /dev/null @@ -1,37 +0,0 @@ -.. include:: ../links.inc - -.. _understanding: - -Understanding ``junifer`` -========================= - -Before you start, you should understand how ``junifer`` works. ``junifer`` is a -tool conceived to extract features from neuroimaging data in an easy-to-use -manner, with minimal coding and minimal user expertise in the internal aspects. - -Unlike other tools like FSL, SPM, AFNI, etc., ``junifer`` is not a toolbox to -pre-process data, but a toolbox to extract features from previously -pre-processed data. - -The main idea is that you have a set of images (e.g. a set of functional MRI, -structural MRI, diffusion MRI, etc.) and you want to extract features to -later use in statistical analyses or machine learning (for example, using -julearn_). - -.. important:: - - ``junifer`` is not a toolbox to create pipelines, but a tool to configure the - ``junifer`` pipeline, which is intended to be fixed and not to be changed. If - you want to create a pipeline, you should use other tools like nipype_. - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - pipeline - data - datagrabber - datareader - preprocess - marker - storage diff --git a/pr-preview/pr-273/_sources/understanding/marker.rst.txt b/pr-preview/pr-273/_sources/understanding/marker.rst.txt deleted file mode 100644 index 4ae5f564b..000000000 --- a/pr-preview/pr-273/_sources/understanding/marker.rst.txt +++ /dev/null @@ -1,32 +0,0 @@ -.. include:: ../links.inc - -.. _marker: - -Marker -====== - -Description ------------ - -The ``Marker`` is an object that is responsible for feature extraction. It -primarily operates on data loaded into memory by :ref:`Data Reader ` -and stored in the ``data`` key of each :ref:`data type ` in the -:ref:`Data object `. In some cases, it can also operate on -pre-processed data as obtained from the :ref:`Preprocess ` step of -the pipeline. - -.. important:: - - This pre-process is not similar to pre-processing done by tools like FSL, - SPM, AFNI, etc., . For example, one can perform confound removal on loaded - data and then perform feature extraction. - -Markers are meant to be used inside the DataGrabber context but you can operate -on them outside the context as long as the actual data is in the memory and the -Python runtime has not garbage-collected it. - -If you are interested in using already provided Markers, please go to -:doc:`../builtin`. And, if you want to implement your own Marker, you need to -provide concrete implementation of :class:`.BaseMarker`. Specifically, you -need to override ``get_valid_inputs``, ``get_output_type`` and ``compute`` -methods. diff --git a/pr-preview/pr-273/_sources/understanding/pipeline.rst.txt b/pr-preview/pr-273/_sources/understanding/pipeline.rst.txt deleted file mode 100644 index 600304069..000000000 --- a/pr-preview/pr-273/_sources/understanding/pipeline.rst.txt +++ /dev/null @@ -1,76 +0,0 @@ -.. include:: ../links.inc - -.. _pipeline: - -The ``junifer`` Pipeline -======================== - -The junifer pipeline is the main execution path of junifer. It consists of five -steps: - -1. :ref:`Data Grabber `: Interpret the dataset and provide a list - of files. -2. :ref:`Data Reader `: Read the files. -3. :ref:`Preprocess `: Prepare the files' data for marker - computation. -4. :ref:`Marker Computation `: Compute the marker(s). -5. :ref:`Storage `: Store the marker(s) values. - -The element that is passed across the pipeline is called the -:ref:`Data Object`. - -The following is a graphical representation of the pipeline: - -.. mermaid:: - - flowchart LR - dg[Data Grabber] - dr[Data Reader] - pp[Preprocess] - mc[Marker Computation] - st[Storage] - dg --> dr - dr --> pp - pp --> mc - mc --> st - - -However, it is usually the case that several markers are computed for the same -data. Thus, the ``Marker Computation`` step of the pipeline is defined as a list -of markers. The following is a graphical representation of the pipeline execution -on multiple markers: - -.. mermaid:: - - flowchart LR - dg[Data Grabber] - dr[Data Reader] - pp[Preprocess] - mc1[Marker Computation] - mc2[Marker Computation] - mc3[Marker Computation] - mc4[Marker Computation] - mc5[Marker Computation] - st1[Storage] - st2[Storage] - st3[Storage] - st4[Storage] - st5[Storage] - dg --> dr - dr --> pp - pp --> mc1 - pp --> mc2 - pp --> mc3 - pp --> mc4 - pp --> mc5 - mc1 --> st1 - mc2 --> st2 - mc3 --> st3 - mc4 --> st4 - mc5 --> st5 - -.. note:: - - To avoid keeping in memory all of the computed marker, the storage step is - called after each marker computation, releasing the memory used to compute - each marker. diff --git a/pr-preview/pr-273/_sources/understanding/preprocess.rst.txt b/pr-preview/pr-273/_sources/understanding/preprocess.rst.txt deleted file mode 100644 index afbf28ce9..000000000 --- a/pr-preview/pr-273/_sources/understanding/preprocess.rst.txt +++ /dev/null @@ -1,196 +0,0 @@ -.. include:: ../links.inc - -.. _preprocess: - -Preprocess -========== - -Description ------------ - -The ``Preprocess`` is an object meant for pre-processing before or after -:ref:`Marker ` step depending on the use-case. For example, you might -want to perform confound removal on ``BOLD`` data before feature extraction. - - -.. note:: - - This step is optional for the pipeline to work. - -.. _preprocess_confounds: - -Confound Removal ----------------- - -This step is meant to remove *confounds* from the ``BOLD`` data. The confounds -are extracted from the ``BOLD_confounds`` data (must be provided by the -:ref:`Data Grabber `). The confounds are then regressed out from -the ``BOLD`` data using :func:`nilearn.image.clean_img`. - -Currently, ``junifer`` supports only one confound removal class: -:class:`.fMRIPrepConfoundRemover`. This class is meant to remove confounds as -described before, using the output of `fMRIPrep`_ as reference. - -Strategy -~~~~~~~~ - -This confound remover uses the `nilearn`_ API from -:func:`nilearn.interfaces.fmriprep.load_confounds`. That is, define a *strategy* -to extract the confounds from the ``BOLD_confounds`` data. The *strategy* is -defined by choosing the *noise components* to be used and the *confounds* to be -extracted from each noise components. The *noise components* currently supported -are: - -* ``motion`` -* ``wm_csf`` -* ``global_signal`` - -The confounds options for each *noise component* are: - -* ``basic``: the basic confounds for each *noise component*. For example, for - ``motion``, the basic confounds are the 6 motion parameters (3 translations - and 3 rotations). For ``wm_csf``, the basic confounds are the mean signal of - the white matter and CSF regions. For ``global_signal``, the basic confound - is the mean signal of the whole brain. -* ``power2``: the basic confounds plus the square of each basic confound. -* ``derivatives``: the basic confounds plus the derivative of each basic - confound. -* ``full``: the basic confounds, the derivative of each basic confound, the - square of each basic confound and the square of each derivative of each basic - confound. - -The *strategy* is defined as a dictionary, with the *noise components* as keys -and the *confounds* as values. - -Example in python format: - -.. code-block:: python - - strategy = { - "motion": "basic", - "wm_csf": "full", - "global_signal": "derivatives" - } - -or in YAML format: - -.. code-block:: yaml - - strategy: - motion: basic - wm_csf: full - global_signal: derivatives - -The default value is to use all the *noise components* with the ``full`` *confounds*: - -.. code-block:: python - - strategy = { - "motion": "full", - "wm_csf": "full", - "global_signal": "full" - } - -Other Parameters -~~~~~~~~~~~~~~~~ - -Additionally, the :class:`.fMRIPrepConfoundRemover` supports the following -parameters: - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Parameter - - Description - - Default - * - ``spike`` - - | Add a spike regressor in the timepoints when the framewise - | displacement exceeds this threshold. - - deactivated - * - ``detrend`` - - Apply detrending on timeseries, before confound removal. - - activated - * - ``standardize`` - - Scale signals to unit variance. - - activated - * - ``low_pass`` - - Low cutoff frequencies, in Hertz. - - deactivated - * - ``high_pass`` - - High cutoff frequencies, in Hertz. - - deactivated - * - ``t_r`` - - Repetition time, in second (sampling period). - - from NIfTI header - * - ``mask`` - - | If provided, signal is only cleaned from voxels inside the mask. - | If not, a mask is computed using - | :func:`nilearn.masking.compute_brain_mask`. - - compute - -.. _preprocess_warping: - -Warping or Transformation to other spaces ------------------------------------------ - -``junifer`` can also warp or transform any supported -:ref:`data type ` from the template space provided by the dataset -(e.g., ``MNI152NLin6Asym``) to either the subject's -:ref:`native space ` or to any other -:ref:`template space ` -(e.g., ``MNI152NLin2009cAsym``). This functionality is provided by -:class:`.SpaceWarper` and depends on external tools like FSL and / or ANTs. - -.. _preprocess_warping_native: - -Warping to subject's native space -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -To warp to subject's native space, the dataset needs to provide ``T1w`` and -``Warp`` data types and the DataGrabber needs to at least have -``["BOLD", "T1w", "Warp"]`` (if you are warping ``BOLD``) as the ``types`` -parameter's value. The :class:`.SpaceWarper`'s ``reference`` parameter needs -to be set to ``T1w``, which means that the ``BOLD`` data will be transformed -using the ``T1w`` as reference (it's resampled internally to match the -resolution of the ``BOLD``). The ``Warp`` data type is new and it's only purpose -is to provide the warp or transformation file (can be linear, non-linear or -linear + non-linear transform) for the purpose. For ``using`` parameter, you can -pass either ``"fsl"`` or ``"ants"`` depending on the warp or transformation file -format. - -An example YAML might look like this: - -.. code-block:: yaml - - preprocess: - - kind: SpaceWarper - using: fsl - reference: T1w - -.. _preprocess_warping_template: - -Warping to other template space -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In a situation where your dataset might provide the ``BOLD`` data (or any other -data type that you want to work on) in ``MNI152NLin6Asym`` template space but -you would like to compute features in ``MNI152NLin2009cAsym`` template space, -you can also use the :class:`.SpaceWarper` by setting the ``reference`` -parameter to the template space's name, in this case, -``reference="MNI152NLin2009cAsym"``. The ``using`` parameter needs to be set -to ``"ants"`` as we need it to warp the data. - -.. note:: - - We only support template spaces provided by `templateflow`_ and the naming - is similar except that we omit the ``tpl-`` prefix used by ``templateflow``. - -For an YAML example: - -.. code-block:: yaml - - preprocess: - - kind: SpaceWarper - using: ants - reference: MNI152NLin2009cAsym diff --git a/pr-preview/pr-273/_sources/understanding/storage.rst.txt b/pr-preview/pr-273/_sources/understanding/storage.rst.txt deleted file mode 100644 index 36d407e04..000000000 --- a/pr-preview/pr-273/_sources/understanding/storage.rst.txt +++ /dev/null @@ -1,79 +0,0 @@ -.. include:: ../links.inc - -.. _storage: - -Storage -======= - -Description ------------ - -The ``Storage`` is an object that is responsible for storing extracted features -as computed from :ref:`Marker ` step of the pipeline. If the pipeline is -provided with a ``storage-like`` object, the extracted features are stored via -that object else they are kept in memory. - -Storage is meant to be used inside the DataGrabber context but you can operate -on them outside the context as long as the processed data is in the memory and -the Python runtime has not garbage-collected it. - -The :ref:`Markers ` are responsible for defining what *storage kind* -(``matrix``, ``vector``, ``timeseries``) they support for which -:ref:`data type ` by overriding its ``get_output_type`` method. The -storage object in turn declares and provides implementation for specific -*storage kind*. For example, :class:`.SQLiteFeatureStorage` supports saving -``matrix``, ``vector`` and ``timeseries`` via ``store_matrix``, ``store_vector`` -and ``store_timeseries`` methods respectively. - -For storage interfaces not supported by ``junifer`` yet, you can either make -your own ``Storage`` by providing a concrete implementation of -:class:`.BaseFeatureStorage` or open an issue on `junifer Github`_ and we can -help you out. - -.. _storage_types: - -Storage Types -------------- - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Storage Type - - Description - - Options - - Reference - * - ``matrix`` - - A 2D matrix with row and column names - - ``col_names``, ``row_names``, ``matrix_kind``, ``diagonal`` - - :meth:`.BaseFeatureStorage.store_matrix` - * - ``vector`` - - A 1D row vector of values with column names - - ``col_names`` - - :meth:`.BaseFeatureStorage.store_vector` - * - ``timeseries`` - - A 2D matrix of values with column names - - ``col_names`` - - :meth:`.BaseFeatureStorage.store_timeseries` - -.. _storage_interfaces: - -Storage Interfaces ------------------- - -.. list-table:: - :widths: auto - :header-rows: 1 - - * - Storage class - - File extension - - File type - - Storage kinds - * - :class:`.SQLiteFeatureStorage` - - ``.sqlite`` - - SQLite - - ``matrix``, ``vector``, ``timeseries`` - * - :class:`.HDF5FeatureStorage` - - ``.hdf5`` - - HDF5 - - ``matrix``, ``vector``, ``timeseries`` diff --git a/pr-preview/pr-273/_sources/using/codeless.rst.txt b/pr-preview/pr-273/_sources/using/codeless.rst.txt deleted file mode 100644 index 0a075c4fe..000000000 --- a/pr-preview/pr-273/_sources/using/codeless.rst.txt +++ /dev/null @@ -1,236 +0,0 @@ -.. include:: ../links.inc - -.. _codeless: - -Code-less Configuration -======================= - -One of the most important features of ``junifer`` is its capacity to run without -writing a single line of code. This is achieved by using a configuration file -that is written in YAML_. In this file, we configure the different steps of -:ref:`pipeline`. - -As a reminder, this is how the pipeline looks like: - -.. mermaid:: - - flowchart LR - dg[Data Grabber] - dr[Data Reader] - pp[Preprocess] - mc[Marker Computation] - st[Storage] - dg --> dr - dr --> pp - pp --> mc - mc --> st - - -Thus, the configuration file must configure each of the sections of the pipeline, -as well as some general parameters. - -As an example, we will generate the configuration file for a pipeline that will -extract the mean ``VBM_GM`` values using two different parcellations and one set -of coordinates, from the ``Oasis VBM Testing dataset`` included in ``junifer``. - - -General Parameters ------------------- - -The general parameters are the ones that are not specific to any of the sections -of the pipeline, but configure ``junifer`` as a whole. These parameters are: - -* ``with``: A section used to specify modules and ``junifer`` extensions to use. -* ``workdir``: The working directory where ``junifer`` will store temporary files. - -Since the example uses a specific DataGrabber for testing, we need to add -``junifer.testing.registry`` to the ``with`` section. This will allow ``junifer`` -to find the DataGrabber. We will set the ``workdir`` to ``/tmp``. - -.. code-block:: yaml - - with: junifer.testing.registry - - workdir: /tmp - -Step-by-step Configuration --------------------------- - -In order to configure the pipeline, we need to configure each step: - -* ``datagrabber`` -* ``datareader`` -* ``preprocess`` -* ``markers`` -* ``storage`` - -.. important:: - - The ``datareader`` step configuration is optional, as ``junifer`` only - provides one DataReader. Nevertheless, it is possible to extend ``junifer`` - with custom DataReaders, and thus, it is also possible to configure this step. - - -Data Grabber -^^^^^^^^^^^^ - -The ``datagrabber`` section must be configured using the ``kind`` key to specify -the DataGrabber to use. Additional keys correspond to the parameters of the -DataGrabber constructor. - -For example, to use the :class:`.DataladAOMICPIOP1` DataGrabber, we just need to -specify its name as the ``kind`` key. - -.. code-block:: yaml - - datagrabber: - kind: DataladAOMICPIOP1 - -However, it is also possible to pass parameters to the DataGrabber constructor. -In this case, we can restrict the DataGrabber to fetch only the ``restingstate`` -task. - -.. code-block:: yaml - - datagrabber: - kind: DataladAOMICPIOP1 - tasks: restingstate - -In the ``Oasis VBM Testing dataset`` example, the section will look like this: - -.. code-block:: yaml - - datagrabber: - kind: OasisVBMTestingDataGrabber - - -Data Reader -^^^^^^^^^^^ - -As mentioned before, this section is entirely optional, as ``junifer`` only -provides one DataReader (:class:`.DefaultDataReader`), which is the default in -case the section is not specified. - -In any case, the syntax of the section is the same as for the ``datagrabber`` -section, using the ``kind`` key to specify the DataReader to use, and additional -keys to pass parameters to the DataReader constructor: - -.. code-block:: yaml - - datareader: - kind: DefaultDataReader - - -For the ``Oasis VBM Testing dataset`` example, we will not specify a -``datareader`` step. - -Preprocess -^^^^^^^^^^ - -``preprocess`` is also an optional step, as it might be the case that no -pre-processing is needed. As we can perform multiple preprocessing steps, it's -passed as a list of Preprocessors. In the case that pre-processing is needed, -each Preprocessord must be configured using the ``kind`` key to specify the -Preprocessor to use, and additional keys to pass parameters to the Preprocessor. - -For example, to use the :class:`.fMRIPrepConfoundRemover` Preprocessor, we just -need to specify its name as the ``kind`` key, as well as its parameters. - -.. code-block:: yaml - - preprocess: - - kind: fMRIPrepConfoundRemover - strategy: - motion: full - wm_csf: full - global_signal: basic - spike: 0.2 - detrend: false - standardize: true - - -For the ``Oasis VBM Testing dataset`` example, we will not specify a -preprocessing step. - - -Marker -^^^^^^ - -The ``markers`` section like the ``preprocess`` section expects a list of -markers. Each Marker has a name that we can use to refer to it later, -and a set of parameters that will be passed to the Marker. - -For the ``Oasis VBM Testing dataset`` example, we want to compute the mean -``VBM_GM`` value for each parcel using the ``Schaefer parcellation (100 parcels, -7 networks)``, ``Schaefer parcellation (200 parcels, 7 networks)``, and the -``DMNBuckner`` network, using ``5mm`` spheres. Thus, we will configure the -``markers`` section as follows: - -.. code-block:: yaml - - markers: - - name: Schaefer100x7_mean - kind: ParcelAggregation - parcellation: Schaefer100x7 - method: mean - - name: Schaefer200x7_mean - kind: ParcelAggregation - parcellation: Schaefer200x7 - method: mean - - name: DMNBuckner_5mm_mean - kind: SphereAggregation - coords: DMNBuckner - radius: 5 - method: mean - - -Storage -^^^^^^^ - -Finally, we need to define how and where the results will be stored. This is -done using the ``storage`` section, which must be configured using the ``kind`` -key to specify the storage to use, and additional keys to pass parameters. - -For example, to use the :class:`.HDF5FeatureStorage` storage, we just need to -specify where we want to store the results: - -.. code-block:: yaml - - storage: - kind: HDF5FeatureStorage - uri: /data/junifer/example/oasis_vbm_testing.hdf5 - - -Complete Example ----------------- - -This is how the full ``Oasis VBM Testing dataset`` example configuration file -looks like: - -.. code-block:: yaml - - with: junifer.testing.registry - - workdir: /tmp - - datagrabber: - kind: OasisVBMTestingDataGrabber - - markers: - - name: Schaefer100x7_mean - kind: ParcelAggregation - parcellation: Schaefer100x7 - method: mean - - name: Schaefer200x7_mean - kind: ParcelAggregation - parcellation: Schaefer200x7 - method: mean - - name: DMNBuckner_5mm_mean - kind: SphereAggregation - coords: DMNBuckner - radius: 5 - method: mean - - storage: - kind: HDF5FeatureStorage - uri: /data/junifer/example/oasis_vbm_testing.hdf5 diff --git a/pr-preview/pr-273/_sources/using/index.rst.txt b/pr-preview/pr-273/_sources/using/index.rst.txt deleted file mode 100644 index 545f57035..000000000 --- a/pr-preview/pr-273/_sources/using/index.rst.txt +++ /dev/null @@ -1,35 +0,0 @@ -.. include:: ../links.inc - -.. _using: - -Using ``junifer`` -================= - -In this section, we will cover the main aspects behind using ``junifer``. We -will first explain the basics behind junifer's code-less configuration. Then we -will show how to use the command line interface to ``run`` the pipeline and -``collect`` the results. Finally, we will show how to use the ``queue`` command -to interact with HPC and HTC systems. - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - codeless - running - queueing - - -.. _using_components: - -Using Common Components ------------------------ - -The following sections explains common components of ``junifer`` that can be used -across many steps of the pipeline. - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - masks diff --git a/pr-preview/pr-273/_sources/using/masks.rst.txt b/pr-preview/pr-273/_sources/using/masks.rst.txt deleted file mode 100644 index b0c6ba933..000000000 --- a/pr-preview/pr-273/_sources/using/masks.rst.txt +++ /dev/null @@ -1,75 +0,0 @@ -.. include:: ../links.inc - -.. _using_masks: - -Masks -===== - -Masks are essentially boolean arrays that are used to constrain the extraction -of features to voxels that are meaningful. For example, in an fMRI imaging -study, a mask can be used to constrain the extraction of features to voxels that -contain a certain ratio of gray matter to white matter / cerebrospinal fluid, -ensuring that the features are not extracted from voxels that contain mostly -white matter or cerebrospinal fluid, which could add noise to the BOLD signal. - -``junifer`` provides a number of built-in masks, which can be listed using -:func:`.list_masks`. Some masks are images, while other masks can be computed -using :ref:`nilearn` functions. - -For markers and steps that accept ``masks`` as an argument, the mask can be -specified as a string, which will be the name of a built-in mask, or as a -dictionary in which the **only** key is the built-in mask name and the value is -a dictionary of keyword arguments to pass to the mask function. - -For example, the following is a valid mask specification that specified the -``GM_prob0.2`` mask: - -.. code-block:: yaml - - masks: GM_prob0.2 - -The following is a valid mask specification that specifies the -``compute_brain_mask`` mask, with a threshold of ``0.5``. - -.. code-block:: yaml - - masks: - compute_brain_mask: - threshold: 0.5 - -Furthermore, junifer allows you to combine several masks using -:func:`nilearn.masking.intersect_masks`. This is done by specifying a list of -masks, where each mask is a string or dictionary as described above. For example, -the following is a valid mask specification that specifies the intersection of -the ``GM_prob0.2`` and ``compute_brain_mask`` masks. - -.. code-block:: yaml - - masks: - - GM_prob0.2 - - compute_brain_mask: - threshold: 0.5 - -We can also specify the arguments of :func:`nilearn.masking.intersect_masks` -(``threshold`` and ``connected``). The following example combines the same masks -as the previous one, but computing the full intersection. - -.. code-block:: yaml - - masks: - - GM_prob0.2 - - compute_brain_mask: - threshold: 0.5 - - threshold: 1 # intersection - -Alternatively, we can also compute the union, even if the voxels do not form a -connected component: - -.. code-block:: yaml - - masks: - - GM_prob0.2 - - compute_brain_mask: - threshold: 0.5 - - threshold: 0 # union - - connected: False # keep disconnected components diff --git a/pr-preview/pr-273/_sources/using/queueing.rst.txt b/pr-preview/pr-273/_sources/using/queueing.rst.txt deleted file mode 100644 index 413ea09cb..000000000 --- a/pr-preview/pr-273/_sources/using/queueing.rst.txt +++ /dev/null @@ -1,116 +0,0 @@ -.. include:: ../links.inc - -.. _queueing: - -Queueing Jobs (HPC, HTC) -======================== - -Yet another interesting feature of ``junifer`` is the ability to queue jobs on -computational clusters. This is done by adding the ``queue`` section in the -:ref:`codeless` file and executing the ``junifer queue`` command. - -While junifer is meant to support `HTCondor`_, `SLURM`_ and local queueing -using `GNU Parallel`_, only HTCondor is currently supported. This will be -implemented in future releases of ``junifer``. If you are in immediate need of -any of these schedulers, please create an issue on the `junifer github`_ -repository. - -The ``queue`` section of the :ref:`codeless` must start by defining the -following general parameters: - -* ``jobname``: Name of the job to be queued. This will be used to name the - folder where the job files will be created, as well as any relevant file. - Depending on the scheduler, it will also be listed in the queueing system - with this name. -* ``kind``: The kind of scheduler to be used. Currently, only ``HTCondor`` is - supported. - -Example in YAML: - -.. code-block:: yaml - - queue: - jobname: TestHTCondorQueue - kind: HTCondor - - -The rest of the parameters depend on the scheduler you are using. - -.. _queueing_condor: - -HTCondor --------- - -When using HTCondor, ``junifer`` will use a DAG to queue one job per element -(``junifer run``). As an option, the DAG can include a final job -(``junifer collect``) to collect the results once all of the individual element -jobs are finished. - -The following parameters are available for HTCondor: - -* ``env``: Definition of the Python environment. It must provide two variables: - - * ``kind``: This is the kind of virtual environment to use: - - * ``conda`` - * ``venv`` - * ``local`` (no virtual environment) - - * ``name``: This is the name of the environment to use in case a virtual - environment is used. It should be the name when ``conda`` is used and - the absolute or relative path to the virtualenv when ``venv`` is used. - If relative path is used then it should be relative to the YAML. - -* ``mem``: Memory to be used by the job. It must be provided as a string with - the units (e.g., ``"2GB"``). -* ``cpus``: Number of CPUs to be used by the job. It must be provided as an - integer (e.g., ``1``). -* ``disk``: Disk space to be used by the job. It must be provided as a string - with the units (e.g., ``"2GB"``). Keep in mind that ``junifer`` uses a local - working directory for each job, and datalad datasets might be cloned in this - temporary directory. -* ``extra_preamble``: Extra lines to be added to the HTCondor submit file. This - can be used to add extra parameters to the job, such as ``requirements``. -* ``collect``: This parameter allows to include a collect to the DAG to collect - the results once all of the individual element jobs are finished. This is - useful if you want to run a ``junifer collect`` job only once all of the - individual element jobs are finished. Valid options are: - - * ``yes``: Include a collect job in the DAG that will be executed even if some - of the individual element jobs fail. - * ``on_success_only``: Include a collect job to the DAG, but will only run if - all of the individual element jobs are successful. - * ``no``: Do not include a collect job to the DAG. - - -Example in YAML: - -.. code-block:: yaml - - queue: - jobname: TestHTCondorQueue - kind: HTCondor - env: - kind: conda - name: junifer - mem: 8G - disk: 2G - collect: "yes" # wrap it in string to avoid boolean - -Once the :ref:`codeless` file is ready, including the ``queue`` section, you can -queue the jobs by executing the ``junifer queue`` command. - -The ``queue`` command will create a folder with the name of the job (``jobname``) -under the ``junifer_jobs`` directory in the current working directory. - -The ``queue`` command accepts the following arguments: - -* ``--help``: Show a help message. -* ``--verbose``: Set the verbosity level. Options are ``warning``, ``info``, - ``debug``. -* ``--submit``: Submit the jobs to the queueing system. If not specified, the - job submit files will be created but not submitted. -* ``--overwrite``: Overwrite the job folder if it already exists. If not - specified, the command will fail if the job folder already exists. -* ``--element``: Queue only the specified element(s). If not specified, all - elements will be queued. diff --git a/pr-preview/pr-273/_sources/using/running.rst.txt b/pr-preview/pr-273/_sources/using/running.rst.txt deleted file mode 100644 index 118e01a3a..000000000 --- a/pr-preview/pr-273/_sources/using/running.rst.txt +++ /dev/null @@ -1,115 +0,0 @@ -.. include:: ../links.inc - -.. _running: - -Running Jobs -============ - -Once we have the :ref:`code-less configuration file `, we can use the -command line interface to extract the features. This is achieved in a two-step -process: ``run`` and ``collect``. - -The ``run`` command is used to extract the features from each element in the -dataset. However, depending on the storage interface, this may create one file -per subject. The ``collect`` command is then used to collect all of the -individual results into a single file. - -Assuming that we have a configuration file named ``config.yaml``, the following -commands will extract the features: - -.. code-block:: bash - - junifer run config.yaml - -The ``run`` command accepts the following additional arguments: - -* ``--help``: Show a help message. -* ``--verbose``: Set the verbosity level. Options are ``warning``, ``info``, - ``debug``. -* ``--element``: The *element* to run. If not specified, all elements will be - run. This parameter can be specified multiple times to run multiple elements. - If the *element* requires several parameters, they can be specified by - separating them with ``,``. It also accepts a file (e.g., ``elements.txt``) - containing complete or partial element(s). - -Example of running two elements: --------------------------------- - -.. code-block:: bash - - junifer run config.yaml --element sub-01 --element sub-02 - -You can also specify the elements via a text file like so: - -.. code-block:: bash - - junifer run config.yaml --element elements.txt - -And the corresponding ``elements.txt`` would be like so: - -.. code-block:: text - - sub-01 - sub-02 - -Example of elements with multiple parameters and verbose output: ----------------------------------------------------------------- - -.. code-block:: bash - - junifer run --verbose info config.yaml --element sub-01,ses-01 - -You can also specify the elements via a text file like so: - -.. code-block:: bash - - junifer run --verbose info config.yaml --element elements.txt - -And the corresponding ``elements.txt`` would be like so: - -.. code-block:: text - - sub-01,ses-01 - -In case you wanted to run for all possible sessions (e.g., ``ses-01``, -``ses-02``, ``ses-03``) but only for ``sub-01``, you could also do: - -.. code-block:: bash - - junifer run --verbose info config.yaml --element sub-01 - -or, - -.. code-block:: bash - - junifer run --verbose info config.yaml --element elements.txt - -and then the ``elements.txt`` would be like so: - -.. code-block:: text - - sub-01 - - -.. _collect: - -Collecting Results -================== - -Once the ``run`` command has been executed, the results are stored in the output -directory. However, depending on the storage interface, this may create one file -per subject. The ``collect`` command is then used to collect all of the -individual results into a single file. - -Assuming that we have a configuration file named ``config.yaml``, the following -commands will collect the results: - -.. code-block:: bash - - junifer collect config.yaml - -The ``collect`` command accepts the following additional arguments: - -* ``--help``: Show a help message. -* ``--verbose``: Set the verbosity level. Options are ``warning``, ``info``, - ``debug``. diff --git a/pr-preview/pr-273/_sources/whats_new.rst.txt b/pr-preview/pr-273/_sources/whats_new.rst.txt deleted file mode 100644 index d19d16505..000000000 --- a/pr-preview/pr-273/_sources/whats_new.rst.txt +++ /dev/null @@ -1,617 +0,0 @@ -.. include:: links.inc -.. include:: changes/contributors.inc - -.. _whats_new: - -What's new -========== - -.. towncrier release notes start - -Junifer 0.0.5.dev11 (2024-04-08) --------------------------------- - -Features -^^^^^^^^ - -- Add support for choosing between ``bash`` and ``zsh`` shells when queueing by - `Synchon Mandal`_ (:gh:`273`) - - -Junifer 0.0.4 (2024-04-05) --------------------------- - -Bugfixes -^^^^^^^^ - -- Make copying of assets in ``with`` block of YAML, relative to YAML and not to - current working directory by `Fede Raimondo`_ and `Synchon Mandal`_ - (:gh:`224`) -- Adapt ``junifer queue`` to properly use HTCondor >=10.4.0 - ``condor_submit_dag`` by `Fede Raimondo`_ and `Synchon Mandal`_ (:gh:`233`) -- Use 1 instead of 0 for successful FSL commands in ``_check_fsl()`` by - `Synchon Mandal`_ (:gh:`272`) -- Store native warped parcellations, coordinates and masks in element-scoped - tempdirs for the pipeline to work by `Synchon Mandal`_ (:gh:`274`) -- Change interpolation scheme for parcel and mask native space transformation - to nearest neighbour by `Synchon Mandal`_ (:gh:`276`) -- Bypass FSL ``std2imgcoord`` stdin bug and use recommended piped input for - coordinates transformation by `Synchon Mandal`_ (:gh:`278`) -- Add ``-std`` to FSL ``std2imgcoord`` for coordinates transformation by - `Synchon Mandal`_ (:gh:`280`) -- Replace FSL ``std2imgcoord`` with ``img2imgcoord`` as the former is incorrect - for coordinates transformation to other template spaces. (:gh:`281`) -- Propagate ReHo and fALFF maps, for aggregation to convert to other template - spaces when required by `Synchon Mandal`_ (:gh:`282`) -- Allow :class:`junifer.pipeline.WorkDirManager` to accept str via the - ``workdir`` parameter by `Synchon Mandal`_ (:gh:`283`) -- Avoid warping mask preprocessed with :class:`.fMRIPrepConfoundRemover` and - used by markers with ``mask="inherit"`` in subject-native template space by - `Fede Raimondo`_ and `Synchon Mandal`_ (:gh:`284`) -- Pass down input path if input space is "native" for ``ReHoEstimator`` and - ``ALFFEstimator``, else use respective compute maps by `Fede Raimondo`_ and - `Synchon Mandal`_ (:gh:`286`) -- Fix :class:`.HTCondorAdapter`'s script generation to use double quotes - instead of single quotes for HTCondor's ``VARS`` by `Synchon Mandal`_ - (:gh:`312`) -- Fix element access for :class:`.DMCC13Benchmark` DataGrabber by `Synchon - Mandal`_ (:gh:`314`) -- Add a validation step on the :func:`.run` function to validate the marker - collection by `Fede Raimondo`_ (:gh:`320`) -- Add the executable flag to the ants docker scripts, fsl docker scripts and - other running scripts by `Fede Raimondo`_ (:gh:`321`) -- Force ``str`` dtype when parsing elements from file by `Synchon Mandal`_ - (:gh:`322`) - - -API Changes -^^^^^^^^^^^ - -- Rename ``Power`` coordinates to ``Power2011`` by `Synchon Mandal`_ - (:gh:`245`) -- Add ``feature_md5`` argument to :func:`.read_transform()` by `Synchon - Mandal`_ (:gh:`248`) -- Add ``native_t1w`` parameter to :class:`.DataladAOMICID1000`, - :class:`.DataladAOMICPIOP1`, :class:`.DataladAOMICPIOP2`, enabling fetching - of T1w data in subject-native space by `Synchon Mandal`_ (:gh:`252`) -- Modify ``preprocessor`` to ``preprocessors`` in :func:`.run` and - ``preprocessing`` to ``preprocessors`` in :class:`.MarkerCollection` to - accept multiple preprocessors by `Synchon Mandal`_ (:gh:`263`) -- Add ``space`` parameter to :func:`.register_coordinates`, - :func:`.register_parcellation` and :func:`.register_mask` and return space - from :func:`.load_coordinates`, :func:`.load_parcellation` and - :func:`.load_mask` by `Synchon Mandal`_ and `Fede Raimondo`_ (:gh:`268`) -- Add ``template_type`` parameter to :func:`.get_template` by `Synchon Mandal`_ - (:gh:`299`) -- Change :meth:`.BasePreprocessor.preprocess` return values to preprocessed - target data and "helper" data types as a dictionary by `Synchon Mandal`_ - (:gh:`310`) -- Add a positional argument ``using`` for Markers and Preprocessors having - implementation-based variations, in particular :class:`.ReHoParcels`, - :class:`.ReHoSpheres`, :class:`.ALFFParcels`, :class:`.ALFFSpheres` and - :class:`.BOLDWarper` by `Synchon Mandal`_ (:gh:`311`) -- Change all ``probseg_`` types to ``VBM_`` types by `Fede Raimondo`_ - (:gh:`320`) -- Change the subject and session patterns for :class:`.DataladAOMICID1000`, - :class:`.DataladAOMICPIOP1`, :class:`.DataladAOMICPIOP2` and - :class:`.DMCC13Benchmark` so that they are consistent with their own - ``"participants.tsv"`` file by `Fede Raimondo`_ (:gh:`325`) - - -Improved Documentation -^^^^^^^^^^^^^^^^^^^^^^ - -- Add Zenodo badge in ``README`` and improve general documentation by `Synchon - Mandal`_ (:gh:`247`) -- Rename ``extMDN`` to ``extDMN`` (extended default mode network) and fix - listing for ``eMDN`` (extended multiple-demand network) by `Synchon Mandal`_ - (:gh:`251`) -- Fixed typo in code example for adding masks from "register_custom_mask" to - "register_mask" by `Tobias Muganga`_ (:gh:`291`) -- Rename ``Misc`` section to ``Miscellaneous`` in ``docs/whats_new.rst`` by - `Synchon Mandal`_ (:gh:`300`) -- Improve documentation by adding information about space transformation and - writing custom Preprocessors by `Synchon Mandal`_ (:gh:`317`) - - -Enhancements -^^^^^^^^^^^^ - -- Support element(s) to be specified via text file for ``--element`` option of - ``junifer run`` by `Synchon Mandal`_ (:gh:`182`) -- Support element-scoped directory and temporary directories for - :class:`junifer.pipeline.WorkDirManager` by `Synchon Mandal`_ (:gh:`258`) -- Improve element directory cleanup via - ``junifer.pipeline.WorkDirManager.cleanup_elementdir`` method by `Synchon - Mandal`_ (:gh:`259`) -- Improve :class:`.BasePreprocessor` for easy subclassing and adapt - :class:`.fMRIPrepConfoundRemover` to it by `Synchon Mandal`_ (:gh:`260`) -- Add ``space`` information to existing datagrabbers, masks, parcellations and - coordinates by `Synchon Mandal`_ and `Fede Raimondo`_ (:gh:`268`) -- Add ``mode`` as an aggregation function option in - :func:`.get_aggfunc_by_name` by `Synchon Mandal`_ (:gh:`287`) -- Adapt :class:`.BOLDWarper` to use FSL or ANTs depending on warp file - extension by `Synchon Mandal`_ (:gh:`293`) -- Rewrite :func:`.compute_brain_mask` to allow variable template fetching via - templateflow, according to target data by `Synchon Mandal`_ (:gh:`299`) -- Replace ``requests`` with ``httpx`` for fetching parcellations by `Synchon - Mandal`_ (:gh:`300`) -- Allow :class:`.BOLDWarper` to warp BOLD data to other MNI spaces by `Synchon - Mandal`_ (:gh:`302`) -- Add support for local ``junifer queue`` via GNU Parallel by `Synchon Mandal`_ - (:gh:`306`) -- Improve :class:`.PatternDataGrabber` and - :class:`.PatternDataladDataGrabber`'s ``patterns`` to enable ``space``, - ``format``, ``mask_item`` and other metadata description handling via YAML by - `Synchon Mandal`_ (:gh:`308`) -- Improve :class:`.BasePreprocessor` by revamping - :meth:`.BasePreprocessor.preprocess` and ``BasePreprocessor._fit_transform`` - to handle "helper" data types better and make the pipeline explicit where - data is being altered by `Synchon Mandal`_ (:gh:`310`) -- Improve external dependency handling for :class:`.PipelineStepMixin`-derived - objects having implementation-based variations by `Synchon Mandal`_ - (:gh:`311`) - - -Features -^^^^^^^^ - -- Introduce complexity markers: :class:`.HurstExponent`, - :class:`.MultiscaleEntropyAUC`, :class:`.PermEntropy`, - :class:`.RangeEntropy`, :class:`.RangeEntropyAUC` and :class:`.SampleEntropy` - by `Amir Omidvarnia`_ (:gh:`145`) -- Add ``junifer reset`` to reset storage and jobs directory by `Synchon - Mandal`_ (:gh:`240`) -- Add support for ``Power2013`` coordinates by `Synchon Mandal`_ (:gh:`245`) -- Support ``venv`` as environment kind for queueing jobs by `Synchon Mandal`_ - (:gh:`249`) -- Add support for ``AutobiographicalMemory`` coordinates by `Synchon Mandal`_ - (:gh:`250`) -- Add support for subject-native space by `Synchon Mandal`_ and `Fede - Raimondo`_ (:gh:`252`) -- Introduce :class:`junifer.pipeline.WorkDirManager` singleton class to manage - working and temporary directories across pipeline by `Synchon Mandal`_ - (:gh:`254`) -- Introduce :func:`.get_parcellation` to fetch parcellation tailored for the - data by `Synchon Mandal`_ (:gh:`264`) -- Introduce :func:`.get_coordinates` to fetch coordinates tailored for the data - by `Synchon Mandal`_ (:gh:`265`) -- Introduce ``junifer.preprocess.fsl.apply_warper._ApplyWarper`` to wrap FSL's - ``applywarp`` by `Synchon Mandal`_ (:gh:`266`) -- Introduce :class:`.BOLDWarper` for warping BOLD data via FSL's ``applywarp`` - by `Synchon Mandal`_ (:gh:`267`) -- Introduce :class:`.DMCC13Benchmark` to access `DMCC13benchmark dataset - `_ by `Synchon - Mandal`_ (:gh:`271`) -- Add ``Brainnetome 246`` parcellation to ``junifer.data`` by `Synchon Mandal`_ - (:gh:`275`) -- Introduce - ``junifer.preprocess.ants.ants_apply_transforms_warper._AntsApplyTransformsWarper`` - to wrap ANTs' ``antsApplyTransforms`` by `Synchon Mandal`_ (:gh:`293`) -- Introduce :func:`.run_ext_cmd` to take care of the boilerplate code for - running external commands from FSL, ANTs and others by `Synchon Mandal`_ - (:gh:`295`) -- Introduce :func:`.get_xfm` to fetch transformation files for moving between - template spaces by `Synchon Mandal`_ (:gh:`297`) -- Introduce :func:`.get_template` to fetch template space image tailored to a - target data by `Synchon Mandal`_ (:gh:`298`) -- Add support for on-the-fly template space transformation in - :func:`.get_parcellation` and :func:`.get_mask` to allow parcellation and - mask in different template spaces to work with a ``DataGrabber``'s data in a - specified template space. (:gh:`299`) -- Introduce :class:`.SpaceWarper` for warping ``T1w``, ``BOLD``, ``VBM_GM``, - ``VBM_WM``, ``fALFF``, ``GCOR`` and ``LCOR`` data to other spaces by `Synchon - Mandal`_ (:gh:`301`) -- Introduce :class:`.QueueContextAdapter` as an abstract base class for job - queueing and :class:`.HTCondorAdapter` as its implementation for HTCondor by - `Synchon Mandal`_ (:gh:`309`) - - -Miscellaneous -^^^^^^^^^^^^^ - -- Update dependencies requirements by `Fede Raimondo`_ (:gh:`253`) -- Pin ``ruff`` to ``0.1.0`` as the lowest version and update ``pre-commit`` - config by `Synchon Mandal`_ (:gh:`261`) -- Add support for accessing FSL via Docker wrapper along with ``flirt``, - ``applywarp`` and ``std2imgcoord`` commands by `Synchon Mandal`_ (:gh:`262`) -- Improve documentation, packaging and code style by `Synchon Mandal`_ - (:gh:`269`) -- Add support for Python 3.12 and make Python 3.11 the base for code coverage - and CI checks by `Synchon Mandal`_ (:gh:`270`) -- Add support for accessing ANTs via Docker wrapper along with - ``antsApplyTransforms`` and ``antsApplyTransformsToPoints`` by `Synchon - Mandal`_ (:gh:`277`) -- Make the external tool wrappers output to stderr instead of stdout by - `Synchon Mandal`_ (:gh:`279`) -- Add support for accessing FSL ``img2imgcoord`` via Docker wrapper command by - `Synchon Mandal`_ (:gh:`281`) -- Make :class:`.BOLDWarper` tool-agnostic by moving it from - ``junifer.preprocess.fsl`` to :mod:`junifer.preprocess` by `Synchon Mandal`_ - (:gh:`288`) -- Add support for accessing ANTs' ``ResampleImage`` via Docker wrapper by - `Synchon Mandal`_ (:gh:`293`) -- Update ``pyproject.toml`` and add FAIR shield in ``README.md`` by `Synchon - Mandal`_ (:gh:`294`) -- Update dependency listing in ``pyproject.toml``, add - ``.github/dependabot.yml`` to auto-update GitHub Actions, add ``ANTs`` and - ``FSL`` installation in CI and improve general code style by `Synchon - Mandal`_ (:gh:`300`) - - -Deprecations and Removals -^^^^^^^^^^^^^^^^^^^^^^^^^ - -- Deprecate :class:`.BOLDWarper` and mark for removal in v0.0.4 by `Synchon - Mandal`_ (:gh:`301`) - - -Junifer 0.0.3 (2023-07-21) --------------------------- - -Bugfixes -^^^^^^^^ - -- Enable YAML 1.2 support and allow multiline strings in YAML which would not - work earlier by `Synchon Mandal`_ (:gh:`223`) -- Handle ``datalad.IncompleteResultsError`` exception for partial clone in - :class:`.DataladDataGrabber` by `Synchon Mandal`_ (:gh:`235`) - - -API Changes -^^^^^^^^^^^ - -- Expose ``types`` parameter for :class:`.DataladAOMICID1000`, - :class:`.DataladAOMICPIOP1`, :class:`.DataladAOMICPIOP2` and - :class:`.JuselessUCLA` by `Synchon Mandal`_ (:gh:`132`) -- Rename ``junifer.testing.datagrabbers.SPMAuditoryTestingDatagrabber`` to - :class:`.SPMAuditoryTestingDataGrabber` and - ``junifer.testing.datagrabbers.OasisVBMTestingDatagrabber`` to - :class:`.OasisVBMTestingDataGrabber` by `Synchon Mandal`_ (:gh:`222`) -- Add :meth:`.BaseFeatureStorage.read` method for storage-like objects by - `Synchon Mandal`_ (:gh:`236`) - - -Improved Documentation -^^^^^^^^^^^^^^^^^^^^^^ - -- Improve general prose, formatting and code blocks in docs and set line length - for ``.rst`` files to 80 by `Synchon Mandal`_ (:gh:`220`) -- Update ``julearn`` example under ``examples`` by `Synchon Mandal`_ - (:gh:`242`) - - -Enhancements -^^^^^^^^^^^^ - -- Change validation of ``types`` against ``patterns`` to allow a subset of - ``patterns``'s types to be used for ``DataGrabber`` data fetch by `Synchon - Mandal`_ (:gh:`132`) -- Rename instances of "Datagrabber" to "DataGrabber" especially in - ``junifer.testing`` to be consistent by `Synchon Mandal`_ (:gh:`222`) -- Use ``ruamel.yaml`` instead of ``pyyaml`` as YAML I/O library by `Synchon - Mandal`_ (:gh:`223`) -- Adopt ``DataGrabber`` consistently throughout codebase to match with the - documentation by `Synchon Mandal`_ (:gh:`226`) -- Adopt ``DataReader`` consistently throughout codebase to match with the - documentation by `Synchon Mandal`_ (:gh:`227`) -- Enable ``stdout`` and ``stderr`` capture for AFNI commands by `Synchon - Mandal`_ (:gh:`234`) -- Adapt :meth:`.HDF5FeatureStorage.read_df` due to addition of - :meth:`.HDF5FeatureStorage.read` by `Synchon Mandal`_ (:gh:`236`) - - -Features -^^^^^^^^ - -- Add ``AICHA v1`` and ``AICHA v2`` parcellations to ``junifer.data`` by - `Synchon Mandal`_ (:gh:`173`) -- Add ``Shen 2013``, ``Shen 2015`` and ``Shen 2019`` parcellations to - ``junifer.data`` by `Synchon Mandal`_ (:gh:`184`) -- Add ``Yan 2023`` parcellation to ``junifer.data`` by `Synchon Mandal`_ - (:gh:`225`) -- Introduce :mod:`.onthefly` sub-module and :func:`.read_transform` for quick - transform operations on stored data by `Synchon Mandal`_ (:gh:`237`) - - -Miscellaneous -^^^^^^^^^^^^^ - -- Consistent docstrings for pytest fixtures used in the test suite by `Synchon - Mandal`_ (:gh:`228`) -- Adopt ``ruff`` as the only linter for the codebase by `Synchon Mandal`_ - (:gh:`229`) -- Improve ``codespell`` support by fixing typos in documentation by `Synchon - Mandal`_ (:gh:`230`) -- Adopt ``pre-commit`` for adding and managing git pre-commit hooks by - `Synchon Mandal`_ (:gh:`232`) -- Improve docstrings and code style and parametrize remaining tests for - ``junifer.data.parcellations`` by `Synchon Mandal`_ (:gh:`238`) -- Bump ``numpy`` version constraint to ``>=1.24,<1.26`` by `Synchon Mandal`_ - (:gh:`241`) - - -Junifer 0.0.2 (2023-03-31) --------------------------- - -Bugfixes -^^^^^^^^ - -- Fix a bug in which relative storage URIs will be computed relative to the CWD - and not to the location of the YAML file by `Fede Raimondo`_. (:gh:`127`) -- Fix ``junifer run`` to respect preprocess step specified in the pipeline by - `Synchon Mandal`_ (:gh:`159`) -- Fix a bug in which only ``REST1`` and ``REST2`` tasks could be accessed in - :class:`.DataladHCP1200` and :class:`.HCP1200` datagrabbers by `Fede - Raimondo`_ (:gh:`183`) -- Fix a bug in which fitting a marker (e.g. ``SphereAggregation``) on a - specific type (e.g.: ``BOLD``) will fail if another non-supported type (e.g.: - ``BOLD_confounds``) is present in the data object by `Fede Raimondo`_ - (:gh:`185`) -- Fix :class:`.ALFFParcels`, :class:`.ALFFSpheres`, :class:`.ReHoSpheres` and - :class:`.ReHoParcels` pass the ``extra_input`` parameter by `Fede Raimondo`_ - (:gh:`187`) -- Fix several markers that did not properly handle the ``extra_input`` - parameter by `Fede Raimondo`_ (:gh:`189`) -- Fix a bug in which relative paths in the YAML ``with`` directive would be - computed relative to the current working directory of the process instead of - the location of the YAML file by `Fede Raimondo`_. (:gh:`191`) -- Fix an issue with datalad cache and locks in which the user-specific - configuration might create a conflict in high throughput systems by `Fede - Raimondo`_ (:gh:`192`) -- Fix a bug in which :class:`.ParcelAggregation` could yield duplicated column - names if two or more parcels were used and label names were not unique by - `Fede Raimondo`_ (:gh:`194`) -- Fix a bug in which :func:`.count` will not be correctly applied across an - axis by `Fede Raimondo`_ (:gh:`195`) -- Fix an issue with datalad cache and locks in which the overridden settings in - Junifer were not propagated to subprocesses, resulting in using the default - settings by `Fede Raimondo`_ (:gh:`199`) -- Fix a bug in which :func:`.get_mask` fails for FunctionalConnectivityBase - class, because of missing extra_input parameter by `Leonard Sasse`_ - (:gh:`200`) -- Fix the output of :class:`.RSSETSMarker` to be 2D by `Synchon Mandal`_ - (:gh:`215`) - - -API Changes -^^^^^^^^^^^ - -- Add ``confounds_format`` parameter to :class:`.PatternDataGrabber` - constructor for improved handling of confounds specified via - ``BOLD_confounds`` data type by `Synchon Mandal`_ (:gh:`158`) -- Rename ``store_table()`` to ``store_vector()`` for storage-like objects and - adapt marker-like objects to use ``"vector"`` in place of ``"table"`` for - storage. Also, improve the logic of storing vectors by `Synchon Mandal`_ - (:gh:`181`) -- Add ``ica_fix`` parameter to :class:`.DataladHCP1200` and :class:`.HCP1200` - datagrabbers to allow for selecting data processed with ICA+FIX. Default - value is ``False`` which changes behaviour since 0.0.1 release. By `Fede - Raimondo`_ (:gh:`183`) -- Add ``pre_run`` parameter to ``_queue_condor`` by `Fede Raimondo`_ - (:gh:`188`) -- Expose ``allow_overlap`` parameter in :class:`.SphereAggregation` and - related markers by `Fede Raimondo`_ (:gh:`190`) -- Rename ``AmplitudeLowFrequencyFluctuationParcels`` and - ``AmplitudeLowFrequencyFluctuationSpheres`` to :class:`.ALFFParcels` and - :class:`.ALFFSpheres` by `Synchon Mandal`_ (:gh:`216`) - - -Improved Documentation -^^^^^^^^^^^^^^^^^^^^^^ - -- Add more documentation on registering parcellations, coordinates, and masks - by `Leonard Sasse`_ (:gh:`166`) -- Migrate and document changelog creation and maintenance via ``towncrier`` by - `Synchon Mandal`_ (:gh:`203`) -- Add copy button to documentation code blocks by `Synchon Mandal`_ (:gh:`205`) -- Add sections *starting* and *help* in the documentation by `Fede Raimondo`_ - (:gh:`210`) -- Shorten Sphinx references across code and docs, and add ``black`` shield in - README by `Synchon Mandal`_ (:gh:`218`) - - -Enhancements -^^^^^^^^^^^^ - -- Organize functional connectivity markers in - ``junifer.markers.functional_connectivity`` by `Synchon Mandal`_ (:gh:`107`) -- Change HCP datagrabber tests to decrease CI running time by `Fede Raimondo`_ - (:gh:`155`) -- Allow :class:`.PartlyCloudyTestingDataGrabber` to be accessible via ``import - junifer.testing.registry`` by `Synchon Mandal`_ (:gh:`160`) -- Update docstrings and fix typo in log message by `Synchon Mandal`_ - (:gh:`165`) -- Add fMRIPrep brain masks to the datagrabber patterns for all datagrabbers in - the aomic sub-package by `Leonard Sasse`_ (:gh:`177`) -- Improved logging output for preprocessing, collecting and pipeline building - from YAML by `Fede Raimondo`_ (:gh:`185`) -- Allow for empty spheres in :class:`.JuniferNiftiSpheresMasker`, that will - result in NaNs. Also, modify the behaviour of the ``collect`` parameter in - HTCondor ``queue`` function to run a collect job even if some of the previous - jobs fail. This is useful to collect the results of a pipeline even if some - of the jobs fail by `Fede Raimondo`_ (:gh:`190`) -- Allow for empty parcels in :class:`.ParcelAggregation`, that will result in - NaNs by `Fede Raimondo`_ (:gh:`194`) -- Improve metadata and data I/O for :class:`.HDF5FeatureStorage` by `Synchon - Mandal`_ (:gh:`196`) -- Force datalad to be non-interactive on *queued* jobs by `Fede Raimondo`_ - (:gh:`201`) -- Add missing ``abstractmethod`` decorators for ``get_valid_inputs`` methods of - :class:`.BaseMarker` and :class:`.BasePreprocessor` by `Synchon Mandal`_ - (:gh:`214`) - - -Features -^^^^^^^^ - -- Add :class:`.EdgeCentricFCParcels` and :class:`.EdgeCentricFCSpheres` by - `Leonard Sasse`_ (:gh:`64`) -- Expose a :func:`.merge_parcellations` function to merge a list of - parcellations by `Leonard Sasse`_ (:gh:`146`) -- Add support for HDF5 feature storage via :class:`.HDF5FeatureStorage` by - `Synchon Mandal`_ (:gh:`147`) -- Add :class:`.TemporalSNRParcels` and :class:`.TemporalSNRSpheres` by `Leonard - Sasse`_ (:gh:`163`) -- Add support for ``Power`` coordinates by `Synchon Mandal`_ (:gh:`167`) -- Add support for ``Dosenbach`` coordinates by `Synchon Mandal`_ (:gh:`168`) -- Add support for nilearn computed masks (``compute_epi_mask``, - ``compute_brain_mask``, ``compute_background_mask``, - ``fetch_icbm152_brain_gm_mask``) by `Fede Raimondo`_ (:gh:`175`) -- Add aggregation function :func:`.count` that returns the number of elements - in a given axis. This allows to count the number of voxels per sphere/parcel - when used as ``method`` in markers by `Fede Raimondo`_ (:gh:`190`) - - -Junifer 0.0.1 (2022-12-20) --------------------------- - -Bugfixes -^^^^^^^^ - -- Fix a bug in which a :class:`.PatternDataGrabber` would now work with - relative ``datadir`` paths (reported by `Leonard Sasse`_, fixed by - `Fede Raimondo`_) (:gh:`96`, :gh:`98`) - -- Fix a bug in which :class:`.DataladAOMICPIOP2` datagrabber did not use user - input to constrain elements based on tasks by `Leonard Sasse`_ (:gh:`105`) - -- Fix a bug in which a datalad dataset could remove a user-cloned dataset by - `Fede Raimondo`_ (:gh:`53`) - -- Fix a bug in which CLI command would not work using elements with more than - one field by `Fede Raimondo`_ - -- Fix a bug in which the generated DAG for HTCondor will not work by - `Fede Raimondo`_ (:gh:`143`) - - -API Changes -^^^^^^^^^^^ - -- Change the ``single_output`` default parameter in storage classes from - ``False`` to ``True`` by `Fede Raimondo`_ (:gh:`134`) - - -Improved Documentation -^^^^^^^^^^^^^^^^^^^^^^ - -- Add an example how to use ``junifer`` and ``julearn`` in one pipeline to - extract features and do machine learning by `Leonard Sasse`_, - `Nicolas Nieto`_, and `Sami Hamdan`_ (:gh:`40`) - -- Add documentation for the datagrabbers by `Leonard Sasse`_, - `Nicolas Nieto`_, and `Sami Hamdan`_ - -- Change documentation template to furo. Fix references and standardize - documentation by `Fede Raimondo`_ (:gh:`114`) - - -Enhancements -^^^^^^^^^^^^ - -- Add comments to :class:`.DataladDataGrabber` datagrabber and change to use - ``datalad-clone`` instead of ``datalad-install`` by `Benjamin Poldrack`_ - (:gh:`55`) - -- Upgrade storage interface for storage-like objects by `Synchon Mandal`_ - (:gh:`84`) - -- Add missing type annotations by `Synchon Mandal`_ (:gh:`74`) - -- Refactor markers ``on`` attribute and ``get_valid_inputs`` to verify that the - marker can be computed on the input data types by `Fede Raimondo`_ - -- Add test for :class:`.DataladHCP1200` datagrabber by `Synchon Mandal`_ - (:gh:`93`) - -- Refactor :class:`.DataladAOMICID1000` slightly by `Leonard Sasse`_ (:gh:`94`) - -- Rename "atlas" to "parcellation" by `Fede Raimondo`_ (:gh:`116`) - -- Refactor the :class:`.BaseDataGrabber` class to allow for easier subclassing - by `Fede Raimondo`_ (:gh:`123`) - -- Allow custom aggregation method for :class:`.SphereAggregation` by - `Synchon Mandal`_ (:gh:`102`) - -- Add support for "masks" by `Fede Raimondo`_ (:gh:`79`) - -- Allow :class:`.ParcelAggregation` to apply multiple parcellations at once by - `Fede Raimondo`_ (:gh:`131`) - -- Refactor :class:`.PipelineStepMixin` to improve its implementation and - validation for pipeline steps by `Synchon Mandal`_ (:gh:`152`) - - -Features -^^^^^^^^ - -- Implement :class:`.SPMAuditoryTestingDataGrabber` datagrabber by - `Fede Raimondo`_ (:gh:`52`) - -- Implement matrix storage in SQliteFeatureStorage by `Fede Raimondo`_ - (:gh:`42`) - -- Implement :class:`.FunctionalConnectivityParcels` marker for functional - connectivity using a parcellation by `Amir Omidvarnia`_ and - `Kaustubh R. Patil`_ (:gh:`41`) - -- Implement :func:`.register_coordinates`, :func:`.list_coordinates` and - :func:`.load_coordinates` by `Fede Raimondo`_ (:gh:`11`) - -- Add :class:`.DataladAOMICID1000` datagrabber for AOMIC ID1000 dataset - including tests and creation of mock dataset for testing by - `Vera Komeyer`_ and `Xuan Li`_ (:gh:`60`) - -- Add support to access other input in the data object in the ``compute`` method - by `Fede Raimondo`_ - -- Implement :class:`.RSSETSMarker` marker by `Leonard Sasse`_, `Nicolas Nieto`_ - and `Sami Hamdan`_ (:gh:`51`) - -- Implement :class:`.SphereAggregation` marker by `Fede Raimondo`_ (:gh:`83`) - -- Implement :class:`.DataladAOMICPIOP1` and :class:`.DataladAOMICPIOP2` - datagrabbers for AOMIC PIOP1 and PIOP2 datasets respectively by - `Leonard Sasse`_ (:gh:`94`) - -- Implement :class:`.JuselessDataladCamCANVBM` datagrabber by `Leonard Sasse`_ - (:gh:`99`) - -- Implement :class:`.JuselessDataladIXIVBM` CAT output datagrabber for juseless - by `Leonard Sasse`_ (:gh:`48`) - -- Add ``junifer wtf`` to report environment details by `Synchon Mandal`_ - (:gh:`33`) - -- Add ``junifer selftest`` to report environment details by `Synchon Mandal`_ - (:gh:`9`) - -- Implement :class:`.JuselessDataladAOMICID1000VBM` datagrabber for accessing - AOMIC ID1000 VBM from juseless by `Felix Hoffstaedter`_ and `Synchon Mandal`_ - (:gh:`57`) - -- Add :class:`.fMRIPrepConfoundRemover` by `Fede Raimondo`_ and `Leonard Sasse`_ - (:gh:`111`) - -- Implement :class:`.CrossParcellationFC` marker by `Leonard Sasse`_ and - `Kaustubh R. Patil`_ (:gh:`85`) - -- Add :class:`.JuselessUCLA` datagrabber for the UCLA dataset available on - juseless by `Leonard Sasse`_ (:gh:`118`) - -- Introduce a singleton decorator for marker computations by `Synchon Mandal`_ - (:gh:`151`) - -- Implement :class:`.ReHoParcels` and :class:`.ReHoSpheres` markers by - `Synchon Mandal`_ (:gh:`36`) - -- Implement :class:`.ALFFParcels` and :class:`.ALFFSpheres` markers by - `Fede Raimondo`_ (:gh:`35`) - - -Miscellaneous -^^^^^^^^^^^^^ - -- Create the repository based on the mockup by `Fede Raimondo`_ diff --git a/pr-preview/pr-273/_static/basic.css b/pr-preview/pr-273/_static/basic.css deleted file mode 100644 index 30fee9d0f..000000000 --- a/pr-preview/pr-273/_static/basic.css +++ /dev/null @@ -1,925 +0,0 @@ -/* - * basic.css - * ~~~~~~~~~ - * - * Sphinx stylesheet -- basic theme. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -/* -- main layout ----------------------------------------------------------- */ - -div.clearer { - clear: both; -} - -div.section::after { - display: block; - content: ''; - clear: left; -} - -/* -- relbar ---------------------------------------------------------------- */ - -div.related { - width: 100%; - font-size: 90%; -} - -div.related h3 { - display: none; -} - -div.related ul { - margin: 0; - padding: 0 0 0 10px; - list-style: none; -} - -div.related li { - display: inline; -} - -div.related li.right { - float: right; - margin-right: 5px; -} - -/* -- sidebar --------------------------------------------------------------- */ - -div.sphinxsidebarwrapper { - padding: 10px 5px 0 10px; -} - -div.sphinxsidebar { - float: left; - width: 230px; - margin-left: -100%; - font-size: 90%; - word-wrap: break-word; - overflow-wrap : break-word; -} - -div.sphinxsidebar ul { - list-style: none; -} - -div.sphinxsidebar ul ul, -div.sphinxsidebar ul.want-points { - margin-left: 20px; - list-style: square; -} - -div.sphinxsidebar ul ul { - margin-top: 0; - margin-bottom: 0; -} - -div.sphinxsidebar form { - margin-top: 10px; -} - -div.sphinxsidebar input { - border: 1px solid #98dbcc; - font-family: sans-serif; - font-size: 1em; -} - -div.sphinxsidebar #searchbox form.search { - overflow: hidden; -} - -div.sphinxsidebar #searchbox input[type="text"] { - float: left; - width: 80%; - padding: 0.25em; - box-sizing: border-box; -} - -div.sphinxsidebar #searchbox input[type="submit"] { - float: left; - width: 20%; - border-left: none; - padding: 0.25em; - box-sizing: border-box; -} - - -img { - border: 0; - max-width: 100%; -} - -/* -- search page ----------------------------------------------------------- */ - -ul.search { - margin: 10px 0 0 20px; - padding: 0; -} - -ul.search li { - padding: 5px 0 5px 20px; - background-image: url(file.png); - background-repeat: no-repeat; - background-position: 0 7px; -} - -ul.search li a { - font-weight: bold; -} - -ul.search li p.context { - color: #888; - margin: 2px 0 0 30px; - text-align: left; -} - -ul.keywordmatches li.goodmatch a { - font-weight: bold; -} - -/* -- index page ------------------------------------------------------------ */ - -table.contentstable { - width: 90%; - margin-left: auto; - margin-right: auto; -} - -table.contentstable p.biglink { - line-height: 150%; -} - -a.biglink { - font-size: 1.3em; -} - -span.linkdescr { - font-style: italic; - padding-top: 5px; - font-size: 90%; -} - -/* -- general index --------------------------------------------------------- */ - -table.indextable { - width: 100%; -} - -table.indextable td { - text-align: left; - vertical-align: top; -} - -table.indextable ul { - margin-top: 0; - margin-bottom: 0; - list-style-type: none; -} - -table.indextable > tbody > tr > td > ul { - padding-left: 0em; -} - -table.indextable tr.pcap { - height: 10px; -} - -table.indextable tr.cap { - margin-top: 10px; - background-color: #f2f2f2; -} - -img.toggler { - margin-right: 3px; - margin-top: 3px; - cursor: pointer; -} - -div.modindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -div.genindex-jumpbox { - border-top: 1px solid #ddd; - border-bottom: 1px solid #ddd; - margin: 1em 0 1em 0; - padding: 0.4em; -} - -/* -- domain module index --------------------------------------------------- */ - -table.modindextable td { - padding: 2px; - border-collapse: collapse; -} - -/* -- general body styles --------------------------------------------------- */ - -div.body { - min-width: 360px; - max-width: 800px; -} - -div.body p, div.body dd, div.body li, div.body blockquote { - -moz-hyphens: auto; - -ms-hyphens: auto; - -webkit-hyphens: auto; - hyphens: auto; -} - -a.headerlink { - visibility: hidden; -} - -a:visited { - color: #551A8B; -} - -h1:hover > a.headerlink, -h2:hover > a.headerlink, -h3:hover > a.headerlink, -h4:hover > a.headerlink, -h5:hover > a.headerlink, -h6:hover > a.headerlink, -dt:hover > a.headerlink, -caption:hover > a.headerlink, -p.caption:hover > a.headerlink, -div.code-block-caption:hover > a.headerlink { - visibility: visible; -} - -div.body p.caption { - text-align: inherit; -} - -div.body td { - text-align: left; -} - -.first { - margin-top: 0 !important; -} - -p.rubric { - margin-top: 30px; - font-weight: bold; -} - -img.align-left, figure.align-left, .figure.align-left, object.align-left { - clear: left; - float: left; - margin-right: 1em; -} - -img.align-right, figure.align-right, .figure.align-right, object.align-right { - clear: right; - float: right; - margin-left: 1em; -} - -img.align-center, figure.align-center, .figure.align-center, object.align-center { - display: block; - margin-left: auto; - margin-right: auto; -} - -img.align-default, figure.align-default, .figure.align-default { - display: block; - margin-left: auto; - margin-right: auto; -} - -.align-left { - text-align: left; -} - -.align-center { - text-align: center; -} - -.align-default { - text-align: center; -} - -.align-right { - text-align: right; -} - -/* -- sidebars -------------------------------------------------------------- */ - -div.sidebar, -aside.sidebar { - margin: 0 0 0.5em 1em; - border: 1px solid #ddb; - padding: 7px; - background-color: #ffe; - width: 40%; - float: right; - clear: right; - overflow-x: auto; -} - -p.sidebar-title { - font-weight: bold; -} - -nav.contents, -aside.topic, -div.admonition, div.topic, blockquote { - clear: left; -} - -/* -- topics ---------------------------------------------------------------- */ - -nav.contents, -aside.topic, -div.topic { - border: 1px solid #ccc; - padding: 7px; - margin: 10px 0 10px 0; -} - -p.topic-title { - font-size: 1.1em; - font-weight: bold; - margin-top: 10px; -} - -/* -- admonitions ----------------------------------------------------------- */ - -div.admonition { - margin-top: 10px; - margin-bottom: 10px; - padding: 7px; -} - -div.admonition dt { - font-weight: bold; -} - -p.admonition-title { - margin: 0px 10px 5px 0px; - font-weight: bold; -} - -div.body p.centered { - text-align: center; - margin-top: 25px; -} - -/* -- content of sidebars/topics/admonitions -------------------------------- */ - -div.sidebar > :last-child, -aside.sidebar > :last-child, -nav.contents > :last-child, -aside.topic > :last-child, -div.topic > :last-child, -div.admonition > :last-child { - margin-bottom: 0; -} - -div.sidebar::after, -aside.sidebar::after, -nav.contents::after, -aside.topic::after, -div.topic::after, -div.admonition::after, -blockquote::after { - display: block; - content: ''; - clear: both; -} - -/* -- tables ---------------------------------------------------------------- */ - -table.docutils { - margin-top: 10px; - margin-bottom: 10px; - border: 0; - border-collapse: collapse; -} - -table.align-center { - margin-left: auto; - margin-right: auto; -} - -table.align-default { - margin-left: auto; - margin-right: auto; -} - -table caption span.caption-number { - font-style: italic; -} - -table caption span.caption-text { -} - -table.docutils td, table.docutils th { - padding: 1px 8px 1px 5px; - border-top: 0; - border-left: 0; - border-right: 0; - border-bottom: 1px solid #aaa; -} - -th { - text-align: left; - padding-right: 5px; -} - -table.citation { - border-left: solid 1px gray; - margin-left: 1px; -} - -table.citation td { - border-bottom: none; -} - -th > :first-child, -td > :first-child { - margin-top: 0px; -} - -th > :last-child, -td > :last-child { - margin-bottom: 0px; -} - -/* -- figures --------------------------------------------------------------- */ - -div.figure, figure { - margin: 0.5em; - padding: 0.5em; -} - -div.figure p.caption, figcaption { - padding: 0.3em; -} - -div.figure p.caption span.caption-number, -figcaption span.caption-number { - font-style: italic; -} - -div.figure p.caption span.caption-text, -figcaption span.caption-text { -} - -/* -- field list styles ----------------------------------------------------- */ - -table.field-list td, table.field-list th { - border: 0 !important; -} - -.field-list ul { - margin: 0; - padding-left: 1em; -} - -.field-list p { - margin: 0; -} - -.field-name { - -moz-hyphens: manual; - -ms-hyphens: manual; - -webkit-hyphens: manual; - hyphens: manual; -} - -/* -- hlist styles ---------------------------------------------------------- */ - -table.hlist { - margin: 1em 0; -} - -table.hlist td { - vertical-align: top; -} - -/* -- object description styles --------------------------------------------- */ - -.sig { - font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; -} - -.sig-name, code.descname { - background-color: transparent; - font-weight: bold; -} - -.sig-name { - font-size: 1.1em; -} - -code.descname { - font-size: 1.2em; -} - -.sig-prename, code.descclassname { - background-color: transparent; -} - -.optional { - font-size: 1.3em; -} - -.sig-paren { - font-size: larger; -} - -.sig-param.n { - font-style: italic; -} - -/* C++ specific styling */ - -.sig-inline.c-texpr, -.sig-inline.cpp-texpr { - font-family: unset; -} - -.sig.c .k, .sig.c .kt, -.sig.cpp .k, .sig.cpp .kt { - color: #0033B3; -} - -.sig.c .m, -.sig.cpp .m { - color: #1750EB; -} - -.sig.c .s, .sig.c .sc, -.sig.cpp .s, .sig.cpp .sc { - color: #067D17; -} - - -/* -- other body styles ----------------------------------------------------- */ - -ol.arabic { - list-style: decimal; -} - -ol.loweralpha { - list-style: lower-alpha; -} - -ol.upperalpha { - list-style: upper-alpha; -} - -ol.lowerroman { - list-style: lower-roman; -} - -ol.upperroman { - list-style: upper-roman; -} - -:not(li) > ol > li:first-child > :first-child, -:not(li) > ul > li:first-child > :first-child { - margin-top: 0px; -} - -:not(li) > ol > li:last-child > :last-child, -:not(li) > ul > li:last-child > :last-child { - margin-bottom: 0px; -} - -ol.simple ol p, -ol.simple ul p, -ul.simple ol p, -ul.simple ul p { - margin-top: 0; -} - -ol.simple > li:not(:first-child) > p, -ul.simple > li:not(:first-child) > p { - margin-top: 0; -} - -ol.simple p, -ul.simple p { - margin-bottom: 0; -} - -aside.footnote > span, -div.citation > span { - float: left; -} -aside.footnote > span:last-of-type, -div.citation > span:last-of-type { - padding-right: 0.5em; -} -aside.footnote > p { - margin-left: 2em; -} -div.citation > p { - margin-left: 4em; -} -aside.footnote > p:last-of-type, -div.citation > p:last-of-type { - margin-bottom: 0em; -} -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { - content: ""; - clear: both; -} - -dl.field-list { - display: grid; - grid-template-columns: fit-content(30%) auto; -} - -dl.field-list > dt { - font-weight: bold; - word-break: break-word; - padding-left: 0.5em; - padding-right: 5px; -} - -dl.field-list > dd { - padding-left: 0.5em; - margin-top: 0em; - margin-left: 0em; - margin-bottom: 0em; -} - -dl { - margin-bottom: 15px; -} - -dd > :first-child { - margin-top: 0px; -} - -dd ul, dd table { - margin-bottom: 10px; -} - -dd { - margin-top: 3px; - margin-bottom: 10px; - margin-left: 30px; -} - -.sig dd { - margin-top: 0px; - margin-bottom: 0px; -} - -.sig dl { - margin-top: 0px; - margin-bottom: 0px; -} - -dl > dd:last-child, -dl > dd:last-child > :last-child { - margin-bottom: 0; -} - -dt:target, span.highlighted { - background-color: #fbe54e; -} - -rect.highlighted { - fill: #fbe54e; -} - -dl.glossary dt { - font-weight: bold; - font-size: 1.1em; -} - -.versionmodified { - font-style: italic; -} - -.system-message { - background-color: #fda; - padding: 5px; - border: 3px solid red; -} - -.footnote:target { - background-color: #ffa; -} - -.line-block { - display: block; - margin-top: 1em; - margin-bottom: 1em; -} - -.line-block .line-block { - margin-top: 0; - margin-bottom: 0; - margin-left: 1.5em; -} - -.guilabel, .menuselection { - font-family: sans-serif; -} - -.accelerator { - text-decoration: underline; -} - -.classifier { - font-style: oblique; -} - -.classifier:before { - font-style: normal; - margin: 0 0.5em; - content: ":"; - display: inline-block; -} - -abbr, acronym { - border-bottom: dotted 1px; - cursor: help; -} - -.translated { - background-color: rgba(207, 255, 207, 0.2) -} - -.untranslated { - background-color: rgba(255, 207, 207, 0.2) -} - -/* -- code displays --------------------------------------------------------- */ - -pre { - overflow: auto; - overflow-y: hidden; /* fixes display issues on Chrome browsers */ -} - -pre, div[class*="highlight-"] { - clear: both; -} - -span.pre { - -moz-hyphens: none; - -ms-hyphens: none; - -webkit-hyphens: none; - hyphens: none; - white-space: nowrap; -} - -div[class*="highlight-"] { - margin: 1em 0; -} - -td.linenos pre { - border: 0; - background-color: transparent; - color: #aaa; -} - -table.highlighttable { - display: block; -} - -table.highlighttable tbody { - display: block; -} - -table.highlighttable tr { - display: flex; -} - -table.highlighttable td { - margin: 0; - padding: 0; -} - -table.highlighttable td.linenos { - padding-right: 0.5em; -} - -table.highlighttable td.code { - flex: 1; - overflow: hidden; -} - -.highlight .hll { - display: block; -} - -div.highlight pre, -table.highlighttable pre { - margin: 0; -} - -div.code-block-caption + div { - margin-top: 0; -} - -div.code-block-caption { - margin-top: 1em; - padding: 2px 5px; - font-size: small; -} - -div.code-block-caption code { - background-color: transparent; -} - -table.highlighttable td.linenos, -span.linenos, -div.highlight span.gp { /* gp: Generic.Prompt */ - user-select: none; - -webkit-user-select: text; /* Safari fallback only */ - -webkit-user-select: none; /* Chrome/Safari */ - -moz-user-select: none; /* Firefox */ - -ms-user-select: none; /* IE10+ */ -} - -div.code-block-caption span.caption-number { - padding: 0.1em 0.3em; - font-style: italic; -} - -div.code-block-caption span.caption-text { -} - -div.literal-block-wrapper { - margin: 1em 0; -} - -code.xref, a code { - background-color: transparent; - font-weight: bold; -} - -h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { - background-color: transparent; -} - -.viewcode-link { - float: right; -} - -.viewcode-back { - float: right; - font-family: sans-serif; -} - -div.viewcode-block:target { - margin: -1px -10px; - padding: 0 10px; -} - -/* -- math display ---------------------------------------------------------- */ - -img.math { - vertical-align: middle; -} - -div.body div.math p { - text-align: center; -} - -span.eqno { - float: right; -} - -span.eqno a.headerlink { - position: absolute; - z-index: 1; -} - -div.math:hover a.headerlink { - visibility: visible; -} - -/* -- printout stylesheet --------------------------------------------------- */ - -@media print { - div.document, - div.documentwrapper, - div.bodywrapper { - margin: 0 !important; - width: 100%; - } - - div.sphinxsidebar, - div.related, - div.footer, - #top-link { - display: none; - } -} \ No newline at end of file diff --git a/pr-preview/pr-273/_static/binder_badge_logo.svg b/pr-preview/pr-273/_static/binder_badge_logo.svg deleted file mode 100644 index 327f6b639..000000000 --- a/pr-preview/pr-273/_static/binder_badge_logo.svg +++ /dev/null @@ -1 +0,0 @@ - launchlaunchbinderbinder \ No newline at end of file diff --git a/pr-preview/pr-273/_static/broken_example.png b/pr-preview/pr-273/_static/broken_example.png deleted file mode 100644 index 4fea24e7d..000000000 Binary files a/pr-preview/pr-273/_static/broken_example.png and /dev/null differ diff --git a/pr-preview/pr-273/_static/check-solid.svg b/pr-preview/pr-273/_static/check-solid.svg deleted file mode 100644 index 92fad4b5c..000000000 --- a/pr-preview/pr-273/_static/check-solid.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/pr-preview/pr-273/_static/clipboard.min.js b/pr-preview/pr-273/_static/clipboard.min.js deleted file mode 100644 index 54b3c4638..000000000 --- a/pr-preview/pr-273/_static/clipboard.min.js +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * clipboard.js v2.0.8 - * https://clipboardjs.com/ - * - * Licensed MIT © Zeno Rocha - */ -!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return n={686:function(t,e,n){"use strict";n.d(e,{default:function(){return o}});var e=n(279),i=n.n(e),e=n(370),u=n.n(e),e=n(817),c=n.n(e);function a(t){try{return document.execCommand(t)}catch(t){return}}var f=function(t){t=c()(t);return a("cut"),t};var l=function(t){var e,n,o,r=1 - - - - diff --git a/pr-preview/pr-273/_static/copybutton.css b/pr-preview/pr-273/_static/copybutton.css deleted file mode 100644 index f1916ec7d..000000000 --- a/pr-preview/pr-273/_static/copybutton.css +++ /dev/null @@ -1,94 +0,0 @@ -/* Copy buttons */ -button.copybtn { - position: absolute; - display: flex; - top: .3em; - right: .3em; - width: 1.7em; - height: 1.7em; - opacity: 0; - transition: opacity 0.3s, border .3s, background-color .3s; - user-select: none; - padding: 0; - border: none; - outline: none; - border-radius: 0.4em; - /* The colors that GitHub uses */ - border: #1b1f2426 1px solid; - background-color: #f6f8fa; - color: #57606a; -} - -button.copybtn.success { - border-color: #22863a; - color: #22863a; -} - -button.copybtn svg { - stroke: currentColor; - width: 1.5em; - height: 1.5em; - padding: 0.1em; -} - -div.highlight { - position: relative; -} - -/* Show the copybutton */ -.highlight:hover button.copybtn, button.copybtn.success { - opacity: 1; -} - -.highlight button.copybtn:hover { - background-color: rgb(235, 235, 235); -} - -.highlight button.copybtn:active { - background-color: rgb(187, 187, 187); -} - -/** - * A minimal CSS-only tooltip copied from: - * https://codepen.io/mildrenben/pen/rVBrpK - * - * To use, write HTML like the following: - * - *

Short

- */ - .o-tooltip--left { - position: relative; - } - - .o-tooltip--left:after { - opacity: 0; - visibility: hidden; - position: absolute; - content: attr(data-tooltip); - padding: .2em; - font-size: .8em; - left: -.2em; - background: grey; - color: white; - white-space: nowrap; - z-index: 2; - border-radius: 2px; - transform: translateX(-102%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); -} - -.o-tooltip--left:hover:after { - display: block; - opacity: 1; - visibility: visible; - transform: translateX(-100%) translateY(0); - transition: opacity 0.2s cubic-bezier(0.64, 0.09, 0.08, 1), transform 0.2s cubic-bezier(0.64, 0.09, 0.08, 1); - transition-delay: .5s; -} - -/* By default the copy button shouldn't show up when printing a page */ -@media print { - button.copybtn { - display: none; - } -} diff --git a/pr-preview/pr-273/_static/copybutton.js b/pr-preview/pr-273/_static/copybutton.js deleted file mode 100644 index 2ea7ff3e2..000000000 --- a/pr-preview/pr-273/_static/copybutton.js +++ /dev/null @@ -1,248 +0,0 @@ -// Localization support -const messages = { - 'en': { - 'copy': 'Copy', - 'copy_to_clipboard': 'Copy to clipboard', - 'copy_success': 'Copied!', - 'copy_failure': 'Failed to copy', - }, - 'es' : { - 'copy': 'Copiar', - 'copy_to_clipboard': 'Copiar al portapapeles', - 'copy_success': '¡Copiado!', - 'copy_failure': 'Error al copiar', - }, - 'de' : { - 'copy': 'Kopieren', - 'copy_to_clipboard': 'In die Zwischenablage kopieren', - 'copy_success': 'Kopiert!', - 'copy_failure': 'Fehler beim Kopieren', - }, - 'fr' : { - 'copy': 'Copier', - 'copy_to_clipboard': 'Copier dans le presse-papier', - 'copy_success': 'Copié !', - 'copy_failure': 'Échec de la copie', - }, - 'ru': { - 'copy': 'Скопировать', - 'copy_to_clipboard': 'Скопировать в буфер', - 'copy_success': 'Скопировано!', - 'copy_failure': 'Не удалось скопировать', - }, - 'zh-CN': { - 'copy': '复制', - 'copy_to_clipboard': '复制到剪贴板', - 'copy_success': '复制成功!', - 'copy_failure': '复制失败', - }, - 'it' : { - 'copy': 'Copiare', - 'copy_to_clipboard': 'Copiato negli appunti', - 'copy_success': 'Copiato!', - 'copy_failure': 'Errore durante la copia', - } -} - -let locale = 'en' -if( document.documentElement.lang !== undefined - && messages[document.documentElement.lang] !== undefined ) { - locale = document.documentElement.lang -} - -let doc_url_root = DOCUMENTATION_OPTIONS.URL_ROOT; -if (doc_url_root == '#') { - doc_url_root = ''; -} - -/** - * SVG files for our copy buttons - */ -let iconCheck = ` - ${messages[locale]['copy_success']} - - -` - -// If the user specified their own SVG use that, otherwise use the default -let iconCopy = ``; -if (!iconCopy) { - iconCopy = ` - ${messages[locale]['copy_to_clipboard']} - - - -` -} - -/** - * Set up copy/paste for code blocks - */ - -const runWhenDOMLoaded = cb => { - if (document.readyState != 'loading') { - cb() - } else if (document.addEventListener) { - document.addEventListener('DOMContentLoaded', cb) - } else { - document.attachEvent('onreadystatechange', function() { - if (document.readyState == 'complete') cb() - }) - } -} - -const codeCellId = index => `codecell${index}` - -// Clears selected text since ClipboardJS will select the text when copying -const clearSelection = () => { - if (window.getSelection) { - window.getSelection().removeAllRanges() - } else if (document.selection) { - document.selection.empty() - } -} - -// Changes tooltip text for a moment, then changes it back -// We want the timeout of our `success` class to be a bit shorter than the -// tooltip and icon change, so that we can hide the icon before changing back. -var timeoutIcon = 2000; -var timeoutSuccessClass = 1500; - -const temporarilyChangeTooltip = (el, oldText, newText) => { - el.setAttribute('data-tooltip', newText) - el.classList.add('success') - // Remove success a little bit sooner than we change the tooltip - // So that we can use CSS to hide the copybutton first - setTimeout(() => el.classList.remove('success'), timeoutSuccessClass) - setTimeout(() => el.setAttribute('data-tooltip', oldText), timeoutIcon) -} - -// Changes the copy button icon for two seconds, then changes it back -const temporarilyChangeIcon = (el) => { - el.innerHTML = iconCheck; - setTimeout(() => {el.innerHTML = iconCopy}, timeoutIcon) -} - -const addCopyButtonToCodeCells = () => { - // If ClipboardJS hasn't loaded, wait a bit and try again. This - // happens because we load ClipboardJS asynchronously. - if (window.ClipboardJS === undefined) { - setTimeout(addCopyButtonToCodeCells, 250) - return - } - - // Add copybuttons to all of our code cells - const COPYBUTTON_SELECTOR = 'div.highlight pre'; - const codeCells = document.querySelectorAll(COPYBUTTON_SELECTOR) - codeCells.forEach((codeCell, index) => { - const id = codeCellId(index) - codeCell.setAttribute('id', id) - - const clipboardButton = id => - `` - codeCell.insertAdjacentHTML('afterend', clipboardButton(id)) - }) - -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -/** - * Removes excluded text from a Node. - * - * @param {Node} target Node to filter. - * @param {string} exclude CSS selector of nodes to exclude. - * @returns {DOMString} Text from `target` with text removed. - */ -function filterText(target, exclude) { - const clone = target.cloneNode(true); // clone as to not modify the live DOM - if (exclude) { - // remove excluded nodes - clone.querySelectorAll(exclude).forEach(node => node.remove()); - } - return clone.innerText; -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} - - -var copyTargetText = (trigger) => { - var target = document.querySelector(trigger.attributes['data-clipboard-target'].value); - - // get filtered text - let exclude = '.linenos'; - - let text = filterText(target, exclude); - return formatCopyText(text, '', false, true, true, true, '', '') -} - - // Initialize with a callback so we can modify the text before copy - const clipboard = new ClipboardJS('.copybtn', {text: copyTargetText}) - - // Update UI with error/success messages - clipboard.on('success', event => { - clearSelection() - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_success']) - temporarilyChangeIcon(event.trigger) - }) - - clipboard.on('error', event => { - temporarilyChangeTooltip(event.trigger, messages[locale]['copy'], messages[locale]['copy_failure']) - }) -} - -runWhenDOMLoaded(addCopyButtonToCodeCells) \ No newline at end of file diff --git a/pr-preview/pr-273/_static/copybutton_funcs.js b/pr-preview/pr-273/_static/copybutton_funcs.js deleted file mode 100644 index dbe1aaad7..000000000 --- a/pr-preview/pr-273/_static/copybutton_funcs.js +++ /dev/null @@ -1,73 +0,0 @@ -function escapeRegExp(string) { - return string.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string -} - -/** - * Removes excluded text from a Node. - * - * @param {Node} target Node to filter. - * @param {string} exclude CSS selector of nodes to exclude. - * @returns {DOMString} Text from `target` with text removed. - */ -export function filterText(target, exclude) { - const clone = target.cloneNode(true); // clone as to not modify the live DOM - if (exclude) { - // remove excluded nodes - clone.querySelectorAll(exclude).forEach(node => node.remove()); - } - return clone.innerText; -} - -// Callback when a copy button is clicked. Will be passed the node that was clicked -// should then grab the text and replace pieces of text that shouldn't be used in output -export function formatCopyText(textContent, copybuttonPromptText, isRegexp = false, onlyCopyPromptLines = true, removePrompts = true, copyEmptyLines = true, lineContinuationChar = "", hereDocDelim = "") { - var regexp; - var match; - - // Do we check for line continuation characters and "HERE-documents"? - var useLineCont = !!lineContinuationChar - var useHereDoc = !!hereDocDelim - - // create regexp to capture prompt and remaining line - if (isRegexp) { - regexp = new RegExp('^(' + copybuttonPromptText + ')(.*)') - } else { - regexp = new RegExp('^(' + escapeRegExp(copybuttonPromptText) + ')(.*)') - } - - const outputLines = []; - var promptFound = false; - var gotLineCont = false; - var gotHereDoc = false; - const lineGotPrompt = []; - for (const line of textContent.split('\n')) { - match = line.match(regexp) - if (match || gotLineCont || gotHereDoc) { - promptFound = regexp.test(line) - lineGotPrompt.push(promptFound) - if (removePrompts && promptFound) { - outputLines.push(match[2]) - } else { - outputLines.push(line) - } - gotLineCont = line.endsWith(lineContinuationChar) & useLineCont - if (line.includes(hereDocDelim) & useHereDoc) - gotHereDoc = !gotHereDoc - } else if (!onlyCopyPromptLines) { - outputLines.push(line) - } else if (copyEmptyLines && line.trim() === '') { - outputLines.push(line) - } - } - - // If no lines with the prompt were found then just use original lines - if (lineGotPrompt.some(v => v === true)) { - textContent = outputLines.join('\n'); - } - - // Remove a trailing newline to avoid auto-running when pasting - if (textContent.endsWith("\n")) { - textContent = textContent.slice(0, -1) - } - return textContent -} diff --git a/pr-preview/pr-273/_static/css/custom.css b/pr-preview/pr-273/_static/css/custom.css deleted file mode 100644 index af8fd1721..000000000 --- a/pr-preview/pr-273/_static/css/custom.css +++ /dev/null @@ -1,46 +0,0 @@ -.table-wrapper.colwidths-auto table td, .table-wrapper.colwidths-auto table th { - white-space: nowrap; -} -.table-wrapper.colwidths-auto table td a.reference.internal { - overflow-wrap: normal; -} - -/* Style the button that is used to open and close the collapsible content */ -.version-select { - cursor: pointer; -} - -/* Style the collapsible content. Note: hidden by default */ -#versions { - display: none; - overflow: hidden; -} - -/* Reduce font size of "What's New" section */ -#what-s-new li, -#what-s-new a { - font-size: medium; -} - -#first-steps-with-junifer div.mermaid { - overflow: scroll; -} - -#first-steps-with-junifer svg { - overflow: scroll; - width: 200%; -} - -body:not([data-theme="light"]) .mermaid svg .flowchart-link { - stroke: white !important; -} - -body:not([data-theme="light"]) .mermaid svg .edgeLabel { - color: white !important; - background-color: #202020 !important; -} - -body:not([data-theme="light"]) .mermaid svg .marker{ - stroke: white !important; - fill: white !important; -} diff --git a/pr-preview/pr-273/_static/debug.css b/pr-preview/pr-273/_static/debug.css deleted file mode 100644 index 74d4aec33..000000000 --- a/pr-preview/pr-273/_static/debug.css +++ /dev/null @@ -1,69 +0,0 @@ -/* - This CSS file should be overridden by the theme authors. It's - meant for debugging and developing the skeleton that this theme provides. -*/ -body { - font-family: -apple-system, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, - "Apple Color Emoji", "Segoe UI Emoji"; - background: lavender; -} -.sb-announcement { - background: rgb(131, 131, 131); -} -.sb-announcement__inner { - background: black; - color: white; -} -.sb-header { - background: lightskyblue; -} -.sb-header__inner { - background: royalblue; - color: white; -} -.sb-header-secondary { - background: lightcyan; -} -.sb-header-secondary__inner { - background: cornflowerblue; - color: white; -} -.sb-sidebar-primary { - background: lightgreen; -} -.sb-main { - background: blanchedalmond; -} -.sb-main__inner { - background: antiquewhite; -} -.sb-header-article { - background: lightsteelblue; -} -.sb-article-container { - background: snow; -} -.sb-article-main { - background: white; -} -.sb-footer-article { - background: lightpink; -} -.sb-sidebar-secondary { - background: lightgoldenrodyellow; -} -.sb-footer-content { - background: plum; -} -.sb-footer-content__inner { - background: palevioletred; -} -.sb-footer { - background: pink; -} -.sb-footer__inner { - background: salmon; -} -.sb-article { - background: white; -} diff --git a/pr-preview/pr-273/_static/doctools.js b/pr-preview/pr-273/_static/doctools.js deleted file mode 100644 index d06a71d75..000000000 --- a/pr-preview/pr-273/_static/doctools.js +++ /dev/null @@ -1,156 +0,0 @@ -/* - * doctools.js - * ~~~~~~~~~~~ - * - * Base JavaScript utilities for all Sphinx HTML documentation. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", -]); - -const _ready = (callback) => { - if (document.readyState !== "loading") { - callback(); - } else { - document.addEventListener("DOMContentLoaded", callback); - } -}; - -/** - * Small JavaScript module for the documentation. - */ -const Documentation = { - init: () => { - Documentation.initDomainIndexTable(); - Documentation.initOnKeyListeners(); - }, - - /** - * i18n support - */ - TRANSLATIONS: {}, - PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), - LOCALE: "unknown", - - // gettext and ngettext don't access this so that the functions - // can safely bound to a different name (_ = Documentation.gettext) - gettext: (string) => { - const translated = Documentation.TRANSLATIONS[string]; - switch (typeof translated) { - case "undefined": - return string; // no translation - case "string": - return translated; // translation exists - default: - return translated[0]; // (singular, plural) translation tuple exists - } - }, - - ngettext: (singular, plural, n) => { - const translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated !== "undefined") - return translated[Documentation.PLURAL_EXPR(n)]; - return n === 1 ? singular : plural; - }, - - addTranslations: (catalog) => { - Object.assign(Documentation.TRANSLATIONS, catalog.messages); - Documentation.PLURAL_EXPR = new Function( - "n", - `return (${catalog.plural_expr})` - ); - Documentation.LOCALE = catalog.locale; - }, - - /** - * helper function to focus on search bar - */ - focusSearchBar: () => { - document.querySelectorAll("input[name=q]")[0]?.focus(); - }, - - /** - * Initialise the domain index toggle buttons - */ - initDomainIndexTable: () => { - const toggler = (el) => { - const idNumber = el.id.substr(7); - const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); - if (el.src.substr(-9) === "minus.png") { - el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; - toggledRows.forEach((el) => (el.style.display = "none")); - } else { - el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; - toggledRows.forEach((el) => (el.style.display = "")); - } - }; - - const togglerElements = document.querySelectorAll("img.toggler"); - togglerElements.forEach((el) => - el.addEventListener("click", (event) => toggler(event.currentTarget)) - ); - togglerElements.forEach((el) => (el.style.display = "")); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); - }, - - initOnKeyListeners: () => { - // only install a listener if it is really needed - if ( - !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS - ) - return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.altKey || event.ctrlKey || event.metaKey) return; - - if (!event.shiftKey) { - switch (event.key) { - case "ArrowLeft": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const prevLink = document.querySelector('link[rel="prev"]'); - if (prevLink && prevLink.href) { - window.location.href = prevLink.href; - event.preventDefault(); - } - break; - case "ArrowRight": - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; - - const nextLink = document.querySelector('link[rel="next"]'); - if (nextLink && nextLink.href) { - window.location.href = nextLink.href; - event.preventDefault(); - } - break; - } - } - - // some keyboard layouts may need Shift to get / - switch (event.key) { - case "/": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.focusSearchBar(); - event.preventDefault(); - } - }); - }, -}; - -// quick alias for translations -const _ = Documentation.gettext; - -_ready(Documentation.init); diff --git a/pr-preview/pr-273/_static/documentation_options.js b/pr-preview/pr-273/_static/documentation_options.js deleted file mode 100644 index 7e4c114f2..000000000 --- a/pr-preview/pr-273/_static/documentation_options.js +++ /dev/null @@ -1,13 +0,0 @@ -const DOCUMENTATION_OPTIONS = { - VERSION: '', - LANGUAGE: 'en', - COLLAPSE_INDEX: false, - BUILDER: 'html', - FILE_SUFFIX: '.html', - LINK_SUFFIX: '.html', - HAS_SOURCE: true, - SOURCELINK_SUFFIX: '.txt', - NAVIGATION_WITH_KEYS: false, - SHOW_SEARCH_SUMMARY: true, - ENABLE_SEARCH_SHORTCUTS: true, -}; \ No newline at end of file diff --git a/pr-preview/pr-273/_static/file.png b/pr-preview/pr-273/_static/file.png deleted file mode 100644 index a858a410e..000000000 Binary files a/pr-preview/pr-273/_static/file.png and /dev/null differ diff --git a/pr-preview/pr-273/_static/js/custom.js b/pr-preview/pr-273/_static/js/custom.js deleted file mode 100644 index fa8ecefd6..000000000 --- a/pr-preview/pr-273/_static/js/custom.js +++ /dev/null @@ -1,14 +0,0 @@ -var coll = document.getElementsByClassName("version-select"); -var i; - -for (i = 0; i < coll.length; i++) { - coll[i].addEventListener("click", function() { - this.classList.toggle("active"); - var content = this.nextElementSibling; - if (content.style.display === "block") { - content.style.display = "none"; - } else { - content.style.display = "block"; - } - }); -} diff --git a/pr-preview/pr-273/_static/junifer_logo.png b/pr-preview/pr-273/_static/junifer_logo.png deleted file mode 100644 index 2665f6040..000000000 Binary files a/pr-preview/pr-273/_static/junifer_logo.png and /dev/null differ diff --git a/pr-preview/pr-273/_static/jupyterlite_badge_logo.svg b/pr-preview/pr-273/_static/jupyterlite_badge_logo.svg deleted file mode 100644 index 5de36d7fd..000000000 --- a/pr-preview/pr-273/_static/jupyterlite_badge_logo.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -launchlaunchlitelite \ No newline at end of file diff --git a/pr-preview/pr-273/_static/language_data.js b/pr-preview/pr-273/_static/language_data.js deleted file mode 100644 index 250f5665f..000000000 --- a/pr-preview/pr-273/_static/language_data.js +++ /dev/null @@ -1,199 +0,0 @@ -/* - * language_data.js - * ~~~~~~~~~~~~~~~~ - * - * This script contains the language-specific data used by searchtools.js, - * namely the list of stopwords, stemmer, scorer and splitter. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ - -var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"]; - - -/* Non-minified version is copied as a separate JS file, is available */ - -/** - * Porter Stemmer - */ -var Stemmer = function() { - - var step2list = { - ational: 'ate', - tional: 'tion', - enci: 'ence', - anci: 'ance', - izer: 'ize', - bli: 'ble', - alli: 'al', - entli: 'ent', - eli: 'e', - ousli: 'ous', - ization: 'ize', - ation: 'ate', - ator: 'ate', - alism: 'al', - iveness: 'ive', - fulness: 'ful', - ousness: 'ous', - aliti: 'al', - iviti: 'ive', - biliti: 'ble', - logi: 'log' - }; - - var step3list = { - icate: 'ic', - ative: '', - alize: 'al', - iciti: 'ic', - ical: 'ic', - ful: '', - ness: '' - }; - - var c = "[^aeiou]"; // consonant - var v = "[aeiouy]"; // vowel - var C = c + "[^aeiouy]*"; // consonant sequence - var V = v + "[aeiou]*"; // vowel sequence - - var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 - var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 - var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 - var s_v = "^(" + C + ")?" + v; // vowel in stem - - this.stemWord = function (w) { - var stem; - var suffix; - var firstch; - var origword = w; - - if (w.length < 3) - return w; - - var re; - var re2; - var re3; - var re4; - - firstch = w.substr(0,1); - if (firstch == "y") - w = firstch.toUpperCase() + w.substr(1); - - // Step 1a - re = /^(.+?)(ss|i)es$/; - re2 = /^(.+?)([^s])s$/; - - if (re.test(w)) - w = w.replace(re,"$1$2"); - else if (re2.test(w)) - w = w.replace(re2,"$1$2"); - - // Step 1b - re = /^(.+?)eed$/; - re2 = /^(.+?)(ed|ing)$/; - if (re.test(w)) { - var fp = re.exec(w); - re = new RegExp(mgr0); - if (re.test(fp[1])) { - re = /.$/; - w = w.replace(re,""); - } - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1]; - re2 = new RegExp(s_v); - if (re2.test(stem)) { - w = stem; - re2 = /(at|bl|iz)$/; - re3 = new RegExp("([^aeiouylsz])\\1$"); - re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re2.test(w)) - w = w + "e"; - else if (re3.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - else if (re4.test(w)) - w = w + "e"; - } - } - - // Step 1c - re = /^(.+?)y$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(s_v); - if (re.test(stem)) - w = stem + "i"; - } - - // Step 2 - re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step2list[suffix]; - } - - // Step 3 - re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - suffix = fp[2]; - re = new RegExp(mgr0); - if (re.test(stem)) - w = stem + step3list[suffix]; - } - - // Step 4 - re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; - re2 = /^(.+?)(s|t)(ion)$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - if (re.test(stem)) - w = stem; - } - else if (re2.test(w)) { - var fp = re2.exec(w); - stem = fp[1] + fp[2]; - re2 = new RegExp(mgr1); - if (re2.test(stem)) - w = stem; - } - - // Step 5 - re = /^(.+?)e$/; - if (re.test(w)) { - var fp = re.exec(w); - stem = fp[1]; - re = new RegExp(mgr1); - re2 = new RegExp(meq1); - re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); - if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) - w = stem; - } - re = /ll$/; - re2 = new RegExp(mgr1); - if (re.test(w) && re2.test(w)) { - re = /.$/; - w = w.replace(re,""); - } - - // and turn initial Y back to y - if (firstch == "y") - w = firstch.toLowerCase() + w.substr(1); - return w; - } -} - diff --git a/pr-preview/pr-273/_static/minus.png b/pr-preview/pr-273/_static/minus.png deleted file mode 100644 index d96755fda..000000000 Binary files a/pr-preview/pr-273/_static/minus.png and /dev/null differ diff --git a/pr-preview/pr-273/_static/no_image.png b/pr-preview/pr-273/_static/no_image.png deleted file mode 100644 index 8c2d48d5d..000000000 Binary files a/pr-preview/pr-273/_static/no_image.png and /dev/null differ diff --git a/pr-preview/pr-273/_static/plus.png b/pr-preview/pr-273/_static/plus.png deleted file mode 100644 index 7107cec93..000000000 Binary files a/pr-preview/pr-273/_static/plus.png and /dev/null differ diff --git a/pr-preview/pr-273/_static/pygments.css b/pr-preview/pr-273/_static/pygments.css deleted file mode 100644 index c2e07c71e..000000000 --- a/pr-preview/pr-273/_static/pygments.css +++ /dev/null @@ -1,258 +0,0 @@ -.highlight pre { line-height: 125%; } -.highlight td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -.highlight span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } -.highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -.highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -.highlight .hll { background-color: #ffffcc } -.highlight { background: #f8f8f8; } -.highlight .c { color: #8f5902; font-style: italic } /* Comment */ -.highlight .err { color: #a40000; border: 1px solid #ef2929 } /* Error */ -.highlight .g { color: #000000 } /* Generic */ -.highlight .k { color: #204a87; font-weight: bold } /* Keyword */ -.highlight .l { color: #000000 } /* Literal */ -.highlight .n { color: #000000 } /* Name */ -.highlight .o { color: #ce5c00; font-weight: bold } /* Operator */ -.highlight .x { color: #000000 } /* Other */ -.highlight .p { color: #000000; font-weight: bold } /* Punctuation */ -.highlight .ch { color: #8f5902; font-style: italic } /* Comment.Hashbang */ -.highlight .cm { color: #8f5902; font-style: italic } /* Comment.Multiline */ -.highlight .cp { color: #8f5902; font-style: italic } /* Comment.Preproc */ -.highlight .cpf { color: #8f5902; font-style: italic } /* Comment.PreprocFile */ -.highlight .c1 { color: #8f5902; font-style: italic } /* Comment.Single */ -.highlight .cs { color: #8f5902; font-style: italic } /* Comment.Special */ -.highlight .gd { color: #a40000 } /* Generic.Deleted */ -.highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ -.highlight .ges { color: #000000; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -.highlight .gr { color: #ef2929 } /* Generic.Error */ -.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ -.highlight .gi { color: #00A000 } /* Generic.Inserted */ -.highlight .go { color: #000000; font-style: italic } /* Generic.Output */ -.highlight .gp { color: #8f5902 } /* Generic.Prompt */ -.highlight .gs { color: #000000; font-weight: bold } /* Generic.Strong */ -.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ -.highlight .gt { color: #a40000; font-weight: bold } /* Generic.Traceback */ -.highlight .kc { color: #204a87; font-weight: bold } /* Keyword.Constant */ -.highlight .kd { color: #204a87; font-weight: bold } /* Keyword.Declaration */ -.highlight .kn { color: #204a87; font-weight: bold } /* Keyword.Namespace */ -.highlight .kp { color: #204a87; font-weight: bold } /* Keyword.Pseudo */ -.highlight .kr { color: #204a87; font-weight: bold } /* Keyword.Reserved */ -.highlight .kt { color: #204a87; font-weight: bold } /* Keyword.Type */ -.highlight .ld { color: #000000 } /* Literal.Date */ -.highlight .m { color: #0000cf; font-weight: bold } /* Literal.Number */ -.highlight .s { color: #4e9a06 } /* Literal.String */ -.highlight .na { color: #c4a000 } /* Name.Attribute */ -.highlight .nb { color: #204a87 } /* Name.Builtin */ -.highlight .nc { color: #000000 } /* Name.Class */ -.highlight .no { color: #000000 } /* Name.Constant */ -.highlight .nd { color: #5c35cc; font-weight: bold } /* Name.Decorator */ -.highlight .ni { color: #ce5c00 } /* Name.Entity */ -.highlight .ne { color: #cc0000; font-weight: bold } /* Name.Exception */ -.highlight .nf { color: #000000 } /* Name.Function */ -.highlight .nl { color: #f57900 } /* Name.Label */ -.highlight .nn { color: #000000 } /* Name.Namespace */ -.highlight .nx { color: #000000 } /* Name.Other */ -.highlight .py { color: #000000 } /* Name.Property */ -.highlight .nt { color: #204a87; font-weight: bold } /* Name.Tag */ -.highlight .nv { color: #000000 } /* Name.Variable */ -.highlight .ow { color: #204a87; font-weight: bold } /* Operator.Word */ -.highlight .pm { color: #000000; font-weight: bold } /* Punctuation.Marker */ -.highlight .w { color: #f8f8f8 } /* Text.Whitespace */ -.highlight .mb { color: #0000cf; font-weight: bold } /* Literal.Number.Bin */ -.highlight .mf { color: #0000cf; font-weight: bold } /* Literal.Number.Float */ -.highlight .mh { color: #0000cf; font-weight: bold } /* Literal.Number.Hex */ -.highlight .mi { color: #0000cf; font-weight: bold } /* Literal.Number.Integer */ -.highlight .mo { color: #0000cf; font-weight: bold } /* Literal.Number.Oct */ -.highlight .sa { color: #4e9a06 } /* Literal.String.Affix */ -.highlight .sb { color: #4e9a06 } /* Literal.String.Backtick */ -.highlight .sc { color: #4e9a06 } /* Literal.String.Char */ -.highlight .dl { color: #4e9a06 } /* Literal.String.Delimiter */ -.highlight .sd { color: #8f5902; font-style: italic } /* Literal.String.Doc */ -.highlight .s2 { color: #4e9a06 } /* Literal.String.Double */ -.highlight .se { color: #4e9a06 } /* Literal.String.Escape */ -.highlight .sh { color: #4e9a06 } /* Literal.String.Heredoc */ -.highlight .si { color: #4e9a06 } /* Literal.String.Interpol */ -.highlight .sx { color: #4e9a06 } /* Literal.String.Other */ -.highlight .sr { color: #4e9a06 } /* Literal.String.Regex */ -.highlight .s1 { color: #4e9a06 } /* Literal.String.Single */ -.highlight .ss { color: #4e9a06 } /* Literal.String.Symbol */ -.highlight .bp { color: #3465a4 } /* Name.Builtin.Pseudo */ -.highlight .fm { color: #000000 } /* Name.Function.Magic */ -.highlight .vc { color: #000000 } /* Name.Variable.Class */ -.highlight .vg { color: #000000 } /* Name.Variable.Global */ -.highlight .vi { color: #000000 } /* Name.Variable.Instance */ -.highlight .vm { color: #000000 } /* Name.Variable.Magic */ -.highlight .il { color: #0000cf; font-weight: bold } /* Literal.Number.Integer.Long */ -@media not print { -body[data-theme="dark"] .highlight pre { line-height: 125%; } -body[data-theme="dark"] .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } -body[data-theme="dark"] .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } -body[data-theme="dark"] .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -body[data-theme="dark"] .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -body[data-theme="dark"] .highlight .hll { background-color: #404040 } -body[data-theme="dark"] .highlight { background: #202020; color: #d0d0d0 } -body[data-theme="dark"] .highlight .c { color: #ababab; font-style: italic } /* Comment */ -body[data-theme="dark"] .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ -body[data-theme="dark"] .highlight .esc { color: #d0d0d0 } /* Escape */ -body[data-theme="dark"] .highlight .g { color: #d0d0d0 } /* Generic */ -body[data-theme="dark"] .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ -body[data-theme="dark"] .highlight .l { color: #d0d0d0 } /* Literal */ -body[data-theme="dark"] .highlight .n { color: #d0d0d0 } /* Name */ -body[data-theme="dark"] .highlight .o { color: #d0d0d0 } /* Operator */ -body[data-theme="dark"] .highlight .x { color: #d0d0d0 } /* Other */ -body[data-theme="dark"] .highlight .p { color: #d0d0d0 } /* Punctuation */ -body[data-theme="dark"] .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ -body[data-theme="dark"] .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ -body[data-theme="dark"] .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ -body[data-theme="dark"] .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ -body[data-theme="dark"] .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ -body[data-theme="dark"] .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ -body[data-theme="dark"] .highlight .gd { color: #d22323 } /* Generic.Deleted */ -body[data-theme="dark"] .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ -body[data-theme="dark"] .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -body[data-theme="dark"] .highlight .gr { color: #d22323 } /* Generic.Error */ -body[data-theme="dark"] .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ -body[data-theme="dark"] .highlight .gi { color: #589819 } /* Generic.Inserted */ -body[data-theme="dark"] .highlight .go { color: #cccccc } /* Generic.Output */ -body[data-theme="dark"] .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ -body[data-theme="dark"] .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ -body[data-theme="dark"] .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ -body[data-theme="dark"] .highlight .gt { color: #d22323 } /* Generic.Traceback */ -body[data-theme="dark"] .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ -body[data-theme="dark"] .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ -body[data-theme="dark"] .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ -body[data-theme="dark"] .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ -body[data-theme="dark"] .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ -body[data-theme="dark"] .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ -body[data-theme="dark"] .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body[data-theme="dark"] .highlight .m { color: #51b2fd } /* Literal.Number */ -body[data-theme="dark"] .highlight .s { color: #ed9d13 } /* Literal.String */ -body[data-theme="dark"] .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body[data-theme="dark"] .highlight .nb { color: #2fbccd } /* Name.Builtin */ -body[data-theme="dark"] .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ -body[data-theme="dark"] .highlight .no { color: #40ffff } /* Name.Constant */ -body[data-theme="dark"] .highlight .nd { color: #ffa500 } /* Name.Decorator */ -body[data-theme="dark"] .highlight .ni { color: #d0d0d0 } /* Name.Entity */ -body[data-theme="dark"] .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body[data-theme="dark"] .highlight .nf { color: #71adff } /* Name.Function */ -body[data-theme="dark"] .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body[data-theme="dark"] .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ -body[data-theme="dark"] .highlight .nx { color: #d0d0d0 } /* Name.Other */ -body[data-theme="dark"] .highlight .py { color: #d0d0d0 } /* Name.Property */ -body[data-theme="dark"] .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ -body[data-theme="dark"] .highlight .nv { color: #40ffff } /* Name.Variable */ -body[data-theme="dark"] .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ -body[data-theme="dark"] .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ -body[data-theme="dark"] .highlight .w { color: #666666 } /* Text.Whitespace */ -body[data-theme="dark"] .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ -body[data-theme="dark"] .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ -body[data-theme="dark"] .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ -body[data-theme="dark"] .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ -body[data-theme="dark"] .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ -body[data-theme="dark"] .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ -body[data-theme="dark"] .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ -body[data-theme="dark"] .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ -body[data-theme="dark"] .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ -body[data-theme="dark"] .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ -body[data-theme="dark"] .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ -body[data-theme="dark"] .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ -body[data-theme="dark"] .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ -body[data-theme="dark"] .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ -body[data-theme="dark"] .highlight .sx { color: #ffa500 } /* Literal.String.Other */ -body[data-theme="dark"] .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ -body[data-theme="dark"] .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ -body[data-theme="dark"] .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body[data-theme="dark"] .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ -body[data-theme="dark"] .highlight .fm { color: #71adff } /* Name.Function.Magic */ -body[data-theme="dark"] .highlight .vc { color: #40ffff } /* Name.Variable.Class */ -body[data-theme="dark"] .highlight .vg { color: #40ffff } /* Name.Variable.Global */ -body[data-theme="dark"] .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ -body[data-theme="dark"] .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body[data-theme="dark"] .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ -@media (prefers-color-scheme: dark) { -body:not([data-theme="light"]) .highlight pre { line-height: 125%; } -body:not([data-theme="light"]) .highlight td.linenos .normal { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } -body:not([data-theme="light"]) .highlight span.linenos { color: #aaaaaa; background-color: transparent; padding-left: 5px; padding-right: 5px; } -body:not([data-theme="light"]) .highlight td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -body:not([data-theme="light"]) .highlight span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } -body:not([data-theme="light"]) .highlight .hll { background-color: #404040 } -body:not([data-theme="light"]) .highlight { background: #202020; color: #d0d0d0 } -body:not([data-theme="light"]) .highlight .c { color: #ababab; font-style: italic } /* Comment */ -body:not([data-theme="light"]) .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ -body:not([data-theme="light"]) .highlight .esc { color: #d0d0d0 } /* Escape */ -body:not([data-theme="light"]) .highlight .g { color: #d0d0d0 } /* Generic */ -body:not([data-theme="light"]) .highlight .k { color: #6ebf26; font-weight: bold } /* Keyword */ -body:not([data-theme="light"]) .highlight .l { color: #d0d0d0 } /* Literal */ -body:not([data-theme="light"]) .highlight .n { color: #d0d0d0 } /* Name */ -body:not([data-theme="light"]) .highlight .o { color: #d0d0d0 } /* Operator */ -body:not([data-theme="light"]) .highlight .x { color: #d0d0d0 } /* Other */ -body:not([data-theme="light"]) .highlight .p { color: #d0d0d0 } /* Punctuation */ -body:not([data-theme="light"]) .highlight .ch { color: #ababab; font-style: italic } /* Comment.Hashbang */ -body:not([data-theme="light"]) .highlight .cm { color: #ababab; font-style: italic } /* Comment.Multiline */ -body:not([data-theme="light"]) .highlight .cp { color: #ff3a3a; font-weight: bold } /* Comment.Preproc */ -body:not([data-theme="light"]) .highlight .cpf { color: #ababab; font-style: italic } /* Comment.PreprocFile */ -body:not([data-theme="light"]) .highlight .c1 { color: #ababab; font-style: italic } /* Comment.Single */ -body:not([data-theme="light"]) .highlight .cs { color: #e50808; font-weight: bold; background-color: #520000 } /* Comment.Special */ -body:not([data-theme="light"]) .highlight .gd { color: #d22323 } /* Generic.Deleted */ -body:not([data-theme="light"]) .highlight .ge { color: #d0d0d0; font-style: italic } /* Generic.Emph */ -body:not([data-theme="light"]) .highlight .ges { color: #d0d0d0; font-weight: bold; font-style: italic } /* Generic.EmphStrong */ -body:not([data-theme="light"]) .highlight .gr { color: #d22323 } /* Generic.Error */ -body:not([data-theme="light"]) .highlight .gh { color: #ffffff; font-weight: bold } /* Generic.Heading */ -body:not([data-theme="light"]) .highlight .gi { color: #589819 } /* Generic.Inserted */ -body:not([data-theme="light"]) .highlight .go { color: #cccccc } /* Generic.Output */ -body:not([data-theme="light"]) .highlight .gp { color: #aaaaaa } /* Generic.Prompt */ -body:not([data-theme="light"]) .highlight .gs { color: #d0d0d0; font-weight: bold } /* Generic.Strong */ -body:not([data-theme="light"]) .highlight .gu { color: #ffffff; text-decoration: underline } /* Generic.Subheading */ -body:not([data-theme="light"]) .highlight .gt { color: #d22323 } /* Generic.Traceback */ -body:not([data-theme="light"]) .highlight .kc { color: #6ebf26; font-weight: bold } /* Keyword.Constant */ -body:not([data-theme="light"]) .highlight .kd { color: #6ebf26; font-weight: bold } /* Keyword.Declaration */ -body:not([data-theme="light"]) .highlight .kn { color: #6ebf26; font-weight: bold } /* Keyword.Namespace */ -body:not([data-theme="light"]) .highlight .kp { color: #6ebf26 } /* Keyword.Pseudo */ -body:not([data-theme="light"]) .highlight .kr { color: #6ebf26; font-weight: bold } /* Keyword.Reserved */ -body:not([data-theme="light"]) .highlight .kt { color: #6ebf26; font-weight: bold } /* Keyword.Type */ -body:not([data-theme="light"]) .highlight .ld { color: #d0d0d0 } /* Literal.Date */ -body:not([data-theme="light"]) .highlight .m { color: #51b2fd } /* Literal.Number */ -body:not([data-theme="light"]) .highlight .s { color: #ed9d13 } /* Literal.String */ -body:not([data-theme="light"]) .highlight .na { color: #bbbbbb } /* Name.Attribute */ -body:not([data-theme="light"]) .highlight .nb { color: #2fbccd } /* Name.Builtin */ -body:not([data-theme="light"]) .highlight .nc { color: #71adff; text-decoration: underline } /* Name.Class */ -body:not([data-theme="light"]) .highlight .no { color: #40ffff } /* Name.Constant */ -body:not([data-theme="light"]) .highlight .nd { color: #ffa500 } /* Name.Decorator */ -body:not([data-theme="light"]) .highlight .ni { color: #d0d0d0 } /* Name.Entity */ -body:not([data-theme="light"]) .highlight .ne { color: #bbbbbb } /* Name.Exception */ -body:not([data-theme="light"]) .highlight .nf { color: #71adff } /* Name.Function */ -body:not([data-theme="light"]) .highlight .nl { color: #d0d0d0 } /* Name.Label */ -body:not([data-theme="light"]) .highlight .nn { color: #71adff; text-decoration: underline } /* Name.Namespace */ -body:not([data-theme="light"]) .highlight .nx { color: #d0d0d0 } /* Name.Other */ -body:not([data-theme="light"]) .highlight .py { color: #d0d0d0 } /* Name.Property */ -body:not([data-theme="light"]) .highlight .nt { color: #6ebf26; font-weight: bold } /* Name.Tag */ -body:not([data-theme="light"]) .highlight .nv { color: #40ffff } /* Name.Variable */ -body:not([data-theme="light"]) .highlight .ow { color: #6ebf26; font-weight: bold } /* Operator.Word */ -body:not([data-theme="light"]) .highlight .pm { color: #d0d0d0 } /* Punctuation.Marker */ -body:not([data-theme="light"]) .highlight .w { color: #666666 } /* Text.Whitespace */ -body:not([data-theme="light"]) .highlight .mb { color: #51b2fd } /* Literal.Number.Bin */ -body:not([data-theme="light"]) .highlight .mf { color: #51b2fd } /* Literal.Number.Float */ -body:not([data-theme="light"]) .highlight .mh { color: #51b2fd } /* Literal.Number.Hex */ -body:not([data-theme="light"]) .highlight .mi { color: #51b2fd } /* Literal.Number.Integer */ -body:not([data-theme="light"]) .highlight .mo { color: #51b2fd } /* Literal.Number.Oct */ -body:not([data-theme="light"]) .highlight .sa { color: #ed9d13 } /* Literal.String.Affix */ -body:not([data-theme="light"]) .highlight .sb { color: #ed9d13 } /* Literal.String.Backtick */ -body:not([data-theme="light"]) .highlight .sc { color: #ed9d13 } /* Literal.String.Char */ -body:not([data-theme="light"]) .highlight .dl { color: #ed9d13 } /* Literal.String.Delimiter */ -body:not([data-theme="light"]) .highlight .sd { color: #ed9d13 } /* Literal.String.Doc */ -body:not([data-theme="light"]) .highlight .s2 { color: #ed9d13 } /* Literal.String.Double */ -body:not([data-theme="light"]) .highlight .se { color: #ed9d13 } /* Literal.String.Escape */ -body:not([data-theme="light"]) .highlight .sh { color: #ed9d13 } /* Literal.String.Heredoc */ -body:not([data-theme="light"]) .highlight .si { color: #ed9d13 } /* Literal.String.Interpol */ -body:not([data-theme="light"]) .highlight .sx { color: #ffa500 } /* Literal.String.Other */ -body:not([data-theme="light"]) .highlight .sr { color: #ed9d13 } /* Literal.String.Regex */ -body:not([data-theme="light"]) .highlight .s1 { color: #ed9d13 } /* Literal.String.Single */ -body:not([data-theme="light"]) .highlight .ss { color: #ed9d13 } /* Literal.String.Symbol */ -body:not([data-theme="light"]) .highlight .bp { color: #2fbccd } /* Name.Builtin.Pseudo */ -body:not([data-theme="light"]) .highlight .fm { color: #71adff } /* Name.Function.Magic */ -body:not([data-theme="light"]) .highlight .vc { color: #40ffff } /* Name.Variable.Class */ -body:not([data-theme="light"]) .highlight .vg { color: #40ffff } /* Name.Variable.Global */ -body:not([data-theme="light"]) .highlight .vi { color: #40ffff } /* Name.Variable.Instance */ -body:not([data-theme="light"]) .highlight .vm { color: #40ffff } /* Name.Variable.Magic */ -body:not([data-theme="light"]) .highlight .il { color: #51b2fd } /* Literal.Number.Integer.Long */ -} -} \ No newline at end of file diff --git a/pr-preview/pr-273/_static/scripts/furo-extensions.js b/pr-preview/pr-273/_static/scripts/furo-extensions.js deleted file mode 100644 index e69de29bb..000000000 diff --git a/pr-preview/pr-273/_static/scripts/furo.js b/pr-preview/pr-273/_static/scripts/furo.js deleted file mode 100644 index 32e7c05be..000000000 --- a/pr-preview/pr-273/_static/scripts/furo.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see furo.js.LICENSE.txt */ -(()=>{var t={212:function(t,e,n){var o,r;r=void 0!==n.g?n.g:"undefined"!=typeof window?window:this,o=function(){return function(t){"use strict";var e={navClass:"active",contentClass:"active",nested:!1,nestedClass:"active",offset:0,reflow:!1,events:!0},n=function(t,e,n){if(n.settings.events){var o=new CustomEvent(t,{bubbles:!0,cancelable:!0,detail:n});e.dispatchEvent(o)}},o=function(t){var e=0;if(t.offsetParent)for(;t;)e+=t.offsetTop,t=t.offsetParent;return e>=0?e:0},r=function(t){t&&t.sort((function(t,e){return o(t.content)=Math.max(document.body.scrollHeight,document.documentElement.scrollHeight,document.body.offsetHeight,document.documentElement.offsetHeight,document.body.clientHeight,document.documentElement.clientHeight)},l=function(t,e){var n=t[t.length-1];if(function(t,e){return!(!s()||!c(t.content,e,!0))}(n,e))return n;for(var o=t.length-1;o>=0;o--)if(c(t[o].content,e))return t[o]},a=function(t,e){if(e.nested&&t.parentNode){var n=t.parentNode.closest("li");n&&(n.classList.remove(e.nestedClass),a(n,e))}},i=function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.remove(e.navClass),t.content.classList.remove(e.contentClass),a(o,e),n("gumshoeDeactivate",o,{link:t.nav,content:t.content,settings:e}))}},u=function(t,e){if(e.nested){var n=t.parentNode.closest("li");n&&(n.classList.add(e.nestedClass),u(n,e))}};return function(o,c){var s,a,d,f,m,v={setup:function(){s=document.querySelectorAll(o),a=[],Array.prototype.forEach.call(s,(function(t){var e=document.getElementById(decodeURIComponent(t.hash.substr(1)));e&&a.push({nav:t,content:e})})),r(a)},detect:function(){var t=l(a,m);t?d&&t.content===d.content||(i(d,m),function(t,e){if(t){var o=t.nav.closest("li");o&&(o.classList.add(e.navClass),t.content.classList.add(e.contentClass),u(o,e),n("gumshoeActivate",o,{link:t.nav,content:t.content,settings:e}))}}(t,m),d=t):d&&(i(d,m),d=null)}},h=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame(v.detect)},g=function(e){f&&t.cancelAnimationFrame(f),f=t.requestAnimationFrame((function(){r(a),v.detect()}))};return v.destroy=function(){d&&i(d,m),t.removeEventListener("scroll",h,!1),m.reflow&&t.removeEventListener("resize",g,!1),a=null,s=null,d=null,f=null,m=null},m=function(){var t={};return Array.prototype.forEach.call(arguments,(function(e){for(var n in e){if(!e.hasOwnProperty(n))return;t[n]=e[n]}})),t}(e,c||{}),v.setup(),v.detect(),t.addEventListener("scroll",h,!1),m.reflow&&t.addEventListener("resize",g,!1),v}}(r)}.apply(e,[]),void 0===o||(t.exports=o)}},e={};function n(o){var r=e[o];if(void 0!==r)return r.exports;var c=e[o]={exports:{}};return t[o].call(c.exports,c,c.exports,n),c.exports}n.n=t=>{var e=t&&t.__esModule?()=>t.default:()=>t;return n.d(e,{a:e}),e},n.d=(t,e)=>{for(var o in e)n.o(e,o)&&!n.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:e[o]})},n.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(t){if("object"==typeof window)return window}}(),n.o=(t,e)=>Object.prototype.hasOwnProperty.call(t,e),(()=>{"use strict";var t=n(212),e=n.n(t),o=null,r=null,c=window.pageYOffset||document.documentElement.scrollTop;const s=64;function l(){const t=localStorage.getItem("theme")||"auto";var e;"light"!==(e=window.matchMedia("(prefers-color-scheme: dark)").matches?"auto"===t?"light":"light"==t?"dark":"auto":"auto"===t?"dark":"dark"==t?"light":"auto")&&"dark"!==e&&"auto"!==e&&(console.error(`Got invalid theme mode: ${e}. Resetting to auto.`),e="auto"),document.body.dataset.theme=e,localStorage.setItem("theme",e),console.log(`Changed to ${e} mode.`)}function a(){!function(){const t=document.getElementsByClassName("theme-toggle");Array.from(t).forEach((t=>{t.addEventListener("click",l)}))}(),function(){let t=0,e=!1;window.addEventListener("scroll",(function(n){t=window.scrollY,e||(window.requestAnimationFrame((function(){var n;n=t,0==Math.floor(r.getBoundingClientRect().top)?r.classList.add("scrolled"):r.classList.remove("scrolled"),function(t){tc&&document.documentElement.classList.remove("show-back-to-top"),c=t}(n),function(t){null!==o&&(0==t?o.scrollTo(0,0):Math.ceil(t)>=Math.floor(document.documentElement.scrollHeight-window.innerHeight)?o.scrollTo(0,o.scrollHeight):document.querySelector(".scroll-current"))}(n),e=!1})),e=!0)})),window.scroll()}(),null!==o&&new(e())(".toc-tree a",{reflow:!0,recursive:!0,navClass:"scroll-current",offset:()=>{let t=parseFloat(getComputedStyle(document.documentElement).fontSize);return r.getBoundingClientRect().height+.5*t+1}})}document.addEventListener("DOMContentLoaded",(function(){document.body.parentNode.classList.remove("no-js"),r=document.querySelector("header"),o=document.querySelector(".toc-scroll"),a()}))})()})(); -//# sourceMappingURL=furo.js.map \ No newline at end of file diff --git a/pr-preview/pr-273/_static/scripts/furo.js.LICENSE.txt b/pr-preview/pr-273/_static/scripts/furo.js.LICENSE.txt deleted file mode 100644 index 1632189c7..000000000 --- a/pr-preview/pr-273/_static/scripts/furo.js.LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -/*! - * gumshoejs v5.1.2 (patched by @pradyunsg) - * A simple, framework-agnostic scrollspy script. - * (c) 2019 Chris Ferdinandi - * MIT License - * http://github.com/cferdinandi/gumshoe - */ diff --git a/pr-preview/pr-273/_static/scripts/furo.js.map b/pr-preview/pr-273/_static/scripts/furo.js.map deleted file mode 100644 index 7b7ddb113..000000000 --- a/pr-preview/pr-273/_static/scripts/furo.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"scripts/furo.js","mappings":";iCAAA,MAQWA,SAWS,IAAX,EAAAC,EACH,EAAAA,EACkB,oBAAXC,OACPA,OACAC,KAbS,EAAF,WACP,OAaJ,SAAUD,GACR,aAMA,IAAIE,EAAW,CAEbC,SAAU,SACVC,aAAc,SAGdC,QAAQ,EACRC,YAAa,SAGbC,OAAQ,EACRC,QAAQ,EAGRC,QAAQ,GA6BNC,EAAY,SAAUC,EAAMC,EAAMC,GAEpC,GAAKA,EAAOC,SAASL,OAArB,CAGA,IAAIM,EAAQ,IAAIC,YAAYL,EAAM,CAChCM,SAAS,EACTC,YAAY,EACZL,OAAQA,IAIVD,EAAKO,cAAcJ,EAVgB,CAWrC,EAOIK,EAAe,SAAUR,GAC3B,IAAIS,EAAW,EACf,GAAIT,EAAKU,aACP,KAAOV,GACLS,GAAYT,EAAKW,UACjBX,EAAOA,EAAKU,aAGhB,OAAOD,GAAY,EAAIA,EAAW,CACpC,EAMIG,EAAe,SAAUC,GACvBA,GACFA,EAASC,MAAK,SAAUC,EAAOC,GAG7B,OAFcR,EAAaO,EAAME,SACnBT,EAAaQ,EAAMC,UACF,EACxB,CACT,GAEJ,EAwCIC,EAAW,SAAUlB,EAAME,EAAUiB,GACvC,IAAIC,EAASpB,EAAKqB,wBACd1B,EAnCU,SAAUO,GAExB,MAA+B,mBAApBA,EAASP,OACX2B,WAAWpB,EAASP,UAItB2B,WAAWpB,EAASP,OAC7B,CA2Be4B,CAAUrB,GACvB,OAAIiB,EAEAK,SAASJ,EAAOD,OAAQ,KACvB/B,EAAOqC,aAAeC,SAASC,gBAAgBC,cAG7CJ,SAASJ,EAAOS,IAAK,KAAOlC,CACrC,EAMImC,EAAa,WACf,OACEC,KAAKC,KAAK5C,EAAOqC,YAAcrC,EAAO6C,cAnCjCF,KAAKG,IACVR,SAASS,KAAKC,aACdV,SAASC,gBAAgBS,aACzBV,SAASS,KAAKE,aACdX,SAASC,gBAAgBU,aACzBX,SAASS,KAAKP,aACdF,SAASC,gBAAgBC,aAkC7B,EAmBIU,EAAY,SAAUzB,EAAUX,GAClC,IAAIqC,EAAO1B,EAASA,EAAS2B,OAAS,GACtC,GAbgB,SAAUC,EAAMvC,GAChC,SAAI4B,MAAgBZ,EAASuB,EAAKxB,QAASf,GAAU,GAEvD,CAUMwC,CAAYH,EAAMrC,GAAW,OAAOqC,EACxC,IAAK,IAAII,EAAI9B,EAAS2B,OAAS,EAAGG,GAAK,EAAGA,IACxC,GAAIzB,EAASL,EAAS8B,GAAG1B,QAASf,GAAW,OAAOW,EAAS8B,EAEjE,EAOIC,EAAmB,SAAUC,EAAK3C,GAEpC,GAAKA,EAAST,QAAWoD,EAAIC,WAA7B,CAGA,IAAIC,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASR,aAG7BkD,EAAiBG,EAAI7C,GAV0B,CAWjD,EAOIiD,EAAa,SAAUC,EAAOlD,GAEhC,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUC,OAAOhD,EAASX,UAC7B6D,EAAMnC,QAAQgC,UAAUC,OAAOhD,EAASV,cAGxCoD,EAAiBG,EAAI7C,GAGrBJ,EAAU,oBAAqBiD,EAAI,CACjCM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,EAOIoD,EAAiB,SAAUT,EAAK3C,GAElC,GAAKA,EAAST,OAAd,CAGA,IAAIsD,EAAKF,EAAIC,WAAWE,QAAQ,MAC3BD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASR,aAG1B4D,EAAeP,EAAI7C,GAVS,CAW9B,EA6LA,OA1JkB,SAAUsD,EAAUC,GAKpC,IACIC,EAAU7C,EAAU8C,EAASC,EAAS1D,EADtC2D,EAAa,CAUjBA,MAAmB,WAEjBH,EAAWhC,SAASoC,iBAAiBN,GAGrC3C,EAAW,GAGXkD,MAAMC,UAAUC,QAAQC,KAAKR,GAAU,SAAUjB,GAE/C,IAAIxB,EAAUS,SAASyC,eACrBC,mBAAmB3B,EAAK4B,KAAKC,OAAO,KAEjCrD,GAGLJ,EAAS0D,KAAK,CACZ1B,IAAKJ,EACLxB,QAASA,GAEb,IAGAL,EAAaC,EACf,EAKAgD,OAAoB,WAElB,IAAIW,EAASlC,EAAUzB,EAAUX,GAG5BsE,EASDb,GAAWa,EAAOvD,UAAY0C,EAAQ1C,UAG1CkC,EAAWQ,EAASzD,GAzFT,SAAUkD,EAAOlD,GAE9B,GAAKkD,EAAL,CAGA,IAAIL,EAAKK,EAAMP,IAAIG,QAAQ,MACtBD,IAGLA,EAAGE,UAAUM,IAAIrD,EAASX,UAC1B6D,EAAMnC,QAAQgC,UAAUM,IAAIrD,EAASV,cAGrC8D,EAAeP,EAAI7C,GAGnBJ,EAAU,kBAAmBiD,EAAI,CAC/BM,KAAMD,EAAMP,IACZ5B,QAASmC,EAAMnC,QACff,SAAUA,IAjBM,CAmBpB,CAqEIuE,CAASD,EAAQtE,GAGjByD,EAAUa,GAfJb,IACFR,EAAWQ,EAASzD,GACpByD,EAAU,KAchB,GAMIe,EAAgB,SAAUvE,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,sBAAsBf,EAAWgB,OACpD,EAMIC,EAAgB,SAAU3E,GAExByD,GACFxE,EAAOuF,qBAAqBf,GAI9BA,EAAUxE,EAAOwF,uBAAsB,WACrChE,EAAaC,GACbgD,EAAWgB,QACb,GACF,EAkDA,OA7CAhB,EAAWkB,QAAU,WAEfpB,GACFR,EAAWQ,EAASzD,GAItBd,EAAO4F,oBAAoB,SAAUN,GAAe,GAChDxE,EAASN,QACXR,EAAO4F,oBAAoB,SAAUF,GAAe,GAItDjE,EAAW,KACX6C,EAAW,KACXC,EAAU,KACVC,EAAU,KACV1D,EAAW,IACb,EAOEA,EA3XS,WACX,IAAI+E,EAAS,CAAC,EAOd,OANAlB,MAAMC,UAAUC,QAAQC,KAAKgB,WAAW,SAAUC,GAChD,IAAK,IAAIC,KAAOD,EAAK,CACnB,IAAKA,EAAIE,eAAeD,GAAM,OAC9BH,EAAOG,GAAOD,EAAIC,EACpB,CACF,IACOH,CACT,CAkXeK,CAAOhG,EAAUmE,GAAW,CAAC,GAGxCI,EAAW0B,QAGX1B,EAAWgB,SAGXzF,EAAOoG,iBAAiB,SAAUd,GAAe,GAC7CxE,EAASN,QACXR,EAAOoG,iBAAiB,SAAUV,GAAe,GAS9CjB,CACT,CAOF,CArcW4B,CAAQvG,EAChB,UAFM,SAEN,uBCXDwG,EAA2B,CAAC,EAGhC,SAASC,EAAoBC,GAE5B,IAAIC,EAAeH,EAAyBE,GAC5C,QAAqBE,IAAjBD,EACH,OAAOA,EAAaE,QAGrB,IAAIC,EAASN,EAAyBE,GAAY,CAGjDG,QAAS,CAAC,GAOX,OAHAE,EAAoBL,GAAU1B,KAAK8B,EAAOD,QAASC,EAAQA,EAAOD,QAASJ,GAGpEK,EAAOD,OACf,CCrBAJ,EAAoBO,EAAKF,IACxB,IAAIG,EAASH,GAAUA,EAAOI,WAC7B,IAAOJ,EAAiB,QACxB,IAAM,EAEP,OADAL,EAAoBU,EAAEF,EAAQ,CAAEG,EAAGH,IAC5BA,CAAM,ECLdR,EAAoBU,EAAI,CAACN,EAASQ,KACjC,IAAI,IAAInB,KAAOmB,EACXZ,EAAoBa,EAAED,EAAYnB,KAASO,EAAoBa,EAAET,EAASX,IAC5EqB,OAAOC,eAAeX,EAASX,EAAK,CAAEuB,YAAY,EAAMC,IAAKL,EAAWnB,IAE1E,ECNDO,EAAoBxG,EAAI,WACvB,GAA0B,iBAAf0H,WAAyB,OAAOA,WAC3C,IACC,OAAOxH,MAAQ,IAAIyH,SAAS,cAAb,EAChB,CAAE,MAAOC,GACR,GAAsB,iBAAX3H,OAAqB,OAAOA,MACxC,CACA,CAPuB,GCAxBuG,EAAoBa,EAAI,CAACrB,EAAK6B,IAAUP,OAAOzC,UAAUqB,eAAenB,KAAKiB,EAAK6B,4CCK9EC,EAAY,KACZC,EAAS,KACTC,EAAgB/H,OAAO6C,aAAeP,SAASC,gBAAgByF,UACnE,MAAMC,EAAmB,GA2EzB,SAASC,IACP,MAAMC,EAAeC,aAAaC,QAAQ,UAAY,OAZxD,IAAkBC,EACH,WADGA,EAaItI,OAAOuI,WAAW,gCAAgCC,QAI/C,SAAjBL,EACO,QACgB,SAAhBA,EACA,OAEA,OAIU,SAAjBA,EACO,OACgB,QAAhBA,EACA,QAEA,SA9BoB,SAATG,GAA4B,SAATA,IACzCG,QAAQC,MAAM,2BAA2BJ,yBACzCA,EAAO,QAGThG,SAASS,KAAK4F,QAAQC,MAAQN,EAC9BF,aAAaS,QAAQ,QAASP,GAC9BG,QAAQK,IAAI,cAAcR,UA0B5B,CAkDA,SAASnC,KART,WAEE,MAAM4C,EAAUzG,SAAS0G,uBAAuB,gBAChDrE,MAAMsE,KAAKF,GAASlE,SAASqE,IAC3BA,EAAI9C,iBAAiB,QAAS8B,EAAe,GAEjD,CAGEiB,GA9CF,WAEE,IAAIC,EAA6B,EAC7BC,GAAU,EAEdrJ,OAAOoG,iBAAiB,UAAU,SAAUuB,GAC1CyB,EAA6BpJ,OAAOsJ,QAE/BD,IACHrJ,OAAOwF,uBAAsB,WAzDnC,IAAuB+D,IA0DDH,EA9GkC,GAAlDzG,KAAK6G,MAAM1B,EAAO7F,wBAAwBQ,KAC5CqF,EAAOjE,UAAUM,IAAI,YAErB2D,EAAOjE,UAAUC,OAAO,YAI5B,SAAmCyF,GAC7BA,EAAYtB,EACd3F,SAASC,gBAAgBsB,UAAUC,OAAO,oBAEtCyF,EAAYxB,EACdzF,SAASC,gBAAgBsB,UAAUM,IAAI,oBAC9BoF,EAAYxB,GACrBzF,SAASC,gBAAgBsB,UAAUC,OAAO,oBAG9CiE,EAAgBwB,CAClB,CAoCEE,CAA0BF,GAlC5B,SAA6BA,GACT,OAAd1B,IAKa,GAAb0B,EACF1B,EAAU6B,SAAS,EAAG,GAGtB/G,KAAKC,KAAK2G,IACV5G,KAAK6G,MAAMlH,SAASC,gBAAgBS,aAAehD,OAAOqC,aAE1DwF,EAAU6B,SAAS,EAAG7B,EAAU7E,cAGhBV,SAASqH,cAAc,mBAc3C,CAKEC,CAAoBL,GAwDdF,GAAU,CACZ,IAEAA,GAAU,EAEd,IACArJ,OAAO6J,QACT,CA6BEC,GA1BkB,OAAdjC,GAKJ,IAAI,IAAJ,CAAY,cAAe,CACzBrH,QAAQ,EACRuJ,WAAW,EACX5J,SAAU,iBACVI,OAAQ,KACN,IAAIyJ,EAAM9H,WAAW+H,iBAAiB3H,SAASC,iBAAiB2H,UAChE,OAAOpC,EAAO7F,wBAAwBkI,OAAS,GAAMH,EAAM,CAAC,GAiBlE,CAcA1H,SAAS8D,iBAAiB,oBAT1B,WACE9D,SAASS,KAAKW,WAAWG,UAAUC,OAAO,SAE1CgE,EAASxF,SAASqH,cAAc,UAChC9B,EAAYvF,SAASqH,cAAc,eAEnCxD,GACF","sources":["webpack:///./src/furo/assets/scripts/gumshoe-patched.js","webpack:///webpack/bootstrap","webpack:///webpack/runtime/compat get default export","webpack:///webpack/runtime/define property getters","webpack:///webpack/runtime/global","webpack:///webpack/runtime/hasOwnProperty shorthand","webpack:///./src/furo/assets/scripts/furo.js"],"sourcesContent":["/*!\n * gumshoejs v5.1.2 (patched by @pradyunsg)\n * A simple, framework-agnostic scrollspy script.\n * (c) 2019 Chris Ferdinandi\n * MIT License\n * http://github.com/cferdinandi/gumshoe\n */\n\n(function (root, factory) {\n if (typeof define === \"function\" && define.amd) {\n define([], function () {\n return factory(root);\n });\n } else if (typeof exports === \"object\") {\n module.exports = factory(root);\n } else {\n root.Gumshoe = factory(root);\n }\n})(\n typeof global !== \"undefined\"\n ? global\n : typeof window !== \"undefined\"\n ? window\n : this,\n function (window) {\n \"use strict\";\n\n //\n // Defaults\n //\n\n var defaults = {\n // Active classes\n navClass: \"active\",\n contentClass: \"active\",\n\n // Nested navigation\n nested: false,\n nestedClass: \"active\",\n\n // Offset & reflow\n offset: 0,\n reflow: false,\n\n // Event support\n events: true,\n };\n\n //\n // Methods\n //\n\n /**\n * Merge two or more objects together.\n * @param {Object} objects The objects to merge together\n * @returns {Object} Merged values of defaults and options\n */\n var extend = function () {\n var merged = {};\n Array.prototype.forEach.call(arguments, function (obj) {\n for (var key in obj) {\n if (!obj.hasOwnProperty(key)) return;\n merged[key] = obj[key];\n }\n });\n return merged;\n };\n\n /**\n * Emit a custom event\n * @param {String} type The event type\n * @param {Node} elem The element to attach the event to\n * @param {Object} detail Any details to pass along with the event\n */\n var emitEvent = function (type, elem, detail) {\n // Make sure events are enabled\n if (!detail.settings.events) return;\n\n // Create a new event\n var event = new CustomEvent(type, {\n bubbles: true,\n cancelable: true,\n detail: detail,\n });\n\n // Dispatch the event\n elem.dispatchEvent(event);\n };\n\n /**\n * Get an element's distance from the top of the Document.\n * @param {Node} elem The element\n * @return {Number} Distance from the top in pixels\n */\n var getOffsetTop = function (elem) {\n var location = 0;\n if (elem.offsetParent) {\n while (elem) {\n location += elem.offsetTop;\n elem = elem.offsetParent;\n }\n }\n return location >= 0 ? location : 0;\n };\n\n /**\n * Sort content from first to last in the DOM\n * @param {Array} contents The content areas\n */\n var sortContents = function (contents) {\n if (contents) {\n contents.sort(function (item1, item2) {\n var offset1 = getOffsetTop(item1.content);\n var offset2 = getOffsetTop(item2.content);\n if (offset1 < offset2) return -1;\n return 1;\n });\n }\n };\n\n /**\n * Get the offset to use for calculating position\n * @param {Object} settings The settings for this instantiation\n * @return {Float} The number of pixels to offset the calculations\n */\n var getOffset = function (settings) {\n // if the offset is a function run it\n if (typeof settings.offset === \"function\") {\n return parseFloat(settings.offset());\n }\n\n // Otherwise, return it as-is\n return parseFloat(settings.offset);\n };\n\n /**\n * Get the document element's height\n * @private\n * @returns {Number}\n */\n var getDocumentHeight = function () {\n return Math.max(\n document.body.scrollHeight,\n document.documentElement.scrollHeight,\n document.body.offsetHeight,\n document.documentElement.offsetHeight,\n document.body.clientHeight,\n document.documentElement.clientHeight,\n );\n };\n\n /**\n * Determine if an element is in view\n * @param {Node} elem The element\n * @param {Object} settings The settings for this instantiation\n * @param {Boolean} bottom If true, check if element is above bottom of viewport instead\n * @return {Boolean} Returns true if element is in the viewport\n */\n var isInView = function (elem, settings, bottom) {\n var bounds = elem.getBoundingClientRect();\n var offset = getOffset(settings);\n if (bottom) {\n return (\n parseInt(bounds.bottom, 10) <\n (window.innerHeight || document.documentElement.clientHeight)\n );\n }\n return parseInt(bounds.top, 10) <= offset;\n };\n\n /**\n * Check if at the bottom of the viewport\n * @return {Boolean} If true, page is at the bottom of the viewport\n */\n var isAtBottom = function () {\n if (\n Math.ceil(window.innerHeight + window.pageYOffset) >=\n getDocumentHeight()\n )\n return true;\n return false;\n };\n\n /**\n * Check if the last item should be used (even if not at the top of the page)\n * @param {Object} item The last item\n * @param {Object} settings The settings for this instantiation\n * @return {Boolean} If true, use the last item\n */\n var useLastItem = function (item, settings) {\n if (isAtBottom() && isInView(item.content, settings, true)) return true;\n return false;\n };\n\n /**\n * Get the active content\n * @param {Array} contents The content areas\n * @param {Object} settings The settings for this instantiation\n * @return {Object} The content area and matching navigation link\n */\n var getActive = function (contents, settings) {\n var last = contents[contents.length - 1];\n if (useLastItem(last, settings)) return last;\n for (var i = contents.length - 1; i >= 0; i--) {\n if (isInView(contents[i].content, settings)) return contents[i];\n }\n };\n\n /**\n * Deactivate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var deactivateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested || !nav.parentNode) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Remove the active class\n li.classList.remove(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n deactivateNested(li, settings);\n };\n\n /**\n * Deactivate a nav and content area\n * @param {Object} items The nav item and content to deactivate\n * @param {Object} settings The settings for this instantiation\n */\n var deactivate = function (items, settings) {\n // Make sure there are items to deactivate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Remove the active class from the nav and content\n li.classList.remove(settings.navClass);\n items.content.classList.remove(settings.contentClass);\n\n // Deactivate any parent navs in a nested navigation\n deactivateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeDeactivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Activate parent navs in a nested navigation\n * @param {Node} nav The starting navigation element\n * @param {Object} settings The settings for this instantiation\n */\n var activateNested = function (nav, settings) {\n // If nesting isn't activated, bail\n if (!settings.nested) return;\n\n // Get the parent navigation\n var li = nav.parentNode.closest(\"li\");\n if (!li) return;\n\n // Add the active class\n li.classList.add(settings.nestedClass);\n\n // Apply recursively to any parent navigation elements\n activateNested(li, settings);\n };\n\n /**\n * Activate a nav and content area\n * @param {Object} items The nav item and content to activate\n * @param {Object} settings The settings for this instantiation\n */\n var activate = function (items, settings) {\n // Make sure there are items to activate\n if (!items) return;\n\n // Get the parent list item\n var li = items.nav.closest(\"li\");\n if (!li) return;\n\n // Add the active class to the nav and content\n li.classList.add(settings.navClass);\n items.content.classList.add(settings.contentClass);\n\n // Activate any parent navs in a nested navigation\n activateNested(li, settings);\n\n // Emit a custom event\n emitEvent(\"gumshoeActivate\", li, {\n link: items.nav,\n content: items.content,\n settings: settings,\n });\n };\n\n /**\n * Create the Constructor object\n * @param {String} selector The selector to use for navigation items\n * @param {Object} options User options and settings\n */\n var Constructor = function (selector, options) {\n //\n // Variables\n //\n\n var publicAPIs = {};\n var navItems, contents, current, timeout, settings;\n\n //\n // Methods\n //\n\n /**\n * Set variables from DOM elements\n */\n publicAPIs.setup = function () {\n // Get all nav items\n navItems = document.querySelectorAll(selector);\n\n // Create contents array\n contents = [];\n\n // Loop through each item, get it's matching content, and push to the array\n Array.prototype.forEach.call(navItems, function (item) {\n // Get the content for the nav item\n var content = document.getElementById(\n decodeURIComponent(item.hash.substr(1)),\n );\n if (!content) return;\n\n // Push to the contents array\n contents.push({\n nav: item,\n content: content,\n });\n });\n\n // Sort contents by the order they appear in the DOM\n sortContents(contents);\n };\n\n /**\n * Detect which content is currently active\n */\n publicAPIs.detect = function () {\n // Get the active content\n var active = getActive(contents, settings);\n\n // if there's no active content, deactivate and bail\n if (!active) {\n if (current) {\n deactivate(current, settings);\n current = null;\n }\n return;\n }\n\n // If the active content is the one currently active, do nothing\n if (current && active.content === current.content) return;\n\n // Deactivate the current content and activate the new content\n deactivate(current, settings);\n activate(active, settings);\n\n // Update the currently active content\n current = active;\n };\n\n /**\n * Detect the active content on scroll\n * Debounced for performance\n */\n var scrollHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(publicAPIs.detect);\n };\n\n /**\n * Update content sorting on resize\n * Debounced for performance\n */\n var resizeHandler = function (event) {\n // If there's a timer, cancel it\n if (timeout) {\n window.cancelAnimationFrame(timeout);\n }\n\n // Setup debounce callback\n timeout = window.requestAnimationFrame(function () {\n sortContents(contents);\n publicAPIs.detect();\n });\n };\n\n /**\n * Destroy the current instantiation\n */\n publicAPIs.destroy = function () {\n // Undo DOM changes\n if (current) {\n deactivate(current, settings);\n }\n\n // Remove event listeners\n window.removeEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.removeEventListener(\"resize\", resizeHandler, false);\n }\n\n // Reset variables\n contents = null;\n navItems = null;\n current = null;\n timeout = null;\n settings = null;\n };\n\n /**\n * Initialize the current instantiation\n */\n var init = function () {\n // Merge user options into defaults\n settings = extend(defaults, options || {});\n\n // Setup variables based on the current DOM\n publicAPIs.setup();\n\n // Find the currently active content\n publicAPIs.detect();\n\n // Setup event listeners\n window.addEventListener(\"scroll\", scrollHandler, false);\n if (settings.reflow) {\n window.addEventListener(\"resize\", resizeHandler, false);\n }\n };\n\n //\n // Initialize and return the public APIs\n //\n\n init();\n return publicAPIs;\n };\n\n //\n // Return the Constructor\n //\n\n return Constructor;\n },\n);\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","import Gumshoe from \"./gumshoe-patched.js\";\n\n////////////////////////////////////////////////////////////////////////////////\n// Scroll Handling\n////////////////////////////////////////////////////////////////////////////////\nvar tocScroll = null;\nvar header = null;\nvar lastScrollTop = window.pageYOffset || document.documentElement.scrollTop;\nconst GO_TO_TOP_OFFSET = 64;\n\nfunction scrollHandlerForHeader() {\n if (Math.floor(header.getBoundingClientRect().top) == 0) {\n header.classList.add(\"scrolled\");\n } else {\n header.classList.remove(\"scrolled\");\n }\n}\n\nfunction scrollHandlerForBackToTop(positionY) {\n if (positionY < GO_TO_TOP_OFFSET) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n } else {\n if (positionY < lastScrollTop) {\n document.documentElement.classList.add(\"show-back-to-top\");\n } else if (positionY > lastScrollTop) {\n document.documentElement.classList.remove(\"show-back-to-top\");\n }\n }\n lastScrollTop = positionY;\n}\n\nfunction scrollHandlerForTOC(positionY) {\n if (tocScroll === null) {\n return;\n }\n\n // top of page.\n if (positionY == 0) {\n tocScroll.scrollTo(0, 0);\n } else if (\n // bottom of page.\n Math.ceil(positionY) >=\n Math.floor(document.documentElement.scrollHeight - window.innerHeight)\n ) {\n tocScroll.scrollTo(0, tocScroll.scrollHeight);\n } else {\n // somewhere in the middle.\n const current = document.querySelector(\".scroll-current\");\n if (current == null) {\n return;\n }\n\n // https://github.com/pypa/pip/issues/9159 This breaks scroll behaviours.\n // // scroll the currently \"active\" heading in toc, into view.\n // const rect = current.getBoundingClientRect();\n // if (0 > rect.top) {\n // current.scrollIntoView(true); // the argument is \"alignTop\"\n // } else if (rect.bottom > window.innerHeight) {\n // current.scrollIntoView(false);\n // }\n }\n}\n\nfunction scrollHandler(positionY) {\n scrollHandlerForHeader();\n scrollHandlerForBackToTop(positionY);\n scrollHandlerForTOC(positionY);\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Theme Toggle\n////////////////////////////////////////////////////////////////////////////////\nfunction setTheme(mode) {\n if (mode !== \"light\" && mode !== \"dark\" && mode !== \"auto\") {\n console.error(`Got invalid theme mode: ${mode}. Resetting to auto.`);\n mode = \"auto\";\n }\n\n document.body.dataset.theme = mode;\n localStorage.setItem(\"theme\", mode);\n console.log(`Changed to ${mode} mode.`);\n}\n\nfunction cycleThemeOnce() {\n const currentTheme = localStorage.getItem(\"theme\") || \"auto\";\n const prefersDark = window.matchMedia(\"(prefers-color-scheme: dark)\").matches;\n\n if (prefersDark) {\n // Auto (dark) -> Light -> Dark\n if (currentTheme === \"auto\") {\n setTheme(\"light\");\n } else if (currentTheme == \"light\") {\n setTheme(\"dark\");\n } else {\n setTheme(\"auto\");\n }\n } else {\n // Auto (light) -> Dark -> Light\n if (currentTheme === \"auto\") {\n setTheme(\"dark\");\n } else if (currentTheme == \"dark\") {\n setTheme(\"light\");\n } else {\n setTheme(\"auto\");\n }\n }\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Setup\n////////////////////////////////////////////////////////////////////////////////\nfunction setupScrollHandler() {\n // Taken from https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let last_known_scroll_position = 0;\n let ticking = false;\n\n window.addEventListener(\"scroll\", function (e) {\n last_known_scroll_position = window.scrollY;\n\n if (!ticking) {\n window.requestAnimationFrame(function () {\n scrollHandler(last_known_scroll_position);\n ticking = false;\n });\n\n ticking = true;\n }\n });\n window.scroll();\n}\n\nfunction setupScrollSpy() {\n if (tocScroll === null) {\n return;\n }\n\n // Scrollspy -- highlight table on contents, based on scroll\n new Gumshoe(\".toc-tree a\", {\n reflow: true,\n recursive: true,\n navClass: \"scroll-current\",\n offset: () => {\n let rem = parseFloat(getComputedStyle(document.documentElement).fontSize);\n return header.getBoundingClientRect().height + 0.5 * rem + 1;\n },\n });\n}\n\nfunction setupTheme() {\n // Attach event handlers for toggling themes\n const buttons = document.getElementsByClassName(\"theme-toggle\");\n Array.from(buttons).forEach((btn) => {\n btn.addEventListener(\"click\", cycleThemeOnce);\n });\n}\n\nfunction setup() {\n setupTheme();\n setupScrollHandler();\n setupScrollSpy();\n}\n\n////////////////////////////////////////////////////////////////////////////////\n// Main entrypoint\n////////////////////////////////////////////////////////////////////////////////\nfunction main() {\n document.body.parentNode.classList.remove(\"no-js\");\n\n header = document.querySelector(\"header\");\n tocScroll = document.querySelector(\".toc-scroll\");\n\n setup();\n}\n\ndocument.addEventListener(\"DOMContentLoaded\", main);\n"],"names":["root","g","window","this","defaults","navClass","contentClass","nested","nestedClass","offset","reflow","events","emitEvent","type","elem","detail","settings","event","CustomEvent","bubbles","cancelable","dispatchEvent","getOffsetTop","location","offsetParent","offsetTop","sortContents","contents","sort","item1","item2","content","isInView","bottom","bounds","getBoundingClientRect","parseFloat","getOffset","parseInt","innerHeight","document","documentElement","clientHeight","top","isAtBottom","Math","ceil","pageYOffset","max","body","scrollHeight","offsetHeight","getActive","last","length","item","useLastItem","i","deactivateNested","nav","parentNode","li","closest","classList","remove","deactivate","items","link","activateNested","add","selector","options","navItems","current","timeout","publicAPIs","querySelectorAll","Array","prototype","forEach","call","getElementById","decodeURIComponent","hash","substr","push","active","activate","scrollHandler","cancelAnimationFrame","requestAnimationFrame","detect","resizeHandler","destroy","removeEventListener","merged","arguments","obj","key","hasOwnProperty","extend","setup","addEventListener","factory","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","undefined","exports","module","__webpack_modules__","n","getter","__esModule","d","a","definition","o","Object","defineProperty","enumerable","get","globalThis","Function","e","prop","tocScroll","header","lastScrollTop","scrollTop","GO_TO_TOP_OFFSET","cycleThemeOnce","currentTheme","localStorage","getItem","mode","matchMedia","matches","console","error","dataset","theme","setItem","log","buttons","getElementsByClassName","from","btn","setupTheme","last_known_scroll_position","ticking","scrollY","positionY","floor","scrollHandlerForBackToTop","scrollTo","querySelector","scrollHandlerForTOC","scroll","setupScrollHandler","recursive","rem","getComputedStyle","fontSize","height"],"sourceRoot":""} \ No newline at end of file diff --git a/pr-preview/pr-273/_static/searchtools.js b/pr-preview/pr-273/_static/searchtools.js deleted file mode 100644 index 7918c3fab..000000000 --- a/pr-preview/pr-273/_static/searchtools.js +++ /dev/null @@ -1,574 +0,0 @@ -/* - * searchtools.js - * ~~~~~~~~~~~~~~~~ - * - * Sphinx JavaScript utilities for the full-text search. - * - * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. - * :license: BSD, see LICENSE for details. - * - */ -"use strict"; - -/** - * Simple result scoring code. - */ -if (typeof Scorer === "undefined") { - var Scorer = { - // Implement the following function to further tweak the score for each result - // The function takes a result array [docname, title, anchor, descr, score, filename] - // and returns the new score. - /* - score: result => { - const [docname, title, anchor, descr, score, filename] = result - return score - }, - */ - - // query matches the full name of an object - objNameMatch: 11, - // or matches in the last dotted part of the object name - objPartialMatch: 6, - // Additive scores depending on the priority of the object - objPrio: { - 0: 15, // used to be importantResults - 1: 5, // used to be objectResults - 2: -5, // used to be unimportantResults - }, - // Used when the priority is not in the mapping. - objPrioDefault: 0, - - // query found in title - title: 15, - partialTitle: 7, - // query found in terms - term: 5, - partialTerm: 2, - }; -} - -const _removeChildren = (element) => { - while (element && element.lastChild) element.removeChild(element.lastChild); -}; - -/** - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping - */ -const _escapeRegExp = (string) => - string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string - -const _displayItem = (item, searchTerms, highlightTerms) => { - const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; - const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; - const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; - const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - const contentRoot = document.documentElement.dataset.content_root; - - const [docName, title, anchor, descr, score, _filename] = item; - - let listItem = document.createElement("li"); - let requestUrl; - let linkUrl; - if (docBuilder === "dirhtml") { - // dirhtml builder - let dirname = docName + "/"; - if (dirname.match(/\/index\/$/)) - dirname = dirname.substring(0, dirname.length - 6); - else if (dirname === "index/") dirname = ""; - requestUrl = contentRoot + dirname; - linkUrl = requestUrl; - } else { - // normal html builders - requestUrl = contentRoot + docName + docFileSuffix; - linkUrl = docName + docLinkSuffix; - } - let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + anchor; - linkEl.dataset.score = score; - linkEl.innerHTML = title; - if (descr) { - listItem.appendChild(document.createElement("span")).innerHTML = - " (" + descr + ")"; - // highlight search terms in the description - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); - } - else if (showSearchSummary) - fetch(requestUrl) - .then((responseData) => responseData.text()) - .then((data) => { - if (data) - listItem.appendChild( - Search.makeSearchSummary(data, searchTerms) - ); - // highlight search terms in the summary - if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js - highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); - }); - Search.output.appendChild(listItem); -}; -const _finishSearch = (resultCount) => { - Search.stopPulse(); - Search.title.innerText = _("Search Results"); - if (!resultCount) - Search.status.innerText = Documentation.gettext( - "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." - ); - else - Search.status.innerText = _( - `Search finished, found ${resultCount} page(s) matching the search query.` - ); -}; -const _displayNextItem = ( - results, - resultCount, - searchTerms, - highlightTerms, -) => { - // results left, load the summary and display it - // this is intended to be dynamic (don't sub resultsCount) - if (results.length) { - _displayItem(results.pop(), searchTerms, highlightTerms); - setTimeout( - () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), - 5 - ); - } - // search finished, update title and status message - else _finishSearch(resultCount); -}; - -/** - * Default splitQuery function. Can be overridden in ``sphinx.search`` with a - * custom function per language. - * - * The regular expression works by splitting the string on consecutive characters - * that are not Unicode letters, numbers, underscores, or emoji characters. - * This is the same as ``\W+`` in Python, preserving the surrogate pair area. - */ -if (typeof splitQuery === "undefined") { - var splitQuery = (query) => query - .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) - .filter(term => term) // remove remaining empty strings -} - -/** - * Search Module - */ -const Search = { - _index: null, - _queued_query: null, - _pulse_status: -1, - - htmlToText: (htmlString) => { - const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); - htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); - const docContent = htmlElement.querySelector('[role="main"]'); - if (docContent !== undefined) return docContent.textContent; - console.warn( - "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." - ); - return ""; - }, - - init: () => { - const query = new URLSearchParams(window.location.search).get("q"); - document - .querySelectorAll('input[name="q"]') - .forEach((el) => (el.value = query)); - if (query) Search.performSearch(query); - }, - - loadIndex: (url) => - (document.body.appendChild(document.createElement("script")).src = url), - - setIndex: (index) => { - Search._index = index; - if (Search._queued_query !== null) { - const query = Search._queued_query; - Search._queued_query = null; - Search.query(query); - } - }, - - hasIndex: () => Search._index !== null, - - deferQuery: (query) => (Search._queued_query = query), - - stopPulse: () => (Search._pulse_status = -1), - - startPulse: () => { - if (Search._pulse_status >= 0) return; - - const pulse = () => { - Search._pulse_status = (Search._pulse_status + 1) % 4; - Search.dots.innerText = ".".repeat(Search._pulse_status); - if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); - }; - pulse(); - }, - - /** - * perform a search for something (or wait until index is loaded) - */ - performSearch: (query) => { - // create the required interface elements - const searchText = document.createElement("h2"); - searchText.textContent = _("Searching"); - const searchSummary = document.createElement("p"); - searchSummary.classList.add("search-summary"); - searchSummary.innerText = ""; - const searchList = document.createElement("ul"); - searchList.classList.add("search"); - - const out = document.getElementById("search-results"); - Search.title = out.appendChild(searchText); - Search.dots = Search.title.appendChild(document.createElement("span")); - Search.status = out.appendChild(searchSummary); - Search.output = out.appendChild(searchList); - - const searchProgress = document.getElementById("search-progress"); - // Some themes don't use the search progress node - if (searchProgress) { - searchProgress.innerText = _("Preparing search..."); - } - Search.startPulse(); - - // index already loaded, the browser was quick! - if (Search.hasIndex()) Search.query(query); - else Search.deferQuery(query); - }, - - /** - * execute search (requires search index to be loaded) - */ - query: (query) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - const allTitles = Search._index.alltitles; - const indexEntries = Search._index.indexentries; - - // stem the search terms and add them to the correct list - const stemmer = new Stemmer(); - const searchTerms = new Set(); - const excludedTerms = new Set(); - const highlightTerms = new Set(); - const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); - splitQuery(query.trim()).forEach((queryTerm) => { - const queryTermLower = queryTerm.toLowerCase(); - - // maybe skip this "word" - // stopwords array is from language_data.js - if ( - stopwords.indexOf(queryTermLower) !== -1 || - queryTerm.match(/^\d+$/) - ) - return; - - // stem the word - let word = stemmer.stemWord(queryTermLower); - // select the correct list - if (word[0] === "-") excludedTerms.add(word.substr(1)); - else { - searchTerms.add(word); - highlightTerms.add(queryTermLower); - } - }); - - if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js - localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) - } - - // console.debug("SEARCH: searching for:"); - // console.info("required: ", [...searchTerms]); - // console.info("excluded: ", [...excludedTerms]); - - // array of [docname, title, anchor, descr, score, filename] - let results = []; - _removeChildren(document.getElementById("search-progress")); - - const queryLower = query.toLowerCase(); - for (const [title, foundTitles] of Object.entries(allTitles)) { - if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { - for (const [file, id] of foundTitles) { - let score = Math.round(100 * queryLower.length / title.length) - results.push([ - docNames[file], - titles[file] !== title ? `${titles[file]} > ${title}` : title, - id !== null ? "#" + id : "", - null, - score, - filenames[file], - ]); - } - } - } - - // search for explicit entries in index directives - for (const [entry, foundEntries] of Object.entries(indexEntries)) { - if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { - for (const [file, id] of foundEntries) { - let score = Math.round(100 * queryLower.length / entry.length) - results.push([ - docNames[file], - titles[file], - id ? "#" + id : "", - null, - score, - filenames[file], - ]); - } - } - } - - // lookup as object - objectTerms.forEach((term) => - results.push(...Search.performObjectSearch(term, objectTerms)) - ); - - // lookup as search terms in fulltext - results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); - - // let the scorer override scores with a custom scoring function - if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); - - // now sort the results by score (in opposite order of appearance, since the - // display function below uses pop() to retrieve items) and then - // alphabetically - results.sort((a, b) => { - const leftScore = a[4]; - const rightScore = b[4]; - if (leftScore === rightScore) { - // same score: sort alphabetically - const leftTitle = a[1].toLowerCase(); - const rightTitle = b[1].toLowerCase(); - if (leftTitle === rightTitle) return 0; - return leftTitle > rightTitle ? -1 : 1; // inverted is intentional - } - return leftScore > rightScore ? 1 : -1; - }); - - // remove duplicate search results - // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept - let seen = new Set(); - results = results.reverse().reduce((acc, result) => { - let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); - if (!seen.has(resultStr)) { - acc.push(result); - seen.add(resultStr); - } - return acc; - }, []); - - results = results.reverse(); - - // for debugging - //Search.lastresults = results.slice(); // a copy - // console.info("search results:", Search.lastresults); - - // print the results - _displayNextItem(results, results.length, searchTerms, highlightTerms); - }, - - /** - * search for object names - */ - performObjectSearch: (object, objectTerms) => { - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const objects = Search._index.objects; - const objNames = Search._index.objnames; - const titles = Search._index.titles; - - const results = []; - - const objectSearchCallback = (prefix, match) => { - const name = match[4] - const fullname = (prefix ? prefix + "." : "") + name; - const fullnameLower = fullname.toLowerCase(); - if (fullnameLower.indexOf(object) < 0) return; - - let score = 0; - const parts = fullnameLower.split("."); - - // check for different match types: exact matches of full name or - // "last name" (i.e. last dotted part) - if (fullnameLower === object || parts.slice(-1)[0] === object) - score += Scorer.objNameMatch; - else if (parts.slice(-1)[0].indexOf(object) > -1) - score += Scorer.objPartialMatch; // matches in last name - - const objName = objNames[match[1]][2]; - const title = titles[match[0]]; - - // If more than one term searched for, we require other words to be - // found in the name/title/description - const otherTerms = new Set(objectTerms); - otherTerms.delete(object); - if (otherTerms.size > 0) { - const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); - if ( - [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) - ) - return; - } - - let anchor = match[3]; - if (anchor === "") anchor = fullname; - else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; - - const descr = objName + _(", in ") + title; - - // add custom score for some objects according to scorer - if (Scorer.objPrio.hasOwnProperty(match[2])) - score += Scorer.objPrio[match[2]]; - else score += Scorer.objPrioDefault; - - results.push([ - docNames[match[0]], - fullname, - "#" + anchor, - descr, - score, - filenames[match[0]], - ]); - }; - Object.keys(objects).forEach((prefix) => - objects[prefix].forEach((array) => - objectSearchCallback(prefix, array) - ) - ); - return results; - }, - - /** - * search for full-text terms in the index - */ - performTermsSearch: (searchTerms, excludedTerms) => { - // prepare search - const terms = Search._index.terms; - const titleTerms = Search._index.titleterms; - const filenames = Search._index.filenames; - const docNames = Search._index.docnames; - const titles = Search._index.titles; - - const scoreMap = new Map(); - const fileMap = new Map(); - - // perform the search on the required terms - searchTerms.forEach((word) => { - const files = []; - const arr = [ - { files: terms[word], score: Scorer.term }, - { files: titleTerms[word], score: Scorer.title }, - ]; - // add support for partial matches - if (word.length > 2) { - const escapedWord = _escapeRegExp(word); - Object.keys(terms).forEach((term) => { - if (term.match(escapedWord) && !terms[word]) - arr.push({ files: terms[term], score: Scorer.partialTerm }); - }); - Object.keys(titleTerms).forEach((term) => { - if (term.match(escapedWord) && !titleTerms[word]) - arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); - }); - } - - // no match but word was a required one - if (arr.every((record) => record.files === undefined)) return; - - // found search word in contents - arr.forEach((record) => { - if (record.files === undefined) return; - - let recordFiles = record.files; - if (recordFiles.length === undefined) recordFiles = [recordFiles]; - files.push(...recordFiles); - - // set score for the word in each file - recordFiles.forEach((file) => { - if (!scoreMap.has(file)) scoreMap.set(file, {}); - scoreMap.get(file)[word] = record.score; - }); - }); - - // create the mapping - files.forEach((file) => { - if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) - fileMap.get(file).push(word); - else fileMap.set(file, [word]); - }); - }); - - // now check if the files don't contain excluded terms - const results = []; - for (const [file, wordList] of fileMap) { - // check if all requirements are matched - - // as search terms with length < 3 are discarded - const filteredTermCount = [...searchTerms].filter( - (term) => term.length > 2 - ).length; - if ( - wordList.length !== searchTerms.size && - wordList.length !== filteredTermCount - ) - continue; - - // ensure that none of the excluded terms is in the search result - if ( - [...excludedTerms].some( - (term) => - terms[term] === file || - titleTerms[term] === file || - (terms[term] || []).includes(file) || - (titleTerms[term] || []).includes(file) - ) - ) - break; - - // select one (max) score for the file. - const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); - // add result to the result list - results.push([ - docNames[file], - titles[file], - "", - null, - score, - filenames[file], - ]); - } - return results; - }, - - /** - * helper function to return a node containing the - * search summary for a given text. keywords is a list - * of stemmed words. - */ - makeSearchSummary: (htmlText, keywords) => { - const text = Search.htmlToText(htmlText); - if (text === "") return null; - - const textLower = text.toLowerCase(); - const actualStartPosition = [...keywords] - .map((k) => textLower.indexOf(k.toLowerCase())) - .filter((i) => i > -1) - .slice(-1)[0]; - const startWithContext = Math.max(actualStartPosition - 120, 0); - - const top = startWithContext === 0 ? "" : "..."; - const tail = startWithContext + 240 < text.length ? "..." : ""; - - let summary = document.createElement("p"); - summary.classList.add("context"); - summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; - - return summary; - }, -}; - -_ready(Search.init); diff --git a/pr-preview/pr-273/_static/sg_gallery-binder.css b/pr-preview/pr-273/_static/sg_gallery-binder.css deleted file mode 100644 index 420005d22..000000000 --- a/pr-preview/pr-273/_static/sg_gallery-binder.css +++ /dev/null @@ -1,11 +0,0 @@ -/* CSS for binder integration */ - -div.binder-badge { - margin: 1em auto; - vertical-align: middle; -} - -div.lite-badge { - margin: 1em auto; - vertical-align: middle; -} diff --git a/pr-preview/pr-273/_static/sg_gallery-dataframe.css b/pr-preview/pr-273/_static/sg_gallery-dataframe.css deleted file mode 100644 index fac74c43b..000000000 --- a/pr-preview/pr-273/_static/sg_gallery-dataframe.css +++ /dev/null @@ -1,47 +0,0 @@ -/* Pandas dataframe css */ -/* Taken from: https://github.com/spatialaudio/nbsphinx/blob/fb3ba670fc1ba5f54d4c487573dbc1b4ecf7e9ff/src/nbsphinx.py#L587-L619 */ -html[data-theme="light"] { - --sg-text-color: #000; - --sg-tr-odd-color: #f5f5f5; - --sg-tr-hover-color: rgba(66, 165, 245, 0.2); -} -html[data-theme="dark"] { - --sg-text-color: #fff; - --sg-tr-odd-color: #373737; - --sg-tr-hover-color: rgba(30, 81, 122, 0.2); -} - -table.dataframe { - border: none !important; - border-collapse: collapse; - border-spacing: 0; - border-color: transparent; - color: var(--sg-text-color); - font-size: 12px; - table-layout: fixed; - width: auto; -} -table.dataframe thead { - border-bottom: 1px solid var(--sg-text-color); - vertical-align: bottom; -} -table.dataframe tr, -table.dataframe th, -table.dataframe td { - text-align: right; - vertical-align: middle; - padding: 0.5em 0.5em; - line-height: normal; - white-space: normal; - max-width: none; - border: none; -} -table.dataframe th { - font-weight: bold; -} -table.dataframe tbody tr:nth-child(odd) { - background: var(--sg-tr-odd-color); -} -table.dataframe tbody tr:hover { - background: var(--sg-tr-hover-color); -} diff --git a/pr-preview/pr-273/_static/sg_gallery-rendered-html.css b/pr-preview/pr-273/_static/sg_gallery-rendered-html.css deleted file mode 100644 index 93dc2ffb0..000000000 --- a/pr-preview/pr-273/_static/sg_gallery-rendered-html.css +++ /dev/null @@ -1,224 +0,0 @@ -/* Adapted from notebook/static/style/style.min.css */ -html[data-theme="light"] { - --sg-text-color: #000; - --sg-background-color: #ffffff; - --sg-code-background-color: #eff0f1; - --sg-tr-hover-color: rgba(66, 165, 245, 0.2); - --sg-tr-odd-color: #f5f5f5; -} -html[data-theme="dark"] { - --sg-text-color: #fff; - --sg-background-color: #121212; - --sg-code-background-color: #2f2f30; - --sg-tr-hover-color: rgba(66, 165, 245, 0.2); - --sg-tr-odd-color: #1f1f1f; -} - -.rendered_html { - color: var(--sg-text-color); - /* any extras will just be numbers: */ -} -.rendered_html em { - font-style: italic; -} -.rendered_html strong { - font-weight: bold; -} -.rendered_html u { - text-decoration: underline; -} -.rendered_html :link { - text-decoration: underline; -} -.rendered_html :visited { - text-decoration: underline; -} -.rendered_html h1 { - font-size: 185.7%; - margin: 1.08em 0 0 0; - font-weight: bold; - line-height: 1.0; -} -.rendered_html h2 { - font-size: 157.1%; - margin: 1.27em 0 0 0; - font-weight: bold; - line-height: 1.0; -} -.rendered_html h3 { - font-size: 128.6%; - margin: 1.55em 0 0 0; - font-weight: bold; - line-height: 1.0; -} -.rendered_html h4 { - font-size: 100%; - margin: 2em 0 0 0; - font-weight: bold; - line-height: 1.0; -} -.rendered_html h5 { - font-size: 100%; - margin: 2em 0 0 0; - font-weight: bold; - line-height: 1.0; - font-style: italic; -} -.rendered_html h6 { - font-size: 100%; - margin: 2em 0 0 0; - font-weight: bold; - line-height: 1.0; - font-style: italic; -} -.rendered_html h1:first-child { - margin-top: 0.538em; -} -.rendered_html h2:first-child { - margin-top: 0.636em; -} -.rendered_html h3:first-child { - margin-top: 0.777em; -} -.rendered_html h4:first-child { - margin-top: 1em; -} -.rendered_html h5:first-child { - margin-top: 1em; -} -.rendered_html h6:first-child { - margin-top: 1em; -} -.rendered_html ul:not(.list-inline), -.rendered_html ol:not(.list-inline) { - padding-left: 2em; -} -.rendered_html ul { - list-style: disc; -} -.rendered_html ul ul { - list-style: square; - margin-top: 0; -} -.rendered_html ul ul ul { - list-style: circle; -} -.rendered_html ol { - list-style: decimal; -} -.rendered_html ol ol { - list-style: upper-alpha; - margin-top: 0; -} -.rendered_html ol ol ol { - list-style: lower-alpha; -} -.rendered_html ol ol ol ol { - list-style: lower-roman; -} -.rendered_html ol ol ol ol ol { - list-style: decimal; -} -.rendered_html * + ul { - margin-top: 1em; -} -.rendered_html * + ol { - margin-top: 1em; -} -.rendered_html hr { - color: var(--sg-text-color); - background-color: var(--sg-text-color); -} -.rendered_html pre { - margin: 1em 2em; - padding: 0px; - background-color: var(--sg-background-color); -} -.rendered_html code { - background-color: var(--sg-code-background-color); -} -.rendered_html p code { - padding: 1px 5px; -} -.rendered_html pre code { - background-color: var(--sg-background-color); -} -.rendered_html pre, -.rendered_html code { - border: 0; - color: var(--sg-text-color); - font-size: 100%; -} -.rendered_html blockquote { - margin: 1em 2em; -} -.rendered_html table { - margin-left: auto; - margin-right: auto; - border: none; - border-collapse: collapse; - border-spacing: 0; - color: var(--sg-text-color); - font-size: 12px; - table-layout: fixed; -} -.rendered_html thead { - border-bottom: 1px solid var(--sg-text-color); - vertical-align: bottom; -} -.rendered_html tr, -.rendered_html th, -.rendered_html td { - text-align: right; - vertical-align: middle; - padding: 0.5em 0.5em; - line-height: normal; - white-space: normal; - max-width: none; - border: none; -} -.rendered_html th { - font-weight: bold; -} -.rendered_html tbody tr:nth-child(odd) { - background: var(--sg-tr-odd-color); -} -.rendered_html tbody tr:hover { - color: var(--sg-text-color); - background: var(--sg-tr-hover-color); -} -.rendered_html * + table { - margin-top: 1em; -} -.rendered_html p { - text-align: left; -} -.rendered_html * + p { - margin-top: 1em; -} -.rendered_html img { - display: block; - margin-left: auto; - margin-right: auto; -} -.rendered_html * + img { - margin-top: 1em; -} -.rendered_html img, -.rendered_html svg { - max-width: 100%; - height: auto; -} -.rendered_html img.unconfined, -.rendered_html svg.unconfined { - max-width: none; -} -.rendered_html .alert { - margin-bottom: initial; -} -.rendered_html * + .alert { - margin-top: 1em; -} -[dir="rtl"] .rendered_html p { - text-align: right; -} diff --git a/pr-preview/pr-273/_static/sg_gallery.css b/pr-preview/pr-273/_static/sg_gallery.css deleted file mode 100644 index 72227837d..000000000 --- a/pr-preview/pr-273/_static/sg_gallery.css +++ /dev/null @@ -1,342 +0,0 @@ -/* -Sphinx-Gallery has compatible CSS to fix default sphinx themes -Tested for Sphinx 1.3.1 for all themes: default, alabaster, sphinxdoc, -scrolls, agogo, traditional, nature, haiku, pyramid -Tested for Read the Docs theme 0.1.7 */ - -/* Define light colors */ -:root, html[data-theme="light"], body[data-theme="light"]{ - --sg-tooltip-foreground: black; - --sg-tooltip-background: rgba(250, 250, 250, 0.9); - --sg-tooltip-border: #ccc transparent; - --sg-thumb-box-shadow-color: #6c757d40; - --sg-thumb-hover-border: #0069d9; - --sg-script-out: #888; - --sg-script-pre: #fafae2; - --sg-pytb-foreground: #000; - --sg-pytb-background: #ffe4e4; - --sg-pytb-border-color: #f66; - --sg-download-a-background-color: #ffc; - --sg-download-a-background-image: linear-gradient(to bottom, #ffc, #d5d57e); - --sg-download-a-border-color: 1px solid #c2c22d; - --sg-download-a-color: #000; - --sg-download-a-hover-background-color: #d5d57e; - --sg-download-a-hover-box-shadow-1: rgba(255, 255, 255, 0.1); - --sg-download-a-hover-box-shadow-2: rgba(0, 0, 0, 0.25); -} -@media(prefers-color-scheme: light) { - :root[data-theme="auto"], html[data-theme="auto"], body[data-theme="auto"] { - --sg-tooltip-foreground: black; - --sg-tooltip-background: rgba(250, 250, 250, 0.9); - --sg-tooltip-border: #ccc transparent; - --sg-thumb-box-shadow-color: #6c757d40; - --sg-thumb-hover-border: #0069d9; - --sg-script-out: #888; - --sg-script-pre: #fafae2; - --sg-pytb-foreground: #000; - --sg-pytb-background: #ffe4e4; - --sg-pytb-border-color: #f66; - --sg-download-a-background-color: #ffc; - --sg-download-a-background-image: linear-gradient(to bottom, #ffc, #d5d57e); - --sg-download-a-border-color: 1px solid #c2c22d; - --sg-download-a-color: #000; - --sg-download-a-hover-background-color: #d5d57e; - --sg-download-a-hover-box-shadow-1: rgba(255, 255, 255, 0.1); - --sg-download-a-hover-box-shadow-2: rgba(0, 0, 0, 0.25); - } -} - -html[data-theme="dark"], body[data-theme="dark"] { - --sg-tooltip-foreground: white; - --sg-tooltip-background: rgba(10, 10, 10, 0.9); - --sg-tooltip-border: #333 transparent; - --sg-thumb-box-shadow-color: #79848d40; - --sg-thumb-hover-border: #003975; - --sg-script-out: rgb(179, 179, 179); - --sg-script-pre: #2e2e22; - --sg-pytb-foreground: #fff; - --sg-pytb-background: #1b1717; - --sg-pytb-border-color: #622; - --sg-download-a-background-color: #443; - --sg-download-a-background-image: linear-gradient(to bottom, #443, #221); - --sg-download-a-border-color: 1px solid #3a3a0d; - --sg-download-a-color: #fff; - --sg-download-a-hover-background-color: #616135; - --sg-download-a-hover-box-shadow-1: rgba(0, 0, 0, 0.1); - --sg-download-a-hover-box-shadow-2: rgba(255, 255, 255, 0.25); -} -@media(prefers-color-scheme: dark){ - html[data-theme="auto"], body[data-theme="auto"] { - --sg-tooltip-foreground: white; - --sg-tooltip-background: rgba(10, 10, 10, 0.9); - --sg-tooltip-border: #333 transparent; - --sg-thumb-box-shadow-color: #79848d40; - --sg-thumb-hover-border: #003975; - --sg-script-out: rgb(179, 179, 179); - --sg-script-pre: #2e2e22; - --sg-pytb-foreground: #fff; - --sg-pytb-background: #1b1717; - --sg-pytb-border-color: #622; - --sg-download-a-background-color: #443; - --sg-download-a-background-image: linear-gradient(to bottom, #443, #221); - --sg-download-a-border-color: 1px solid #3a3a0d; - --sg-download-a-color: #fff; - --sg-download-a-hover-background-color: #616135; - --sg-download-a-hover-box-shadow-1: rgba(0, 0, 0, 0.1); - --sg-download-a-hover-box-shadow-2: rgba(255, 255, 255, 0.25); - } -} - -.sphx-glr-thumbnails { - width: 100%; - margin: 0px 0px 20px 0px; - - /* align thumbnails on a grid */ - justify-content: space-between; - display: grid; - /* each grid column should be at least 160px (this will determine - the actual number of columns) and then take as much of the - remaining width as possible */ - grid-template-columns: repeat(auto-fill, minmax(160px, 1fr)); - gap: 15px; -} -.sphx-glr-thumbnails .toctree-wrapper { - /* hide empty toctree divs added to the DOM - by sphinx even though the toctree is hidden - (they would fill grid places with empty divs) */ - display: none; -} -.sphx-glr-thumbcontainer { - background: transparent; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - box-shadow: 0 0 10px var(--sg-thumb-box-shadow-color); - - /* useful to absolutely position link in div */ - position: relative; - - /* thumbnail width should include padding and borders - and take all available space */ - box-sizing: border-box; - width: 100%; - padding: 10px; - border: 1px solid transparent; - - /* align content in thumbnail */ - display: flex; - flex-direction: column; - align-items: center; - gap: 7px; -} -.sphx-glr-thumbcontainer p { - position: absolute; - top: 0; - left: 0; -} -.sphx-glr-thumbcontainer p, -.sphx-glr-thumbcontainer p a { - /* link should cover the whole thumbnail div */ - width: 100%; - height: 100%; -} -.sphx-glr-thumbcontainer p a span { - /* text within link should be masked - (we are just interested in the href) */ - display: none; -} -.sphx-glr-thumbcontainer:hover { - border: 1px solid; - border-color: var(--sg-thumb-hover-border); - cursor: pointer; -} -.sphx-glr-thumbcontainer a.internal { - bottom: 0; - display: block; - left: 0; - box-sizing: border-box; - padding: 150px 10px 0; - position: absolute; - right: 0; - top: 0; -} -/* Next one is to avoid Sphinx traditional theme to cover all the -thumbnail with its default link Background color */ -.sphx-glr-thumbcontainer a.internal:hover { - background-color: transparent; -} - -.sphx-glr-thumbcontainer p { - margin: 0 0 0.1em 0; -} -.sphx-glr-thumbcontainer .figure { - margin: 10px; - width: 160px; -} -.sphx-glr-thumbcontainer img { - display: inline; - max-height: 112px; - max-width: 160px; -} -.sphx-glr-thumbcontainer[tooltip]:hover:after { - background: var(--sg-tooltip-background); - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - color: var(--sg-tooltip-foreground); - content: attr(tooltip); - padding: 10px; - z-index: 98; - width: 100%; - height: 100%; - position: absolute; - pointer-events: none; - top: 0; - box-sizing: border-box; - overflow: hidden; - backdrop-filter: blur(3px); -} - -.sphx-glr-script-out { - color: var(--sg-script-out); - display: flex; - gap: 0.5em; -} -.sphx-glr-script-out::before { - content: "Out:"; - /* These numbers come from the pre style in the pydata sphinx theme. This - * turns out to match perfectly on the rtd theme, but be a bit too low for - * the pydata sphinx theme. As I could not find a dimension to use that was - * scaled the same way, I just picked one option that worked pretty close for - * both. */ - line-height: 1.4; - padding-top: 10px; -} -.sphx-glr-script-out .highlight { - background-color: transparent; - /* These options make the div expand... */ - flex-grow: 1; - /* ... but also keep it from overflowing its flex container. */ - overflow: auto; -} -.sphx-glr-script-out .highlight pre { - background-color: var(--sg-script-pre); - border: 0; - max-height: 30em; - overflow: auto; - padding-left: 1ex; - /* This margin is necessary in the pydata sphinx theme because pre has a box - * shadow which would be clipped by the overflow:auto in the parent div - * above. */ - margin: 2px; - word-break: break-word; -} -.sphx-glr-script-out + p { - margin-top: 1.8em; -} -blockquote.sphx-glr-script-out { - margin-left: 0pt; -} -.sphx-glr-script-out.highlight-pytb .highlight pre { - color: var(--sg-pytb-foreground); - background-color: var(--sg-pytb-background); - border: 1px solid var(--sg-pytb-border-color); - margin-top: 10px; - padding: 7px; -} - -div.sphx-glr-footer { - text-align: center; -} - -div.sphx-glr-download { - margin: 1em auto; - vertical-align: middle; -} - -div.sphx-glr-download a { - background-color: var(--sg-download-a-background-color); - background-image: var(--sg-download-a-background-image); - border-radius: 4px; - border: 1px solid var(--sg-download-a-border-color); - color: var(--sg-download-a-color); - display: inline-block; - font-weight: bold; - padding: 1ex; - text-align: center; -} - -div.sphx-glr-download code.download { - display: inline-block; - white-space: normal; - word-break: normal; - overflow-wrap: break-word; - /* border and background are given by the enclosing 'a' */ - border: none; - background: none; -} - -div.sphx-glr-download a:hover { - box-shadow: inset 0 1px 0 var(--sg-download-a-hover-box-shadow-1), 0 1px 5px var(--sg-download-a-hover-box-shadow-2); - text-decoration: none; - background-image: none; - background-color: var(--sg-download-a-hover-background-color); -} - -.sphx-glr-example-title:target::before { - display: block; - content: ""; - margin-top: -50px; - height: 50px; - visibility: hidden; -} - -ul.sphx-glr-horizontal { - list-style: none; - padding: 0; -} -ul.sphx-glr-horizontal li { - display: inline; -} -ul.sphx-glr-horizontal img { - height: auto !important; -} - -.sphx-glr-single-img { - margin: auto; - display: block; - max-width: 100%; -} - -.sphx-glr-multi-img { - max-width: 42%; - height: auto; -} - -div.sphx-glr-animation { - margin: auto; - display: block; - max-width: 100%; -} -div.sphx-glr-animation .animation { - display: block; -} - -p.sphx-glr-signature a.reference.external { - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - border-radius: 5px; - padding: 3px; - font-size: 75%; - text-align: right; - margin-left: auto; - display: table; -} - -.sphx-glr-clear { - clear: both; -} - -a.sphx-glr-backref-instance { - text-decoration: none; -} diff --git a/pr-preview/pr-273/_static/skeleton.css b/pr-preview/pr-273/_static/skeleton.css deleted file mode 100644 index 467c878c6..000000000 --- a/pr-preview/pr-273/_static/skeleton.css +++ /dev/null @@ -1,296 +0,0 @@ -/* Some sane resets. */ -html { - height: 100%; -} - -body { - margin: 0; - min-height: 100%; -} - -/* All the flexbox magic! */ -body, -.sb-announcement, -.sb-content, -.sb-main, -.sb-container, -.sb-container__inner, -.sb-article-container, -.sb-footer-content, -.sb-header, -.sb-header-secondary, -.sb-footer { - display: flex; -} - -/* These order things vertically */ -body, -.sb-main, -.sb-article-container { - flex-direction: column; -} - -/* Put elements in the center */ -.sb-header, -.sb-header-secondary, -.sb-container, -.sb-content, -.sb-footer, -.sb-footer-content { - justify-content: center; -} -/* Put elements at the ends */ -.sb-article-container { - justify-content: space-between; -} - -/* These elements grow. */ -.sb-main, -.sb-content, -.sb-container, -article { - flex-grow: 1; -} - -/* Because padding making this wider is not fun */ -article { - box-sizing: border-box; -} - -/* The announcements element should never be wider than the page. */ -.sb-announcement { - max-width: 100%; -} - -.sb-sidebar-primary, -.sb-sidebar-secondary { - flex-shrink: 0; - width: 17rem; -} - -.sb-announcement__inner { - justify-content: center; - - box-sizing: border-box; - height: 3rem; - - overflow-x: auto; - white-space: nowrap; -} - -/* Sidebars, with checkbox-based toggle */ -.sb-sidebar-primary, -.sb-sidebar-secondary { - position: fixed; - height: 100%; - top: 0; -} - -.sb-sidebar-primary { - left: -17rem; - transition: left 250ms ease-in-out; -} -.sb-sidebar-secondary { - right: -17rem; - transition: right 250ms ease-in-out; -} - -.sb-sidebar-toggle { - display: none; -} -.sb-sidebar-overlay { - position: fixed; - top: 0; - width: 0; - height: 0; - - transition: width 0ms ease 250ms, height 0ms ease 250ms, opacity 250ms ease; - - opacity: 0; - background-color: rgba(0, 0, 0, 0.54); -} - -#sb-sidebar-toggle--primary:checked - ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--primary"], -#sb-sidebar-toggle--secondary:checked - ~ .sb-sidebar-overlay[for="sb-sidebar-toggle--secondary"] { - width: 100%; - height: 100%; - opacity: 1; - transition: width 0ms ease, height 0ms ease, opacity 250ms ease; -} - -#sb-sidebar-toggle--primary:checked ~ .sb-container .sb-sidebar-primary { - left: 0; -} -#sb-sidebar-toggle--secondary:checked ~ .sb-container .sb-sidebar-secondary { - right: 0; -} - -/* Full-width mode */ -.drop-secondary-sidebar-for-full-width-content - .hide-when-secondary-sidebar-shown { - display: none !important; -} -.drop-secondary-sidebar-for-full-width-content .sb-sidebar-secondary { - display: none !important; -} - -/* Mobile views */ -.sb-page-width { - width: 100%; -} - -.sb-article-container, -.sb-footer-content__inner, -.drop-secondary-sidebar-for-full-width-content .sb-article, -.drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 100vw; -} - -.sb-article, -.match-content-width { - padding: 0 1rem; - box-sizing: border-box; -} - -@media (min-width: 32rem) { - .sb-article, - .match-content-width { - padding: 0 2rem; - } -} - -/* Tablet views */ -@media (min-width: 42rem) { - .sb-article-container { - width: auto; - } - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 42rem; - } - .sb-article, - .match-content-width { - width: 42rem; - } -} -@media (min-width: 46rem) { - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 46rem; - } - .sb-article, - .match-content-width { - width: 46rem; - } -} -@media (min-width: 50rem) { - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 50rem; - } - .sb-article, - .match-content-width { - width: 50rem; - } -} - -/* Tablet views */ -@media (min-width: 59rem) { - .sb-sidebar-secondary { - position: static; - } - .hide-when-secondary-sidebar-shown { - display: none !important; - } - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 59rem; - } - .sb-article, - .match-content-width { - width: 42rem; - } -} -@media (min-width: 63rem) { - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 63rem; - } - .sb-article, - .match-content-width { - width: 46rem; - } -} -@media (min-width: 67rem) { - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 67rem; - } - .sb-article, - .match-content-width { - width: 50rem; - } -} - -/* Desktop views */ -@media (min-width: 76rem) { - .sb-sidebar-primary { - position: static; - } - .hide-when-primary-sidebar-shown { - display: none !important; - } - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 59rem; - } - .sb-article, - .match-content-width { - width: 42rem; - } -} - -/* Full desktop views */ -@media (min-width: 80rem) { - .sb-article, - .match-content-width { - width: 46rem; - } - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 63rem; - } -} - -@media (min-width: 84rem) { - .sb-article, - .match-content-width { - width: 50rem; - } - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 67rem; - } -} - -@media (min-width: 88rem) { - .sb-footer-content__inner, - .drop-secondary-sidebar-for-full-width-content .sb-article, - .drop-secondary-sidebar-for-full-width-content .match-content-width { - width: 67rem; - } - .sb-page-width { - width: 88rem; - } -} diff --git a/pr-preview/pr-273/_static/sphinx_highlight.js b/pr-preview/pr-273/_static/sphinx_highlight.js deleted file mode 100644 index 8a96c69a1..000000000 --- a/pr-preview/pr-273/_static/sphinx_highlight.js +++ /dev/null @@ -1,154 +0,0 @@ -/* Highlighting utilities for Sphinx HTML documentation. */ -"use strict"; - -const SPHINX_HIGHLIGHT_ENABLED = true - -/** - * highlight a given string on a node by wrapping it in - * span elements with the given class name. - */ -const _highlight = (node, addItems, text, className) => { - if (node.nodeType === Node.TEXT_NODE) { - const val = node.nodeValue; - const parent = node.parentNode; - const pos = val.toLowerCase().indexOf(text); - if ( - pos >= 0 && - !parent.classList.contains(className) && - !parent.classList.contains("nohighlight") - ) { - let span; - - const closestNode = parent.closest("body, svg, foreignObject"); - const isInSVG = closestNode && closestNode.matches("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.classList.add(className); - } - - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - const rest = document.createTextNode(val.substr(pos + text.length)); - parent.insertBefore( - span, - parent.insertBefore( - rest, - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - /* There may be more occurrences of search term in this node. So call this - * function recursively on the remaining fragment. - */ - _highlight(rest, addItems, text, className); - - if (isInSVG) { - const rect = document.createElementNS( - "http://www.w3.org/2000/svg", - "rect" - ); - const bbox = parent.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute("class", className); - addItems.push({ parent: parent, target: rect }); - } - } - } else if (node.matches && !node.matches("button, select, textarea")) { - node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); - } -}; -const _highlightText = (thisNode, text, className) => { - let addItems = []; - _highlight(thisNode, addItems, text, className); - addItems.forEach((obj) => - obj.parent.insertAdjacentElement("beforebegin", obj.target) - ); -}; - -/** - * Small JavaScript module for the documentation. - */ -const SphinxHighlight = { - - /** - * highlight the search words provided in localstorage in the text - */ - highlightSearchWords: () => { - if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight - - // get and clear terms from localstorage - const url = new URL(window.location); - const highlight = - localStorage.getItem("sphinx_highlight_terms") - || url.searchParams.get("highlight") - || ""; - localStorage.removeItem("sphinx_highlight_terms") - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - - // get individual terms from highlight string - const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); - if (terms.length === 0) return; // nothing to do - - // There should never be more than one element matching "div.body" - const divBody = document.querySelectorAll("div.body"); - const body = divBody.length ? divBody[0] : document.querySelector("body"); - window.setTimeout(() => { - terms.forEach((term) => _highlightText(body, term, "highlighted")); - }, 10); - - const searchBox = document.getElementById("searchbox"); - if (searchBox === null) return; - searchBox.appendChild( - document - .createRange() - .createContextualFragment( - '" - ) - ); - }, - - /** - * helper function to hide the search marks again - */ - hideSearchWords: () => { - document - .querySelectorAll("#searchbox .highlight-link") - .forEach((el) => el.remove()); - document - .querySelectorAll("span.highlighted") - .forEach((el) => el.classList.remove("highlighted")); - localStorage.removeItem("sphinx_highlight_terms") - }, - - initEscapeListener: () => { - // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; - - document.addEventListener("keydown", (event) => { - // bail for input elements - if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; - // bail with special keys - if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; - if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { - SphinxHighlight.hideSearchWords(); - event.preventDefault(); - } - }); - }, -}; - -_ready(() => { - /* Do not call highlightSearchWords() when we are on the search page. - * It will highlight words from the *previous* search query. - */ - if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); - SphinxHighlight.initEscapeListener(); -}); diff --git a/pr-preview/pr-273/_static/styles/furo-extensions.css b/pr-preview/pr-273/_static/styles/furo-extensions.css deleted file mode 100644 index bc447f228..000000000 --- a/pr-preview/pr-273/_static/styles/furo-extensions.css +++ /dev/null @@ -1,2 +0,0 @@ -#furo-sidebar-ad-placement{padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)}#furo-sidebar-ad-placement .ethical-sidebar{background:var(--color-background-secondary);border:none;box-shadow:none}#furo-sidebar-ad-placement .ethical-sidebar:hover{background:var(--color-background-hover)}#furo-sidebar-ad-placement .ethical-sidebar a{color:var(--color-foreground-primary)}#furo-sidebar-ad-placement .ethical-callout a{color:var(--color-foreground-secondary)!important}#furo-readthedocs-versions{background:transparent;display:block;position:static;width:100%}#furo-readthedocs-versions .rst-versions{background:#1a1c1e}#furo-readthedocs-versions .rst-current-version{background:var(--color-sidebar-item-background);cursor:unset}#furo-readthedocs-versions .rst-current-version:hover{background:var(--color-sidebar-item-background)}#furo-readthedocs-versions .rst-current-version .fa-book{color:var(--color-foreground-primary)}#furo-readthedocs-versions>.rst-other-versions{padding:0}#furo-readthedocs-versions>.rst-other-versions small{opacity:1}#furo-readthedocs-versions .injected .rst-versions{position:unset}#furo-readthedocs-versions:focus-within,#furo-readthedocs-versions:hover{box-shadow:0 0 0 1px var(--color-sidebar-background-border)}#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:hover .rst-current-version{background:#1a1c1e;font-size:inherit;height:auto;line-height:inherit;padding:12px;text-align:right}#furo-readthedocs-versions:focus-within .rst-current-version .fa-book,#furo-readthedocs-versions:hover .rst-current-version .fa-book{color:#fff;float:left}#furo-readthedocs-versions:focus-within .fa-caret-down,#furo-readthedocs-versions:hover .fa-caret-down{display:none}#furo-readthedocs-versions:focus-within .injected,#furo-readthedocs-versions:focus-within .rst-current-version,#furo-readthedocs-versions:focus-within .rst-other-versions,#furo-readthedocs-versions:hover .injected,#furo-readthedocs-versions:hover .rst-current-version,#furo-readthedocs-versions:hover .rst-other-versions{display:block}#furo-readthedocs-versions:focus-within>.rst-current-version,#furo-readthedocs-versions:hover>.rst-current-version{display:none}.highlight:hover button.copybtn{color:var(--color-code-foreground)}.highlight button.copybtn{align-items:center;background-color:var(--color-code-background);border:none;color:var(--color-background-item);cursor:pointer;height:1.25em;opacity:1;right:.5rem;top:.625rem;transition:color .3s,opacity .3s;width:1.25em}.highlight button.copybtn:hover{background-color:var(--color-code-background);color:var(--color-brand-content)}.highlight button.copybtn:after{background-color:transparent;color:var(--color-code-foreground);display:none}.highlight button.copybtn.success{color:#22863a;transition:color 0ms}.highlight button.copybtn.success:after{display:block}.highlight button.copybtn svg{padding:0}body{--sd-color-primary:var(--color-brand-primary);--sd-color-primary-highlight:var(--color-brand-content);--sd-color-primary-text:var(--color-background-primary);--sd-color-shadow:rgba(0,0,0,.05);--sd-color-card-border:var(--color-card-border);--sd-color-card-border-hover:var(--color-brand-content);--sd-color-card-background:var(--color-card-background);--sd-color-card-text:var(--color-foreground-primary);--sd-color-card-header:var(--color-card-marginals-background);--sd-color-card-footer:var(--color-card-marginals-background);--sd-color-tabs-label-active:var(--color-brand-content);--sd-color-tabs-label-hover:var(--color-foreground-muted);--sd-color-tabs-label-inactive:var(--color-foreground-muted);--sd-color-tabs-underline-active:var(--color-brand-content);--sd-color-tabs-underline-hover:var(--color-foreground-border);--sd-color-tabs-underline-inactive:var(--color-background-border);--sd-color-tabs-overline:var(--color-background-border);--sd-color-tabs-underline:var(--color-background-border)}.sd-tab-content{box-shadow:0 -2px var(--sd-color-tabs-overline),0 1px var(--sd-color-tabs-underline)}.sd-card{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)}.sd-shadow-sm{box-shadow:0 .1rem .25rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-md{box-shadow:0 .3rem .75rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-shadow-lg{box-shadow:0 .6rem 1.5rem var(--sd-color-shadow),0 0 .0625rem rgba(0,0,0,.1)!important}.sd-card-hover:hover{transform:none}.sd-cards-carousel{gap:.25rem;padding:.25rem}body{--tabs--label-text:var(--color-foreground-muted);--tabs--label-text--hover:var(--color-foreground-muted);--tabs--label-text--active:var(--color-brand-content);--tabs--label-text--active--hover:var(--color-brand-content);--tabs--label-background:transparent;--tabs--label-background--hover:transparent;--tabs--label-background--active:transparent;--tabs--label-background--active--hover:transparent;--tabs--padding-x:0.25em;--tabs--margin-x:1em;--tabs--border:var(--color-background-border);--tabs--label-border:transparent;--tabs--label-border--hover:var(--color-foreground-muted);--tabs--label-border--active:var(--color-brand-content);--tabs--label-border--active--hover:var(--color-brand-content)}[role=main] .container{max-width:none;padding-left:0;padding-right:0}.shadow.docutils{border:none;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)!important}.sphinx-bs .card{background-color:var(--color-background-secondary);color:var(--color-foreground)} -/*# sourceMappingURL=furo-extensions.css.map*/ \ No newline at end of file diff --git a/pr-preview/pr-273/_static/styles/furo-extensions.css.map b/pr-preview/pr-273/_static/styles/furo-extensions.css.map deleted file mode 100644 index 9ba5637f9..000000000 --- a/pr-preview/pr-273/_static/styles/furo-extensions.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"styles/furo-extensions.css","mappings":"AAGA,2BACE,oFACA,4CAKE,6CAHA,YACA,eAEA,CACA,kDACE,yCAEF,8CACE,sCAEJ,8CACE,kDAEJ,2BAGE,uBACA,cAHA,gBACA,UAEA,CAGA,yCACE,mBAEF,gDAEE,gDADA,YACA,CACA,sDACE,gDACF,yDACE,sCAEJ,+CACE,UACA,qDACE,UAGF,mDACE,eAEJ,yEAEE,4DAEA,mHASE,mBAPA,kBAEA,YADA,oBAGA,aADA,gBAIA,CAEA,qIAEE,WADA,UACA,CAEJ,uGACE,aAEF,iUAGE,cAEF,mHACE,aC1EJ,gCACE,mCAEF,0BAKE,mBAUA,8CACA,YAFA,mCAKA,eAZA,cALA,UASA,YADA,YAYA,iCAdA,YAcA,CAEA,gCAEE,8CADA,gCACA,CAEF,gCAGE,6BADA,mCADA,YAEA,CAEF,kCAEE,cADA,oBACA,CACA,wCACE,cAEJ,8BACE,UC5CN,KAEE,6CAA8C,CAC9C,uDAAwD,CACxD,uDAAwD,CAGxD,iCAAsC,CAGtC,+CAAgD,CAChD,uDAAwD,CACxD,uDAAwD,CACxD,oDAAqD,CACrD,6DAA8D,CAC9D,6DAA8D,CAG9D,uDAAwD,CACxD,yDAA0D,CAC1D,4DAA6D,CAC7D,2DAA4D,CAC5D,8DAA+D,CAC/D,iEAAkE,CAClE,uDAAwD,CACxD,wDAAyD,CAG3D,gBACE,qFAGF,SACE,6EAEF,cACE,uFAEF,cACE,uFAEF,cACE,uFAGF,qBACE,eAEF,mBACE,WACA,eChDF,KACE,gDAAiD,CACjD,uDAAwD,CACxD,qDAAsD,CACtD,4DAA6D,CAC7D,oCAAqC,CACrC,2CAA4C,CAC5C,4CAA6C,CAC7C,mDAAoD,CACpD,wBAAyB,CACzB,oBAAqB,CACrB,6CAA8C,CAC9C,gCAAiC,CACjC,yDAA0D,CAC1D,uDAAwD,CACxD,8DAA+D,CCbjE,uBACE,eACA,eACA,gBAGF,iBACE,YACA,+EAGF,iBACE,mDACA","sources":["webpack:///./src/furo/assets/styles/extensions/_readthedocs.sass","webpack:///./src/furo/assets/styles/extensions/_copybutton.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-design.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-inline-tabs.sass","webpack:///./src/furo/assets/styles/extensions/_sphinx-panels.sass"],"sourcesContent":["// This file contains the styles used for tweaking how ReadTheDoc's embedded\n// contents would show up inside the theme.\n\n#furo-sidebar-ad-placement\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n .ethical-sidebar\n // Remove the border and box-shadow.\n border: none\n box-shadow: none\n // Manage the background colors.\n background: var(--color-background-secondary)\n &:hover\n background: var(--color-background-hover)\n // Ensure the text is legible.\n a\n color: var(--color-foreground-primary)\n\n .ethical-callout a\n color: var(--color-foreground-secondary) !important\n\n#furo-readthedocs-versions\n position: static\n width: 100%\n background: transparent\n display: block\n\n // Make the background color fit with the theme's aesthetic.\n .rst-versions\n background: rgb(26, 28, 30)\n\n .rst-current-version\n cursor: unset\n background: var(--color-sidebar-item-background)\n &:hover\n background: var(--color-sidebar-item-background)\n .fa-book\n color: var(--color-foreground-primary)\n\n > .rst-other-versions\n padding: 0\n small\n opacity: 1\n\n .injected\n .rst-versions\n position: unset\n\n &:hover,\n &:focus-within\n box-shadow: 0 0 0 1px var(--color-sidebar-background-border)\n\n .rst-current-version\n // Undo the tweaks done in RTD's CSS\n font-size: inherit\n line-height: inherit\n height: auto\n text-align: right\n padding: 12px\n\n // Match the rest of the body\n background: #1a1c1e\n\n .fa-book\n float: left\n color: white\n\n .fa-caret-down\n display: none\n\n .rst-current-version,\n .rst-other-versions,\n .injected\n display: block\n\n > .rst-current-version\n display: none\n",".highlight\n &:hover button.copybtn\n color: var(--color-code-foreground)\n\n button.copybtn\n // Make it visible\n opacity: 1\n\n // Align things correctly\n align-items: center\n\n height: 1.25em\n width: 1.25em\n\n top: 0.625rem // $code-spacing-vertical\n right: 0.5rem\n\n // Make it look better\n color: var(--color-background-item)\n background-color: var(--color-code-background)\n border: none\n\n // Change to cursor to make it obvious that you can click on it\n cursor: pointer\n\n // Transition smoothly, for aesthetics\n transition: color 300ms, opacity 300ms\n\n &:hover\n color: var(--color-brand-content)\n background-color: var(--color-code-background)\n\n &::after\n display: none\n color: var(--color-code-foreground)\n background-color: transparent\n\n &.success\n transition: color 0ms\n color: #22863a\n &::after\n display: block\n\n svg\n padding: 0\n","body\n // Colors\n --sd-color-primary: var(--color-brand-primary)\n --sd-color-primary-highlight: var(--color-brand-content)\n --sd-color-primary-text: var(--color-background-primary)\n\n // Shadows\n --sd-color-shadow: rgba(0, 0, 0, 0.05)\n\n // Cards\n --sd-color-card-border: var(--color-card-border)\n --sd-color-card-border-hover: var(--color-brand-content)\n --sd-color-card-background: var(--color-card-background)\n --sd-color-card-text: var(--color-foreground-primary)\n --sd-color-card-header: var(--color-card-marginals-background)\n --sd-color-card-footer: var(--color-card-marginals-background)\n\n // Tabs\n --sd-color-tabs-label-active: var(--color-brand-content)\n --sd-color-tabs-label-hover: var(--color-foreground-muted)\n --sd-color-tabs-label-inactive: var(--color-foreground-muted)\n --sd-color-tabs-underline-active: var(--color-brand-content)\n --sd-color-tabs-underline-hover: var(--color-foreground-border)\n --sd-color-tabs-underline-inactive: var(--color-background-border)\n --sd-color-tabs-overline: var(--color-background-border)\n --sd-color-tabs-underline: var(--color-background-border)\n\n// Tabs\n.sd-tab-content\n box-shadow: 0 -2px var(--sd-color-tabs-overline), 0 1px var(--sd-color-tabs-underline)\n\n// Shadows\n.sd-card // Have a shadow by default\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n.sd-shadow-sm\n box-shadow: 0 0.1rem 0.25rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-md\n box-shadow: 0 0.3rem 0.75rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n.sd-shadow-lg\n box-shadow: 0 0.6rem 1.5rem var(--sd-color-shadow), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Cards\n.sd-card-hover:hover // Don't change scale on hover\n transform: none\n\n.sd-cards-carousel // Have a bit of gap in the carousel by default\n gap: 0.25rem\n padding: 0.25rem\n","// This file contains styles to tweak sphinx-inline-tabs to work well with Furo.\n\nbody\n --tabs--label-text: var(--color-foreground-muted)\n --tabs--label-text--hover: var(--color-foreground-muted)\n --tabs--label-text--active: var(--color-brand-content)\n --tabs--label-text--active--hover: var(--color-brand-content)\n --tabs--label-background: transparent\n --tabs--label-background--hover: transparent\n --tabs--label-background--active: transparent\n --tabs--label-background--active--hover: transparent\n --tabs--padding-x: 0.25em\n --tabs--margin-x: 1em\n --tabs--border: var(--color-background-border)\n --tabs--label-border: transparent\n --tabs--label-border--hover: var(--color-foreground-muted)\n --tabs--label-border--active: var(--color-brand-content)\n --tabs--label-border--active--hover: var(--color-brand-content)\n","// This file contains styles to tweak sphinx-panels to work well with Furo.\n\n// sphinx-panels includes Bootstrap 4, which uses .container which can conflict\n// with docutils' `.. container::` directive.\n[role=\"main\"] .container\n max-width: initial\n padding-left: initial\n padding-right: initial\n\n// Make the panels look nicer!\n.shadow.docutils\n border: none\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1) !important\n\n// Make panel colors respond to dark mode\n.sphinx-bs .card\n background-color: var(--color-background-secondary)\n color: var(--color-foreground)\n"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/pr-preview/pr-273/_static/styles/furo.css b/pr-preview/pr-273/_static/styles/furo.css deleted file mode 100644 index 3d29a218f..000000000 --- a/pr-preview/pr-273/_static/styles/furo.css +++ /dev/null @@ -1,2 +0,0 @@ -/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{-webkit-text-size-adjust:100%;line-height:1.15}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}@media print{.content-icon-container,.headerlink,.mobile-header,.related-pages{display:none!important}.highlight{border:.1pt solid var(--color-foreground-border)}a,blockquote,dl,ol,pre,table,ul{page-break-inside:avoid}caption,figure,h1,h2,h3,h4,h5,h6,img{page-break-after:avoid;page-break-inside:avoid}dl,ol,ul{page-break-before:avoid}}.visually-hidden{clip:rect(0,0,0,0)!important;border:0!important;height:1px!important;margin:-1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;white-space:nowrap!important;width:1px!important}:-moz-focusring{outline:auto}body{--font-stack:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji;--font-stack--monospace:"SFMono-Regular",Menlo,Consolas,Monaco,Liberation Mono,Lucida Console,monospace;--font-size--normal:100%;--font-size--small:87.5%;--font-size--small--2:81.25%;--font-size--small--3:75%;--font-size--small--4:62.5%;--sidebar-caption-font-size:var(--font-size--small--2);--sidebar-item-font-size:var(--font-size--small);--sidebar-search-input-font-size:var(--font-size--small);--toc-font-size:var(--font-size--small--3);--toc-font-size--mobile:var(--font-size--normal);--toc-title-font-size:var(--font-size--small--4);--admonition-font-size:0.8125rem;--admonition-title-font-size:0.8125rem;--code-font-size:var(--font-size--small--2);--api-font-size:var(--font-size--small);--header-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*4);--header-padding:0.5rem;--sidebar-tree-space-above:1.5rem;--sidebar-caption-space-above:1rem;--sidebar-item-line-height:1rem;--sidebar-item-spacing-vertical:0.5rem;--sidebar-item-spacing-horizontal:1rem;--sidebar-item-height:calc(var(--sidebar-item-line-height) + var(--sidebar-item-spacing-vertical)*2);--sidebar-expander-width:var(--sidebar-item-height);--sidebar-search-space-above:0.5rem;--sidebar-search-input-spacing-vertical:0.5rem;--sidebar-search-input-spacing-horizontal:0.5rem;--sidebar-search-input-height:1rem;--sidebar-search-icon-size:var(--sidebar-search-input-height);--toc-title-padding:0.25rem 0;--toc-spacing-vertical:1.5rem;--toc-spacing-horizontal:1.5rem;--toc-item-spacing-vertical:0.4rem;--toc-item-spacing-horizontal:1rem;--icon-search:url('data:image/svg+xml;charset=utf-8,');--icon-pencil:url('data:image/svg+xml;charset=utf-8,');--icon-abstract:url('data:image/svg+xml;charset=utf-8,');--icon-info:url('data:image/svg+xml;charset=utf-8,');--icon-flame:url('data:image/svg+xml;charset=utf-8,');--icon-question:url('data:image/svg+xml;charset=utf-8,');--icon-warning:url('data:image/svg+xml;charset=utf-8,');--icon-failure:url('data:image/svg+xml;charset=utf-8,');--icon-spark:url('data:image/svg+xml;charset=utf-8,');--color-admonition-title--caution:#ff9100;--color-admonition-title-background--caution:rgba(255,145,0,.2);--color-admonition-title--warning:#ff9100;--color-admonition-title-background--warning:rgba(255,145,0,.2);--color-admonition-title--danger:#ff5252;--color-admonition-title-background--danger:rgba(255,82,82,.2);--color-admonition-title--attention:#ff5252;--color-admonition-title-background--attention:rgba(255,82,82,.2);--color-admonition-title--error:#ff5252;--color-admonition-title-background--error:rgba(255,82,82,.2);--color-admonition-title--hint:#00c852;--color-admonition-title-background--hint:rgba(0,200,82,.2);--color-admonition-title--tip:#00c852;--color-admonition-title-background--tip:rgba(0,200,82,.2);--color-admonition-title--important:#00bfa5;--color-admonition-title-background--important:rgba(0,191,165,.2);--color-admonition-title--note:#00b0ff;--color-admonition-title-background--note:rgba(0,176,255,.2);--color-admonition-title--seealso:#448aff;--color-admonition-title-background--seealso:rgba(68,138,255,.2);--color-admonition-title--admonition-todo:grey;--color-admonition-title-background--admonition-todo:hsla(0,0%,50%,.2);--color-admonition-title:#651fff;--color-admonition-title-background:rgba(101,31,255,.2);--icon-admonition-default:var(--icon-abstract);--color-topic-title:#14b8a6;--color-topic-title-background:rgba(20,184,166,.2);--icon-topic-default:var(--icon-pencil);--color-problematic:#b30000;--color-foreground-primary:#000;--color-foreground-secondary:#5a5c63;--color-foreground-muted:#646776;--color-foreground-border:#878787;--color-background-primary:#fff;--color-background-secondary:#f8f9fb;--color-background-hover:#efeff4;--color-background-hover--transparent:#efeff400;--color-background-border:#eeebee;--color-background-item:#ccc;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2962ff;--color-brand-content:#2a5adf;--color-api-background:var(--color-background-hover--transparent);--color-api-background-hover:var(--color-background-hover);--color-api-overall:var(--color-foreground-secondary);--color-api-name:var(--color-problematic);--color-api-pre-name:var(--color-problematic);--color-api-paren:var(--color-foreground-secondary);--color-api-keyword:var(--color-foreground-primary);--color-highlight-on-target:#ffc;--color-inline-code-background:var(--color-background-secondary);--color-highlighted-background:#def;--color-highlighted-text:var(--color-foreground-primary);--color-guilabel-background:#ddeeff80;--color-guilabel-border:#bedaf580;--color-guilabel-text:var(--color-foreground-primary);--color-admonition-background:transparent;--color-table-header-background:var(--color-background-secondary);--color-table-border:var(--color-background-border);--color-card-border:var(--color-background-secondary);--color-card-background:transparent;--color-card-marginals-background:var(--color-background-secondary);--color-header-background:var(--color-background-primary);--color-header-border:var(--color-background-border);--color-header-text:var(--color-foreground-primary);--color-sidebar-background:var(--color-background-secondary);--color-sidebar-background-border:var(--color-background-border);--color-sidebar-brand-text:var(--color-foreground-primary);--color-sidebar-caption-text:var(--color-foreground-muted);--color-sidebar-link-text:var(--color-foreground-secondary);--color-sidebar-link-text--top-level:var(--color-brand-primary);--color-sidebar-item-background:var(--color-sidebar-background);--color-sidebar-item-background--current:var( --color-sidebar-item-background );--color-sidebar-item-background--hover:linear-gradient(90deg,var(--color-background-hover--transparent) 0%,var(--color-background-hover) var(--sidebar-item-spacing-horizontal),var(--color-background-hover) 100%);--color-sidebar-item-expander-background:transparent;--color-sidebar-item-expander-background--hover:var( --color-background-hover );--color-sidebar-search-text:var(--color-foreground-primary);--color-sidebar-search-background:var(--color-background-secondary);--color-sidebar-search-background--focus:var(--color-background-primary);--color-sidebar-search-border:var(--color-background-border);--color-sidebar-search-icon:var(--color-foreground-muted);--color-toc-background:var(--color-background-primary);--color-toc-title-text:var(--color-foreground-muted);--color-toc-item-text:var(--color-foreground-secondary);--color-toc-item-text--hover:var(--color-foreground-primary);--color-toc-item-text--active:var(--color-brand-primary);--color-content-foreground:var(--color-foreground-primary);--color-content-background:transparent;--color-link:var(--color-brand-content);--color-link--hover:var(--color-brand-content);--color-link-underline:var(--color-background-border);--color-link-underline--hover:var(--color-foreground-border)}.only-light{display:block!important}html body .only-dark{display:none!important}@media not print{body[data-theme=dark]{--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body[data-theme=dark] .only-light{display:none!important}body[data-theme=dark] .only-dark{display:block!important}@media(prefers-color-scheme:dark){body:not([data-theme=light]){--color-problematic:#ee5151;--color-foreground-primary:#ffffffcc;--color-foreground-secondary:#9ca0a5;--color-foreground-muted:#81868d;--color-foreground-border:#666;--color-background-primary:#131416;--color-background-secondary:#1a1c1e;--color-background-hover:#1e2124;--color-background-hover--transparent:#1e212400;--color-background-border:#303335;--color-background-item:#444;--color-announcement-background:#000000dd;--color-announcement-text:#eeebee;--color-brand-primary:#2b8cee;--color-brand-content:#368ce2;--color-highlighted-background:#083563;--color-guilabel-background:#08356380;--color-guilabel-border:#13395f80;--color-api-keyword:var(--color-foreground-secondary);--color-highlight-on-target:#330;--color-admonition-background:#18181a;--color-card-border:var(--color-background-secondary);--color-card-background:#18181a;--color-card-marginals-background:var(--color-background-hover)}html body:not([data-theme=light]) .only-light{display:none!important}body:not([data-theme=light]) .only-dark{display:block!important}}}body[data-theme=auto] .theme-toggle svg.theme-icon-when-auto,body[data-theme=dark] .theme-toggle svg.theme-icon-when-dark,body[data-theme=light] .theme-toggle svg.theme-icon-when-light{display:block}body{font-family:var(--font-stack)}code,kbd,pre,samp{font-family:var(--font-stack--monospace)}body{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}article{line-height:1.5}h1,h2,h3,h4,h5,h6{border-radius:.5rem;font-weight:700;line-height:1.25;margin:.5rem -.5rem;padding-left:.5rem;padding-right:.5rem}h1+p,h2+p,h3+p,h4+p,h5+p,h6+p{margin-top:0}h1{font-size:2.5em;margin-bottom:1rem}h1,h2{margin-top:1.75rem}h2{font-size:2em}h3{font-size:1.5em}h4{font-size:1.25em}h5{font-size:1.125em}h6{font-size:1em}small{font-size:80%;opacity:75%}p{margin-bottom:.75rem;margin-top:.5rem}hr.docutils{background-color:var(--color-background-border);border:0;height:1px;margin:2rem 0;padding:0}.centered{text-align:center}a{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}a:hover{color:var(--color-link--hover);text-decoration-color:var(--color-link-underline--hover)}a.muted-link{color:inherit}a.muted-link:hover{color:var(--color-link);text-decoration-color:var(--color-link-underline--hover)}html{overflow-x:hidden;overflow-y:scroll;scroll-behavior:smooth}.sidebar-scroll,.toc-scroll,article[role=main] *{scrollbar-color:var(--color-foreground-border) transparent;scrollbar-width:thin}.sidebar-scroll::-webkit-scrollbar,.toc-scroll::-webkit-scrollbar,article[role=main] ::-webkit-scrollbar{height:.25rem;width:.25rem}.sidebar-scroll::-webkit-scrollbar-thumb,.toc-scroll::-webkit-scrollbar-thumb,article[role=main] ::-webkit-scrollbar-thumb{background-color:var(--color-foreground-border);border-radius:.125rem}body,html{background:var(--color-background-primary);color:var(--color-foreground-primary);height:100%}article{background:var(--color-content-background);color:var(--color-content-foreground);overflow-wrap:break-word}.page{display:flex;min-height:100%}.mobile-header{background-color:var(--color-header-background);border-bottom:1px solid var(--color-header-border);color:var(--color-header-text);display:none;height:var(--header-height);width:100%;z-index:10}.mobile-header.scrolled{border-bottom:none;box-shadow:0 0 .2rem rgba(0,0,0,.1),0 .2rem .4rem rgba(0,0,0,.2)}.mobile-header .header-center a{color:var(--color-header-text);text-decoration:none}.main{display:flex;flex:1}.sidebar-drawer{background:var(--color-sidebar-background);border-right:1px solid var(--color-sidebar-background-border);box-sizing:border-box;display:flex;justify-content:flex-end;min-width:15em;width:calc(50% - 26em)}.sidebar-container,.toc-drawer{box-sizing:border-box;width:15em}.toc-drawer{background:var(--color-toc-background);padding-right:1rem}.sidebar-sticky,.toc-sticky{display:flex;flex-direction:column;height:min(100%,100vh);height:100vh;position:sticky;top:0}.sidebar-scroll,.toc-scroll{flex-grow:1;flex-shrink:1;overflow:auto;scroll-behavior:smooth}.content{display:flex;flex-direction:column;justify-content:space-between;padding:0 3em;width:46em}.icon{display:inline-block;height:1rem;width:1rem}.icon svg{height:100%;width:100%}.announcement{align-items:center;background-color:var(--color-announcement-background);color:var(--color-announcement-text);display:flex;height:var(--header-height);overflow-x:auto}.announcement+.page{min-height:calc(100% - var(--header-height))}.announcement-content{box-sizing:border-box;min-width:100%;padding:.5rem;text-align:center;white-space:nowrap}.announcement-content a{color:var(--color-announcement-text);text-decoration-color:var(--color-announcement-text)}.announcement-content a:hover{color:var(--color-announcement-text);text-decoration-color:var(--color-link--hover)}.no-js .theme-toggle-container{display:none}.theme-toggle-container{vertical-align:middle}.theme-toggle{background:transparent;border:none;cursor:pointer;padding:0}.theme-toggle svg{color:var(--color-foreground-primary);display:none;height:1rem;vertical-align:middle;width:1rem}.theme-toggle-header{float:left;padding:1rem .5rem}.nav-overlay-icon,.toc-overlay-icon{cursor:pointer;display:none}.nav-overlay-icon .icon,.toc-overlay-icon .icon{color:var(--color-foreground-secondary);height:1rem;width:1rem}.nav-overlay-icon,.toc-header-icon{align-items:center;justify-content:center}.toc-content-icon{height:1.5rem;width:1.5rem}.content-icon-container{display:flex;float:right;gap:.5rem;margin-bottom:1rem;margin-left:1rem;margin-top:1.5rem}.content-icon-container .edit-this-page svg{color:inherit;height:1rem;width:1rem}.sidebar-toggle{display:none;position:absolute}.sidebar-toggle[name=__toc]{left:20px}.sidebar-toggle:checked{left:40px}.overlay{background-color:rgba(0,0,0,.54);height:0;opacity:0;position:fixed;top:0;transition:width 0ms,height 0ms,opacity .25s ease-out;width:0}.sidebar-overlay{z-index:20}.toc-overlay{z-index:40}.sidebar-drawer{transition:left .25s ease-in-out;z-index:30}.toc-drawer{transition:right .25s ease-in-out;z-index:50}#__navigation:checked~.sidebar-overlay{height:100%;opacity:1;width:100%}#__navigation:checked~.page .sidebar-drawer{left:0;top:0}#__toc:checked~.toc-overlay{height:100%;opacity:1;width:100%}#__toc:checked~.page .toc-drawer{right:0;top:0}.back-to-top{background:var(--color-background-primary);border-radius:1rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 1px 0 hsla(220,9%,46%,.502);display:none;font-size:.8125rem;left:0;margin-left:50%;padding:.5rem .75rem .5rem .5rem;position:fixed;text-decoration:none;top:1rem;transform:translateX(-50%);z-index:10}.back-to-top svg{fill:currentColor;display:inline-block;height:1rem;width:1rem}.back-to-top span{margin-left:.25rem}.show-back-to-top .back-to-top{align-items:center;display:flex}@media(min-width:97em){html{font-size:110%}}@media(max-width:82em){.toc-content-icon{display:flex}.toc-drawer{border-left:1px solid var(--color-background-muted);height:100vh;position:fixed;right:-15em;top:0}.toc-tree{border-left:none;font-size:var(--toc-font-size--mobile)}.sidebar-drawer{width:calc(50% - 18.5em)}}@media(max-width:67em){.nav-overlay-icon{display:flex}.sidebar-drawer{height:100vh;left:-15em;position:fixed;top:0;width:15em}.toc-header-icon{display:flex}.theme-toggle-content,.toc-content-icon{display:none}.theme-toggle-header{display:block}.mobile-header{align-items:center;display:flex;justify-content:space-between;position:sticky;top:0}.mobile-header .header-left,.mobile-header .header-right{display:flex;height:var(--header-height);padding:0 var(--header-padding)}.mobile-header .header-left label,.mobile-header .header-right label{height:100%;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:100%}.nav-overlay-icon .icon,.theme-toggle svg{height:1.25rem;width:1.25rem}:target{scroll-margin-top:var(--header-height)}.back-to-top{top:calc(var(--header-height) + .5rem)}.page{flex-direction:column;justify-content:center}.content{margin-left:auto;margin-right:auto}}@media(max-width:52em){.content{overflow-x:auto;width:100%}}@media(max-width:46em){.content{padding:0 1em}article aside.sidebar{float:none;margin:1rem 0;width:100%}}.admonition,.topic{background:var(--color-admonition-background);border-radius:.2rem;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1);font-size:var(--admonition-font-size);margin:1rem auto;overflow:hidden;padding:0 .5rem .5rem;page-break-inside:avoid}.admonition>:nth-child(2),.topic>:nth-child(2){margin-top:0}.admonition>:last-child,.topic>:last-child{margin-bottom:0}.admonition p.admonition-title,p.topic-title{font-size:var(--admonition-title-font-size);font-weight:500;line-height:1.3;margin:0 -.5rem .5rem;padding:.4rem .5rem .4rem 2rem;position:relative}.admonition p.admonition-title:before,p.topic-title:before{content:"";height:1rem;left:.5rem;position:absolute;width:1rem}p.admonition-title{background-color:var(--color-admonition-title-background)}p.admonition-title:before{background-color:var(--color-admonition-title);-webkit-mask-image:var(--icon-admonition-default);mask-image:var(--icon-admonition-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}p.topic-title{background-color:var(--color-topic-title-background)}p.topic-title:before{background-color:var(--color-topic-title);-webkit-mask-image:var(--icon-topic-default);mask-image:var(--icon-topic-default);-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat}.admonition{border-left:.2rem solid var(--color-admonition-title)}.admonition.caution{border-left-color:var(--color-admonition-title--caution)}.admonition.caution>.admonition-title{background-color:var(--color-admonition-title-background--caution)}.admonition.caution>.admonition-title:before{background-color:var(--color-admonition-title--caution);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.warning{border-left-color:var(--color-admonition-title--warning)}.admonition.warning>.admonition-title{background-color:var(--color-admonition-title-background--warning)}.admonition.warning>.admonition-title:before{background-color:var(--color-admonition-title--warning);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.danger{border-left-color:var(--color-admonition-title--danger)}.admonition.danger>.admonition-title{background-color:var(--color-admonition-title-background--danger)}.admonition.danger>.admonition-title:before{background-color:var(--color-admonition-title--danger);-webkit-mask-image:var(--icon-spark);mask-image:var(--icon-spark)}.admonition.attention{border-left-color:var(--color-admonition-title--attention)}.admonition.attention>.admonition-title{background-color:var(--color-admonition-title-background--attention)}.admonition.attention>.admonition-title:before{background-color:var(--color-admonition-title--attention);-webkit-mask-image:var(--icon-warning);mask-image:var(--icon-warning)}.admonition.error{border-left-color:var(--color-admonition-title--error)}.admonition.error>.admonition-title{background-color:var(--color-admonition-title-background--error)}.admonition.error>.admonition-title:before{background-color:var(--color-admonition-title--error);-webkit-mask-image:var(--icon-failure);mask-image:var(--icon-failure)}.admonition.hint{border-left-color:var(--color-admonition-title--hint)}.admonition.hint>.admonition-title{background-color:var(--color-admonition-title-background--hint)}.admonition.hint>.admonition-title:before{background-color:var(--color-admonition-title--hint);-webkit-mask-image:var(--icon-question);mask-image:var(--icon-question)}.admonition.tip{border-left-color:var(--color-admonition-title--tip)}.admonition.tip>.admonition-title{background-color:var(--color-admonition-title-background--tip)}.admonition.tip>.admonition-title:before{background-color:var(--color-admonition-title--tip);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.important{border-left-color:var(--color-admonition-title--important)}.admonition.important>.admonition-title{background-color:var(--color-admonition-title-background--important)}.admonition.important>.admonition-title:before{background-color:var(--color-admonition-title--important);-webkit-mask-image:var(--icon-flame);mask-image:var(--icon-flame)}.admonition.note{border-left-color:var(--color-admonition-title--note)}.admonition.note>.admonition-title{background-color:var(--color-admonition-title-background--note)}.admonition.note>.admonition-title:before{background-color:var(--color-admonition-title--note);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition.seealso{border-left-color:var(--color-admonition-title--seealso)}.admonition.seealso>.admonition-title{background-color:var(--color-admonition-title-background--seealso)}.admonition.seealso>.admonition-title:before{background-color:var(--color-admonition-title--seealso);-webkit-mask-image:var(--icon-info);mask-image:var(--icon-info)}.admonition.admonition-todo{border-left-color:var(--color-admonition-title--admonition-todo)}.admonition.admonition-todo>.admonition-title{background-color:var(--color-admonition-title-background--admonition-todo)}.admonition.admonition-todo>.admonition-title:before{background-color:var(--color-admonition-title--admonition-todo);-webkit-mask-image:var(--icon-pencil);mask-image:var(--icon-pencil)}.admonition-todo>.admonition-title{text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd{margin-left:2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:first-child{margin-top:.125rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list,dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) dd>:last-child{margin-bottom:.75rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list>dt{font-size:var(--font-size--small);text-transform:uppercase}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd:empty{margin-bottom:.5rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul{margin-left:-1.2rem}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p:nth-child(2){margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) .field-list dd>ul>li>p+p:last-child:empty{margin-bottom:0;margin-top:0}dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)>dt{color:var(--color-api-overall)}.sig:not(.sig-inline){background:var(--color-api-background);border-radius:.25rem;font-family:var(--font-stack--monospace);font-size:var(--api-font-size);font-weight:700;margin-left:-.25rem;margin-right:-.25rem;padding:.25rem .5rem .25rem 3em;text-indent:-2.5em;transition:background .1s ease-out}.sig:not(.sig-inline):hover{background:var(--color-api-background-hover)}.sig:not(.sig-inline) a.reference .viewcode-link{font-weight:400;width:3.5rem}em.property{font-style:normal}em.property:first-child{color:var(--color-api-keyword)}.sig-name{color:var(--color-api-name)}.sig-prename{color:var(--color-api-pre-name);font-weight:400}.sig-paren{color:var(--color-api-paren)}.sig-param{font-style:normal}.versionmodified{font-style:italic}div.deprecated p,div.versionadded p,div.versionchanged p{margin-bottom:.125rem;margin-top:.125rem}.viewcode-back,.viewcode-link{float:right;text-align:right}.line-block{margin-bottom:.75rem;margin-top:.5rem}.line-block .line-block{margin-bottom:0;margin-top:0;padding-left:1rem}.code-block-caption,article p.caption,table>caption{font-size:var(--font-size--small);text-align:center}.toctree-wrapper.compound .caption,.toctree-wrapper.compound :not(.caption)>.caption-text{font-size:var(--font-size--small);margin-bottom:0;text-align:initial;text-transform:uppercase}.toctree-wrapper.compound>ul{margin-bottom:0;margin-top:0}.sig-inline,code.literal{background:var(--color-inline-code-background);border-radius:.2em;font-size:var(--font-size--small--2);padding:.1em .2em}pre.literal-block .sig-inline,pre.literal-block code.literal{font-size:inherit;padding:0}p .sig-inline,p code.literal{border:1px solid var(--color-background-border)}.sig-inline{font-family:var(--font-stack--monospace)}div[class*=" highlight-"],div[class^=highlight-]{display:flex;margin:1em 0}div[class*=" highlight-"] .table-wrapper,div[class^=highlight-] .table-wrapper,pre{margin:0;padding:0}pre{overflow:auto}article[role=main] .highlight pre{line-height:1.5}.highlight pre,pre.literal-block{font-size:var(--code-font-size);padding:.625rem .875rem}pre.literal-block{background-color:var(--color-code-background);border-radius:.2rem;color:var(--color-code-foreground);margin-bottom:1rem;margin-top:1rem}.highlight{border-radius:.2rem;width:100%}.highlight .gp,.highlight span.linenos{pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.highlight .hll{display:block;margin-left:-.875rem;margin-right:-.875rem;padding-left:.875rem;padding-right:.875rem}.code-block-caption{background-color:var(--color-code-background);border-bottom:1px solid;border-radius:.25rem;border-bottom-left-radius:0;border-bottom-right-radius:0;border-color:var(--color-background-border);color:var(--color-code-foreground);display:flex;font-weight:300;padding:.625rem .875rem}.code-block-caption+div[class]{margin-top:0}.code-block-caption+div[class] pre{border-top-left-radius:0;border-top-right-radius:0}.highlighttable{display:block;width:100%}.highlighttable tbody{display:block}.highlighttable tr{display:flex}.highlighttable td.linenos{background-color:var(--color-code-background);border-bottom-left-radius:.2rem;border-top-left-radius:.2rem;color:var(--color-code-foreground);padding:.625rem 0 .625rem .875rem}.highlighttable .linenodiv{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;font-size:var(--code-font-size);padding-right:.875rem}.highlighttable td.code{display:block;flex:1;overflow:hidden;padding:0}.highlighttable td.code .highlight{border-bottom-left-radius:0;border-top-left-radius:0}.highlight span.linenos{box-shadow:-.0625rem 0 var(--color-foreground-border) inset;display:inline-block;margin-right:.875rem;padding-left:0;padding-right:.875rem}.footnote-reference{font-size:var(--font-size--small--4);vertical-align:super}dl.footnote.brackets{color:var(--color-foreground-secondary);display:grid;font-size:var(--font-size--small);grid-template-columns:max-content auto}dl.footnote.brackets dt{margin:0}dl.footnote.brackets dt>.fn-backref{margin-left:.25rem}dl.footnote.brackets dt:after{content:":"}dl.footnote.brackets dt .brackets:before{content:"["}dl.footnote.brackets dt .brackets:after{content:"]"}dl.footnote.brackets dd{margin:0;padding:0 1rem}aside.footnote{color:var(--color-foreground-secondary);font-size:var(--font-size--small)}aside.footnote>span,div.citation>span{float:left;font-weight:500;padding-right:.25rem}aside.footnote>p,div.citation>p{margin-left:2rem}img{box-sizing:border-box;height:auto;max-width:100%}article .figure,article figure{border-radius:.2rem;margin:0}article .figure :last-child,article figure :last-child{margin-bottom:0}article .align-left{clear:left;float:left;margin:0 1rem 1rem}article .align-right{clear:right;float:right;margin:0 1rem 1rem}article .align-center,article .align-default{display:block;margin-left:auto;margin-right:auto;text-align:center}article table.align-default{display:table;text-align:initial}.domainindex-jumpbox,.genindex-jumpbox{border-bottom:1px solid var(--color-background-border);border-top:1px solid var(--color-background-border);padding:.25rem}.domainindex-section h2,.genindex-section h2{margin-bottom:.5rem;margin-top:.75rem}.domainindex-section ul,.genindex-section ul{margin-bottom:0;margin-top:0}ol,ul{margin-bottom:1rem;margin-top:1rem;padding-left:1.2rem}ol li>p:first-child,ul li>p:first-child{margin-bottom:.25rem;margin-top:.25rem}ol li>p:last-child,ul li>p:last-child{margin-top:.25rem}ol li>ol,ol li>ul,ul li>ol,ul li>ul{margin-bottom:.5rem;margin-top:.5rem}ol.arabic{list-style:decimal}ol.loweralpha{list-style:lower-alpha}ol.upperalpha{list-style:upper-alpha}ol.lowerroman{list-style:lower-roman}ol.upperroman{list-style:upper-roman}.simple li>ol,.simple li>ul,.toctree-wrapper li>ol,.toctree-wrapper li>ul{margin-bottom:0;margin-top:0}.field-list dt,.option-list dt,dl.footnote dt,dl.glossary dt,dl.simple dt,dl:not([class]) dt{font-weight:500;margin-top:.25rem}.field-list dt+dt,.option-list dt+dt,dl.footnote dt+dt,dl.glossary dt+dt,dl.simple dt+dt,dl:not([class]) dt+dt{margin-top:0}.field-list dt .classifier:before,.option-list dt .classifier:before,dl.footnote dt .classifier:before,dl.glossary dt .classifier:before,dl.simple dt .classifier:before,dl:not([class]) dt .classifier:before{content:":";margin-left:.2rem;margin-right:.2rem}.field-list dd ul,.field-list dd>p:first-child,.option-list dd ul,.option-list dd>p:first-child,dl.footnote dd ul,dl.footnote dd>p:first-child,dl.glossary dd ul,dl.glossary dd>p:first-child,dl.simple dd ul,dl.simple dd>p:first-child,dl:not([class]) dd ul,dl:not([class]) dd>p:first-child{margin-top:.125rem}.field-list dd ul,.option-list dd ul,dl.footnote dd ul,dl.glossary dd ul,dl.simple dd ul,dl:not([class]) dd ul{margin-bottom:.125rem}.math-wrapper{overflow-x:auto;width:100%}div.math{position:relative;text-align:center}div.math .headerlink,div.math:focus .headerlink{display:none}div.math:hover .headerlink{display:inline-block}div.math span.eqno{position:absolute;right:.5rem;top:50%;transform:translateY(-50%);z-index:1}abbr[title]{cursor:help}.problematic{color:var(--color-problematic)}kbd:not(.compound){background-color:var(--color-background-secondary);border:1px solid var(--color-foreground-border);border-radius:.2rem;box-shadow:0 .0625rem 0 rgba(0,0,0,.2),inset 0 0 0 .125rem var(--color-background-primary);color:var(--color-foreground-primary);display:inline-block;font-size:var(--font-size--small--3);margin:0 .2rem;padding:0 .2rem;vertical-align:text-bottom}blockquote{background:var(--color-background-secondary);border-left:4px solid var(--color-background-border);margin-left:0;margin-right:0;padding:.5rem 1rem}blockquote .attribution{font-weight:600;text-align:right}blockquote.highlights,blockquote.pull-quote{font-size:1.25em}blockquote.epigraph,blockquote.pull-quote{border-left-width:0;border-radius:.5rem}blockquote.highlights{background:transparent;border-left-width:0}p .reference img{vertical-align:middle}p.rubric{font-size:1.125em;font-weight:700;line-height:1.25}dd p.rubric{font-size:var(--font-size--small);font-weight:inherit;line-height:inherit;text-transform:uppercase}article .sidebar{background-color:var(--color-background-secondary);border:1px solid var(--color-background-border);border-radius:.2rem;clear:right;float:right;margin-left:1rem;margin-right:0;width:30%}article .sidebar>*{padding-left:1rem;padding-right:1rem}article .sidebar>ol,article .sidebar>ul{padding-left:2.2rem}article .sidebar .sidebar-title{border-bottom:1px solid var(--color-background-border);font-weight:500;margin:0;padding:.5rem 1rem}.table-wrapper{margin-bottom:.5rem;margin-top:1rem;overflow-x:auto;padding:.2rem .2rem .75rem;width:100%}table.docutils{border-collapse:collapse;border-radius:.2rem;border-spacing:0;box-shadow:0 .2rem .5rem rgba(0,0,0,.05),0 0 .0625rem rgba(0,0,0,.1)}table.docutils th{background:var(--color-table-header-background)}table.docutils td,table.docutils th{border-bottom:1px solid var(--color-table-border);border-left:1px solid var(--color-table-border);border-right:1px solid var(--color-table-border);padding:0 .25rem}table.docutils td p,table.docutils th p{margin:.25rem}table.docutils td:first-child,table.docutils th:first-child{border-left:none}table.docutils td:last-child,table.docutils th:last-child{border-right:none}table.docutils td.text-left,table.docutils th.text-left{text-align:left}table.docutils td.text-right,table.docutils th.text-right{text-align:right}table.docutils td.text-center,table.docutils th.text-center{text-align:center}:target{scroll-margin-top:.5rem}@media(max-width:67em){:target{scroll-margin-top:calc(.5rem + var(--header-height))}section>span:target{scroll-margin-top:calc(.8rem + var(--header-height))}}.headerlink{font-weight:100;-webkit-user-select:none;-moz-user-select:none;user-select:none}.code-block-caption>.headerlink,dl dt>.headerlink,figcaption p>.headerlink,h1>.headerlink,h2>.headerlink,h3>.headerlink,h4>.headerlink,h5>.headerlink,h6>.headerlink,p.caption>.headerlink,table>caption>.headerlink{margin-left:.5rem;visibility:hidden}.code-block-caption:hover>.headerlink,dl dt:hover>.headerlink,figcaption p:hover>.headerlink,h1:hover>.headerlink,h2:hover>.headerlink,h3:hover>.headerlink,h4:hover>.headerlink,h5:hover>.headerlink,h6:hover>.headerlink,p.caption:hover>.headerlink,table>caption:hover>.headerlink{visibility:visible}.code-block-caption>.toc-backref,dl dt>.toc-backref,figcaption p>.toc-backref,h1>.toc-backref,h2>.toc-backref,h3>.toc-backref,h4>.toc-backref,h5>.toc-backref,h6>.toc-backref,p.caption>.toc-backref,table>caption>.toc-backref{color:inherit;text-decoration-line:none}figure:hover>figcaption>p>.headerlink,table:hover>caption>.headerlink{visibility:visible}:target>h1:first-of-type,:target>h2:first-of-type,:target>h3:first-of-type,:target>h4:first-of-type,:target>h5:first-of-type,:target>h6:first-of-type,span:target~h1:first-of-type,span:target~h2:first-of-type,span:target~h3:first-of-type,span:target~h4:first-of-type,span:target~h5:first-of-type,span:target~h6:first-of-type{background-color:var(--color-highlight-on-target)}:target>h1:first-of-type code.literal,:target>h2:first-of-type code.literal,:target>h3:first-of-type code.literal,:target>h4:first-of-type code.literal,:target>h5:first-of-type code.literal,:target>h6:first-of-type code.literal,span:target~h1:first-of-type code.literal,span:target~h2:first-of-type code.literal,span:target~h3:first-of-type code.literal,span:target~h4:first-of-type code.literal,span:target~h5:first-of-type code.literal,span:target~h6:first-of-type code.literal{background-color:transparent}.literal-block-wrapper:target .code-block-caption,.this-will-duplicate-information-and-it-is-still-useful-here li :target,figure:target,table:target>caption{background-color:var(--color-highlight-on-target)}dt:target{background-color:var(--color-highlight-on-target)!important}.footnote-reference:target,.footnote>dt:target+dd{background-color:var(--color-highlight-on-target)}.guilabel{background-color:var(--color-guilabel-background);border:1px solid var(--color-guilabel-border);border-radius:.5em;color:var(--color-guilabel-text);font-size:.9em;padding:0 .3em}footer{display:flex;flex-direction:column;font-size:var(--font-size--small);margin-top:2rem}.bottom-of-page{align-items:center;border-top:1px solid var(--color-background-border);color:var(--color-foreground-secondary);display:flex;justify-content:space-between;line-height:1.5;margin-top:1rem;padding-bottom:1rem;padding-top:1rem}@media(max-width:46em){.bottom-of-page{flex-direction:column-reverse;gap:.25rem;text-align:center}}.bottom-of-page .left-details{font-size:var(--font-size--small)}.bottom-of-page .right-details{display:flex;flex-direction:column;gap:.25rem;text-align:right}.bottom-of-page .icons{display:flex;font-size:1rem;gap:.25rem;justify-content:flex-end}.bottom-of-page .icons a{text-decoration:none}.bottom-of-page .icons img,.bottom-of-page .icons svg{font-size:1.125rem;height:1em;width:1em}.related-pages a{align-items:center;display:flex;text-decoration:none}.related-pages a:hover .page-info .title{color:var(--color-link);text-decoration:underline;text-decoration-color:var(--color-link-underline)}.related-pages a svg.furo-related-icon,.related-pages a svg.furo-related-icon>use{color:var(--color-foreground-border);flex-shrink:0;height:.75rem;margin:0 .5rem;width:.75rem}.related-pages a.next-page{clear:right;float:right;max-width:50%;text-align:right}.related-pages a.prev-page{clear:left;float:left;max-width:50%}.related-pages a.prev-page svg{transform:rotate(180deg)}.page-info{display:flex;flex-direction:column;overflow-wrap:anywhere}.next-page .page-info{align-items:flex-end}.page-info .context{align-items:center;color:var(--color-foreground-muted);display:flex;font-size:var(--font-size--small);padding-bottom:.1rem;text-decoration:none}ul.search{list-style:none;padding-left:0}ul.search li{border-bottom:1px solid var(--color-background-border);padding:1rem 0}[role=main] .highlighted{background-color:var(--color-highlighted-background);color:var(--color-highlighted-text)}.sidebar-brand{display:flex;flex-direction:column;flex-shrink:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none}.sidebar-brand-text{color:var(--color-sidebar-brand-text);font-size:1.5rem;overflow-wrap:break-word}.sidebar-brand-text,.sidebar-logo-container{margin:var(--sidebar-item-spacing-vertical) 0}.sidebar-logo{display:block;margin:0 auto;max-width:100%}.sidebar-search-container{align-items:center;background:var(--color-sidebar-search-background);display:flex;margin-top:var(--sidebar-search-space-above);position:relative}.sidebar-search-container:focus-within,.sidebar-search-container:hover{background:var(--color-sidebar-search-background--focus)}.sidebar-search-container:before{background-color:var(--color-sidebar-search-icon);content:"";height:var(--sidebar-search-icon-size);left:var(--sidebar-item-spacing-horizontal);-webkit-mask-image:var(--icon-search);mask-image:var(--icon-search);position:absolute;width:var(--sidebar-search-icon-size)}.sidebar-search{background:transparent;border:none;border-bottom:1px solid var(--color-sidebar-search-border);border-top:1px solid var(--color-sidebar-search-border);box-sizing:border-box;color:var(--color-sidebar-search-foreground);padding:var(--sidebar-search-input-spacing-vertical) var(--sidebar-search-input-spacing-horizontal) var(--sidebar-search-input-spacing-vertical) calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size));width:100%;z-index:10}.sidebar-search:focus{outline:none}.sidebar-search::-moz-placeholder{font-size:var(--sidebar-search-input-font-size)}.sidebar-search::placeholder{font-size:var(--sidebar-search-input-font-size)}#searchbox .highlight-link{margin:0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0;text-align:center}#searchbox .highlight-link a{color:var(--color-sidebar-search-icon);font-size:var(--font-size--small--2)}.sidebar-tree{font-size:var(--sidebar-item-font-size);margin-bottom:var(--sidebar-item-spacing-vertical);margin-top:var(--sidebar-tree-space-above)}.sidebar-tree ul{display:flex;flex-direction:column;list-style:none;margin-bottom:0;margin-top:0;padding:0}.sidebar-tree li{margin:0;position:relative}.sidebar-tree li>ul{margin-left:var(--sidebar-item-spacing-horizontal)}.sidebar-tree .icon,.sidebar-tree .reference{color:var(--color-sidebar-link-text)}.sidebar-tree .reference{box-sizing:border-box;display:inline-block;height:100%;line-height:var(--sidebar-item-line-height);overflow-wrap:anywhere;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-decoration:none;width:100%}.sidebar-tree .reference:hover{background:var(--color-sidebar-item-background--hover)}.sidebar-tree .reference.external:after{color:var(--color-sidebar-link-text);content:url("data:image/svg+xml;charset=utf-8,%3Csvg width='12' height='12' xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' stroke-width='1.5' stroke='%23607D8B' fill='none' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M0 0h24v24H0z' stroke='none'/%3E%3Cpath d='M11 7H6a2 2 0 0 0-2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2-2v-5M10 14 20 4M15 4h5v5'/%3E%3C/svg%3E");margin:0 .25rem;vertical-align:middle}.sidebar-tree .current-page>.reference{font-weight:700}.sidebar-tree label{align-items:center;cursor:pointer;display:flex;height:var(--sidebar-item-height);justify-content:center;position:absolute;right:0;top:0;-webkit-user-select:none;-moz-user-select:none;user-select:none;width:var(--sidebar-expander-width)}.sidebar-tree .caption,.sidebar-tree :not(.caption)>.caption-text{color:var(--color-sidebar-caption-text);font-size:var(--sidebar-caption-font-size);font-weight:700;margin:var(--sidebar-caption-space-above) 0 0 0;padding:var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal);text-transform:uppercase}.sidebar-tree li.has-children>.reference{padding-right:var(--sidebar-expander-width)}.sidebar-tree .toctree-l1>.reference,.sidebar-tree .toctree-l1>label .icon{color:var(--color-sidebar-link-text--top-level)}.sidebar-tree label{background:var(--color-sidebar-item-expander-background)}.sidebar-tree label:hover{background:var(--color-sidebar-item-expander-background--hover)}.sidebar-tree .current>.reference{background:var(--color-sidebar-item-background--current)}.sidebar-tree .current>.reference:hover{background:var(--color-sidebar-item-background--hover)}.toctree-checkbox{display:none;position:absolute}.toctree-checkbox~ul{display:none}.toctree-checkbox~label .icon svg{transform:rotate(90deg)}.toctree-checkbox:checked~ul{display:block}.toctree-checkbox:checked~label .icon svg{transform:rotate(-90deg)}.toc-title-container{padding:var(--toc-title-padding);padding-top:var(--toc-spacing-vertical)}.toc-title{color:var(--color-toc-title-text);font-size:var(--toc-title-font-size);padding-left:var(--toc-spacing-horizontal);text-transform:uppercase}.no-toc{display:none}.toc-tree-container{padding-bottom:var(--toc-spacing-vertical)}.toc-tree{border-left:1px solid var(--color-background-border);font-size:var(--toc-font-size);line-height:1.3;padding-left:calc(var(--toc-spacing-horizontal) - var(--toc-item-spacing-horizontal))}.toc-tree>ul>li:first-child{padding-top:0}.toc-tree>ul>li:first-child>ul{padding-left:0}.toc-tree>ul>li:first-child>a{display:none}.toc-tree ul{list-style-type:none;margin-bottom:0;margin-top:0;padding-left:var(--toc-item-spacing-horizontal)}.toc-tree li{padding-top:var(--toc-item-spacing-vertical)}.toc-tree li.scroll-current>.reference{color:var(--color-toc-item-text--active);font-weight:700}.toc-tree .reference{color:var(--color-toc-item-text);overflow-wrap:anywhere;text-decoration:none}.toc-scroll{max-height:100vh;overflow-y:scroll}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here){background:rgba(255,0,0,.25);color:var(--color-problematic)}.contents:not(.this-will-duplicate-information-and-it-is-still-useful-here):before{content:"ERROR: Adding a table of contents in Furo-based documentation is unnecessary, and does not work well with existing styling.Add a 'this-will-duplicate-information-and-it-is-still-useful-here' class, if you want an escape hatch."}.text-align\:left>p{text-align:left}.text-align\:center>p{text-align:center}.text-align\:right>p{text-align:right} -/*# sourceMappingURL=furo.css.map*/ \ No newline at end of file diff --git a/pr-preview/pr-273/_static/styles/furo.css.map b/pr-preview/pr-273/_static/styles/furo.css.map deleted file mode 100644 index d1dfb109d..000000000 --- a/pr-preview/pr-273/_static/styles/furo.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"styles/furo.css","mappings":"AAAA,2EAA2E,CAU3E,KAEE,6BAA8B,CAD9B,gBAEF,CASA,KACE,QACF,CAMA,KACE,aACF,CAOA,GACE,aAAc,CACd,cACF,CAUA,GACE,sBAAuB,CACvB,QAAS,CACT,gBACF,CAOA,IACE,+BAAiC,CACjC,aACF,CASA,EACE,4BACF,CAOA,YACE,kBAAmB,CACnB,yBAA0B,CAC1B,gCACF,CAMA,SAEE,kBACF,CAOA,cAGE,+BAAiC,CACjC,aACF,CAeA,QAEE,aAAc,CACd,aAAc,CACd,iBAAkB,CAClB,uBACF,CAEA,IACE,aACF,CAEA,IACE,SACF,CASA,IACE,iBACF,CAUA,sCAKE,mBAAoB,CACpB,cAAe,CACf,gBAAiB,CACjB,QACF,CAOA,aAEE,gBACF,CAOA,cAEE,mBACF,CAMA,gDAIE,yBACF,CAMA,wHAIE,iBAAkB,CAClB,SACF,CAMA,4GAIE,6BACF,CAMA,SACE,0BACF,CASA,OACE,qBAAsB,CACtB,aAAc,CACd,aAAc,CACd,cAAe,CACf,SAAU,CACV,kBACF,CAMA,SACE,uBACF,CAMA,SACE,aACF,CAOA,6BAEE,qBAAsB,CACtB,SACF,CAMA,kFAEE,WACF,CAOA,cACE,4BAA6B,CAC7B,mBACF,CAMA,yCACE,uBACF,CAOA,6BACE,yBAA0B,CAC1B,YACF,CASA,QACE,aACF,CAMA,QACE,iBACF,CAiBA,kBACE,YACF,CCvVA,aAcE,kEACE,uBAOF,WACE,iDAMF,gCACE,wBAEF,qCAEE,uBADA,uBACA,CAEF,SACE,wBAtBA,CCpBJ,iBAOE,6BAEA,mBANA,qBAEA,sBACA,0BAFA,oBAHA,4BAOA,6BANA,mBAOA,CAEF,gBACE,aCPF,KCGE,mHAEA,wGAGA,wBAAyB,CACzB,wBAAyB,CACzB,4BAA6B,CAC7B,yBAA0B,CAC1B,2BAA4B,CAG5B,sDAAuD,CACvD,gDAAiD,CACjD,wDAAyD,CAGzD,0CAA2C,CAC3C,gDAAiD,CACjD,gDAAiD,CAKjD,gCAAiC,CACjC,sCAAuC,CAGvC,2CAA4C,CAG5C,uCAAwC,CChCxC,+FAGA,uBAAwB,CAGxB,iCAAkC,CAClC,kCAAmC,CAEnC,+BAAgC,CAChC,sCAAuC,CACvC,sCAAuC,CACvC,qGAIA,mDAAoD,CAEpD,mCAAoC,CACpC,8CAA+C,CAC/C,gDAAiD,CACjD,kCAAmC,CACnC,6DAA8D,CAG9D,6BAA8B,CAC9B,6BAA8B,CAC9B,+BAAgC,CAChC,kCAAmC,CACnC,kCAAmC,CCPjC,ukBCYA,srCAZF,kaCVA,mLAOA,oTAWA,2UAaA,0CACA,gEACA,0CAGA,gEAUA,yCACA,+DAGA,4CACA,CACA,iEAGA,sGACA,uCACA,4DAGA,sCACA,2DAEA,4CACA,kEACA,oGACA,CAEA,0GACA,+CAGA,+MAOA,+EACA,wCAIA,4DACA,sEACA,kEACA,sEACA,gDAGA,+DACA,0CACA,gEACA,gGACA,CAGA,2DACA,qDAGA,0CACA,8CACA,oDACA,oDL7GF,iCAEA,iEAME,oCKyGA,yDAIA,sCACA,kCACA,sDAGA,0CACA,kEACA,oDAEA,sDAGA,oCACA,oEAIA,CAGA,yDAGA,qDACA,oDAGA,6DAIA,iEAGA,2DAEA,2DL9IE,4DAEA,gEAIF,gEKgGA,gFAIA,oNAOA,qDAEA,gFAIA,4DAIA,oEAMA,yEAIA,6DACA,0DAGA,uDAGA,qDAEA,wDLpII,6DAEA,yDACE,2DAMN,uCAIA,yCACE,8CAGF,sDMjDA,6DAKA,oCAIA,4CACA,kBAGF,sBAMA,2BAME,qCAGA,qCAEA,iCAEA,+BAEA,mCAEA,qCAIA,CACA,gCACA,gDAKA,kCAIA,6BAEA,0CAQA,kCAIF,8BAGE,8BACA,uCAGF,sCAKE,kCAEA,sDAGA,iCACE,CACA,2FAGA,gCACE,CACA,+DCzEJ,wCAEA,sBAEF,yDAEE,mCACA,wDAGA,2GAGA,wIACE,gDAMJ,kCAGE,6BACA,0CAGA,gEACA,8BACA,uCAKA,sCAIA,kCACA,sDACA,iCACA,sCAOA,sDAKE,gGAIE,+CAGN,sBAEE,yCAMA,0BAMA,yLAMA,aACA,MAEF,6BACE,2DAIF,wCAIE,kCAGA,SACA,kCAKA,mBAGA,CAJA,eACA,CAHF,gBAEE,CAWA,mBACA,mBACA,mDAGA,YACA,CACA,kBACA,CAEE,kBAKJ,OAPE,kBAQA,CADF,GACE,iCACA,wCAEA,wBACA,aACA,CAFA,WAEA,GACA,oBACA,CAFA,gBAEA,aACE,+CAIF,UAJE,kCAIF,WACA,iBACA,GAGA,uBACE,CAJF,yBAGA,CACE,iDACA,uCAEA,yDACE,cACA,wDAKN,yDAIE,uBAEF,kBACE,uBAEA,kDAIA,0DAGA,CAHA,oBAGA,0GAYA,aAEA,CAHA,YAGA,4HAKF,+CAGE,sBAEF,WAKE,0CAEA,CALA,qCAGA,CAJA,WAOA,SAIA,2CAJA,qCAIA,CACE,wBACA,OACA,YAEJ,gBACE,gBAIA,+CAKF,CAGE,kDAGA,CANF,8BAGE,CAGA,YAEA,CAdF,2BACE,CAHA,UAEF,CAYE,UAEA,CACA,0CACF,iEAOE,iCACA,8BAGA,wCAIA,wBAKE,0CAKF,CARE,6DAGA,CALF,qBAEE,CASA,YACA,yBAGA,CAEE,cAKN,CAPI,sBAOJ,gCAGE,qBAEA,WACA,aACA,sCAEA,mBACA,6BAGA,uEADA,qBACA,6BAIA,yBACA,qCAEE,UAEA,YACA,sBAEF,8BAGA,CAPE,aACA,WAMF,4BACE,sBACA,WAMJ,uBACE,cAYE,mBAXA,qDAKA,qCAGA,CAEA,YACA,CAHA,2BAEA,CACA,oCAEA,4CACA,uBAIA,oCAEJ,CAFI,cAIF,iBACE,CAHJ,kBAGI,yBAEA,oCAIA,qDAMF,mEAEA,CACE,8CAKA,gCAEA,qCAGA,oCAGE,sBACA,CAJF,WAEE,CAFF,eAEE,SAEA,mBACA,qCACE,aACA,CAFF,YADA,qBACA,WAEE,sBACA,kEAEN,2BAEE,iDAKA,uCAGF,CACE,0DAKA,kBACF,CAFE,sBAGA,mBACA,0BAEJ,yBAII,aADA,WACA,CAMF,UAFE,kBAEF,CAJF,gBACE,CAHE,iBAMF,6CC9ZF,yBACE,WACA,iBAEA,aAFA,iBAEA,6BAEA,kCACA,mBAKA,gCAGA,CARA,QAEA,CAGA,UALA,qBAEA,qDAGA,CALA,OAQA,4BACE,cAGF,2BACE,gCAEJ,CAHE,UAGF,8CAGE,CAHF,UAGE,wCAGA,qBACA,CAFA,UAEA,6CAGA,yCAIA,sBAHA,UAGA,kCACE,OACA,CAFF,KAEE,cAQF,0CACE,CAFF,kBACA,CACE,wEACA,CARA,YACA,CAKF,mBAFF,OAII,eACA,CAJF,iCAJE,cAGJ,CANI,oBAEA,CAKF,SAIE,2BADA,UACA,kBAGF,sCACA,CAFF,WACE,WACA,qCACE,gCACA,2EACA,sDAKJ,aACE,mDAII,CAJJ,6CAII,kEACA,iBACE,iDACA,+CACE,aACA,WADA,+BACA,uEANN,YACE,mDAEE,mBADF,0CACE,CADF,qBACE,0DACA,YACE,4DACA,sEANN,YACE,8CACA,kBADA,UACA,2CACE,2EACA,cACE,kEACA,mEANN,yBACE,4DACA,sBACE,+EAEE,iEACA,qEANN,sCACE,CAGE,iBAHF,gBAGE,qBACE,CAJJ,uBACA,gDACE,wDACA,6DAHF,2CACA,CADA,gBACA,eACE,CAGE,sBANN,8BACE,CAII,iBAFF,4DACA,WACE,YADF,uCACE,6EACA,2BANN,8CACE,kDACA,0CACE,8BACA,yFACE,sBACA,sFALJ,mEACA,sBACE,kEACA,6EACE,uCACA,kEALJ,qGAEE,kEACA,6EACE,uCACA,kEALJ,8CACA,uDACE,sEACA,2EACE,sCACA,iEALJ,mGACA,qCACE,oDACA,0DACE,6GACA,gDAGR,yDCrEA,sEACE,CACA,6GACE,gEACF,iGAIF,wFACE,qDAGA,mGAEE,2CAEF,4FACE,gCACF,wGACE,8DAEE,6FAIA,iJAKN,6GACE,gDAKF,yDACA,qCAGA,6BACA,kBACA,qDAKA,oCAEA,+DAGA,2CAGE,oDAIA,oEAEE,qBAGJ,wDAEE,uCAEF,kEAGA,8CAEA,uDAKA,oCAEA,yDAEE,gEAKF,+CC5FA,0EAGE,CACA,qDCLJ,+DAIE,sCAIA,kEACE,yBACA,2FAMA,gBACA,yGCbF,mBAOA,2MAIA,4HAYA,0DACE,8GAYF,8HAQE,mBAEA,6HAOF,YAGA,mIAME,eACA,CAFF,YAEE,4FAMJ,8BAEE,uBAYA,sCAEE,CAJF,oBAEA,CARA,wCAEA,CAHA,8BACA,CAFA,eACA,CAGA,wCAEA,CAEA,mDAIE,kCACE,6BACA,4CAKJ,kDAIA,eACE,aAGF,8BACE,uDACA,sCACA,cAEA,+BACA,CAFA,eAEA,wCAEF,YACE,iBACA,mCACA,0DAGF,qBAEE,CAFF,kBAEE,+BAIA,yCAEE,qBADA,gBACA,yBAKF,eACA,CAFF,YACE,CACA,iBACA,qDAEA,mDCvIJ,2FAOE,iCACA,CAEA,eACA,CAHA,kBAEA,CAFA,wBAGA,8BACA,eACE,CAFF,YAEE,0BACA,8CAGA,oBACE,oCAGA,kBACE,8DAEA,iBAEN,UACE,8BAIJ,+CAEE,qDAEF,kDAIE,YAEF,CAFE,YAEF,CCjCE,mFAJA,QACA,UAIE,CADF,iBACE,mCAGA,iDACE,+BAGF,wBAEA,mBAKA,6CAEF,CAHE,mBACA,CAEF,kCAIE,CARA,kBACA,CAFF,eASE,YACA,mBAGF,CAJE,UAIF,wCCjCA,oBDmCE,wBCpCJ,uCACE,8BACA,4CACA,oBAGA,2CCAA,6CAGE,CAPF,uBAIA,CDGA,gDACE,6BCVJ,CAWM,2CAEF,CAJA,kCAEE,CDJF,aCLF,gBDKE,uBCMA,gCAGA,gDAGE,wBAGJ,0BAEA,iBACE,aACF,CADE,UACF,uBACE,aACF,oBACE,YACF,4BACE,6CAMA,CAYF,6DAZE,mCAGE,iCASJ,4BAGE,4DADA,+BACA,CAFA,qBAEA,yBACE,aAEF,wBAHA,SAGA,iHACE,2DAKF,CANA,yCACE,CADF,oCAMA,uSAIA,sGACE,oDChEJ,WAEF,yBACE,QACA,eAEA,gBAEE,uCAGA,CALF,iCAKE,uCAGA,0BACA,CACA,oBACA,iCClBJ,gBACE,KAGF,qBACE,YAGF,CAHE,cAGF,gCAEE,mBACA,iEAEA,oCACA,wCAEA,sBACA,WAEA,CAFA,YAEA,8EAEA,mCAFA,iBAEA,6BAIA,wEAKA,sDAIE,CARF,mDAIA,CAIE,cAEF,8CAIA,oBAFE,iBAEF,8CAGE,eAEF,CAFE,YAEF,OAEE,kBAGJ,CAJI,eACA,CAFF,mBAKF,yCCjDE,oBACA,CAFA,iBAEA,uCAKE,iBACA,qCAGA,mBCZJ,CDWI,gBCXJ,6BAEE,eACA,sBAGA,eAEA,sBACA,oDACA,iGAMA,gBAFE,YAEF,8FAME,iJClBF,YACA,gNAUE,6BAEF,oTAcI,kBACF,gHAIA,qBACE,eACF,qDACE,kBACF,6DACE,4BCxCJ,oBAEF,qCAEI,+CAGF,uBACE,uDAGJ,oBAkBE,mDAhBA,+CAaA,CAbA,oBAaA,0FAEE,CAFF,gGAbA,+BAaA,0BAGA,mQAIA,oNAEE,iBAGJ,CAHI,gBADA,gBAIJ,8CAYI,CAZJ,wCAYI,sVACE,iCAGA,uEAHA,QAGA,qXAKJ,iDAGF,CARM,+CACE,iDAIN,CALI,gBAQN,mHACE,gBAGF,2DACE,0EAOA,0EAKA,6EC/EA,iDACA,gCACA,oDAGA,qBACA,oDCFA,cACA,eAEA,yBAGF,sBAEE,iBACA,sNAWA,iBACE,kBACA,wRAgBA,kBAEA,iOAgBA,uCACE,uEAEA,kBAEF,qUAuBE,iDAIJ,CACA,geCxFF,4BAEE,CAQA,6JACA,iDAIA,sEAGA,mDAOF,iDAGE,4DAIA,8CACA,qDAEE,eAFF,cAEE,oBAEF,uBAFE,kCAGA,eACA,iBACA,mBAIA,mDACA,CAHA,uCAEA,CAJA,0CACA,CAIA,gBAJA,gBACA,oBADA,gBAIA,wBAEJ,gBAGE,6BACA,YAHA,iBAGA,gCACA,iEAEA,6CACA,sDACA,0BADA,wBACA,0BACA,oIAIA,mBAFA,YAEA,qBACA,0CAIE,uBAEF,CAHA,yBACE,CAEF,iDACE,mFAKJ,oCACE,CANE,aAKJ,CACE,qEAIA,YAFA,WAEA,CAHA,aACA,CAEA,gBACE,4BACA,sBADA,aACA,gCAMF,oCACA,yDACA,2CAEA,qBAGE,kBAEA,CACA,mCAIF,CARE,YACA,CAOF,iCAEE,CAPA,oBACA,CAQA,oBACE,uDAEJ,sDAGA,CAHA,cAGA,0BACE,oDAIA,oCACA,4BACA,sBAGA,cAEA,oFAGA,sBAEA,yDACE,CAIA,iBAJA,wBAIA,6CAJA,6CAOA,4BAGJ,CAHI,cAGJ,yCAGA,kBACE,CAIA,iDAEA,CATA,YAEF,CACE,4CAGA,kBAIA,wEAEA,wDAIF,kCAOE,iDACA,CARF,WAIE,sCAGA,CANA,2CACA,CAMA,oEARF,iBACE,CACA,qCAMA,iBAuBE,uBAlBF,YAKA,2DALA,uDAKA,CALA,sBAiBA,4CACE,CALA,gRAIF,YACE,UAEN,uBACE,YACA,mCAOE,+CAGA,8BAGF,+CAGA,4BCjNA,SDiNA,qFCjNA,gDAGA,sCACA,qCACA,sDAIF,CAIE,kDAGA,CAPF,0CAOE,kBAEA,kDAEA,CAHA,eACA,CAFA,YACA,CADA,SAIA,mHAIE,CAGA,6CAFA,oCAeE,CAbF,yBACE,qBAEJ,CAGE,oBACA,CAEA,YAFA,2CACF,CACE,uBAEA,mFAEE,CALJ,oBACE,CAEA,UAEE,gCAGF,sDAEA,yCC7CJ,oCAGA,CD6CE,yXAQE,sCCrDJ,wCAGA,oCACE","sources":["webpack:///./node_modules/normalize.css/normalize.css","webpack:///./src/furo/assets/styles/base/_print.sass","webpack:///./src/furo/assets/styles/base/_screen-readers.sass","webpack:///./src/furo/assets/styles/base/_theme.sass","webpack:///./src/furo/assets/styles/variables/_fonts.scss","webpack:///./src/furo/assets/styles/variables/_spacing.scss","webpack:///./src/furo/assets/styles/variables/_icons.scss","webpack:///./src/furo/assets/styles/variables/_admonitions.scss","webpack:///./src/furo/assets/styles/variables/_colors.scss","webpack:///./src/furo/assets/styles/base/_typography.sass","webpack:///./src/furo/assets/styles/_scaffold.sass","webpack:///./src/furo/assets/styles/content/_admonitions.sass","webpack:///./src/furo/assets/styles/content/_api.sass","webpack:///./src/furo/assets/styles/content/_blocks.sass","webpack:///./src/furo/assets/styles/content/_captions.sass","webpack:///./src/furo/assets/styles/content/_code.sass","webpack:///./src/furo/assets/styles/content/_footnotes.sass","webpack:///./src/furo/assets/styles/content/_images.sass","webpack:///./src/furo/assets/styles/content/_indexes.sass","webpack:///./src/furo/assets/styles/content/_lists.sass","webpack:///./src/furo/assets/styles/content/_math.sass","webpack:///./src/furo/assets/styles/content/_misc.sass","webpack:///./src/furo/assets/styles/content/_rubrics.sass","webpack:///./src/furo/assets/styles/content/_sidebar.sass","webpack:///./src/furo/assets/styles/content/_tables.sass","webpack:///./src/furo/assets/styles/content/_target.sass","webpack:///./src/furo/assets/styles/content/_gui-labels.sass","webpack:///./src/furo/assets/styles/components/_footer.sass","webpack:///./src/furo/assets/styles/components/_sidebar.sass","webpack:///./src/furo/assets/styles/components/_table_of_contents.sass","webpack:///./src/furo/assets/styles/_shame.sass"],"sourcesContent":["/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */\n\n/* Document\n ========================================================================== */\n\n/**\n * 1. Correct the line height in all browsers.\n * 2. Prevent adjustments of font size after orientation changes in iOS.\n */\n\nhtml {\n line-height: 1.15; /* 1 */\n -webkit-text-size-adjust: 100%; /* 2 */\n}\n\n/* Sections\n ========================================================================== */\n\n/**\n * Remove the margin in all browsers.\n */\n\nbody {\n margin: 0;\n}\n\n/**\n * Render the `main` element consistently in IE.\n */\n\nmain {\n display: block;\n}\n\n/**\n * Correct the font size and margin on `h1` elements within `section` and\n * `article` contexts in Chrome, Firefox, and Safari.\n */\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n/* Grouping content\n ========================================================================== */\n\n/**\n * 1. Add the correct box sizing in Firefox.\n * 2. Show the overflow in Edge and IE.\n */\n\nhr {\n box-sizing: content-box; /* 1 */\n height: 0; /* 1 */\n overflow: visible; /* 2 */\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\npre {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/* Text-level semantics\n ========================================================================== */\n\n/**\n * Remove the gray background on active links in IE 10.\n */\n\na {\n background-color: transparent;\n}\n\n/**\n * 1. Remove the bottom border in Chrome 57-\n * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari.\n */\n\nabbr[title] {\n border-bottom: none; /* 1 */\n text-decoration: underline; /* 2 */\n text-decoration: underline dotted; /* 2 */\n}\n\n/**\n * Add the correct font weight in Chrome, Edge, and Safari.\n */\n\nb,\nstrong {\n font-weight: bolder;\n}\n\n/**\n * 1. Correct the inheritance and scaling of font size in all browsers.\n * 2. Correct the odd `em` font sizing in all browsers.\n */\n\ncode,\nkbd,\nsamp {\n font-family: monospace, monospace; /* 1 */\n font-size: 1em; /* 2 */\n}\n\n/**\n * Add the correct font size in all browsers.\n */\n\nsmall {\n font-size: 80%;\n}\n\n/**\n * Prevent `sub` and `sup` elements from affecting the line height in\n * all browsers.\n */\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsub {\n bottom: -0.25em;\n}\n\nsup {\n top: -0.5em;\n}\n\n/* Embedded content\n ========================================================================== */\n\n/**\n * Remove the border on images inside links in IE 10.\n */\n\nimg {\n border-style: none;\n}\n\n/* Forms\n ========================================================================== */\n\n/**\n * 1. Change the font styles in all browsers.\n * 2. Remove the margin in Firefox and Safari.\n */\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n font-family: inherit; /* 1 */\n font-size: 100%; /* 1 */\n line-height: 1.15; /* 1 */\n margin: 0; /* 2 */\n}\n\n/**\n * Show the overflow in IE.\n * 1. Show the overflow in Edge.\n */\n\nbutton,\ninput { /* 1 */\n overflow: visible;\n}\n\n/**\n * Remove the inheritance of text transform in Edge, Firefox, and IE.\n * 1. Remove the inheritance of text transform in Firefox.\n */\n\nbutton,\nselect { /* 1 */\n text-transform: none;\n}\n\n/**\n * Correct the inability to style clickable types in iOS and Safari.\n */\n\nbutton,\n[type=\"button\"],\n[type=\"reset\"],\n[type=\"submit\"] {\n -webkit-appearance: button;\n}\n\n/**\n * Remove the inner border and padding in Firefox.\n */\n\nbutton::-moz-focus-inner,\n[type=\"button\"]::-moz-focus-inner,\n[type=\"reset\"]::-moz-focus-inner,\n[type=\"submit\"]::-moz-focus-inner {\n border-style: none;\n padding: 0;\n}\n\n/**\n * Restore the focus styles unset by the previous rule.\n */\n\nbutton:-moz-focusring,\n[type=\"button\"]:-moz-focusring,\n[type=\"reset\"]:-moz-focusring,\n[type=\"submit\"]:-moz-focusring {\n outline: 1px dotted ButtonText;\n}\n\n/**\n * Correct the padding in Firefox.\n */\n\nfieldset {\n padding: 0.35em 0.75em 0.625em;\n}\n\n/**\n * 1. Correct the text wrapping in Edge and IE.\n * 2. Correct the color inheritance from `fieldset` elements in IE.\n * 3. Remove the padding so developers are not caught out when they zero out\n * `fieldset` elements in all browsers.\n */\n\nlegend {\n box-sizing: border-box; /* 1 */\n color: inherit; /* 2 */\n display: table; /* 1 */\n max-width: 100%; /* 1 */\n padding: 0; /* 3 */\n white-space: normal; /* 1 */\n}\n\n/**\n * Add the correct vertical alignment in Chrome, Firefox, and Opera.\n */\n\nprogress {\n vertical-align: baseline;\n}\n\n/**\n * Remove the default vertical scrollbar in IE 10+.\n */\n\ntextarea {\n overflow: auto;\n}\n\n/**\n * 1. Add the correct box sizing in IE 10.\n * 2. Remove the padding in IE 10.\n */\n\n[type=\"checkbox\"],\n[type=\"radio\"] {\n box-sizing: border-box; /* 1 */\n padding: 0; /* 2 */\n}\n\n/**\n * Correct the cursor style of increment and decrement buttons in Chrome.\n */\n\n[type=\"number\"]::-webkit-inner-spin-button,\n[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n/**\n * 1. Correct the odd appearance in Chrome and Safari.\n * 2. Correct the outline style in Safari.\n */\n\n[type=\"search\"] {\n -webkit-appearance: textfield; /* 1 */\n outline-offset: -2px; /* 2 */\n}\n\n/**\n * Remove the inner padding in Chrome and Safari on macOS.\n */\n\n[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n/**\n * 1. Correct the inability to style clickable types in iOS and Safari.\n * 2. Change font properties to `inherit` in Safari.\n */\n\n::-webkit-file-upload-button {\n -webkit-appearance: button; /* 1 */\n font: inherit; /* 2 */\n}\n\n/* Interactive\n ========================================================================== */\n\n/*\n * Add the correct display in Edge, IE 10+, and Firefox.\n */\n\ndetails {\n display: block;\n}\n\n/*\n * Add the correct display in all browsers.\n */\n\nsummary {\n display: list-item;\n}\n\n/* Misc\n ========================================================================== */\n\n/**\n * Add the correct display in IE 10+.\n */\n\ntemplate {\n display: none;\n}\n\n/**\n * Add the correct display in IE 10.\n */\n\n[hidden] {\n display: none;\n}\n","// This file contains styles for managing print media.\n\n////////////////////////////////////////////////////////////////////////////////\n// Hide elements not relevant to print media.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Hide icon container.\n .content-icon-container\n display: none !important\n\n // Hide showing header links if hovering over when printing.\n .headerlink\n display: none !important\n\n // Hide mobile header.\n .mobile-header\n display: none !important\n\n // Hide navigation links.\n .related-pages\n display: none !important\n\n////////////////////////////////////////////////////////////////////////////////\n// Tweaks related to decolorization.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n // Apply a border around code which no longer have a color background.\n .highlight\n border: 0.1pt solid var(--color-foreground-border)\n\n////////////////////////////////////////////////////////////////////////////////\n// Avoid page break in some relevant cases.\n////////////////////////////////////////////////////////////////////////////////\n@media print\n ul, ol, dl, a, table, pre, blockquote\n page-break-inside: avoid\n\n h1, h2, h3, h4, h5, h6, img, figure, caption\n page-break-inside: avoid\n page-break-after: avoid\n\n ul, ol, dl\n page-break-before: avoid\n",".visually-hidden\n position: absolute !important\n width: 1px !important\n height: 1px !important\n padding: 0 !important\n margin: -1px !important\n overflow: hidden !important\n clip: rect(0,0,0,0) !important\n white-space: nowrap !important\n border: 0 !important\n\n:-moz-focusring\n outline: auto\n","// This file serves as the \"skeleton\" of the theming logic.\n//\n// This contains the bulk of the logic for handling dark mode, color scheme\n// toggling and the handling of color-scheme-specific hiding of elements.\n\nbody\n @include fonts\n @include spacing\n @include icons\n @include admonitions\n @include default-admonition(#651fff, \"abstract\")\n @include default-topic(#14B8A6, \"pencil\")\n\n @include colors\n\n.only-light\n display: block !important\nhtml body .only-dark\n display: none !important\n\n// Ignore dark-mode hints if print media.\n@media not print\n // Enable dark-mode, if requested.\n body[data-theme=\"dark\"]\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n // Enable dark mode, unless explicitly told to avoid.\n @media (prefers-color-scheme: dark)\n body:not([data-theme=\"light\"])\n @include colors-dark\n\n html & .only-light\n display: none !important\n .only-dark\n display: block !important\n\n//\n// Theme toggle presentation\n//\nbody[data-theme=\"auto\"]\n .theme-toggle svg.theme-icon-when-auto\n display: block\n\nbody[data-theme=\"dark\"]\n .theme-toggle svg.theme-icon-when-dark\n display: block\n\nbody[data-theme=\"light\"]\n .theme-toggle svg.theme-icon-when-light\n display: block\n","// Fonts used by this theme.\n//\n// There are basically two things here -- using the system font stack and\n// defining sizes for various elements in %ages. We could have also used `em`\n// but %age is easier to reason about for me.\n\n@mixin fonts {\n // These are adapted from https://systemfontstack.com/\n --font-stack: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial,\n sans-serif, Apple Color Emoji, Segoe UI Emoji;\n --font-stack--monospace: \"SFMono-Regular\", Menlo, Consolas, Monaco,\n Liberation Mono, Lucida Console, monospace;\n\n --font-size--normal: 100%;\n --font-size--small: 87.5%;\n --font-size--small--2: 81.25%;\n --font-size--small--3: 75%;\n --font-size--small--4: 62.5%;\n\n // Sidebar\n --sidebar-caption-font-size: var(--font-size--small--2);\n --sidebar-item-font-size: var(--font-size--small);\n --sidebar-search-input-font-size: var(--font-size--small);\n\n // Table of Contents\n --toc-font-size: var(--font-size--small--3);\n --toc-font-size--mobile: var(--font-size--normal);\n --toc-title-font-size: var(--font-size--small--4);\n\n // Admonitions\n //\n // These aren't defined in terms of %ages, since nesting these is permitted.\n --admonition-font-size: 0.8125rem;\n --admonition-title-font-size: 0.8125rem;\n\n // Code\n --code-font-size: var(--font-size--small--2);\n\n // API\n --api-font-size: var(--font-size--small);\n}\n","// Spacing for various elements on the page\n//\n// If the user wants to tweak things in a certain way, they are permitted to.\n// They also have to deal with the consequences though!\n\n@mixin spacing {\n // Header!\n --header-height: calc(\n var(--sidebar-item-line-height) + 4 * #{var(--sidebar-item-spacing-vertical)}\n );\n --header-padding: 0.5rem;\n\n // Sidebar\n --sidebar-tree-space-above: 1.5rem;\n --sidebar-caption-space-above: 1rem;\n\n --sidebar-item-line-height: 1rem;\n --sidebar-item-spacing-vertical: 0.5rem;\n --sidebar-item-spacing-horizontal: 1rem;\n --sidebar-item-height: calc(\n var(--sidebar-item-line-height) + 2 *#{var(--sidebar-item-spacing-vertical)}\n );\n\n --sidebar-expander-width: var(--sidebar-item-height); // be square\n\n --sidebar-search-space-above: 0.5rem;\n --sidebar-search-input-spacing-vertical: 0.5rem;\n --sidebar-search-input-spacing-horizontal: 0.5rem;\n --sidebar-search-input-height: 1rem;\n --sidebar-search-icon-size: var(--sidebar-search-input-height);\n\n // Table of Contents\n --toc-title-padding: 0.25rem 0;\n --toc-spacing-vertical: 1.5rem;\n --toc-spacing-horizontal: 1.5rem;\n --toc-item-spacing-vertical: 0.4rem;\n --toc-item-spacing-horizontal: 1rem;\n}\n","// Expose theme icons as CSS variables.\n\n$icons: (\n // Adapted from tabler-icons\n // url: https://tablericons.com/\n \"search\":\n url('data:image/svg+xml;charset=utf-8,'),\n // Factored out from mkdocs-material on 24-Aug-2020.\n // url: https://squidfunk.github.io/mkdocs-material/reference/admonitions/\n \"pencil\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"abstract\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"info\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"flame\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"question\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"warning\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"failure\":\n url('data:image/svg+xml;charset=utf-8,'),\n \"spark\":\n url('data:image/svg+xml;charset=utf-8,')\n);\n\n@mixin icons {\n @each $name, $glyph in $icons {\n --icon-#{$name}: #{$glyph};\n }\n}\n","// Admonitions\n\n// Structure of these is:\n// admonition-class: color \"icon-name\";\n//\n// The colors are translated into CSS variables below. The icons are\n// used directly in the main declarations to set the `mask-image` in\n// the title.\n\n// prettier-ignore\n$admonitions: (\n // Each of these has an reST directives for it.\n \"caution\": #ff9100 \"spark\",\n \"warning\": #ff9100 \"warning\",\n \"danger\": #ff5252 \"spark\",\n \"attention\": #ff5252 \"warning\",\n \"error\": #ff5252 \"failure\",\n \"hint\": #00c852 \"question\",\n \"tip\": #00c852 \"info\",\n \"important\": #00bfa5 \"flame\",\n \"note\": #00b0ff \"pencil\",\n \"seealso\": #448aff \"info\",\n \"admonition-todo\": #808080 \"pencil\"\n);\n\n@mixin default-admonition($color, $icon-name) {\n --color-admonition-title: #{$color};\n --color-admonition-title-background: #{rgba($color, 0.2)};\n\n --icon-admonition-default: var(--icon-#{$icon-name});\n}\n\n@mixin default-topic($color, $icon-name) {\n --color-topic-title: #{$color};\n --color-topic-title-background: #{rgba($color, 0.2)};\n\n --icon-topic-default: var(--icon-#{$icon-name});\n}\n\n@mixin admonitions {\n @each $name, $values in $admonitions {\n --color-admonition-title--#{$name}: #{nth($values, 1)};\n --color-admonition-title-background--#{$name}: #{rgba(\n nth($values, 1),\n 0.2\n )};\n }\n}\n","// Colors used throughout this theme.\n//\n// The aim is to give the user more control. Thus, instead of hard-coding colors\n// in various parts of the stylesheet, the approach taken is to define all\n// colors as CSS variables and reusing them in all the places.\n//\n// `colors-dark` depends on `colors` being included at a lower specificity.\n\n@mixin colors {\n --color-problematic: #b30000;\n\n // Base Colors\n --color-foreground-primary: black; // for main text and headings\n --color-foreground-secondary: #5a5c63; // for secondary text\n --color-foreground-muted: #646776; // for muted text\n --color-foreground-border: #878787; // for content borders\n\n --color-background-primary: white; // for content\n --color-background-secondary: #f8f9fb; // for navigation + ToC\n --color-background-hover: #efeff4ff; // for navigation-item hover\n --color-background-hover--transparent: #efeff400;\n --color-background-border: #eeebee; // for UI borders\n --color-background-item: #ccc; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2962ff;\n --color-brand-content: #2a5adf;\n\n // API documentation\n --color-api-background: var(--color-background-hover--transparent);\n --color-api-background-hover: var(--color-background-hover);\n --color-api-overall: var(--color-foreground-secondary);\n --color-api-name: var(--color-problematic);\n --color-api-pre-name: var(--color-problematic);\n --color-api-paren: var(--color-foreground-secondary);\n --color-api-keyword: var(--color-foreground-primary);\n --color-highlight-on-target: #ffffcc;\n\n // Inline code background\n --color-inline-code-background: var(--color-background-secondary);\n\n // Highlighted text (search)\n --color-highlighted-background: #ddeeff;\n --color-highlighted-text: var(--color-foreground-primary);\n\n // GUI Labels\n --color-guilabel-background: #ddeeff80;\n --color-guilabel-border: #bedaf580;\n --color-guilabel-text: var(--color-foreground-primary);\n\n // Admonitions!\n --color-admonition-background: transparent;\n\n //////////////////////////////////////////////////////////////////////////////\n // Everything below this should be one of:\n // - var(...)\n // - *-gradient(...)\n // - special literal values (eg: transparent, none)\n //////////////////////////////////////////////////////////////////////////////\n\n // Tables\n --color-table-header-background: var(--color-background-secondary);\n --color-table-border: var(--color-background-border);\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: transparent;\n --color-card-marginals-background: var(--color-background-secondary);\n\n // Header\n --color-header-background: var(--color-background-primary);\n --color-header-border: var(--color-background-border);\n --color-header-text: var(--color-foreground-primary);\n\n // Sidebar (left)\n --color-sidebar-background: var(--color-background-secondary);\n --color-sidebar-background-border: var(--color-background-border);\n\n --color-sidebar-brand-text: var(--color-foreground-primary);\n --color-sidebar-caption-text: var(--color-foreground-muted);\n --color-sidebar-link-text: var(--color-foreground-secondary);\n --color-sidebar-link-text--top-level: var(--color-brand-primary);\n\n --color-sidebar-item-background: var(--color-sidebar-background);\n --color-sidebar-item-background--current: var(\n --color-sidebar-item-background\n );\n --color-sidebar-item-background--hover: linear-gradient(\n 90deg,\n var(--color-background-hover--transparent) 0%,\n var(--color-background-hover) var(--sidebar-item-spacing-horizontal),\n var(--color-background-hover) 100%\n );\n\n --color-sidebar-item-expander-background: transparent;\n --color-sidebar-item-expander-background--hover: var(\n --color-background-hover\n );\n\n --color-sidebar-search-text: var(--color-foreground-primary);\n --color-sidebar-search-background: var(--color-background-secondary);\n --color-sidebar-search-background--focus: var(--color-background-primary);\n --color-sidebar-search-border: var(--color-background-border);\n --color-sidebar-search-icon: var(--color-foreground-muted);\n\n // Table of Contents (right)\n --color-toc-background: var(--color-background-primary);\n --color-toc-title-text: var(--color-foreground-muted);\n --color-toc-item-text: var(--color-foreground-secondary);\n --color-toc-item-text--hover: var(--color-foreground-primary);\n --color-toc-item-text--active: var(--color-brand-primary);\n\n // Actual page contents\n --color-content-foreground: var(--color-foreground-primary);\n --color-content-background: transparent;\n\n // Links\n --color-link: var(--color-brand-content);\n --color-link--hover: var(--color-brand-content);\n --color-link-underline: var(--color-background-border);\n --color-link-underline--hover: var(--color-foreground-border);\n}\n\n@mixin colors-dark {\n --color-problematic: #ee5151;\n\n // Base Colors\n --color-foreground-primary: #ffffffcc; // for main text and headings\n --color-foreground-secondary: #9ca0a5; // for secondary text\n --color-foreground-muted: #81868d; // for muted text\n --color-foreground-border: #666666; // for content borders\n\n --color-background-primary: #131416; // for content\n --color-background-secondary: #1a1c1e; // for navigation + ToC\n --color-background-hover: #1e2124ff; // for navigation-item hover\n --color-background-hover--transparent: #1e212400;\n --color-background-border: #303335; // for UI borders\n --color-background-item: #444; // for \"background\" items (eg: copybutton)\n\n // Announcements\n --color-announcement-background: #000000dd;\n --color-announcement-text: #eeebee;\n\n // Brand colors\n --color-brand-primary: #2b8cee;\n --color-brand-content: #368ce2;\n\n // Highlighted text (search)\n --color-highlighted-background: #083563;\n\n // GUI Labels\n --color-guilabel-background: #08356380;\n --color-guilabel-border: #13395f80;\n\n // API documentation\n --color-api-keyword: var(--color-foreground-secondary);\n --color-highlight-on-target: #333300;\n\n // Admonitions\n --color-admonition-background: #18181a;\n\n // Cards\n --color-card-border: var(--color-background-secondary);\n --color-card-background: #18181a;\n --color-card-marginals-background: var(--color-background-hover);\n}\n","// This file contains the styling for making the content throughout the page,\n// including fonts, paragraphs, headings and spacing among these elements.\n\nbody\n font-family: var(--font-stack)\npre,\ncode,\nkbd,\nsamp\n font-family: var(--font-stack--monospace)\n\n// Make fonts look slightly nicer.\nbody\n -webkit-font-smoothing: antialiased\n -moz-osx-font-smoothing: grayscale\n\n// Line height from Bootstrap 4.1\narticle\n line-height: 1.5\n\n//\n// Headings\n//\nh1,\nh2,\nh3,\nh4,\nh5,\nh6\n line-height: 1.25\n font-weight: bold\n\n border-radius: 0.5rem\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n margin-left: -0.5rem\n margin-right: -0.5rem\n padding-left: 0.5rem\n padding-right: 0.5rem\n\n + p\n margin-top: 0\n\nh1\n font-size: 2.5em\n margin-top: 1.75rem\n margin-bottom: 1rem\nh2\n font-size: 2em\n margin-top: 1.75rem\nh3\n font-size: 1.5em\nh4\n font-size: 1.25em\nh5\n font-size: 1.125em\nh6\n font-size: 1em\n\nsmall\n opacity: 75%\n font-size: 80%\n\n// Paragraph\np\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n\n// Horizontal rules\nhr.docutils\n height: 1px\n padding: 0\n margin: 2rem 0\n background-color: var(--color-background-border)\n border: 0\n\n.centered\n text-align: center\n\n// Links\na\n text-decoration: underline\n\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n &:hover\n color: var(--color-link--hover)\n text-decoration-color: var(--color-link-underline--hover)\n &.muted-link\n color: inherit\n &:hover\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline--hover)\n","// This file contains the styles for the overall layouting of the documentation\n// skeleton, including the responsive changes as well as sidebar toggles.\n//\n// This is implemented as a mobile-last design, which isn't ideal, but it is\n// reasonably good-enough and I got pretty tired by the time I'd finished this\n// to move the rules around to fix this. Shouldn't take more than 3-4 hours,\n// if you know what you're doing tho.\n\n// HACK: Not all browsers account for the scrollbar width in media queries.\n// This results in horizontal scrollbars in the breakpoint where we go\n// from displaying everything to hiding the ToC. We accomodate for this by\n// adding a bit of padding to the TOC drawer, disabling the horizontal\n// scrollbar and allowing the scrollbars to cover the padding.\n// https://www.456bereastreet.com/archive/201301/media_query_width_and_vertical_scrollbars/\n\n// HACK: Always having the scrollbar visible, prevents certain browsers from\n// causing the content to stutter horizontally between taller-than-viewport and\n// not-taller-than-viewport pages.\n\nhtml\n overflow-x: hidden\n overflow-y: scroll\n scroll-behavior: smooth\n\n.sidebar-scroll, .toc-scroll, article[role=main] *\n // Override Firefox scrollbar style\n scrollbar-width: thin\n scrollbar-color: var(--color-foreground-border) transparent\n\n // Override Chrome scrollbar styles\n &::-webkit-scrollbar\n width: 0.25rem\n height: 0.25rem\n &::-webkit-scrollbar-thumb\n background-color: var(--color-foreground-border)\n border-radius: 0.125rem\n\n//\n// Overalls\n//\nhtml,\nbody\n height: 100%\n color: var(--color-foreground-primary)\n background: var(--color-background-primary)\n\narticle\n color: var(--color-content-foreground)\n background: var(--color-content-background)\n overflow-wrap: break-word\n\n.page\n display: flex\n // fill the viewport for pages with little content.\n min-height: 100%\n\n.mobile-header\n width: 100%\n height: var(--header-height)\n background-color: var(--color-header-background)\n color: var(--color-header-text)\n border-bottom: 1px solid var(--color-header-border)\n\n // Looks like sub-script/super-script have this, and we need this to\n // be \"on top\" of those.\n z-index: 10\n\n // We don't show the header on large screens.\n display: none\n\n // Add shadow when scrolled\n &.scrolled\n border-bottom: none\n box-shadow: 0 0 0.2rem rgba(0, 0, 0, 0.1), 0 0.2rem 0.4rem rgba(0, 0, 0, 0.2)\n\n .header-center\n a\n color: var(--color-header-text)\n text-decoration: none\n\n.main\n display: flex\n flex: 1\n\n// Sidebar (left) also covers the entire left portion of screen.\n.sidebar-drawer\n box-sizing: border-box\n\n border-right: 1px solid var(--color-sidebar-background-border)\n background: var(--color-sidebar-background)\n\n display: flex\n justify-content: flex-end\n // These next two lines took me two days to figure out.\n width: calc((100% - #{$full-width}) / 2 + #{$sidebar-width})\n min-width: $sidebar-width\n\n// Scroll-along sidebars\n.sidebar-container,\n.toc-drawer\n box-sizing: border-box\n width: $sidebar-width\n\n.toc-drawer\n background: var(--color-toc-background)\n // See HACK described on top of this document\n padding-right: 1rem\n\n.sidebar-sticky,\n.toc-sticky\n position: sticky\n top: 0\n height: min(100%, 100vh)\n height: 100vh\n\n display: flex\n flex-direction: column\n\n.sidebar-scroll,\n.toc-scroll\n flex-grow: 1\n flex-shrink: 1\n\n overflow: auto\n scroll-behavior: smooth\n\n// Central items.\n.content\n padding: 0 $content-padding\n width: $content-width\n\n display: flex\n flex-direction: column\n justify-content: space-between\n\n.icon\n display: inline-block\n height: 1rem\n width: 1rem\n svg\n width: 100%\n height: 100%\n\n//\n// Accommodate announcement banner\n//\n.announcement\n background-color: var(--color-announcement-background)\n color: var(--color-announcement-text)\n\n height: var(--header-height)\n display: flex\n align-items: center\n overflow-x: auto\n & + .page\n min-height: calc(100% - var(--header-height))\n\n.announcement-content\n box-sizing: border-box\n padding: 0.5rem\n min-width: 100%\n white-space: nowrap\n text-align: center\n\n a\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-announcement-text)\n\n &:hover\n color: var(--color-announcement-text)\n text-decoration-color: var(--color-link--hover)\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for theme\n////////////////////////////////////////////////////////////////////////////////\n.no-js .theme-toggle-container // don't show theme toggle if there's no JS\n display: none\n\n.theme-toggle-container\n vertical-align: middle\n\n.theme-toggle\n cursor: pointer\n border: none\n padding: 0\n background: transparent\n\n.theme-toggle svg\n vertical-align: middle\n height: 1rem\n width: 1rem\n color: var(--color-foreground-primary)\n display: none\n\n.theme-toggle-header\n float: left\n padding: 1rem 0.5rem\n\n////////////////////////////////////////////////////////////////////////////////\n// Toggles for elements\n////////////////////////////////////////////////////////////////////////////////\n.toc-overlay-icon, .nav-overlay-icon\n display: none\n cursor: pointer\n\n .icon\n color: var(--color-foreground-secondary)\n height: 1rem\n width: 1rem\n\n.toc-header-icon, .nav-overlay-icon\n // for when we set display: flex\n justify-content: center\n align-items: center\n\n.toc-content-icon\n height: 1.5rem\n width: 1.5rem\n\n.content-icon-container\n float: right\n display: flex\n margin-top: 1.5rem\n margin-left: 1rem\n margin-bottom: 1rem\n gap: 0.5rem\n\n .edit-this-page svg\n color: inherit\n height: 1rem\n width: 1rem\n\n.sidebar-toggle\n position: absolute\n display: none\n// \n.sidebar-toggle[name=\"__toc\"]\n left: 20px\n.sidebar-toggle:checked\n left: 40px\n// \n\n.overlay\n position: fixed\n top: 0\n width: 0\n height: 0\n\n transition: width 0ms, height 0ms, opacity 250ms ease-out\n\n opacity: 0\n background-color: rgba(0, 0, 0, 0.54)\n.sidebar-overlay\n z-index: 20\n.toc-overlay\n z-index: 40\n\n// Keep things on top and smooth.\n.sidebar-drawer\n z-index: 30\n transition: left 250ms ease-in-out\n.toc-drawer\n z-index: 50\n transition: right 250ms ease-in-out\n\n// Show the Sidebar\n#__navigation:checked\n & ~ .sidebar-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .sidebar-drawer\n top: 0\n left: 0\n // Show the toc sidebar\n#__toc:checked\n & ~ .toc-overlay\n width: 100%\n height: 100%\n opacity: 1\n & ~ .page\n .toc-drawer\n top: 0\n right: 0\n\n////////////////////////////////////////////////////////////////////////////////\n// Back to top\n////////////////////////////////////////////////////////////////////////////////\n.back-to-top\n text-decoration: none\n\n display: none\n position: fixed\n left: 0\n top: 1rem\n padding: 0.5rem\n padding-right: 0.75rem\n border-radius: 1rem\n font-size: 0.8125rem\n\n background: var(--color-background-primary)\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), #6b728080 0px 0px 1px 0px\n\n z-index: 10\n\n margin-left: 50%\n transform: translateX(-50%)\n svg\n height: 1rem\n width: 1rem\n fill: currentColor\n display: inline-block\n\n span\n margin-left: 0.25rem\n\n .show-back-to-top &\n display: flex\n align-items: center\n\n////////////////////////////////////////////////////////////////////////////////\n// Responsive layouting\n////////////////////////////////////////////////////////////////////////////////\n// Make things a bit bigger on bigger screens.\n@media (min-width: $full-width + $sidebar-width)\n html\n font-size: 110%\n\n@media (max-width: $full-width)\n // Collapse \"toc\" into the icon.\n .toc-content-icon\n display: flex\n .toc-drawer\n position: fixed\n height: 100vh\n top: 0\n right: -$sidebar-width\n border-left: 1px solid var(--color-background-muted)\n .toc-tree\n border-left: none\n font-size: var(--toc-font-size--mobile)\n\n // Accomodate for a changed content width.\n .sidebar-drawer\n width: calc((100% - #{$full-width - $sidebar-width}) / 2 + #{$sidebar-width})\n\n@media (max-width: $full-width - $sidebar-width)\n // Collapse \"navigation\".\n .nav-overlay-icon\n display: flex\n .sidebar-drawer\n position: fixed\n height: 100vh\n width: $sidebar-width\n\n top: 0\n left: -$sidebar-width\n\n // Swap which icon is visible.\n .toc-header-icon\n display: flex\n .toc-content-icon, .theme-toggle-content\n display: none\n .theme-toggle-header\n display: block\n\n // Show the header.\n .mobile-header\n position: sticky\n top: 0\n display: flex\n justify-content: space-between\n align-items: center\n\n .header-left,\n .header-right\n display: flex\n height: var(--header-height)\n padding: 0 var(--header-padding)\n label\n height: 100%\n width: 100%\n user-select: none\n\n .nav-overlay-icon .icon,\n .theme-toggle svg\n height: 1.25rem\n width: 1.25rem\n\n // Add a scroll margin for the content\n :target\n scroll-margin-top: var(--header-height)\n\n // Show back-to-top below the header\n .back-to-top\n top: calc(var(--header-height) + 0.5rem)\n\n // Center the page, and accommodate for the header.\n .page\n flex-direction: column\n justify-content: center\n .content\n margin-left: auto\n margin-right: auto\n\n@media (max-width: $content-width + 2* $content-padding)\n // Content should respect window limits.\n .content\n width: 100%\n overflow-x: auto\n\n@media (max-width: $content-width)\n .content\n padding: 0 $content-padding--small\n // Don't float sidebars to the right.\n article aside.sidebar\n float: none\n width: 100%\n margin: 1rem 0\n","//\n// The design here is strongly inspired by mkdocs-material.\n.admonition, .topic\n margin: 1rem auto\n padding: 0 0.5rem 0.5rem 0.5rem\n\n background: var(--color-admonition-background)\n\n border-radius: 0.2rem\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n font-size: var(--admonition-font-size)\n\n overflow: hidden\n page-break-inside: avoid\n\n // First element should have no margin, since the title has it.\n > :nth-child(2)\n margin-top: 0\n\n // Last item should have no margin, since we'll control that w/ padding\n > :last-child\n margin-bottom: 0\n\n.admonition p.admonition-title,\np.topic-title\n position: relative\n margin: 0 -0.5rem 0.5rem\n padding-left: 2rem\n padding-right: .5rem\n padding-top: .4rem\n padding-bottom: .4rem\n\n font-weight: 500\n font-size: var(--admonition-title-font-size)\n line-height: 1.3\n\n // Our fancy icon\n &::before\n content: \"\"\n position: absolute\n left: 0.5rem\n width: 1rem\n height: 1rem\n\n// Default styles\np.admonition-title\n background-color: var(--color-admonition-title-background)\n &::before\n background-color: var(--color-admonition-title)\n mask-image: var(--icon-admonition-default)\n mask-repeat: no-repeat\n\np.topic-title\n background-color: var(--color-topic-title-background)\n &::before\n background-color: var(--color-topic-title)\n mask-image: var(--icon-topic-default)\n mask-repeat: no-repeat\n\n//\n// Variants\n//\n.admonition\n border-left: 0.2rem solid var(--color-admonition-title)\n\n @each $type, $value in $admonitions\n &.#{$type}\n border-left-color: var(--color-admonition-title--#{$type})\n > .admonition-title\n background-color: var(--color-admonition-title-background--#{$type})\n &::before\n background-color: var(--color-admonition-title--#{$type})\n mask-image: var(--icon-#{nth($value, 2)})\n\n.admonition-todo > .admonition-title\n text-transform: uppercase\n","// This file stylizes the API documentation (stuff generated by autodoc). It's\n// deeply nested due to how autodoc structures the HTML without enough classes\n// to select the relevant items.\n\n// API docs!\ndl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple)\n // Tweak the spacing of all the things!\n dd\n margin-left: 2rem\n > :first-child\n margin-top: 0.125rem\n > :last-child\n margin-bottom: 0.75rem\n\n // This is used for the arguments\n .field-list\n margin-bottom: 0.75rem\n\n // \"Headings\" (like \"Parameters\" and \"Return\")\n > dt\n text-transform: uppercase\n font-size: var(--font-size--small)\n\n dd:empty\n margin-bottom: 0.5rem\n dd > ul\n margin-left: -1.2rem\n > li\n > p:nth-child(2)\n margin-top: 0\n // When the last-empty-paragraph follows a paragraph, it doesn't need\n // to augument the existing spacing.\n > p + p:last-child:empty\n margin-top: 0\n margin-bottom: 0\n\n // Colorize the elements\n > dt\n color: var(--color-api-overall)\n\n.sig:not(.sig-inline)\n font-weight: bold\n\n font-size: var(--api-font-size)\n font-family: var(--font-stack--monospace)\n\n margin-left: -0.25rem\n margin-right: -0.25rem\n padding-top: 0.25rem\n padding-bottom: 0.25rem\n padding-right: 0.5rem\n\n // These are intentionally em, to properly match the font size.\n padding-left: 3em\n text-indent: -2.5em\n\n border-radius: 0.25rem\n\n background: var(--color-api-background)\n transition: background 100ms ease-out\n\n &:hover\n background: var(--color-api-background-hover)\n\n // adjust the size of the [source] link on the right.\n a.reference\n .viewcode-link\n font-weight: normal\n width: 3.5rem\n\nem.property\n font-style: normal\n &:first-child\n color: var(--color-api-keyword)\n.sig-name\n color: var(--color-api-name)\n.sig-prename\n font-weight: normal\n color: var(--color-api-pre-name)\n.sig-paren\n color: var(--color-api-paren)\n.sig-param\n font-style: normal\n\n.versionmodified\n font-style: italic\ndiv.versionadded, div.versionchanged, div.deprecated\n p\n margin-top: 0.125rem\n margin-bottom: 0.125rem\n\n// Align the [docs] and [source] to the right.\n.viewcode-link, .viewcode-back\n float: right\n text-align: right\n",".line-block\n margin-top: 0.5rem\n margin-bottom: 0.75rem\n .line-block\n margin-top: 0rem\n margin-bottom: 0rem\n padding-left: 1rem\n","// Captions\narticle p.caption,\ntable > caption,\n.code-block-caption\n font-size: var(--font-size--small)\n text-align: center\n\n// Caption above a TOCTree\n.toctree-wrapper.compound\n .caption, :not(.caption) > .caption-text\n font-size: var(--font-size--small)\n text-transform: uppercase\n\n text-align: initial\n margin-bottom: 0\n\n > ul\n margin-top: 0\n margin-bottom: 0\n","// Inline code\ncode.literal, .sig-inline\n background: var(--color-inline-code-background)\n border-radius: 0.2em\n // Make the font smaller, and use padding to recover.\n font-size: var(--font-size--small--2)\n padding: 0.1em 0.2em\n\n pre.literal-block &\n font-size: inherit\n padding: 0\n\n p &\n border: 1px solid var(--color-background-border)\n\n.sig-inline\n font-family: var(--font-stack--monospace)\n\n// Code and Literal Blocks\n$code-spacing-vertical: 0.625rem\n$code-spacing-horizontal: 0.875rem\n\n// Wraps every literal block + line numbers.\ndiv[class*=\" highlight-\"],\ndiv[class^=\"highlight-\"]\n margin: 1em 0\n display: flex\n\n .table-wrapper\n margin: 0\n padding: 0\n\npre\n margin: 0\n padding: 0\n overflow: auto\n\n // Needed to have more specificity than pygments' \"pre\" selector. :(\n article[role=\"main\"] .highlight &\n line-height: 1.5\n\n &.literal-block,\n .highlight &\n font-size: var(--code-font-size)\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n // Make it look like all the other blocks.\n &.literal-block\n margin-top: 1rem\n margin-bottom: 1rem\n\n border-radius: 0.2rem\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n\n// All code is always contained in this.\n.highlight\n width: 100%\n border-radius: 0.2rem\n\n // Make line numbers and prompts un-selectable.\n .gp, span.linenos\n user-select: none\n pointer-events: none\n\n // Expand the line-highlighting.\n .hll\n display: block\n margin-left: -$code-spacing-horizontal\n margin-right: -$code-spacing-horizontal\n padding-left: $code-spacing-horizontal\n padding-right: $code-spacing-horizontal\n\n/* Make code block captions be nicely integrated */\n.code-block-caption\n display: flex\n padding: $code-spacing-vertical $code-spacing-horizontal\n\n border-radius: 0.25rem\n border-bottom-left-radius: 0\n border-bottom-right-radius: 0\n font-weight: 300\n border-bottom: 1px solid\n\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n border-color: var(--color-background-border)\n\n + div[class]\n margin-top: 0\n pre\n border-top-left-radius: 0\n border-top-right-radius: 0\n\n// When `html_codeblock_linenos_style` is table.\n.highlighttable\n width: 100%\n display: block\n tbody\n display: block\n\n tr\n display: flex\n\n // Line numbers\n td.linenos\n background-color: var(--color-code-background)\n color: var(--color-code-foreground)\n padding: $code-spacing-vertical $code-spacing-horizontal\n padding-right: 0\n border-top-left-radius: 0.2rem\n border-bottom-left-radius: 0.2rem\n\n .linenodiv\n padding-right: $code-spacing-horizontal\n font-size: var(--code-font-size)\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n\n // Actual code\n td.code\n padding: 0\n display: block\n flex: 1\n overflow: hidden\n\n .highlight\n border-top-left-radius: 0\n border-bottom-left-radius: 0\n\n// When `html_codeblock_linenos_style` is inline.\n.highlight\n span.linenos\n display: inline-block\n padding-left: 0\n padding-right: $code-spacing-horizontal\n margin-right: $code-spacing-horizontal\n box-shadow: -0.0625rem 0 var(--color-foreground-border) inset\n","// Inline Footnote Reference\n.footnote-reference\n font-size: var(--font-size--small--4)\n vertical-align: super\n\n// Definition list, listing the content of each note.\n// docutils <= 0.17\ndl.footnote.brackets\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\n display: grid\n grid-template-columns: max-content auto\n dt\n margin: 0\n > .fn-backref\n margin-left: 0.25rem\n\n &:after\n content: \":\"\n\n .brackets\n &:before\n content: \"[\"\n &:after\n content: \"]\"\n\n dd\n margin: 0\n padding: 0 1rem\n\n// docutils >= 0.18\naside.footnote\n font-size: var(--font-size--small)\n color: var(--color-foreground-secondary)\n\naside.footnote > span,\ndiv.citation > span\n float: left\n font-weight: 500\n padding-right: 0.25rem\n\naside.footnote > p,\ndiv.citation > p\n margin-left: 2rem\n","//\n// Figures\n//\nimg\n box-sizing: border-box\n max-width: 100%\n height: auto\n\narticle\n figure, .figure\n border-radius: 0.2rem\n\n margin: 0\n :last-child\n margin-bottom: 0\n\n .align-left\n float: left\n clear: left\n margin: 0 1rem 1rem\n\n .align-right\n float: right\n clear: right\n margin: 0 1rem 1rem\n\n .align-default,\n .align-center\n display: block\n text-align: center\n margin-left: auto\n margin-right: auto\n\n // WELL, table needs to be stylised like a table.\n table.align-default\n display: table\n text-align: initial\n",".genindex-jumpbox, .domainindex-jumpbox\n border-top: 1px solid var(--color-background-border)\n border-bottom: 1px solid var(--color-background-border)\n padding: 0.25rem\n\n.genindex-section, .domainindex-section\n h2\n margin-top: 0.75rem\n margin-bottom: 0.5rem\n ul\n margin-top: 0\n margin-bottom: 0\n","ul,\nol\n padding-left: 1.2rem\n\n // Space lists out like paragraphs\n margin-top: 1rem\n margin-bottom: 1rem\n // reduce margins within li.\n li\n > p:first-child\n margin-top: 0.25rem\n margin-bottom: 0.25rem\n\n > p:last-child\n margin-top: 0.25rem\n\n > ul,\n > ol\n margin-top: 0.5rem\n margin-bottom: 0.5rem\n\nol\n &.arabic\n list-style: decimal\n &.loweralpha\n list-style: lower-alpha\n &.upperalpha\n list-style: upper-alpha\n &.lowerroman\n list-style: lower-roman\n &.upperroman\n list-style: upper-roman\n\n// Don't space lists out when they're \"simple\" or in a `.. toctree::`\n.simple,\n.toctree-wrapper\n li\n > ul,\n > ol\n margin-top: 0\n margin-bottom: 0\n\n// Definition Lists\n.field-list,\n.option-list,\ndl:not([class]),\ndl.simple,\ndl.footnote,\ndl.glossary\n dt\n font-weight: 500\n margin-top: 0.25rem\n + dt\n margin-top: 0\n\n .classifier::before\n content: \":\"\n margin-left: 0.2rem\n margin-right: 0.2rem\n\n dd\n > p:first-child,\n ul\n margin-top: 0.125rem\n\n ul\n margin-bottom: 0.125rem\n",".math-wrapper\n width: 100%\n overflow-x: auto\n\ndiv.math\n position: relative\n text-align: center\n\n .headerlink,\n &:focus .headerlink\n display: none\n\n &:hover .headerlink\n display: inline-block\n\n span.eqno\n position: absolute\n right: 0.5rem\n top: 50%\n transform: translate(0, -50%)\n z-index: 1\n","// Abbreviations\nabbr[title]\n cursor: help\n\n// \"Problematic\" content, as identified by Sphinx\n.problematic\n color: var(--color-problematic)\n\n// Keyboard / Mouse \"instructions\"\nkbd:not(.compound)\n margin: 0 0.2rem\n padding: 0 0.2rem\n border-radius: 0.2rem\n border: 1px solid var(--color-foreground-border)\n color: var(--color-foreground-primary)\n vertical-align: text-bottom\n\n font-size: var(--font-size--small--3)\n display: inline-block\n\n box-shadow: 0 0.0625rem 0 rgba(0, 0, 0, 0.2), inset 0 0 0 0.125rem var(--color-background-primary)\n\n background-color: var(--color-background-secondary)\n\n// Blockquote\nblockquote\n border-left: 4px solid var(--color-background-border)\n background: var(--color-background-secondary)\n\n margin-left: 0\n margin-right: 0\n padding: 0.5rem 1rem\n\n .attribution\n font-weight: 600\n text-align: right\n\n &.pull-quote,\n &.highlights\n font-size: 1.25em\n\n &.epigraph,\n &.pull-quote\n border-left-width: 0\n border-radius: 0.5rem\n\n &.highlights\n border-left-width: 0\n background: transparent\n\n// Center align embedded-in-text images\np .reference img\n vertical-align: middle\n","p.rubric\n line-height: 1.25\n font-weight: bold\n font-size: 1.125em\n\n // For Numpy-style documentation that's got rubrics within it.\n // https://github.com/pradyunsg/furo/discussions/505\n dd &\n line-height: inherit\n font-weight: inherit\n\n font-size: var(--font-size--small)\n text-transform: uppercase\n","article .sidebar\n float: right\n clear: right\n width: 30%\n\n margin-left: 1rem\n margin-right: 0\n\n border-radius: 0.2rem\n background-color: var(--color-background-secondary)\n border: var(--color-background-border) 1px solid\n\n > *\n padding-left: 1rem\n padding-right: 1rem\n\n > ul, > ol // lists need additional padding, because bullets.\n padding-left: 2.2rem\n\n .sidebar-title\n margin: 0\n padding: 0.5rem 1rem\n border-bottom: var(--color-background-border) 1px solid\n\n font-weight: 500\n\n// TODO: subtitle\n// TODO: dedicated variables?\n",".table-wrapper\n width: 100%\n overflow-x: auto\n margin-top: 1rem\n margin-bottom: 0.5rem\n padding: 0.2rem 0.2rem 0.75rem\n\ntable.docutils\n border-radius: 0.2rem\n border-spacing: 0\n border-collapse: collapse\n\n box-shadow: 0 0.2rem 0.5rem rgba(0, 0, 0, 0.05), 0 0 0.0625rem rgba(0, 0, 0, 0.1)\n\n th\n background: var(--color-table-header-background)\n\n td,\n th\n // Space things out properly\n padding: 0 0.25rem\n\n // Get the borders looking just-right.\n border-left: 1px solid var(--color-table-border)\n border-right: 1px solid var(--color-table-border)\n border-bottom: 1px solid var(--color-table-border)\n\n p\n margin: 0.25rem\n\n &:first-child\n border-left: none\n &:last-child\n border-right: none\n\n // MyST-parser tables set these classes for control of column alignment\n &.text-left\n text-align: left\n &.text-right\n text-align: right\n &.text-center\n text-align: center\n",":target\n scroll-margin-top: 0.5rem\n\n@media (max-width: $full-width - $sidebar-width)\n :target\n scroll-margin-top: calc(0.5rem + var(--header-height))\n\n // When a heading is selected\n section > span:target\n scroll-margin-top: calc(0.8rem + var(--header-height))\n\n// Permalinks\n.headerlink\n font-weight: 100\n user-select: none\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\ndl dt,\np.caption,\nfigcaption p,\ntable > caption,\n.code-block-caption\n > .headerlink\n margin-left: 0.5rem\n visibility: hidden\n &:hover > .headerlink\n visibility: visible\n\n // Don't change to link-like, if someone adds the contents directive.\n > .toc-backref\n color: inherit\n text-decoration-line: none\n\n// Figure and table captions are special.\nfigure:hover > figcaption > p > .headerlink,\ntable:hover > caption > .headerlink\n visibility: visible\n\n:target >, // Regular section[id] style anchors\nspan:target ~ // Non-regular span[id] style \"extra\" anchors\n h1,\n h2,\n h3,\n h4,\n h5,\n h6\n &:nth-of-type(1)\n background-color: var(--color-highlight-on-target)\n // .headerlink\n // visibility: visible\n code.literal\n background-color: transparent\n\ntable:target > caption,\nfigure:target\n background-color: var(--color-highlight-on-target)\n\n// Inline page contents\n.this-will-duplicate-information-and-it-is-still-useful-here li :target\n background-color: var(--color-highlight-on-target)\n\n// Code block permalinks\n.literal-block-wrapper:target .code-block-caption\n background-color: var(--color-highlight-on-target)\n\n// When a definition list item is selected\n//\n// There isn't really an alternative to !important here, due to the\n// high-specificity of API documentation's selector.\ndt:target\n background-color: var(--color-highlight-on-target) !important\n\n// When a footnote reference is selected\n.footnote > dt:target + dd,\n.footnote-reference:target\n background-color: var(--color-highlight-on-target)\n",".guilabel\n background-color: var(--color-guilabel-background)\n border: 1px solid var(--color-guilabel-border)\n color: var(--color-guilabel-text)\n\n padding: 0 0.3em\n border-radius: 0.5em\n font-size: 0.9em\n","// This file contains the styles used for stylizing the footer that's shown\n// below the content.\n\nfooter\n font-size: var(--font-size--small)\n display: flex\n flex-direction: column\n\n margin-top: 2rem\n\n// Bottom of page information\n.bottom-of-page\n display: flex\n align-items: center\n justify-content: space-between\n\n margin-top: 1rem\n padding-top: 1rem\n padding-bottom: 1rem\n\n color: var(--color-foreground-secondary)\n border-top: 1px solid var(--color-background-border)\n\n line-height: 1.5\n\n @media (max-width: $content-width)\n text-align: center\n flex-direction: column-reverse\n gap: 0.25rem\n\n .left-details\n font-size: var(--font-size--small)\n\n .right-details\n display: flex\n flex-direction: column\n gap: 0.25rem\n text-align: right\n\n .icons\n display: flex\n justify-content: flex-end\n gap: 0.25rem\n font-size: 1rem\n\n a\n text-decoration: none\n\n svg,\n img\n font-size: 1.125rem\n height: 1em\n width: 1em\n\n// Next/Prev page information\n.related-pages\n a\n display: flex\n align-items: center\n\n text-decoration: none\n &:hover .page-info .title\n text-decoration: underline\n color: var(--color-link)\n text-decoration-color: var(--color-link-underline)\n\n svg.furo-related-icon,\n svg.furo-related-icon > use\n flex-shrink: 0\n\n color: var(--color-foreground-border)\n\n width: 0.75rem\n height: 0.75rem\n margin: 0 0.5rem\n\n &.next-page\n max-width: 50%\n\n float: right\n clear: right\n text-align: right\n\n &.prev-page\n max-width: 50%\n\n float: left\n clear: left\n\n svg\n transform: rotate(180deg)\n\n.page-info\n display: flex\n flex-direction: column\n overflow-wrap: anywhere\n\n .next-page &\n align-items: flex-end\n\n .context\n display: flex\n align-items: center\n\n padding-bottom: 0.1rem\n\n color: var(--color-foreground-muted)\n font-size: var(--font-size--small)\n text-decoration: none\n","// This file contains the styles for the contents of the left sidebar, which\n// contains the navigation tree, logo, search etc.\n\n////////////////////////////////////////////////////////////////////////////////\n// Brand on top of the scrollable tree.\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-brand\n display: flex\n flex-direction: column\n flex-shrink: 0\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n text-decoration: none\n\n.sidebar-brand-text\n color: var(--color-sidebar-brand-text)\n overflow-wrap: break-word\n margin: var(--sidebar-item-spacing-vertical) 0\n font-size: 1.5rem\n\n.sidebar-logo-container\n margin: var(--sidebar-item-spacing-vertical) 0\n\n.sidebar-logo\n margin: 0 auto\n display: block\n max-width: 100%\n\n////////////////////////////////////////////////////////////////////////////////\n// Search\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-search-container\n display: flex\n align-items: center\n margin-top: var(--sidebar-search-space-above)\n\n position: relative\n\n background: var(--color-sidebar-search-background)\n &:hover,\n &:focus-within\n background: var(--color-sidebar-search-background--focus)\n\n &::before\n content: \"\"\n position: absolute\n left: var(--sidebar-item-spacing-horizontal)\n width: var(--sidebar-search-icon-size)\n height: var(--sidebar-search-icon-size)\n\n background-color: var(--color-sidebar-search-icon)\n mask-image: var(--icon-search)\n\n.sidebar-search\n box-sizing: border-box\n\n border: none\n border-top: 1px solid var(--color-sidebar-search-border)\n border-bottom: 1px solid var(--color-sidebar-search-border)\n\n padding-top: var(--sidebar-search-input-spacing-vertical)\n padding-bottom: var(--sidebar-search-input-spacing-vertical)\n padding-right: var(--sidebar-search-input-spacing-horizontal)\n padding-left: calc(var(--sidebar-item-spacing-horizontal) + var(--sidebar-search-input-spacing-horizontal) + var(--sidebar-search-icon-size))\n\n width: 100%\n\n color: var(--color-sidebar-search-foreground)\n background: transparent\n z-index: 10\n\n &:focus\n outline: none\n\n &::placeholder\n font-size: var(--sidebar-search-input-font-size)\n\n//\n// Hide Search Matches link\n//\n#searchbox .highlight-link\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal) 0\n margin: 0\n text-align: center\n\n a\n color: var(--color-sidebar-search-icon)\n font-size: var(--font-size--small--2)\n\n////////////////////////////////////////////////////////////////////////////////\n// Structure/Skeleton of the navigation tree (left)\n////////////////////////////////////////////////////////////////////////////////\n.sidebar-tree\n font-size: var(--sidebar-item-font-size)\n margin-top: var(--sidebar-tree-space-above)\n margin-bottom: var(--sidebar-item-spacing-vertical)\n\n ul\n padding: 0\n margin-top: 0\n margin-bottom: 0\n\n display: flex\n flex-direction: column\n\n list-style: none\n\n li\n position: relative\n margin: 0\n\n > ul\n margin-left: var(--sidebar-item-spacing-horizontal)\n\n .icon\n color: var(--color-sidebar-link-text)\n\n .reference\n box-sizing: border-box\n color: var(--color-sidebar-link-text)\n\n // Fill the parent.\n display: inline-block\n line-height: var(--sidebar-item-line-height)\n text-decoration: none\n\n // Don't allow long words to cause wrapping.\n overflow-wrap: anywhere\n\n height: 100%\n width: 100%\n\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n &:hover\n background: var(--color-sidebar-item-background--hover)\n\n // Add a nice little \"external-link\" arrow here.\n &.external::after\n content: url('data:image/svg+xml,')\n margin: 0 0.25rem\n vertical-align: middle\n color: var(--color-sidebar-link-text)\n\n // Make the current page reference bold.\n .current-page > .reference\n font-weight: bold\n\n label\n position: absolute\n top: 0\n right: 0\n height: var(--sidebar-item-height)\n width: var(--sidebar-expander-width)\n\n cursor: pointer\n user-select: none\n\n display: flex\n justify-content: center\n align-items: center\n\n .caption, :not(.caption) > .caption-text\n font-size: var(--sidebar-caption-font-size)\n color: var(--color-sidebar-caption-text)\n\n font-weight: bold\n text-transform: uppercase\n\n margin: var(--sidebar-caption-space-above) 0 0 0\n padding: var(--sidebar-item-spacing-vertical) var(--sidebar-item-spacing-horizontal)\n\n // If it has children, add a bit more padding to wrap the content to avoid\n // overlapping with the