From 555cd705990125f1ea550ffe40c13a8a99ec5f54 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Sun, 4 Aug 2024 13:20:11 +0300 Subject: [PATCH 01/16] added dataset description and bidsignore --- src/keprep/interfaces/bids/__init__.py | 5 + src/keprep/interfaces/bids/bids.py | 103 +++++++++++ .../interfaces/{bids.py => bids/utils.py} | 169 +++++++----------- src/keprep/workflows/base/workflow.py | 8 + .../workflows/dwi/stages/derivatives.py | 34 ---- 5 files changed, 183 insertions(+), 136 deletions(-) create mode 100644 src/keprep/interfaces/bids/__init__.py create mode 100644 src/keprep/interfaces/bids/bids.py rename src/keprep/interfaces/{bids.py => bids/utils.py} (59%) diff --git a/src/keprep/interfaces/bids/__init__.py b/src/keprep/interfaces/bids/__init__.py new file mode 100644 index 0000000..4bade74 --- /dev/null +++ b/src/keprep/interfaces/bids/__init__.py @@ -0,0 +1,5 @@ +from keprep.interfaces.bids.bids import ( # noqa: F401 + BIDSDataGrabber, + DerivativesDataSink, +) +from keprep.interfaces.bids.utils import collect_data, get_fieldmap # noqa: F401 diff --git a/src/keprep/interfaces/bids/bids.py b/src/keprep/interfaces/bids/bids.py new file mode 100644 index 0000000..1735d30 --- /dev/null +++ b/src/keprep/interfaces/bids/bids.py @@ -0,0 +1,103 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: + +from nipype import logging +from nipype.interfaces.base import ( + BaseInterfaceInputSpec, + OutputMultiObject, + SimpleInterface, + Str, + TraitedSpec, + traits, +) +from niworkflows.interfaces.bids import DerivativesDataSink as _DDSink + +LOGGER = logging.getLogger("nipype.interface") + +CUSTOM_PATH_PATTERNS = [ + "sub-{subject}[/ses-{session}]/{datatype|dwi}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.json|.nii.gz|.nii|.tck|.trk>|.nii.gz}", # pylint: disable=line-too-long + "sub-{subject}[/ses-{session}]/{datatype|dwi}/{desc}", +] + + +class DerivativesDataSink(_DDSink): + out_path_base = "" + _file_patterns = tuple(list(_DDSink._file_patterns) + CUSTOM_PATH_PATTERNS) + + +__all__ = ("DerivativesDataSink",) + + +class _BIDSDataGrabberInputSpec(BaseInterfaceInputSpec): + subject_data = traits.Dict(Str, traits.Any) + subject_id = Str() + + +class _BIDSDataGrabberOutputSpec(TraitedSpec): + out_dict = traits.Dict(desc="output data structure") + fmap = OutputMultiObject(desc="output fieldmaps") + bold = OutputMultiObject(desc="output functional images") + sbref = OutputMultiObject(desc="output sbrefs") + t1w = OutputMultiObject(desc="output T1w images") + roi = OutputMultiObject(desc="output ROI images") + t2w = OutputMultiObject(desc="output T2w images") + flair = OutputMultiObject(desc="output FLAIR images") + dwi = OutputMultiObject(desc="output DWI images") + + +class BIDSDataGrabber(SimpleInterface): + """ + Collect files from a BIDS directory structure. + + .. testsetup:: + + >>> data_dir_canary() + + >>> bids_src = BIDSDataGrabber(anat_only=False) + >>> bids_src.inputs.subject_data = bids_collect_data( + ... str(datadir / 'ds114'), '01', bids_validate=False)[0] + >>> bids_src.inputs.subject_id = '01' + >>> res = bids_src.run() + >>> res.outputs.t1w # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE + ['.../ds114/sub-01/ses-retest/anat/sub-01_ses-retest_T1w.nii.gz', + '.../ds114/sub-01/ses-test/anat/sub-01_ses-test_T1w.nii.gz'] + + """ + + input_spec = _BIDSDataGrabberInputSpec + output_spec = _BIDSDataGrabberOutputSpec + _require_dwis = True + + def __init__(self, *args, **kwargs): + anat_only = kwargs.pop("anat_only") + anat_derivatives = kwargs.pop("anat_derivatives", None) + super().__init__(*args, **kwargs) + if anat_only is not None: + self._require_dwis = not anat_only + self._require_t1w = anat_derivatives is None + + def _run_interface(self, runtime): + bids_dict = self.inputs.subject_data + + self._results["out_dict"] = bids_dict + self._results.update(bids_dict) + + if self._require_t1w and not bids_dict["t1w"]: + raise FileNotFoundError( + f"No T1w images found for subject sub-{self.inputs.subject_id}" + ) + + if self._require_dwis and not bids_dict["dwi"]: + raise FileNotFoundError( + f"No DWI images found for subject sub-{self.inputs.subject_id}" + ) + + for imtype in ["bold", "t2w", "flair", "fmap", "sbref", "roi", "dwi"]: + if not bids_dict.get(imtype): + LOGGER.info( + 'No "%s" images found for sub-%s', + imtype, + self.inputs.subject_id, + ) + + return runtime diff --git a/src/keprep/interfaces/bids.py b/src/keprep/interfaces/bids/utils.py similarity index 59% rename from src/keprep/interfaces/bids.py rename to src/keprep/interfaces/bids/utils.py index d21e06a..a499509 100644 --- a/src/keprep/interfaces/bids.py +++ b/src/keprep/interfaces/bids/utils.py @@ -1,34 +1,9 @@ -# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- -# vi: set ft=python sts=4 ts=4 sw=4 et: +import json +import os from pathlib import Path from bids import BIDSLayout from bids.layout import Query, parse_file_entities -from nipype import logging -from nipype.interfaces.base import ( - BaseInterfaceInputSpec, - OutputMultiObject, - SimpleInterface, - Str, - TraitedSpec, - traits, -) -from niworkflows.interfaces.bids import DerivativesDataSink as _DDSink - -LOGGER = logging.getLogger("nipype.interface") - -CUSTOM_PATH_PATTERNS = [ - "sub-{subject}[/ses-{session}]/{datatype|dwi}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_space-{space}][_cohort-{cohort}][_res-{resolution}][_desc-{desc}]_{suffix}{extension<.json|.nii.gz|.nii|.tck|.trk>|.nii.gz}", # pylint: disable=line-too-long - "sub-{subject}[/ses-{session}]/{datatype|dwi}/{desc}", -] - - -class DerivativesDataSink(_DDSink): - out_path_base = "" - _file_patterns = tuple(list(_DDSink._file_patterns) + CUSTOM_PATH_PATTERNS) - - -__all__ = ("DerivativesDataSink",) def collect_data( @@ -138,81 +113,6 @@ def collect_data( return subj_data, layout -class _BIDSDataGrabberInputSpec(BaseInterfaceInputSpec): - subject_data = traits.Dict(Str, traits.Any) - subject_id = Str() - - -class _BIDSDataGrabberOutputSpec(TraitedSpec): - out_dict = traits.Dict(desc="output data structure") - fmap = OutputMultiObject(desc="output fieldmaps") - bold = OutputMultiObject(desc="output functional images") - sbref = OutputMultiObject(desc="output sbrefs") - t1w = OutputMultiObject(desc="output T1w images") - roi = OutputMultiObject(desc="output ROI images") - t2w = OutputMultiObject(desc="output T2w images") - flair = OutputMultiObject(desc="output FLAIR images") - dwi = OutputMultiObject(desc="output DWI images") - - -class BIDSDataGrabber(SimpleInterface): - """ - Collect files from a BIDS directory structure. - - .. testsetup:: - - >>> data_dir_canary() - - >>> bids_src = BIDSDataGrabber(anat_only=False) - >>> bids_src.inputs.subject_data = bids_collect_data( - ... str(datadir / 'ds114'), '01', bids_validate=False)[0] - >>> bids_src.inputs.subject_id = '01' - >>> res = bids_src.run() - >>> res.outputs.t1w # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE - ['.../ds114/sub-01/ses-retest/anat/sub-01_ses-retest_T1w.nii.gz', - '.../ds114/sub-01/ses-test/anat/sub-01_ses-test_T1w.nii.gz'] - - """ - - input_spec = _BIDSDataGrabberInputSpec - output_spec = _BIDSDataGrabberOutputSpec - _require_dwis = True - - def __init__(self, *args, **kwargs): - anat_only = kwargs.pop("anat_only") - anat_derivatives = kwargs.pop("anat_derivatives", None) - super().__init__(*args, **kwargs) - if anat_only is not None: - self._require_dwis = not anat_only - self._require_t1w = anat_derivatives is None - - def _run_interface(self, runtime): - bids_dict = self.inputs.subject_data - - self._results["out_dict"] = bids_dict - self._results.update(bids_dict) - - if self._require_t1w and not bids_dict["t1w"]: - raise FileNotFoundError( - f"No T1w images found for subject sub-{self.inputs.subject_id}" - ) - - if self._require_dwis and not bids_dict["dwi"]: - raise FileNotFoundError( - f"No DWI images found for subject sub-{self.inputs.subject_id}" - ) - - for imtype in ["bold", "t2w", "flair", "fmap", "sbref", "roi", "dwi"]: - if not bids_dict.get(imtype): - LOGGER.info( - 'No "%s" images found for sub-%s', - imtype, - self.inputs.subject_id, - ) - - return runtime - - def get_fieldmap(dwi_file: str | Path, subject_data: dict) -> str | None: """ Locate the fieldmap (dir-PA) associated with the dwi file of the session. @@ -243,3 +143,68 @@ def get_fieldmap(dwi_file: str | Path, subject_data: dict) -> str | None: ): return fmap return None + + +def write_derivative_description(bids_dir, deriv_dir): + from keprep import __version__ + + DOWNLOAD_URL = ( + f"https://github.com/GalKepler/keprep/archive/refs/tags/v{__version__}.tar.gz" + ) + + desc = { + "Name": "KePrep output", + "BIDSVersion": "1.9.0", + "PipelineDescription": { + "Name": "keprep", + "Version": __version__, + "CodeURL": DOWNLOAD_URL, + }, + "GeneratedBy": [ + { + "Name": "keprep", + "Version": __version__, + "CodeURL": DOWNLOAD_URL, + } + ], + "CodeURL": "https://github.com/GalKepler/keprep", + "HowToAcknowledge": "Please cite our paper and " + "include the generated citation boilerplate within the Methods " + "section of the text.", + } + + # Keys deriving from source dataset + fname = os.path.join(bids_dir, "dataset_description.json") + if os.path.exists(fname): + with open(fname) as fobj: + orig_desc = json.load(fobj) + else: + orig_desc = {} + + if "DatasetDOI" in orig_desc: + desc["SourceDatasetsURLs"] = [ + "https://doi.org/{}".format(orig_desc["DatasetDOI"]) + ] + if "License" in orig_desc: + desc["License"] = orig_desc["License"] + + with open(os.path.join(deriv_dir, "dataset_description.json"), "w") as fobj: + json.dump(desc, fobj, indent=4) + + +def write_bidsignore(deriv_dir): + bids_ignore = ( + "*.html", + "logs/", + "figures/", # Reports + "*_xfm.*", # Unspecified transform files + "*.surf.gii", # Unspecified structural outputs + # Unspecified functional outputs + "*_boldref.nii.gz", + "*_bold.func.gii", + "*_mixing.tsv", + "*_timeseries.tsv", + ) + ignore_file = Path(deriv_dir) / ".bidsignore" + + ignore_file.write_text("\n".join(bids_ignore) + "\n") diff --git a/src/keprep/workflows/base/workflow.py b/src/keprep/workflows/base/workflow.py index af4aa02..c7218bd 100644 --- a/src/keprep/workflows/base/workflow.py +++ b/src/keprep/workflows/base/workflow.py @@ -8,6 +8,7 @@ from packaging.version import Version from keprep import config +from keprep.interfaces.bids.utils import write_bidsignore, write_derivative_description from keprep.workflows.base.messages import ( ANAT_DERIVATIVES_FAILED, BASE_POSTDESC, @@ -48,6 +49,13 @@ def init_keprep_wf(): keprep_wf = Workflow(name=f"keprep_{ver.major}_{ver.minor}_{ver.micro}_wf") keprep_wf.base_dir = config.execution.work_dir + # Write BIDS-required files (dataset_description.json, ...) + write_derivative_description( + config.execution.bids_dir, + config.execution.keprep_dir, + ) + write_bidsignore(config.execution.keprep_dir) + freesurfer = config.workflow.do_reconall if freesurfer: fsdir = pe.Node( diff --git a/src/keprep/workflows/dwi/stages/derivatives.py b/src/keprep/workflows/dwi/stages/derivatives.py index 15ec323..5d91c60 100644 --- a/src/keprep/workflows/dwi/stages/derivatives.py +++ b/src/keprep/workflows/dwi/stages/derivatives.py @@ -189,30 +189,6 @@ def init_derivatives_wf(name: str = "derivatives_wf") -> pe.Workflow: run_without_submitting=True, ) - ds_unsifted_tck = pe.Node( - DerivativesDataSink( - base_directory=output_dir, - suffix="streamlines", - desc="unsifted", - extension=".tck", - dismiss_entities=["direction"], - ), - name="ds_unsifted_tck", - run_without_submitting=True, - ) - - ds_sifted_tck = pe.Node( - DerivativesDataSink( - base_directory=output_dir, - suffix="streamlines", - desc="sifted", - extension=".tck", - dismiss_entities=["direction"], - ), - name="ds_sifted_tck", - run_without_submitting=True, - ) - workflow.connect( [ ( @@ -291,16 +267,6 @@ def init_derivatives_wf(name: str = "derivatives_wf") -> pe.Workflow: ds_t1w2dwi_aff, [("t1w2dwi_aff", "in_file"), ("source_file", "source_file")], ), - ( - inputnode, - ds_unsifted_tck, - [("unsifted_tck", "in_file"), ("source_file", "source_file")], - ), - ( - inputnode, - ds_sifted_tck, - [("sifted_tck", "in_file"), ("source_file", "source_file")], - ), ] ) From 750548e59de8f04f8a76323597f324473493161d Mon Sep 17 00:00:00 2001 From: GalKepler Date: Sun, 4 Aug 2024 14:03:34 +0300 Subject: [PATCH 02/16] edited tox ini --- poetry.lock | 25 +++++++++++++++++++++---- pyproject.toml | 6 ++++++ src/keprep/config.py | 2 +- src/keprep/workflows/base/workflow.py | 10 +++++----- src/keprep/workflows/dwi/workflow.py | 2 +- tox.ini | 8 ++++++-- 6 files changed, 40 insertions(+), 13 deletions(-) diff --git a/poetry.lock b/poetry.lock index cbbdca2..8a226db 100644 --- a/poetry.lock +++ b/poetry.lock @@ -695,6 +695,23 @@ mccabe = ">=0.7.0,<0.8.0" pycodestyle = ">=2.12.0,<2.13.0" pyflakes = ">=3.2.0,<3.3.0" +[[package]] +name = "flake8-pyproject" +version = "1.2.3" +description = "Flake8 plug-in loading the configuration from pyproject.toml" +optional = false +python-versions = ">= 3.6" +files = [ + {file = "flake8_pyproject-1.2.3-py3-none-any.whl", hash = "sha256:6249fe53545205af5e76837644dc80b4c10037e73a0e5db87ff562d75fb5bd4a"}, +] + +[package.dependencies] +Flake8 = ">=5" +TOMLi = {version = "*", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["pyTest", "pyTest-cov"] + [[package]] name = "fonttools" version = "4.53.1" @@ -2550,13 +2567,13 @@ testing = ["covdefaults (>=2.3)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytes [[package]] name = "pytest" -version = "8.3.1" +version = "8.3.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.8" files = [ - {file = "pytest-8.3.1-py3-none-any.whl", hash = "sha256:e9600ccf4f563976e2c99fa02c7624ab938296551f280835ee6516df8bc4ae8c"}, - {file = "pytest-8.3.1.tar.gz", hash = "sha256:7e8e5c5abd6e93cb1cc151f23e57adc31fcf8cfd2a3ff2da63e23f732de35db6"}, + {file = "pytest-8.3.2-py3-none-any.whl", hash = "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5"}, + {file = "pytest-8.3.2.tar.gz", hash = "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce"}, ] [package.dependencies] @@ -3738,4 +3755,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "6f951fb98e049f6c11d41d1124bf789e4fca3a3aedc48b025aafed203f815e27" +content-hash = "7d937971dc780515748a10238243a814397a47ee4ba062e421be8f302b2a25e3" diff --git a/pyproject.toml b/pyproject.toml index 8e19557..6c09aa6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -31,6 +31,8 @@ smriprep = "^0.12.1" sdcflows = "^2.5.1" tox = "^4.16.0" doc8 = "^1.1.1" +flake8-pyproject = "^1.2.3" +pytest = "^8.3.2" [tool.poetry.dev-dependencies] coverage = "^7.5.4" # testing @@ -88,3 +90,7 @@ source = [ omit = [ "tests/*" ] + +[tool.flake8] +max-line-length = 88 +per-file-ignores = ["src/keprep/config.py:E501", "src/keprep/interfaces/*.py:E501"] diff --git a/src/keprep/config.py b/src/keprep/config.py index 1e87c85..c20f978 100644 --- a/src/keprep/config.py +++ b/src/keprep/config.py @@ -254,7 +254,7 @@ class nipype(_Config): memory_gb = None """Estimation in GB of the RAM this workflow can allocate at any given time.""" nprocs = os.cpu_count() - """Number of processes (compute tasks) that can be run in parallel (multiprocessing only).""" # noqa: C0301 + """Number of processes (compute tasks) that can be run in parallel (multiprocessing only).""" # noqa: E501 omp_nthreads = None """Number of CPUs a single process can access for multithreaded execution.""" plugin = "MultiProc" diff --git a/src/keprep/workflows/base/workflow.py b/src/keprep/workflows/base/workflow.py index c7218bd..2464f53 100644 --- a/src/keprep/workflows/base/workflow.py +++ b/src/keprep/workflows/base/workflow.py @@ -62,16 +62,16 @@ def init_keprep_wf(): BIDSFreeSurferDir( derivatives=config.execution.output_dir, freesurfer_home=os.getenv("FREESURFER_HOME"), - spaces=config.workflow.spaces.get_fs_spaces(), # type: ignore[attr-defined] + spaces=config.workflow.spaces.get_fs_spaces(), # type: ignore[attr-defined] # noqa: E501 minimum_fs_version="7.0.0", ), name=f"fsdir_run_{config.execution.run_uuid.replace('-', '_')}", run_without_submitting=True, ) if config.execution.fs_subjects_dir is not None: - fsdir.inputs.subjects_dir = str(config.execution.fs_subjects_dir.absolute()) # type: ignore[unreachable] + fsdir.inputs.subjects_dir = str(config.execution.fs_subjects_dir.absolute()) # type: ignore[unreachable] # noqa: E501 - participants: list = config.execution.participant_label # type: ignore[assignment] # pylint: disable=not-an-iterable + participants: list = config.execution.participant_label # type: ignore[assignment] # pylint: disable=not-an-iterable # noqa: E501 for subject_id in list(participants): single_subject_wf = init_single_subject_wf(subject_id) # type: ignore[operator] @@ -167,7 +167,7 @@ def init_single_subject_wf(subject_id: str): ) if anat_derivatives: - from smriprep.utils.bids import ( # type: ignore[unreachable] # pylint: disable=import-outside-toplevel,import-error + from smriprep.utils.bids import ( # type: ignore[unreachable] # pylint: disable=import-outside-toplevel,import-error # noqa: E501 collect_derivatives, ) @@ -263,7 +263,7 @@ def init_single_subject_wf(subject_id: str): (bidssrc, bids_info, [(('t1w', fix_multi_T1w_source_name), 'in_file')]), ]) else: - workflow.connect([ # type: ignore[unreachable] + workflow.connect([ # type: ignore[unreachable] (bidssrc, bids_info, [(('dwi', fix_multi_T1w_source_name), 'in_file')]), ]) diff --git a/src/keprep/workflows/dwi/workflow.py b/src/keprep/workflows/dwi/workflow.py index d841323..0240806 100644 --- a/src/keprep/workflows/dwi/workflow.py +++ b/src/keprep/workflows/dwi/workflow.py @@ -314,4 +314,4 @@ def _get_wf_name(filename): fname = Path(filename).name.rpartition(".nii")[0].replace("_dwi", "_wf") fname_nosub = "_".join(fname.split("_")[1:]) - return f"dwi_preproc_{fname_nosub.replace('.', '_').replace(' ', '').replace('-', '_')}" + return f"dwi_preproc_{fname_nosub.replace('.', '_').replace(' ', '').replace('-', '_')}" # noqa: E501 diff --git a/tox.ini b/tox.ini index ffb8409..0d793c0 100644 --- a/tox.ini +++ b/tox.ini @@ -46,8 +46,12 @@ commands = sphinx-build -b html docs docs/build [testenv:report] -deps = coverage +deps = + coverage + pytest + . skip_install = true commands = - coverage report + coverage run --source keprep -m pytest + coverage report -m coverage html From 6353905a155bf4e1dcb28103f93dbffa8e24e11a Mon Sep 17 00:00:00 2001 From: Gal Kepler Date: Sun, 4 Aug 2024 13:26:53 +0300 Subject: [PATCH 03/16] CircleCI Commit --- .circleci/config.yml | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 .circleci/config.yml diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 0000000..0b3c69e --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,41 @@ +# This config was automatically generated from your source code +# Stacks detected: cicd:github-actions:.github/workflows,deps:python:.,package_manager:poetry:.,test:tox:. +version: 2.1 +orbs: + python: circleci/python@2 +jobs: + test-python: + # Install dependencies and run tests + docker: + - image: cimg/python:3.10-node + steps: + - checkout + - python/install-packages: + pkg-manager: poetry + - python/install-packages: + args: tox + pkg-manager: poetry + - run: + name: Run tests + command: poetry run tox + - store_test_results: + path: junit.xml + deploy: + # This is an example deploy job, not actually used by the workflow + docker: + - image: cimg/base:stable + steps: + # Replace this with steps to deploy to users + - run: + name: deploy + command: '#e.g. ./deploy.sh' + - run: + name: found github actions config + command: ':' +workflows: + build-and-test: + jobs: + - test-python + # - deploy: + # requires: + # - test-python From d7e92f23569c6a7ba2b1d598f014b673a017e160 Mon Sep 17 00:00:00 2001 From: Gal Kepler Date: Sun, 4 Aug 2024 13:33:15 +0300 Subject: [PATCH 04/16] Update config.yml --- .circleci/config.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 0b3c69e..a4a3a24 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,7 +13,6 @@ jobs: - python/install-packages: pkg-manager: poetry - python/install-packages: - args: tox pkg-manager: poetry - run: name: Run tests From c3bebc2b1d5fe0e102ca6d109af691010669b752 Mon Sep 17 00:00:00 2001 From: Gal Kepler Date: Sun, 4 Aug 2024 13:40:40 +0300 Subject: [PATCH 05/16] Update config.yml --- .circleci/config.yml | 2 -- 1 file changed, 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a4a3a24..523a178 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -10,8 +10,6 @@ jobs: - image: cimg/python:3.10-node steps: - checkout - - python/install-packages: - pkg-manager: poetry - python/install-packages: pkg-manager: poetry - run: From 8f9aa9bceaa33a32ca8d4ce77c27c5781b8a397a Mon Sep 17 00:00:00 2001 From: Gal Kepler Date: Sun, 4 Aug 2024 14:03:06 +0300 Subject: [PATCH 06/16] Update config.yml --- .circleci/config.yml | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 523a178..eee5c10 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,8 +13,20 @@ jobs: - python/install-packages: pkg-manager: poetry - run: - name: Run tests - command: poetry run tox + name: Check + command: poetry run tox -e check -v + - run: + name: docs + command: poetry run tox -e docs -v + - run: + name: flake8 + command: poetry run tox -e flake8 -v + - run: + name: tests + command: poetry run pytest + - run: + name: coverage + command: poetry run tox -e report -v - store_test_results: path: junit.xml deploy: From 7427b851411a910238e618620eb5fbabbcda0c47 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Sun, 4 Aug 2024 14:12:09 +0300 Subject: [PATCH 07/16] updated readme --- README.rst | 6 +- poetry.lock | 586 +++++++++++++++++++++++++++++----------------------- 2 files changed, 328 insertions(+), 264 deletions(-) diff --git a/README.rst b/README.rst index 350a2af..6ecde2a 100644 --- a/README.rst +++ b/README.rst @@ -13,7 +13,7 @@ Overview * - docs - |docs| * - tests, CI & coverage - - |github-actions| |codecov| |codacy| + - |github-actions| |circleci| |codecov| |codacy| * - codeclimate - |codeclimate-maintainability| |codeclimate-testcoverage| * - version @@ -31,6 +31,10 @@ Overview :alt: GitHub Actions Build Status :target: https://github.com/GalKepler/keprep/actions +.. |circleci| image:: https://dl.circleci.com/status-badge/img/circleci/J6A3JWLZsHZMCMZ1aCKdXb/AVFefVDaX15sp62PZ8MpA9/tree/main.svg?style=svg + :alt: CircleCI Build Status + :target: https://dl.circleci.com/status-badge/redirect/circleci/J6A3JWLZsHZMCMZ1aCKdXb/AVFefVDaX15sp62PZ8MpA9/tree/main + .. |codecov| image:: https://codecov.io/github/GalKepler/keprep/graph/badge.svg?token=LO5CH471O4 :alt: Coverage Status :target: https://app.codecov.io/github/GalKepler/keprep diff --git a/poetry.lock b/poetry.lock index 8a226db..9030c9e 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,19 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "acres" +version = "0.1.0" +description = "Access resources on your terms" +optional = false +python-versions = ">=3.8" +files = [ + {file = "acres-0.1.0-py3-none-any.whl", hash = "sha256:7bbb3744de84d1499e5cc00f02d10f7e85c880e343722871816ca41502d4d103"}, + {file = "acres-0.1.0.tar.gz", hash = "sha256:4765479683389849368947da9e5319e677e7323ed858d642f9736ad1c070f45b"}, +] + +[package.dependencies] +importlib_resources = {version = "*", markers = "python_version < \"3.11\""} + [[package]] name = "appnope" version = "0.1.4" @@ -42,22 +56,22 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "attrs" -version = "23.2.0" +version = "24.1.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, - {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, + {file = "attrs-24.1.0-py3-none-any.whl", hash = "sha256:377b47448cb61fea38533f671fba0d0f8a96fd58facd4dc518e3dac9dbea0905"}, + {file = "attrs-24.1.0.tar.gz", hash = "sha256:adbdec84af72d38be7628e353a09b6a6790d15cd71819f6e9d7b0faa8a125745"}, ] [package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] -tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "bids-validator" @@ -72,33 +86,33 @@ files = [ [[package]] name = "black" -version = "24.4.2" +version = "24.8.0" description = "The uncompromising code formatter." optional = false python-versions = ">=3.8" files = [ - {file = "black-24.4.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dd1b5a14e417189db4c7b64a6540f31730713d173f0b63e55fabd52d61d8fdce"}, - {file = "black-24.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e537d281831ad0e71007dcdcbe50a71470b978c453fa41ce77186bbe0ed6021"}, - {file = "black-24.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaea3008c281f1038edb473c1aa8ed8143a5535ff18f978a318f10302b254063"}, - {file = "black-24.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:7768a0dbf16a39aa5e9a3ded568bb545c8c2727396d063bbaf847df05b08cd96"}, - {file = "black-24.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:257d724c2c9b1660f353b36c802ccece186a30accc7742c176d29c146df6e474"}, - {file = "black-24.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bdde6f877a18f24844e381d45e9947a49e97933573ac9d4345399be37621e26c"}, - {file = "black-24.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e151054aa00bad1f4e1f04919542885f89f5f7d086b8a59e5000e6c616896ffb"}, - {file = "black-24.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:7e122b1c4fb252fd85df3ca93578732b4749d9be076593076ef4d07a0233c3e1"}, - {file = "black-24.4.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:accf49e151c8ed2c0cdc528691838afd217c50412534e876a19270fea1e28e2d"}, - {file = "black-24.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:88c57dc656038f1ab9f92b3eb5335ee9b021412feaa46330d5eba4e51fe49b04"}, - {file = "black-24.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:be8bef99eb46d5021bf053114442914baeb3649a89dc5f3a555c88737e5e98fc"}, - {file = "black-24.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:415e686e87dbbe6f4cd5ef0fbf764af7b89f9057b97c908742b6008cc554b9c0"}, - {file = "black-24.4.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:bf10f7310db693bb62692609b397e8d67257c55f949abde4c67f9cc574492cc7"}, - {file = "black-24.4.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:98e123f1d5cfd42f886624d84464f7756f60ff6eab89ae845210631714f6db94"}, - {file = "black-24.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:48a85f2cb5e6799a9ef05347b476cce6c182d6c71ee36925a6c194d074336ef8"}, - {file = "black-24.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:b1530ae42e9d6d5b670a34db49a94115a64596bc77710b1d05e9801e62ca0a7c"}, - {file = "black-24.4.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:37aae07b029fa0174d39daf02748b379399b909652a806e5708199bd93899da1"}, - {file = "black-24.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da33a1a5e49c4122ccdfd56cd021ff1ebc4a1ec4e2d01594fef9b6f267a9e741"}, - {file = "black-24.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef703f83fc32e131e9bcc0a5094cfe85599e7109f896fe8bc96cc402f3eb4b6e"}, - {file = "black-24.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:b9176b9832e84308818a99a561e90aa479e73c523b3f77afd07913380ae2eab7"}, - {file = "black-24.4.2-py3-none-any.whl", hash = "sha256:d36ed1124bb81b32f8614555b34cc4259c3fbc7eec17870e8ff8ded335b58d8c"}, - {file = "black-24.4.2.tar.gz", hash = "sha256:c872b53057f000085da66a19c55d68f6f8ddcac2642392ad3a355878406fbd4d"}, + {file = "black-24.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:09cdeb74d494ec023ded657f7092ba518e8cf78fa8386155e4a03fdcc44679e6"}, + {file = "black-24.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:81c6742da39f33b08e791da38410f32e27d632260e599df7245cccee2064afeb"}, + {file = "black-24.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:707a1ca89221bc8a1a64fb5e15ef39cd755633daa672a9db7498d1c19de66a42"}, + {file = "black-24.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:d6417535d99c37cee4091a2f24eb2b6d5ec42b144d50f1f2e436d9fe1916fe1a"}, + {file = "black-24.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:fb6e2c0b86bbd43dee042e48059c9ad7830abd5c94b0bc518c0eeec57c3eddc1"}, + {file = "black-24.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:837fd281f1908d0076844bc2b801ad2d369c78c45cf800cad7b61686051041af"}, + {file = "black-24.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62e8730977f0b77998029da7971fa896ceefa2c4c4933fcd593fa599ecbf97a4"}, + {file = "black-24.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:72901b4913cbac8972ad911dc4098d5753704d1f3c56e44ae8dce99eecb0e3af"}, + {file = "black-24.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7c046c1d1eeb7aea9335da62472481d3bbf3fd986e093cffd35f4385c94ae368"}, + {file = "black-24.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:649f6d84ccbae73ab767e206772cc2d7a393a001070a4c814a546afd0d423aed"}, + {file = "black-24.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b59b250fdba5f9a9cd9d0ece6e6d993d91ce877d121d161e4698af3eb9c1018"}, + {file = "black-24.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:6e55d30d44bed36593c3163b9bc63bf58b3b30e4611e4d88a0c3c239930ed5b2"}, + {file = "black-24.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:505289f17ceda596658ae81b61ebbe2d9b25aa78067035184ed0a9d855d18afd"}, + {file = "black-24.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b19c9ad992c7883ad84c9b22aaa73562a16b819c1d8db7a1a1a49fb7ec13c7d2"}, + {file = "black-24.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f13f7f386f86f8121d76599114bb8c17b69d962137fc70efe56137727c7047e"}, + {file = "black-24.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:f490dbd59680d809ca31efdae20e634f3fae27fba3ce0ba3208333b713bc3920"}, + {file = "black-24.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:eab4dd44ce80dea27dc69db40dab62d4ca96112f87996bca68cd75639aeb2e4c"}, + {file = "black-24.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3c4285573d4897a7610054af5a890bde7c65cb466040c5f0c8b732812d7f0e5e"}, + {file = "black-24.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e84e33b37be070ba135176c123ae52a51f82306def9f7d063ee302ecab2cf47"}, + {file = "black-24.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:73bbf84ed136e45d451a260c6b73ed674652f90a2b3211d6a35e78054563a9bb"}, + {file = "black-24.8.0-py3-none-any.whl", hash = "sha256:972085c618ee94f402da1af548a4f218c754ea7e5dc70acb168bfaca4c2542ed"}, + {file = "black-24.8.0.tar.gz", hash = "sha256:2500945420b6784c38b9ee885af039f5e7471ef284ab03fa35ecdde4688cd83f"}, ] [package.dependencies] @@ -525,33 +539,13 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.2" +version = "1.8.3" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.2-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2"}, - {file = "debugpy-1.8.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6"}, - {file = "debugpy-1.8.2-cp310-cp310-win32.whl", hash = "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47"}, - {file = "debugpy-1.8.2-cp310-cp310-win_amd64.whl", hash = "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3"}, - {file = "debugpy-1.8.2-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a"}, - {file = "debugpy-1.8.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634"}, - {file = "debugpy-1.8.2-cp311-cp311-win32.whl", hash = "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad"}, - {file = "debugpy-1.8.2-cp311-cp311-win_amd64.whl", hash = "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa"}, - {file = "debugpy-1.8.2-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835"}, - {file = "debugpy-1.8.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3"}, - {file = "debugpy-1.8.2-cp312-cp312-win32.whl", hash = "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e"}, - {file = "debugpy-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859"}, - {file = "debugpy-1.8.2-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d"}, - {file = "debugpy-1.8.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02"}, - {file = "debugpy-1.8.2-cp38-cp38-win32.whl", hash = "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031"}, - {file = "debugpy-1.8.2-cp38-cp38-win_amd64.whl", hash = "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210"}, - {file = "debugpy-1.8.2-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9"}, - {file = "debugpy-1.8.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1"}, - {file = "debugpy-1.8.2-cp39-cp39-win32.whl", hash = "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326"}, - {file = "debugpy-1.8.2-cp39-cp39-win_amd64.whl", hash = "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755"}, - {file = "debugpy-1.8.2-py2.py3-none-any.whl", hash = "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca"}, - {file = "debugpy-1.8.2.zip", hash = "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00"}, + {file = "debugpy-1.8.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0df2c400853150af14996b8d1a4f54d45ffa98e76c0f3de30665e89e273ea293"}, + {file = "debugpy-1.8.3.zip", hash = "sha256:0f5a6326d9fc375b864ed368d06cddf2dabe5135511e71cde3758be699847d36"}, ] [[package]] @@ -801,6 +795,45 @@ wrapt = ">=1.0" arrow = ["pyarrow (>=1)"] calculus = ["sympy (>=1.3,<1.10)"] +[[package]] +name = "fsspec" +version = "2024.6.1" +description = "File-system specification" +optional = false +python-versions = ">=3.8" +files = [ + {file = "fsspec-2024.6.1-py3-none-any.whl", hash = "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e"}, + {file = "fsspec-2024.6.1.tar.gz", hash = "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49"}, +] + +[package.extras] +abfs = ["adlfs"] +adl = ["adlfs"] +arrow = ["pyarrow (>=1)"] +dask = ["dask", "distributed"] +dev = ["pre-commit", "ruff"] +doc = ["numpydoc", "sphinx", "sphinx-design", "sphinx-rtd-theme", "yarl"] +dropbox = ["dropbox", "dropboxdrivefs", "requests"] +full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "dask", "distributed", "dropbox", "dropboxdrivefs", "fusepy", "gcsfs", "libarchive-c", "ocifs", "panel", "paramiko", "pyarrow (>=1)", "pygit2", "requests", "s3fs", "smbprotocol", "tqdm"] +fuse = ["fusepy"] +gcs = ["gcsfs"] +git = ["pygit2"] +github = ["requests"] +gs = ["gcsfs"] +gui = ["panel"] +hdfs = ["pyarrow (>=1)"] +http = ["aiohttp (!=4.0.0a0,!=4.0.0a1)"] +libarchive = ["libarchive-c"] +oci = ["ocifs"] +s3 = ["s3fs"] +sftp = ["paramiko"] +smb = ["smbprotocol"] +ssh = ["paramiko"] +test = ["aiohttp (!=4.0.0a0,!=4.0.0a1)", "numpy", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "requests"] +test-downstream = ["aiobotocore (>=2.5.4,<3.0.0)", "dask-expr", "dask[dataframe,test]", "moto[server] (>4,<5)", "pytest-timeout", "xarray"] +test-full = ["adlfs", "aiohttp (!=4.0.0a0,!=4.0.0a1)", "cloudpickle", "dask", "distributed", "dropbox", "dropboxdrivefs", "fastparquet", "fusepy", "gcsfs", "jinja2", "kerchunk", "libarchive-c", "lz4", "notebook", "numpy", "ocifs", "pandas", "panel", "paramiko", "pyarrow", "pyarrow (>=1)", "pyftpdlib", "pygit2", "pytest", "pytest-asyncio (!=0.22.0)", "pytest-benchmark", "pytest-cov", "pytest-mock", "pytest-recording", "pytest-rerunfailures", "python-snappy", "requests", "smbprotocol", "tqdm", "urllib3", "zarr", "zstandard"] +tqdm = ["tqdm"] + [[package]] name = "greenlet" version = "3.0.3" @@ -1722,58 +1755,40 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] -[[package]] -name = "migas" -version = "0.4.0" -description = "A Python package to communicate with a migas server." -optional = false -python-versions = ">=3.8" -files = [ - {file = "migas-0.4.0-py3-none-any.whl", hash = "sha256:22cefe4f65b4eed0850bb166c9c958701e3c2105476d6ca853b262553d0c150c"}, - {file = "migas-0.4.0.tar.gz", hash = "sha256:069481021e86fb9a84b9977f2f5adb9c77c5220787065859b9510cf80e7095f5"}, -] - -[package.dependencies] -ci-info = "*" - -[package.extras] -dev = ["black", "isort", "pre-commit"] -test = ["looseversion", "pytest", "requests"] - [[package]] name = "mypy" -version = "1.11.0" +version = "1.11.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.8" files = [ - {file = "mypy-1.11.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a3824187c99b893f90c845bab405a585d1ced4ff55421fdf5c84cb7710995229"}, - {file = "mypy-1.11.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:96f8dbc2c85046c81bcddc246232d500ad729cb720da4e20fce3b542cab91287"}, - {file = "mypy-1.11.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a5d8d8dd8613a3e2be3eae829ee891b6b2de6302f24766ff06cb2875f5be9c6"}, - {file = "mypy-1.11.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:72596a79bbfb195fd41405cffa18210af3811beb91ff946dbcb7368240eed6be"}, - {file = "mypy-1.11.0-cp310-cp310-win_amd64.whl", hash = "sha256:35ce88b8ed3a759634cb4eb646d002c4cef0a38f20565ee82b5023558eb90c00"}, - {file = "mypy-1.11.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:98790025861cb2c3db8c2f5ad10fc8c336ed2a55f4daf1b8b3f877826b6ff2eb"}, - {file = "mypy-1.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:25bcfa75b9b5a5f8d67147a54ea97ed63a653995a82798221cca2a315c0238c1"}, - {file = "mypy-1.11.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bea2a0e71c2a375c9fa0ede3d98324214d67b3cbbfcbd55ac8f750f85a414e3"}, - {file = "mypy-1.11.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:d2b3d36baac48e40e3064d2901f2fbd2a2d6880ec6ce6358825c85031d7c0d4d"}, - {file = "mypy-1.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:d8e2e43977f0e09f149ea69fd0556623919f816764e26d74da0c8a7b48f3e18a"}, - {file = "mypy-1.11.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:1d44c1e44a8be986b54b09f15f2c1a66368eb43861b4e82573026e04c48a9e20"}, - {file = "mypy-1.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cea3d0fb69637944dd321f41bc896e11d0fb0b0aa531d887a6da70f6e7473aba"}, - {file = "mypy-1.11.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a83ec98ae12d51c252be61521aa5731f5512231d0b738b4cb2498344f0b840cd"}, - {file = "mypy-1.11.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:c7b73a856522417beb78e0fb6d33ef89474e7a622db2653bc1285af36e2e3e3d"}, - {file = "mypy-1.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:f2268d9fcd9686b61ab64f077be7ffbc6fbcdfb4103e5dd0cc5eaab53a8886c2"}, - {file = "mypy-1.11.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:940bfff7283c267ae6522ef926a7887305945f716a7704d3344d6d07f02df850"}, - {file = "mypy-1.11.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:14f9294528b5f5cf96c721f231c9f5b2733164e02c1c018ed1a0eff8a18005ac"}, - {file = "mypy-1.11.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7b54c27783991399046837df5c7c9d325d921394757d09dbcbf96aee4649fe9"}, - {file = "mypy-1.11.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:65f190a6349dec29c8d1a1cd4aa71284177aee5949e0502e6379b42873eddbe7"}, - {file = "mypy-1.11.0-cp38-cp38-win_amd64.whl", hash = "sha256:dbe286303241fea8c2ea5466f6e0e6a046a135a7e7609167b07fd4e7baf151bf"}, - {file = "mypy-1.11.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:104e9c1620c2675420abd1f6c44bab7dd33cc85aea751c985006e83dcd001095"}, - {file = "mypy-1.11.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f006e955718ecd8d159cee9932b64fba8f86ee6f7728ca3ac66c3a54b0062abe"}, - {file = "mypy-1.11.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:becc9111ca572b04e7e77131bc708480cc88a911adf3d0239f974c034b78085c"}, - {file = "mypy-1.11.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6801319fe76c3f3a3833f2b5af7bd2c17bb93c00026a2a1b924e6762f5b19e13"}, - {file = "mypy-1.11.0-cp39-cp39-win_amd64.whl", hash = "sha256:c1a184c64521dc549324ec6ef7cbaa6b351912be9cb5edb803c2808a0d7e85ac"}, - {file = "mypy-1.11.0-py3-none-any.whl", hash = "sha256:56913ec8c7638b0091ef4da6fcc9136896914a9d60d54670a75880c3e5b99ace"}, - {file = "mypy-1.11.0.tar.gz", hash = "sha256:93743608c7348772fdc717af4aeee1997293a1ad04bc0ea6efa15bf65385c538"}, + {file = "mypy-1.11.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a32fc80b63de4b5b3e65f4be82b4cfa362a46702672aa6a0f443b4689af7008c"}, + {file = "mypy-1.11.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c1952f5ea8a5a959b05ed5f16452fddadbaae48b5d39235ab4c3fc444d5fd411"}, + {file = "mypy-1.11.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1e30dc3bfa4e157e53c1d17a0dad20f89dc433393e7702b813c10e200843b03"}, + {file = "mypy-1.11.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2c63350af88f43a66d3dfeeeb8d77af34a4f07d760b9eb3a8697f0386c7590b4"}, + {file = "mypy-1.11.1-cp310-cp310-win_amd64.whl", hash = "sha256:a831671bad47186603872a3abc19634f3011d7f83b083762c942442d51c58d58"}, + {file = "mypy-1.11.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7b6343d338390bb946d449677726edf60102a1c96079b4f002dedff375953fc5"}, + {file = "mypy-1.11.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e4fe9f4e5e521b458d8feb52547f4bade7ef8c93238dfb5bbc790d9ff2d770ca"}, + {file = "mypy-1.11.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:886c9dbecc87b9516eff294541bf7f3655722bf22bb898ee06985cd7269898de"}, + {file = "mypy-1.11.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fca4a60e1dd9fd0193ae0067eaeeb962f2d79e0d9f0f66223a0682f26ffcc809"}, + {file = "mypy-1.11.1-cp311-cp311-win_amd64.whl", hash = "sha256:0bd53faf56de9643336aeea1c925012837432b5faf1701ccca7fde70166ccf72"}, + {file = "mypy-1.11.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f39918a50f74dc5969807dcfaecafa804fa7f90c9d60506835036cc1bc891dc8"}, + {file = "mypy-1.11.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0bc71d1fb27a428139dd78621953effe0d208aed9857cb08d002280b0422003a"}, + {file = "mypy-1.11.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b868d3bcff720dd7217c383474008ddabaf048fad8d78ed948bb4b624870a417"}, + {file = "mypy-1.11.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a707ec1527ffcdd1c784d0924bf5cb15cd7f22683b919668a04d2b9c34549d2e"}, + {file = "mypy-1.11.1-cp312-cp312-win_amd64.whl", hash = "sha256:64f4a90e3ea07f590c5bcf9029035cf0efeae5ba8be511a8caada1a4893f5525"}, + {file = "mypy-1.11.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:749fd3213916f1751fff995fccf20c6195cae941dc968f3aaadf9bb4e430e5a2"}, + {file = "mypy-1.11.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b639dce63a0b19085213ec5fdd8cffd1d81988f47a2dec7100e93564f3e8fb3b"}, + {file = "mypy-1.11.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c956b49c5d865394d62941b109728c5c596a415e9c5b2be663dd26a1ff07bc0"}, + {file = "mypy-1.11.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45df906e8b6804ef4b666af29a87ad9f5921aad091c79cc38e12198e220beabd"}, + {file = "mypy-1.11.1-cp38-cp38-win_amd64.whl", hash = "sha256:d44be7551689d9d47b7abc27c71257adfdb53f03880841a5db15ddb22dc63edb"}, + {file = "mypy-1.11.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2684d3f693073ab89d76da8e3921883019ea8a3ec20fa5d8ecca6a2db4c54bbe"}, + {file = "mypy-1.11.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:79c07eb282cb457473add5052b63925e5cc97dfab9812ee65a7c7ab5e3cb551c"}, + {file = "mypy-1.11.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11965c2f571ded6239977b14deebd3f4c3abd9a92398712d6da3a772974fad69"}, + {file = "mypy-1.11.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a2b43895a0f8154df6519706d9bca8280cda52d3d9d1514b2d9c3e26792a0b74"}, + {file = "mypy-1.11.1-cp39-cp39-win_amd64.whl", hash = "sha256:1a81cf05975fd61aec5ae16501a091cfb9f605dc3e3c878c0da32f250b74760b"}, + {file = "mypy-1.11.1-py3-none-any.whl", hash = "sha256:0624bdb940255d2dd24e829d99a13cfeb72e4e9031f9492148f410ed30bcab54"}, + {file = "mypy-1.11.1.tar.gz", hash = "sha256:f404a0b069709f18bbdb702eb3dcfe51910602995de00bd39cea3050b5772d08"}, ] [package.dependencies] @@ -1931,40 +1946,39 @@ xvfbwrapper = ["xvfbwrapper"] [[package]] name = "nitransforms" -version = "23.0.1" +version = "21.0.0" description = "NiTransforms -- Neuroimaging spatial transforms in Python." optional = false python-versions = ">=3.7" files = [ - {file = "nitransforms-23.0.1-py3-none-any.whl", hash = "sha256:9c8acc1b6fdec99e8c5bd9769a817a66d858d04f05f683f054a37deba9ce5156"}, - {file = "nitransforms-23.0.1.tar.gz", hash = "sha256:2edcb868fcd29704494aa097788548085fa0b9d62ab68d4e4b8715672ac1da76"}, + {file = "nitransforms-21.0.0-py3-none-any.whl", hash = "sha256:3341a3ac73b46d358c8ff0b9e241142e4b360b6a4750d718ccad024dfe8be3a6"}, + {file = "nitransforms-21.0.0.tar.gz", hash = "sha256:9e326a1ea5d5c6577219f99d33c1a680a760213e243182f370ce7e6b2476103a"}, ] [package.dependencies] h5py = "*" nibabel = ">=3.0" -numpy = {version = ">=1.21,<2.0", markers = "python_version > \"3.7\""} -scipy = {version = ">=1.6,<2.0", markers = "python_version > \"3.7\""} +numpy = "*" +scipy = "*" [package.extras] -all = ["codecov", "lxml", "pytest", "pytest-cov"] -niftiext = ["lxml"] -niftiexts = ["lxml"] +all = ["codecov", "pytest", "pytest-cov"] test = ["codecov", "pytest", "pytest-cov"] tests = ["codecov", "pytest", "pytest-cov"] [[package]] name = "niworkflows" -version = "1.10.2" +version = "1.11.0" description = "NeuroImaging Workflows provides processing tools for magnetic resonance images of the brain." optional = false python-versions = ">=3.8" files = [ - {file = "niworkflows-1.10.2-py3-none-any.whl", hash = "sha256:2a753d7d35f8723a7d7a433c10f8772e481d3cd1e5457637f66f46b8e5226781"}, - {file = "niworkflows-1.10.2.tar.gz", hash = "sha256:ab95e4a2217ce151881e196cfbd649ffedc6c28ea4eed194f39d2f303b29be24"}, + {file = "niworkflows-1.11.0-py3-none-any.whl", hash = "sha256:f194fa958caf960ae1cba4333257eb9f0ad39efc9f23cd39f91b59495684c18c"}, + {file = "niworkflows-1.11.0.tar.gz", hash = "sha256:932bc150ea29f7d83febda9ecd05023ecd45454b532a0aec2b505ebf0a25cbc7"}, ] [package.dependencies] +acres = "*" attrs = "*" importlib-resources = {version = ">=5.7", markers = "python_version < \"3.11\""} jinja2 = "*" @@ -2022,47 +2036,56 @@ docopt = ">=0.6.2" [[package]] name = "numpy" -version = "1.26.4" +version = "2.0.1" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, - {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, - {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, - {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, - {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, - {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, - {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, - {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, - {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, - {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, - {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, - {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, - {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, - {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, - {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, - {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, - {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, - {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, - {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, - {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, - {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, - {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, - {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, + {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, + {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, + {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, + {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, + {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, + {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, + {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, + {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, + {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, ] [[package]] @@ -2330,13 +2353,13 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "pre-commit" -version = "3.7.1" +version = "3.8.0" description = "A framework for managing and maintaining multi-language pre-commit hooks." optional = false python-versions = ">=3.9" files = [ - {file = "pre_commit-3.7.1-py2.py3-none-any.whl", hash = "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5"}, - {file = "pre_commit-3.7.1.tar.gz", hash = "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a"}, + {file = "pre_commit-3.8.0-py2.py3-none-any.whl", hash = "sha256:9a90a53bf82fdd8778d58085faf8d83df56e40dfe18f45b19446e26bf1b3a63f"}, + {file = "pre_commit-3.8.0.tar.gz", hash = "sha256:8bb6494d4a20423842e198980c9ecf9f96607a07ea29549e180eef9ae80fe7af"}, ] [package.dependencies] @@ -2435,13 +2458,13 @@ tests = ["pytest"] [[package]] name = "pybids" -version = "0.16.5" +version = "0.17.0" description = "bids: interface with datasets conforming to BIDS" optional = false python-versions = ">=3.8" files = [ - {file = "pybids-0.16.5-py3-none-any.whl", hash = "sha256:7b3d4b8005644895fcff01d565cc163de9e2aa338f3ef238cec8b2289959eef5"}, - {file = "pybids-0.16.5.tar.gz", hash = "sha256:e4c029e426253a1d56c6c5ce13f2c754d9bf2b854615a2ca59a68a6302a34083"}, + {file = "pybids-0.17.0-py3-none-any.whl", hash = "sha256:d879dcabb9093533f1c39ecd157c3debb7cdfca20362f1e25b93a4cd4ab00d45"}, + {file = "pybids-0.17.0.tar.gz", hash = "sha256:e000335eae5b7749ea9621adca4a17309fb9a4bb67a3f4231a70155267875a50"}, ] [package.dependencies] @@ -2454,6 +2477,7 @@ numpy = ">=1.19" pandas = ">=0.25.2" scipy = ">=1.5" sqlalchemy = ">=1.3.16" +universal-pathlib = ">=0.2.2" [package.extras] ci-tests = ["pybids[test]"] @@ -2614,13 +2638,13 @@ files = [ [[package]] name = "pyupgrade" -version = "3.16.0" +version = "3.17.0" description = "A tool to automatically upgrade syntax for newer versions." optional = false -python-versions = ">=3.8.1" +python-versions = ">=3.9" files = [ - {file = "pyupgrade-3.16.0-py2.py3-none-any.whl", hash = "sha256:7a54ee28f3024d027048d49d101e5c702e88c85edc3a1d08b636c50ebef2a97d"}, - {file = "pyupgrade-3.16.0.tar.gz", hash = "sha256:237893a05d5b117259b31b423f23cbae4bce0b7eae57ba9a52c06098c2ddd76f"}, + {file = "pyupgrade-3.17.0-py2.py3-none-any.whl", hash = "sha256:cbc8f67a61d3f4e7ca9c2ef57b9aae67f023d3780ce30c99fccec78401723754"}, + {file = "pyupgrade-3.17.0.tar.gz", hash = "sha256:d5dd1dcaf9a016c31508bb9d3d09fd335d736578092f91df52bb26ac30c37919"}, ] [package.dependencies] @@ -2711,99 +2735,120 @@ files = [ [[package]] name = "pyzmq" -version = "26.0.3" +version = "26.1.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.7" files = [ - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, - {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, - {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, - {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, - {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, - {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, - {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, - {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, - {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, - {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, - {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, - {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, - {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, - {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, - {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, - {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, - {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, - {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, - {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, - {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, - {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, - {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, - {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, - {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, - {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, - {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, - {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, - {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, - {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, - {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, - {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, - {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, - {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, - {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e"}, + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88"}, + {file = "pyzmq-26.1.0-cp310-cp310-win32.whl", hash = "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b"}, + {file = "pyzmq-26.1.0-cp311-cp311-win32.whl", hash = "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83"}, + {file = "pyzmq-26.1.0-cp312-cp312-win32.whl", hash = "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4"}, + {file = "pyzmq-26.1.0-cp313-cp313-win32.whl", hash = "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win32.whl", hash = "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c"}, + {file = "pyzmq-26.1.0-cp38-cp38-win32.whl", hash = "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741"}, + {file = "pyzmq-26.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8"}, + {file = "pyzmq-26.1.0-cp39-cp39-win32.whl", hash = "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c"}, + {file = "pyzmq-26.1.0.tar.gz", hash = "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f"}, ] [package.dependencies] @@ -3027,35 +3072,32 @@ test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "me [[package]] name = "sdcflows" -version = "2.10.0" +version = "2.5.2" description = "Susceptibility Distortion Correction (SDC) workflows for EPI MR schemes." optional = false -python-versions = ">=3.9" +python-versions = ">=3.8" files = [ - {file = "sdcflows-2.10.0-py3-none-any.whl", hash = "sha256:bd9360afe861b9daec783da114f4564bd02324f8d0cfbe5f27e118093f6f4bfc"}, - {file = "sdcflows-2.10.0.tar.gz", hash = "sha256:c86dde3cbe95316e4c8fbb46d705fdb91b92f9623c36c29775ced113931946d1"}, + {file = "sdcflows-2.5.2-py3-none-any.whl", hash = "sha256:281428fd35a0f2b67de2810d7dae96feb1a0108b52a0afe9aee4e80e652cbe3f"}, + {file = "sdcflows-2.5.2.tar.gz", hash = "sha256:c32ef718ef0311f7dd13a8718e3b2d8f2e0884514788180c1018b4197d45a9ce"}, ] [package.dependencies] attrs = ">=20.1.0" -migas = ">=0.4.0" nibabel = ">=3.1.0" nipype = ">=1.8.5,<2.0" -nitransforms = ">=23.0.1" +nitransforms = ">=21.0.0" niworkflows = ">=1.7.0" numpy = ">=1.21.0" -pybids = ">=0.16.4" +pybids = ">=0.15.1" scikit-image = ">=0.18" scipy = ">=1.8.1" templateflow = "*" -toml = "*" traits = "<6.4" [package.extras] -all = ["attrs (>=20.1.0)", "black", "coverage", "flake8-pyproject", "furo", "importlib-resources", "ipykernel", "ipython", "isort", "matplotlib (>=2.2.0)", "nbsphinx", "nibabel", "nipype (>=1.5.1)", "niworkflows (>=1.10.0)", "numpy", "packaging", "pandoc", "pre-commit", "psutil", "pydot (>=1.2.3)", "pydotplus", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "scipy", "sphinx (>=7.2.2)", "sphinx-argparse", "sphinxcontrib-apidoc", "templateflow", "traits (<6.4)"] -dev = ["black", "flake8-pyproject", "isort", "pre-commit"] -doc = ["attrs (>=20.1.0)", "furo", "importlib-resources", "ipykernel", "ipython", "matplotlib (>=2.2.0)", "nbsphinx", "nibabel", "nipype (>=1.5.1)", "niworkflows (>=1.10.0)", "numpy", "packaging", "pandoc", "pydot (>=1.2.3)", "pydotplus", "scipy", "sphinx (>=7.2.2)", "sphinx-argparse", "sphinxcontrib-apidoc", "templateflow", "traits (<6.4)"] -docs = ["attrs (>=20.1.0)", "furo", "importlib-resources", "ipykernel", "ipython", "matplotlib (>=2.2.0)", "nbsphinx", "nibabel", "nipype (>=1.5.1)", "niworkflows (>=1.10.0)", "numpy", "packaging", "pandoc", "pydot (>=1.2.3)", "pydotplus", "scipy", "sphinx (>=7.2.2)", "sphinx-argparse", "sphinxcontrib-apidoc", "templateflow", "traits (<6.4)"] +all = ["coverage", "furo (>=2021.10.09,<2021.11.0)", "psutil", "pydot", "pydotplus", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +doc = ["furo (>=2021.10.09,<2021.11.0)", "pydot", "pydotplus", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +docs = ["furo (>=2021.10.09,<2021.11.0)", "pydot", "pydotplus", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] mem = ["psutil"] test = ["coverage", "pytest", "pytest-cov", "pytest-env", "pytest-xdist"] tests = ["coverage", "pytest", "pytest-cov", "pytest-env", "pytest-xdist"] @@ -3508,13 +3550,13 @@ testing = ["build[virtualenv] (>=1.2.1)", "covdefaults (>=2.3)", "detect-test-po [[package]] name = "tqdm" -version = "4.66.4" +version = "4.66.5" description = "Fast, Extensible Progress Meter" optional = false python-versions = ">=3.7" files = [ - {file = "tqdm-4.66.4-py3-none-any.whl", hash = "sha256:b75ca56b413b030bc3f00af51fd2c1a1a5eac6a0c1cca83cbb37a5c52abce644"}, - {file = "tqdm-4.66.4.tar.gz", hash = "sha256:e4d936c9de8727928f3be6079590e97d9abfe8d39a590be678eb5919ffc186bb"}, + {file = "tqdm-4.66.5-py3-none-any.whl", hash = "sha256:90279a3770753eafc9194a0364852159802111925aa30eb3f9d85b0e805ac7cd"}, + {file = "tqdm-4.66.5.tar.gz", hash = "sha256:e1020aef2e5096702d8a025ac7d16b1577279c9d63f8375b63083e9a5f0fcbad"}, ] [package.dependencies] @@ -3625,6 +3667,24 @@ files = [ {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, ] +[[package]] +name = "universal-pathlib" +version = "0.2.2" +description = "pathlib api extended to use fsspec backends" +optional = false +python-versions = ">=3.8" +files = [ + {file = "universal_pathlib-0.2.2-py3-none-any.whl", hash = "sha256:9bc176112d593348bb29806a47e409eda78dff8d95391d66dd6f85e443aaa75d"}, + {file = "universal_pathlib-0.2.2.tar.gz", hash = "sha256:6bc215548792ad5db3553708b1c19bafd9e2fa1667dc925ed404c95e52ae2f13"}, +] + +[package.dependencies] +fsspec = ">=2022.1.0" + +[package.extras] +dev = ["adlfs", "aiohttp", "cheroot", "gcsfs", "moto[s3,server] (<5)", "mypy (==1.8.0)", "packaging", "pydantic", "pydantic-settings", "pylint (==2.17.4)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-mock (==3.12.0)", "pytest-sugar (==0.9.7)", "requests", "s3fs", "webdav4[fsspec]", "wsgidav"] +tests = ["mypy (==1.8.0)", "packaging", "pylint (==2.17.4)", "pytest (==8.0.0)", "pytest-cov (==4.1.0)", "pytest-mock (==3.12.0)", "pytest-sugar (==0.9.7)"] + [[package]] name = "urllib3" version = "2.2.2" From f87e0900ae3b7b9333805c7341387743341f382d Mon Sep 17 00:00:00 2001 From: GalKepler Date: Sun, 4 Aug 2024 16:20:57 +0300 Subject: [PATCH 08/16] WIP adding description of the workflow per subject --- poetry.lock | 187 +++++++++++++++------- pyproject.toml | 2 + src/keprep/config.py | 5 + src/keprep/interfaces/bids/__init__.py | 7 +- src/keprep/interfaces/reports/__init__.py | 0 src/keprep/interfaces/reports/reports.py | 155 ++++++++++++++++++ src/keprep/workflows/base/messages.py | 8 + src/keprep/workflows/base/workflow.py | 71 ++++++-- 8 files changed, 362 insertions(+), 73 deletions(-) create mode 100644 src/keprep/interfaces/reports/__init__.py create mode 100644 src/keprep/interfaces/reports/reports.py diff --git a/poetry.lock b/poetry.lock index 9030c9e..bc780d8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1755,6 +1755,24 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "migas" +version = "0.4.0" +description = "A Python package to communicate with a migas server." +optional = false +python-versions = ">=3.8" +files = [ + {file = "migas-0.4.0-py3-none-any.whl", hash = "sha256:22cefe4f65b4eed0850bb166c9c958701e3c2105476d6ca853b262553d0c150c"}, + {file = "migas-0.4.0.tar.gz", hash = "sha256:069481021e86fb9a84b9977f2f5adb9c77c5220787065859b9510cf80e7095f5"}, +] + +[package.dependencies] +ci-info = "*" + +[package.extras] +dev = ["black", "isort", "pre-commit"] +test = ["looseversion", "pytest", "requests"] + [[package]] name = "mypy" version = "1.11.1" @@ -1944,25 +1962,60 @@ ssh = ["paramiko"] tests = ["codecov", "coverage (<5)", "pytest", "pytest-cov", "pytest-doctestplus", "pytest-env", "pytest-timeout", "sphinx"] xvfbwrapper = ["xvfbwrapper"] +[[package]] +name = "nireports" +version = "23.2.1" +description = "NiReports - The Visual Report System (VRS) of NiPreps" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nireports-23.2.1-py3-none-any.whl", hash = "sha256:2e0b3b1c4605dc01d4c51fb4ec17f1c23687c5abb75fbcdfdf1ec0dd76d81b55"}, + {file = "nireports-23.2.1.tar.gz", hash = "sha256:08f066bbf4d88f52497936a83d4560f138ec9e43314301be291da8c56e141b77"}, +] + +[package.dependencies] +importlib-resources = {version = ">=5.12", markers = "python_version < \"3.12\""} +matplotlib = ">=3.4.2" +nibabel = ">=3.0.1" +nilearn = ">=0.5.2" +nipype = "*" +numpy = "*" +pandas = "*" +pybids = "*" +pyyaml = "*" +seaborn = "*" +svgutils = ">=0.3.4" +templateflow = "*" + +[package.extras] +all = ["black (>=22.3.0,<22.4.0)", "coverage", "flake8-pyproject", "furo (>=2021.10.09,<2021.11.0)", "isort (>=5.10.1,<5.11.0)", "matplotlib", "pre-commit", "pydot (>=1.2.3)", "pydotplus", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx", "sphinx (>=4.0,<5.0)", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +dev = ["black (>=22.3.0,<22.4.0)", "flake8-pyproject", "isort (>=5.10.1,<5.11.0)", "pre-commit"] +doc = ["furo (>=2021.10.09,<2021.11.0)", "pydot (>=1.2.3)", "pydotplus", "sphinx (>=4.0,<5.0)", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +docs = ["furo (>=2021.10.09,<2021.11.0)", "pydot (>=1.2.3)", "pydotplus", "sphinx (>=4.0,<5.0)", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +test = ["coverage", "matplotlib", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx"] +tests = ["coverage", "matplotlib", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx"] + [[package]] name = "nitransforms" -version = "21.0.0" +version = "23.0.1" description = "NiTransforms -- Neuroimaging spatial transforms in Python." optional = false python-versions = ">=3.7" files = [ - {file = "nitransforms-21.0.0-py3-none-any.whl", hash = "sha256:3341a3ac73b46d358c8ff0b9e241142e4b360b6a4750d718ccad024dfe8be3a6"}, - {file = "nitransforms-21.0.0.tar.gz", hash = "sha256:9e326a1ea5d5c6577219f99d33c1a680a760213e243182f370ce7e6b2476103a"}, + {file = "nitransforms-23.0.1-py3-none-any.whl", hash = "sha256:9c8acc1b6fdec99e8c5bd9769a817a66d858d04f05f683f054a37deba9ce5156"}, + {file = "nitransforms-23.0.1.tar.gz", hash = "sha256:2edcb868fcd29704494aa097788548085fa0b9d62ab68d4e4b8715672ac1da76"}, ] [package.dependencies] h5py = "*" nibabel = ">=3.0" -numpy = "*" -scipy = "*" +numpy = {version = ">=1.21,<2.0", markers = "python_version > \"3.7\""} +scipy = {version = ">=1.6,<2.0", markers = "python_version > \"3.7\""} [package.extras] -all = ["codecov", "pytest", "pytest-cov"] +all = ["codecov", "lxml", "pytest", "pytest-cov"] +niftiext = ["lxml"] +niftiexts = ["lxml"] test = ["codecov", "pytest", "pytest-cov"] tests = ["codecov", "pytest", "pytest-cov"] @@ -2036,56 +2089,47 @@ docopt = ">=0.6.2" [[package]] name = "numpy" -version = "2.0.1" +version = "1.26.4" description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.9" files = [ - {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, - {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, - {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, - {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, - {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, - {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, - {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, - {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, - {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, - {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0"}, + {file = "numpy-1.26.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4"}, + {file = "numpy-1.26.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a"}, + {file = "numpy-1.26.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2"}, + {file = "numpy-1.26.4-cp310-cp310-win32.whl", hash = "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07"}, + {file = "numpy-1.26.4-cp310-cp310-win_amd64.whl", hash = "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71"}, + {file = "numpy-1.26.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e"}, + {file = "numpy-1.26.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a"}, + {file = "numpy-1.26.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a"}, + {file = "numpy-1.26.4-cp311-cp311-win32.whl", hash = "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20"}, + {file = "numpy-1.26.4-cp311-cp311-win_amd64.whl", hash = "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218"}, + {file = "numpy-1.26.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b"}, + {file = "numpy-1.26.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a"}, + {file = "numpy-1.26.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0"}, + {file = "numpy-1.26.4-cp312-cp312-win32.whl", hash = "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110"}, + {file = "numpy-1.26.4-cp312-cp312-win_amd64.whl", hash = "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c"}, + {file = "numpy-1.26.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764"}, + {file = "numpy-1.26.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd"}, + {file = "numpy-1.26.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c"}, + {file = "numpy-1.26.4-cp39-cp39-win32.whl", hash = "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6"}, + {file = "numpy-1.26.4-cp39-cp39-win_amd64.whl", hash = "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c"}, + {file = "numpy-1.26.4-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0"}, + {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] [[package]] @@ -3072,32 +3116,35 @@ test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "me [[package]] name = "sdcflows" -version = "2.5.2" +version = "2.10.0" description = "Susceptibility Distortion Correction (SDC) workflows for EPI MR schemes." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" files = [ - {file = "sdcflows-2.5.2-py3-none-any.whl", hash = "sha256:281428fd35a0f2b67de2810d7dae96feb1a0108b52a0afe9aee4e80e652cbe3f"}, - {file = "sdcflows-2.5.2.tar.gz", hash = "sha256:c32ef718ef0311f7dd13a8718e3b2d8f2e0884514788180c1018b4197d45a9ce"}, + {file = "sdcflows-2.10.0-py3-none-any.whl", hash = "sha256:bd9360afe861b9daec783da114f4564bd02324f8d0cfbe5f27e118093f6f4bfc"}, + {file = "sdcflows-2.10.0.tar.gz", hash = "sha256:c86dde3cbe95316e4c8fbb46d705fdb91b92f9623c36c29775ced113931946d1"}, ] [package.dependencies] attrs = ">=20.1.0" +migas = ">=0.4.0" nibabel = ">=3.1.0" nipype = ">=1.8.5,<2.0" -nitransforms = ">=21.0.0" +nitransforms = ">=23.0.1" niworkflows = ">=1.7.0" numpy = ">=1.21.0" -pybids = ">=0.15.1" +pybids = ">=0.16.4" scikit-image = ">=0.18" scipy = ">=1.8.1" templateflow = "*" +toml = "*" traits = "<6.4" [package.extras] -all = ["coverage", "furo (>=2021.10.09,<2021.11.0)", "psutil", "pydot", "pydotplus", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] -doc = ["furo (>=2021.10.09,<2021.11.0)", "pydot", "pydotplus", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] -docs = ["furo (>=2021.10.09,<2021.11.0)", "pydot", "pydotplus", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +all = ["attrs (>=20.1.0)", "black", "coverage", "flake8-pyproject", "furo", "importlib-resources", "ipykernel", "ipython", "isort", "matplotlib (>=2.2.0)", "nbsphinx", "nibabel", "nipype (>=1.5.1)", "niworkflows (>=1.10.0)", "numpy", "packaging", "pandoc", "pre-commit", "psutil", "pydot (>=1.2.3)", "pydotplus", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "scipy", "sphinx (>=7.2.2)", "sphinx-argparse", "sphinxcontrib-apidoc", "templateflow", "traits (<6.4)"] +dev = ["black", "flake8-pyproject", "isort", "pre-commit"] +doc = ["attrs (>=20.1.0)", "furo", "importlib-resources", "ipykernel", "ipython", "matplotlib (>=2.2.0)", "nbsphinx", "nibabel", "nipype (>=1.5.1)", "niworkflows (>=1.10.0)", "numpy", "packaging", "pandoc", "pydot (>=1.2.3)", "pydotplus", "scipy", "sphinx (>=7.2.2)", "sphinx-argparse", "sphinxcontrib-apidoc", "templateflow", "traits (<6.4)"] +docs = ["attrs (>=20.1.0)", "furo", "importlib-resources", "ipykernel", "ipython", "matplotlib (>=2.2.0)", "nbsphinx", "nibabel", "nipype (>=1.5.1)", "niworkflows (>=1.10.0)", "numpy", "packaging", "pandoc", "pydot (>=1.2.3)", "pydotplus", "scipy", "sphinx (>=7.2.2)", "sphinx-argparse", "sphinxcontrib-apidoc", "templateflow", "traits (<6.4)"] mem = ["psutil"] test = ["coverage", "pytest", "pytest-cov", "pytest-env", "pytest-xdist"] tests = ["coverage", "pytest", "pytest-cov", "pytest-env", "pytest-xdist"] @@ -3123,6 +3170,22 @@ dev = ["flake8", "flit", "mypy", "pandas-stubs", "pre-commit", "pytest", "pytest docs = ["ipykernel", "nbconvert", "numpydoc", "pydata_sphinx_theme (==0.10.0rc2)", "pyyaml", "sphinx (<6.0.0)", "sphinx-copybutton", "sphinx-design", "sphinx-issues"] stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] +[[package]] +name = "setuptools" +version = "72.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, + {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, +] + +[package.extras] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + [[package]] name = "simplejson" version = "3.19.2" @@ -3815,4 +3878,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "7d937971dc780515748a10238243a814397a47ee4ba062e421be8f302b2a25e3" +content-hash = "524dd1a55420af649f4a1434b40b681c1a9aae450f18303428defdd0a9fecf00" diff --git a/pyproject.toml b/pyproject.toml index 6c09aa6..4881ef9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -33,6 +33,8 @@ tox = "^4.16.0" doc8 = "^1.1.1" flake8-pyproject = "^1.2.3" pytest = "^8.3.2" +nireports = "^23.2.1" +setuptools = "^72.1.0" [tool.poetry.dev-dependencies] coverage = "^7.5.4" # testing diff --git a/src/keprep/config.py b/src/keprep/config.py index c20f978..843e151 100644 --- a/src/keprep/config.py +++ b/src/keprep/config.py @@ -342,6 +342,8 @@ class execution(_Config): """FreeSurfer's subjects directory.""" layout = None """A :py:class:`~keprep.bids.layout.QSIPrepLayout` object, see :py:func:`init`.""" + reportlets_dir = None + """Path to a directory where reportlets will be stored.""" log_dir = None """The path to a directory that contains execution logs.""" log_level = 25 @@ -424,6 +426,9 @@ def init(cls): cls.participant_label = cls.layout.get_subjects() else: cls.participant_label = list(cls.participant_label) + if cls.reportlets_dir is None: + cls.reportlets_dir = Path(cls.work_dir) / "reportlets" + cls.reportlets_dir.mkdir(exist_ok=True, parents=True) # type: ignore[union-attr] # These variables are not necessary anymore diff --git a/src/keprep/interfaces/bids/__init__.py b/src/keprep/interfaces/bids/__init__.py index 4bade74..d4e95fc 100644 --- a/src/keprep/interfaces/bids/__init__.py +++ b/src/keprep/interfaces/bids/__init__.py @@ -2,4 +2,9 @@ BIDSDataGrabber, DerivativesDataSink, ) -from keprep.interfaces.bids.utils import collect_data, get_fieldmap # noqa: F401 +from keprep.interfaces.bids.utils import ( # noqa: F401 + collect_data, + get_fieldmap, + write_bidsignore, + write_derivative_description, +) diff --git a/src/keprep/interfaces/reports/__init__.py b/src/keprep/interfaces/reports/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/keprep/interfaces/reports/reports.py b/src/keprep/interfaces/reports/reports.py new file mode 100644 index 0000000..285f328 --- /dev/null +++ b/src/keprep/interfaces/reports/reports.py @@ -0,0 +1,155 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +# +# Copyright 2021 The NiPreps Developers +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# We support and encourage derived works from this project, please read +# about our expectations at +# +# https://www.nipreps.org/community/licensing/ +# +"""Interfaces to generate reportlets.""" + +import os +import time + +from nipype.interfaces import freesurfer as fs +from nipype.interfaces.base import ( + BaseInterfaceInputSpec, + Directory, + File, + InputMultiObject, + SimpleInterface, + Str, + TraitedSpec, + isdefined, + traits, +) + +SUBJECT_TEMPLATE = """\ +\t
    +\t\t
  • Subject ID: {subject_id}
  • +\t\t
  • Structural images: {n_t1s:d} T1-weighted {t2w}
  • +\t\t
  • Diffusion Weighted Images: {n_dwi:d}
  • +\t\t
  • Standard output spaces: {std_spaces}
  • +\t\t
  • Non-standard output spaces: {nstd_spaces}
  • +\t\t
  • FreeSurfer reconstruction: {freesurfer_status}
  • +\t
+""" + +ABOUT_TEMPLATE = """\t
    +\t\t
  • KePrep version: {version}
  • +\t\t
  • KePrep command: {command}
  • +\t\t
  • Date preprocessed: {date}
  • +\t
+ +""" + + +class SummaryOutputSpec(TraitedSpec): + out_report = File(exists=True, desc="HTML segment containing summary") + + +class SummaryInterface(SimpleInterface): + output_spec = SummaryOutputSpec + + def _run_interface(self, runtime): + segment = self._generate_segment() + fname = os.path.join(runtime.cwd, "report.html") + with open(fname, "w") as fobj: + fobj.write(segment) + self._results["out_report"] = fname + return runtime + + def _generate_segment(self): + raise NotImplementedError + + +class SubjectSummaryInputSpec(BaseInterfaceInputSpec): + t1w = InputMultiObject(File(exists=True), desc="T1w structural images") + t2w = InputMultiObject(File(exists=True), desc="T2w structural images") + subjects_dir = Directory(desc="FreeSurfer subjects directory") + subject_id = Str(desc="Subject ID") + dwi = InputMultiObject( + traits.Either(File(exists=True), traits.List(File(exists=True))), + desc="DWI files", + ) + std_spaces = traits.List(Str, desc="list of standard spaces") + nstd_spaces = traits.List(Str, desc="list of non-standard spaces") + + +class SubjectSummaryOutputSpec(SummaryOutputSpec): + # This exists to ensure that the summary is run prior to the first ReconAll + # call, allowing a determination whether there is a pre-existing directory + subject_id = Str(desc="FreeSurfer subject ID") + + +class SubjectSummary(SummaryInterface): + input_spec = SubjectSummaryInputSpec + output_spec = SubjectSummaryOutputSpec + + def _run_interface(self, runtime): + if isdefined(self.inputs.subject_id): + self._results["subject_id"] = self.inputs.subject_id + return super(SubjectSummary, self)._run_interface(runtime) + + def _generate_segment(self): + if not isdefined(self.inputs.subjects_dir): + freesurfer_status = "Not run" + else: + recon = fs.ReconAll( + subjects_dir=self.inputs.subjects_dir, + subject_id=self.inputs.subject_id, + T1_files=self.inputs.t1w, + flags="-noskullstrip", + ) + if recon.cmdline.startswith("echo"): + freesurfer_status = "Pre-existing directory" + else: + freesurfer_status = "Run by KePrep" + + t2w_seg = "" + if self.inputs.t2w: + t2w_seg = "(+ {:d} T2-weighted)".format(len(self.inputs.t2w)) + + dwi_files = self.inputs.dwi if isdefined(self.inputs.dwi) else [] + dwi_files = [s[0] if isinstance(s, list) else s for s in dwi_files] + + return SUBJECT_TEMPLATE.format( + subject_id=self.inputs.subject_id, + n_t1s=len(self.inputs.t1w), + t2w=t2w_seg, + n_dwi=len(dwi_files), + std_spaces=", ".join(self.inputs.std_spaces), + nstd_spaces=", ".join(self.inputs.nstd_spaces), + freesurfer_status=freesurfer_status, + ) + + +class AboutSummaryInputSpec(BaseInterfaceInputSpec): + version = Str(desc="KePrep version") + command = Str(desc="KePrep command") + # Date not included - update timestamp only if version or command changes + + +class AboutSummary(SummaryInterface): + input_spec = AboutSummaryInputSpec + + def _generate_segment(self): + return ABOUT_TEMPLATE.format( + version=self.inputs.version, + command=self.inputs.command, + date=time.strftime("%Y-%m-%d %H:%M:%S %z"), + ) diff --git a/src/keprep/workflows/base/messages.py b/src/keprep/workflows/base/messages.py index be20a42..7a087c8 100644 --- a/src/keprep/workflows/base/messages.py +++ b/src/keprep/workflows/base/messages.py @@ -33,3 +33,11 @@ ### References """ + +DIFFUSION_WORKFLOW_DESCRIPTION = """ +Diffusion data preprocessing + +: For each of the {n_dwi} DWI scans found per subject + (across all sessions), the following preprocessing was + performed. +""" # TODO: add more details diff --git a/src/keprep/workflows/base/workflow.py b/src/keprep/workflows/base/workflow.py index 2464f53..496c68c 100644 --- a/src/keprep/workflows/base/workflow.py +++ b/src/keprep/workflows/base/workflow.py @@ -1,4 +1,5 @@ import os +import sys import warnings from copy import deepcopy from pathlib import Path @@ -8,11 +9,17 @@ from packaging.version import Version from keprep import config -from keprep.interfaces.bids.utils import write_bidsignore, write_derivative_description +from keprep.interfaces.bids import ( + DerivativesDataSink, + write_bidsignore, + write_derivative_description, +) +from keprep.interfaces.reports.reports import AboutSummary, SubjectSummary from keprep.workflows.base.messages import ( ANAT_DERIVATIVES_FAILED, BASE_POSTDESC, BASE_WORKFLOW_DESCRIPTION, + DIFFUSION_WORKFLOW_DESCRIPTION, ) from keprep.workflows.dwi.workflow import init_dwi_preproc_wf @@ -228,6 +235,41 @@ def init_single_subject_wf(subject_id: str): name="bids_info", ) + summary = pe.Node( + SubjectSummary( + std_spaces=spaces.get_spaces(nonstandard=False), + nstd_spaces=spaces.get_spaces(standard=False), + ), + name="summary", + run_without_submitting=True, + ) + + about = pe.Node( + AboutSummary(version=config.environment.version, command=" ".join(sys.argv)), + name="about", + run_without_submitting=True, + ) + + ds_report_summary = pe.Node( + DerivativesDataSink( + base_directory=str(config.execution.keprep_dir), + desc="summary", + datatype="figures", + ), + name="ds_report_summary", + run_without_submitting=True, + ) + + ds_report_about = pe.Node( + DerivativesDataSink( + base_directory=str(config.execution.keprep_dir), + desc="about", + datatype="figures", + ), + name="ds_report_about", + run_without_submitting=True, + ) + # Preprocessing of T1w (includes registration to MNI) anat_preproc_wf = init_anat_preproc_wf( bids_root=str(config.execution.bids_dir), @@ -248,6 +290,7 @@ def init_single_subject_wf(subject_id: str): t2w=subject_data["t2w"], cifti_output=config.workflow.cifti_output, ) + anat_preproc_wf.__desc__ = f"\n\n{anat_preproc_wf.__desc__}" # fmt:off workflow.connect([ (inputnode, anat_preproc_wf, [('subjects_dir', 'inputnode.subjects_dir')]), @@ -256,17 +299,22 @@ def init_single_subject_wf(subject_id: str): ('t2w', 'inputnode.t2w'), ('roi', 'inputnode.roi'), ('flair', 'inputnode.flair')]), + (bidssrc, bids_info, [(('t1w', fix_multi_T1w_source_name), 'in_file')]), + (inputnode, summary, [('subjects_dir', 'subjects_dir')]), + (bids_info, summary, [('subject', 'subject_id')]), + (bidssrc, summary, [('t1w', 't1w'), + ('t2w', 't2w'), + ('dwi', 'dwi')]), + (bidssrc, ds_report_summary, [ + (("t1w", fix_multi_T1w_source_name), "source_file"), + ]), + (summary, ds_report_summary, [("out_report", "in_file")]), + (bidssrc, ds_report_about, [ + (("t1w", fix_multi_T1w_source_name), "source_file") + ]), + (about, ds_report_about, [("out_report", "in_file")]), ]) - if not anat_derivatives: - workflow.connect([ - (bidssrc, bids_info, [(('t1w', fix_multi_T1w_source_name), 'in_file')]), - ]) - else: - workflow.connect([ # type: ignore[unreachable] - (bidssrc, bids_info, [(('dwi', fix_multi_T1w_source_name), 'in_file')]), - ]) - # Overwrite ``out_path_base`` of smriprep's DataSinks for node in workflow.list_node_names(): if node.split(".")[-1].startswith("ds_"): @@ -277,6 +325,9 @@ def init_single_subject_wf(subject_id: str): for dwi_file in subject_data["dwi"]: dwi_preproc_wf = init_dwi_preproc_wf(dwi_file, subject_data) + dwi_preproc_wf.__desc__ = DIFFUSION_WORKFLOW_DESCRIPTION.format( + n_dwi=len(subject_data["dwi"]) + ) workflow.connect( [ ( From f3a9b5ae593cba29a24bd4fa7be5ad96fd80f896 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Mon, 5 Aug 2024 14:41:42 +0300 Subject: [PATCH 09/16] WIP creating visual QA per subject --- poetry.lock | 134 +++- pyproject.toml | 1 + src/keprep/config.py | 11 + src/keprep/data/__init__.py | 14 + src/keprep/data/boilerplate.bib | 647 ++++++++++++++++++ src/keprep/{interfaces => }/data/keprep.json | 2 +- src/keprep/data/quality_assurance/__init__.py | 0 src/keprep/data/quality_assurance/reports.py | 148 ++++ .../quality_assurance/templates/__init__.py | 0 .../templates/reports-spec copy.yml | 199 ++++++ .../templates/reports-spec.yml | 67 ++ src/keprep/interfaces/reports/__init__.py | 5 + src/keprep/interfaces/reports/reports.py | 75 ++ src/keprep/workflows/base/workflow.py | 10 +- src/keprep/workflows/dwi/stages/eddy.py | 2 +- src/keprep/workflows/dwi/stages/post_eddy.py | 81 ++- src/keprep/workflows/dwi/utils.py | 34 + src/keprep/workflows/dwi/workflow.py | 69 +- 18 files changed, 1460 insertions(+), 39 deletions(-) create mode 100644 src/keprep/data/__init__.py create mode 100644 src/keprep/data/boilerplate.bib rename src/keprep/{interfaces => }/data/keprep.json (99%) create mode 100644 src/keprep/data/quality_assurance/__init__.py create mode 100644 src/keprep/data/quality_assurance/reports.py create mode 100644 src/keprep/data/quality_assurance/templates/__init__.py create mode 100644 src/keprep/data/quality_assurance/templates/reports-spec copy.yml create mode 100644 src/keprep/data/quality_assurance/templates/reports-spec.yml create mode 100644 src/keprep/workflows/dwi/utils.py diff --git a/poetry.lock b/poetry.lock index bc780d8..3dd6900 100644 --- a/poetry.lock +++ b/poetry.lock @@ -559,6 +559,81 @@ files = [ {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, ] +[[package]] +name = "deepdiff" +version = "7.0.1" +description = "Deep Difference and Search of any Python object/data. Recreate objects by adding adding deltas to each other." +optional = false +python-versions = ">=3.8" +files = [ + {file = "deepdiff-7.0.1-py3-none-any.whl", hash = "sha256:447760081918216aa4fd4ca78a4b6a848b81307b2ea94c810255334b759e1dc3"}, + {file = "deepdiff-7.0.1.tar.gz", hash = "sha256:260c16f052d4badbf60351b4f77e8390bee03a0b516246f6839bc813fb429ddf"}, +] + +[package.dependencies] +ordered-set = ">=4.1.0,<4.2.0" + +[package.extras] +cli = ["click (==8.1.7)", "pyyaml (==6.0.1)"] +optimize = ["orjson"] + +[[package]] +name = "dipy" +version = "1.9.0" +description = "Diffusion MRI Imaging in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "dipy-1.9.0-1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4114959d291eea4b79ff0a0044cfb9ea78d584d1ff303e18c9ee08dbf1c2bcbd"}, + {file = "dipy-1.9.0-1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2e4f6f25455b5600fbfa256120bfe486044585d8d769ac69ce489c47f90f5a54"}, + {file = "dipy-1.9.0-1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49b414a34a4f3cb6c7c56e35413e6a27de975fd1df22c6fad143f06348957f67"}, + {file = "dipy-1.9.0-1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23a519ff742c90686b166d08d8b524a743a4834cb88d40a717c5912dc5d8eb4e"}, + {file = "dipy-1.9.0-1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:82918bb4f37771d8372c2a3bfee9a8b6cbf93c574adfcb1b210cacd414504d19"}, + {file = "dipy-1.9.0-1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1a6951b799c7ec9d650b3b98140bafa20b3f96c85e8b99c6243187fec7e143ea"}, + {file = "dipy-1.9.0-1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8819ffa79acc79832982ef6adb33bd00dac44e82ee42c51f5a25a5d0e929ec3d"}, + {file = "dipy-1.9.0-1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9f1bfdd31ca2e7ff55f99aa80396b84303c354f1c468ba1eb0306a2a504cbc22"}, + {file = "dipy-1.9.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0f29fee8dae3a988b5c44ceda9a8c9056e59ba73829463c646b98708e0e73bd9"}, + {file = "dipy-1.9.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:642a5757930271fc44cead63d95fb421b44283423fc8414d3841afb91dd236b5"}, + {file = "dipy-1.9.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61e22cf21784173d580bfc7e7f8f4bf87786756155c65cc0abf5f6c098a6b9b7"}, + {file = "dipy-1.9.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d59cb8a73b82cc60ac12cc338546d2d5b5c2ebafe0571366549bf91542b1a311"}, + {file = "dipy-1.9.0-cp310-cp310-win_amd64.whl", hash = "sha256:17427a280dcf07702d45191de3a8645d846d9c70144c21b3abc15daa15ba3e17"}, + {file = "dipy-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0abd802100250871d5eb065bf56933f49082935181e8d47e2362ed3e41e9b4fc"}, + {file = "dipy-1.9.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4f5cc43ad0ba37be236006b20bd0ed957640e07565e06d5997e47fdbbd7a0c2d"}, + {file = "dipy-1.9.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:34144ed9bdda83e2dceae820d550bf4f184a537cf8efc3e5b9f8872103ed521a"}, + {file = "dipy-1.9.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cee0ccd5fd73afc19992b63af3e9cad0d3dee8c6a62b6c68a615c36424255f61"}, + {file = "dipy-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:8da3f5311cfd71dc635b3996b8421192a596f1759851a050a63d085856e9cb9f"}, + {file = "dipy-1.9.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3f5450c3982595db4811f38dd4be07cd3e077d5f4d0e4e8911ebf5157ca82da"}, + {file = "dipy-1.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:58f7365086fcc135eb48cdb0cd76525e6ac960f7b693b071034dd4be4594c284"}, + {file = "dipy-1.9.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:33c7eda4b1953cdacda1bf0da1a7970fef79260fa82e09d6b58d43fabd5a4299"}, + {file = "dipy-1.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4066f696a84ca20a550ba5b7879a51ae61bac2c719b5cba0fcbef855d8d612ec"}, + {file = "dipy-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:6f18e2593ee0bc2acad60272ce6b44472401f797e216617e5738d752073a5be1"}, + {file = "dipy-1.9.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:908c3716f219d399da72f65196ba3b86cd8878377618bbbf6d0a9b1f91af4c44"}, + {file = "dipy-1.9.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f9490816d394ca92c413a95d8a41b79dea3eaa7aab59c9f65a9c0e977e4b0574"}, + {file = "dipy-1.9.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f11d4b68ecbd89f6099d3c0d4a2386139232e6f49aff4fc2c979b269d1267dbb"}, + {file = "dipy-1.9.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06144427182c753f58c7117bf167ef7148ca8534871ca61c7fad6aa94f2ac25d"}, + {file = "dipy-1.9.0-cp39-cp39-win_amd64.whl", hash = "sha256:12754416f5290fd9f91261746ba961ab3589a47e1855f4ee644f3aa7700661b0"}, + {file = "dipy-1.9.0.tar.gz", hash = "sha256:eb0f7a211202d48f30961743528c86ec9804fcba8ca440a7484e0a113fa2cc4f"}, +] + +[package.dependencies] +h5py = ">=3.1.0" +nibabel = ">=3.0.0" +numpy = ">=1.22.4" +packaging = ">=21" +scipy = ">=1.8" +tqdm = ">=4.30.0" +trx-python = ">=0.2.9" + +[package.extras] +all = ["dipy[dev,doc,extra,ml,style,test,viz]"] +dev = ["Cython (>=0.29.35)", "build", "meson-python (>=0.13)", "ninja", "numpy (>=1.22)", "packaging (>=21)", "setuptools (>=67)", "spin (>=0.5)", "wheel"] +doc = ["Jinja2", "grg-sphinx-theme (>=0.2.0)", "numpydoc", "sphinx (>=5.3,<6.0)", "sphinx-gallery (>=0.10.0)", "sphinx_design", "sphinxcontrib-bibtex", "texext", "tomli", "tomli (>=2.0.1)"] +extra = ["boto3", "cvxpy", "dipy[ml,viz]", "scikit-image"] +ml = ["pandas", "scikit_learn", "statsmodels (>=0.14.0)", "tables", "tensorflow"] +style = ["flake8", "isort"] +test = ["asv", "codecov", "coverage", "coveralls", "pytest"] +viz = ["fury (>=0.10.0)", "matplotlib"] + [[package]] name = "distlib" version = "0.3.8" @@ -2132,6 +2207,20 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] +[[package]] +name = "ordered-set" +version = "4.1.0" +description = "An OrderedSet is a custom MutableSet that remembers its order, so that every" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ordered-set-4.1.0.tar.gz", hash = "sha256:694a8e44c87657c59292ede72891eb91d34131f6531463aab3009191c77364a8"}, + {file = "ordered_set-4.1.0-py3-none-any.whl", hash = "sha256:046e1132c71fcf3330438a539928932caf51ddbc582496833e23de611de14562"}, +] + +[package.extras] +dev = ["black", "mypy", "pytest"] + [[package]] name = "packaging" version = "24.1" @@ -3186,6 +3275,27 @@ core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.te doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +[[package]] +name = "setuptools-scm" +version = "8.1.0" +description = "the blessed package to manage your versions by scm tags" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools_scm-8.1.0-py3-none-any.whl", hash = "sha256:897a3226a6fd4a6eb2f068745e49733261a21f70b1bb28fce0339feb978d9af3"}, + {file = "setuptools_scm-8.1.0.tar.gz", hash = "sha256:42dea1b65771cba93b7a515d65a65d8246e560768a66b9106a592c8e7f26c8a7"}, +] + +[package.dependencies] +packaging = ">=20" +setuptools = "*" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["entangled-cli (>=2.0,<3.0)", "mkdocs", "mkdocs-entangled-plugin", "mkdocs-material", "mkdocstrings[python]", "pygments"] +rich = ["rich"] +test = ["build", "pytest", "rich", "typing-extensions", "wheel"] + [[package]] name = "simplejson" version = "3.19.2" @@ -3708,6 +3818,28 @@ files = [ [package.dependencies] numpy = ">=1.15" +[[package]] +name = "trx-python" +version = "0.3" +description = "Experiments with new file format for tractography" +optional = false +python-versions = ">=3.8" +files = [ + {file = "trx_python-0.3-py3-none-any.whl", hash = "sha256:b00efb1024022a7835cc8b36e024a4ea575f19ce3fae81deb50b709fc8abcb49"}, + {file = "trx_python-0.3.tar.gz", hash = "sha256:193e3282eaf03610c7e1b848aec04ddb9498fad3a7b684b30ca358e06751fbfd"}, +] + +[package.dependencies] +deepdiff = "*" +nibabel = ">=5" +numpy = ">=1.22" +setuptools-scm = "*" + +[package.extras] +all = ["astroid (==2.15.8)", "flake8", "numpydoc", "psutil", "pydata-sphinx-theme", "pytest (>=7)", "pytest-console-scripts (>=0)", "sphinx", "sphinx-autoapi"] +doc = ["astroid (==2.15.8)", "numpydoc", "pydata-sphinx-theme", "sphinx", "sphinx-autoapi"] +test = ["flake8", "psutil", "pytest (>=7)", "pytest-console-scripts (>=0)"] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -3878,4 +4010,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "524dd1a55420af649f4a1434b40b681c1a9aae450f18303428defdd0a9fecf00" +content-hash = "7c861a626a96a6389deb9b46476278046beaa40bf2c38ae74c35597032b5c053" diff --git a/pyproject.toml b/pyproject.toml index 4881ef9..9acb6e6 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -35,6 +35,7 @@ flake8-pyproject = "^1.2.3" pytest = "^8.3.2" nireports = "^23.2.1" setuptools = "^72.1.0" +dipy = "^1.9.0" [tool.poetry.dev-dependencies] coverage = "^7.5.4" # testing diff --git a/src/keprep/config.py b/src/keprep/config.py index 843e151..85c5c17 100644 --- a/src/keprep/config.py +++ b/src/keprep/config.py @@ -470,6 +470,17 @@ class workflow(_Config): skull_strip_t1w = "force" """Skip brain extraction of the T1w image (default is ``force``, meaning that *KePrep* will run brain extraction of the T1w).""" + denoise_method = "dwidenoise" + """Image-based denoising method. Either "dwidenoise" (MRtrix), "patch2self" (DIPY) + or "none".""" + dwi_denoise_window = "auto" + """Window size in voxels for image-based denoising, integer or "auto".""" + dwi_no_biascorr = False + """DEPRECATED: see --b1-biascorrect-stage.""" + eddy_config = "--fwhm=0 --flm='quadratic'" + """Configuration for running Eddy.""" + hmc_model = "eddy" + """Model used to generate target images for hmc.""" class loggers: diff --git a/src/keprep/data/__init__.py b/src/keprep/data/__init__.py new file mode 100644 index 0000000..b1918c8 --- /dev/null +++ b/src/keprep/data/__init__.py @@ -0,0 +1,14 @@ +"""fMRIPrep data files + +.. autofunction:: load + +.. automethod:: load.readable + +.. automethod:: load.as_path + +.. automethod:: load.cached +""" + +from acres import Loader + +load = Loader(__package__) diff --git a/src/keprep/data/boilerplate.bib b/src/keprep/data/boilerplate.bib new file mode 100644 index 0000000..e5da0e1 --- /dev/null +++ b/src/keprep/data/boilerplate.bib @@ -0,0 +1,647 @@ +@article{fmriprep1, + author = {Esteban, Oscar and Markiewicz, Christopher and Blair, Ross W and Moodie, Craig and Isik, Ayse Ilkay and Erramuzpe Aliaga, Asier and Kent, James and Goncalves, Mathias and DuPre, Elizabeth and Snyder, Madeleine and Oya, Hiroyuki and Ghosh, Satrajit and Wright, Jessey and Durnez, Joke and Poldrack, Russell and Gorgolewski, Krzysztof Jacek}, + title = {fmriprep: a robust preprocessing pipeline for functional {MRI}}, + year = {2018}, + doi = {10.1101/306951}, + journal = {bioRxiv} +} + +@article{fmriprep2, + author = {Esteban, Oscar and Blair, Ross and Markiewicz, Christopher J. and Berleant, Shoshana L. and Moodie, Craig and Ma, Feilong and Isik, Ayse Ilkay and Erramuzpe, Asier and Kent, James D. andGoncalves, Mathias and DuPre, Elizabeth and Sitek, Kevin R. and Gomez, Daniel E. P. and Lurie, Daniel J. and Ye, Zhifang and Poldrack, Russell A. and Gorgolewski, Krzysztof J.}, + title = {fmriprep}, + year = 2018, + doi = {10.5281/zenodo.852659}, + publisher = {Zenodo}, + journal = {Software} +} + +@article{dipy, + title={Dipy, a library for the analysis of diffusion MRI data}, + author={Garyfallidis, Eleftherios and Brett, Matthew and Amirbekian, Bagrat and Rokem, Ariel and Van Der Walt, Stefan and Descoteaux, Maxime and Nimmo-Smith, Ian}, + journal={Frontiers in neuroinformatics}, + volume={8}, + pages={8}, + year={2014}, + publisher={Frontiers} +} + + +@article{pyafq, + title = {Evaluating the reliability of human brain white matter tractometry}, + author = {Kruper, J. and Yeatman, J.D. and Richie-Halford, A. and Bloom, D. and Grotheer, M. and Caffarra, S. and Kiar, G. and Karipidis, I.I. and Roy, E. and Chandio, B.Q. and Garyfallidis, E. and Rokem, A.}, + journal = {Aperture Neuro}, + volume = {1}, + pages = {1-25}, + year = {2021}, +} + +@article{pyafq2, + title = {Tract profiles of White Matter Properties: Automating fiber-tract quantification}, + volume = {7}, + doi = {10.1371/journal.pone.0049790}, + number = {11}, + journal = {PLoS ONE}, + author = {Yeatman, Jason D. and Dougherty, Robert F. and Myall, Nathaniel J. and Wandell, Brian A. and Feldman, Heidi M.}, + year = {2012} +} + +@article{nipype1, + author = {Gorgolewski, K. and Burns, C. D. and Madison, C. and Clark, D. and Halchenko, Y. O. and Waskom, M. L. and Ghosh, S.}, + doi = {10.3389/fninf.2011.00013}, + journal = {Frontiers in Neuroinformatics}, + pages = 13, + shorttitle = {Nipype}, + title = {Nipype: a flexible, lightweight and extensible neuroimaging data processing framework in Python}, + volume = 5, + year = 2011 +} + +@article{nipype2, + author = {Gorgolewski, Krzysztof J. and Esteban, Oscar and Markiewicz, Christopher J. and Ziegler, Erik and Ellis, David Gage and Notter, Michael Philipp and Jarecka, Dorota and Johnson, Hans and Burns, Christopher and Manhães-Savio, Alexandre and Hamalainen, Carlo and Yvernault, Benjamin and Salo, Taylor and Jordan, Kesshi and Goncalves, Mathias and Waskom, Michael and Clark, Daniel and Wong, Jason and Loney, Fred and Modat, Marc and Dewey, Blake E and Madison, Cindee and Visconti di Oleggio Castello, Matteo and Clark, Michael G. and Dayan, Michael and Clark, Dav and Keshavan, Anisha and Pinsard, Basile and Gramfort, Alexandre and Berleant, Shoshana and Nielson, Dylan M. and Bougacha, Salma and Varoquaux, Gael and Cipollini, Ben and Markello, Ross and Rokem, Ariel and Moloney, Brendan and Halchenko, Yaroslav O. and Wassermann , Demian and Hanke, Michael and Horea, Christian and Kaczmarzyk, Jakub and Gilles de Hollander and DuPre, Elizabeth and Gillman, Ashley and Mordom, David and Buchanan, Colin and Tungaraza, Rosalia and Pauli, Wolfgang M. and Iqbal, Shariq and Sikka, Sharad and Mancini, Matteo and Schwartz, Yannick and Malone, Ian B. and Dubois, Mathieu and Frohlich, Caroline and Welch, David and Forbes, Jessica and Kent, James and Watanabe, Aimi and Cumba, Chad and Huntenburg, Julia M. and Kastman, Erik and Nichols, B. Nolan and Eshaghi, Arman and Ginsburg, Daniel and Schaefer, Alexander and Acland, Benjamin and Giavasis, Steven and Kleesiek, Jens and Erickson, Drew and Küttner, René and Haselgrove, Christian and Correa, Carlos and Ghayoor, Ali and Liem, Franz and Millman, Jarrod and Haehn, Daniel and Lai, Jeff and Zhou, Dale and Blair, Ross and Glatard, Tristan and Renfro, Mandy and Liu, Siqi and Kahn, Ari E. and Pérez-García, Fernando and Triplett, William and Lampe, Leonie and Stadler, Jörg and Kong, Xiang-Zhen and Hallquist, Michael and Chetverikov, Andrey and Salvatore, John and Park, Anne and Poldrack, Russell and Craddock, R. Cameron and Inati, Souheil and Hinds, Oliver and Cooper, Gavin and Perkins, L. Nathan and Marina, Ana and Mattfeld, Aaron and Noel, Maxime and Lukas Snoek and Matsubara, K and Cheung, Brian and Rothmei, Simon and Urchs, Sebastian and Durnez, Joke and Mertz, Fred and Geisler, Daniel and Floren, Andrew and Gerhard, Stephan and Sharp, Paul and Molina-Romero, Miguel and Weinstein, Alejandro and Broderick, William and Saase, Victor and Andberg, Sami Kristian and Harms, Robbert and Schlamp, Kai and Arias, Jaime and Papadopoulos Orfanos, Dimitri and Tarbert, Claire and Tambini, Arielle and De La Vega, Alejandro and Nickson, Thomas and Brett, Matthew and Falkiewicz, Marcel and Podranski, Kornelius and Linkersdörfer, Janosch and Flandin, Guillaume and Ort, Eduard and Shachnev, Dmitry and McNamee, Daniel and Davison, Andrew and Varada, Jan and Schwabacher, Isaac and Pellman, John and Perez-Guevara, Martin and Khanuja, Ranjeet and Pannetier, Nicolas and McDermottroe, Conor and Ghosh, Satrajit}, + title = {Nipype}, + year = 2018, + doi = {10.5281/zenodo.596855}, + publisher = {Zenodo}, + journal = {Software} +} + +@article{n4, + author = {Tustison, N. J. and Avants, B. B. and Cook, P. A. and Zheng, Y. and Egan, A. and Yushkevich, P. A. and Gee, J. C.}, + doi = {10.1109/TMI.2010.2046908}, + issn = {0278-0062}, + journal = {IEEE Transactions on Medical Imaging}, + number = 6, + pages = {1310-1320}, + shorttitle = {N4ITK}, + title = {N4ITK: Improved N3 Bias Correction}, + volume = 29, + year = 2010 +} + +@article{fs_reconall, + author = {Dale, Anders M. and Fischl, Bruce and Sereno, Martin I.}, + doi = {10.1006/nimg.1998.0395}, + issn = {1053-8119}, + journal = {NeuroImage}, + number = 2, + pages = {179-194}, + shorttitle = {Cortical Surface-Based Analysis}, + title = {Cortical Surface-Based Analysis: I. Segmentation and Surface Reconstruction}, + url = {http://www.sciencedirect.com/science/article/pii/S1053811998903950}, + volume = 9, + year = 1999 +} + +@article{mindboggle, + author = {Klein, Arno and Ghosh, Satrajit S. and Bao, Forrest S. and Giard, Joachim and Häme, Yrjö and Stavsky, Eliezer and Lee, Noah and Rossa, Brian and Reuter, Martin and Neto, Elias Chaibub and Keshavan, Anisha}, + doi = {10.1371/journal.pcbi.1005350}, + issn = {1553-7358}, + journal = {PLOS Computational Biology}, + number = 2, + pages = {e1005350}, + title = {Mindboggling morphometry of human brains}, + url = {http://journals.plos.org/ploscompbiol/article?id=10.1371/journal.pcbi.1005350}, + volume = 13, + year = 2017 +} + +@article{mni, + author = {Fonov, VS and Evans, AC and McKinstry, RC and Almli, CR and Collins, DL}, + doi = {10.1016/S1053-8119(09)70884-5}, + issn = {1053-8119}, + journal = {NeuroImage}, + pages = {S102}, + series = {Organization for Human Brain Mapping 2009 Annual Meeting}, + title = {Unbiased nonlinear average age-appropriate brain templates from birth to adulthood}, + url = {http://www.sciencedirect.com/science/article/pii/S1053811909708845}, + volume = {47, Supplement 1}, + year = 2009 +} + +@article{ants, + author = {Avants, B.B. and Epstein, C.L. and Grossman, M. and Gee, J.C.}, + doi = {10.1016/j.media.2007.06.004}, + issn = {1361-8415}, + journal = {Medical Image Analysis}, + number = 1, + pages = {26-41}, + shorttitle = {Symmetric diffeomorphic image registration with cross-correlation}, + title = {Symmetric diffeomorphic image registration with cross-correlation: Evaluating automated labeling of elderly and neurodegenerative brain}, + url = {http://www.sciencedirect.com/science/article/pii/S1361841507000606}, + volume = 12, + year = 2008 +} + +@article{fsl_fast, + author = {Zhang, Y. and Brady, M. and Smith, S.}, + doi = {10.1109/42.906424}, + issn = {0278-0062}, + journal = {IEEE Transactions on Medical Imaging}, + number = 1, + pages = {45-57}, + title = {Segmentation of brain {MR} images through a hidden Markov random field model and the expectation-maximization algorithm}, + volume = 20, + year = 2001 +} + +@article{fieldmapless1, + author = {Wang, Sijia and Peterson, Daniel J. and Gatenby, J. C. and Li, Wenbin and Grabowski, Thomas J. and Madhyastha, Tara M.}, + doi = {10.3389/fninf.2017.00017}, + issn = {1662-5196}, + journal = {Frontiers in Neuroinformatics}, + language = {English}, + title = {Evaluation of Field Map and Nonlinear Registration Methods for Correction of Susceptibility Artifacts in Diffusion {MRI}}, + url = {http://journal.frontiersin.org/article/10.3389/fninf.2017.00017/full}, + volume = 11, + year = 2017 +} + +@phdthesis{fieldmapless2, + address = {Berlin}, + author = {Huntenburg, Julia M.}, + language = {eng}, + school = {Freie Universität}, + title = {Evaluating nonlinear coregistration of {BOLD} {EPI} and T1w images}, + type = {Master's Thesis}, + url = {http://hdl.handle.net/11858/00-001M-0000-002B-1CB5-A}, + year = 2014 +} + +@article{fieldmapless3, + author = {Treiber, Jeffrey Mark and White, Nathan S. and Steed, Tyler Christian and Bartsch, Hauke and Holland, Dominic and Farid, Nikdokht and McDonald, Carrie R. and Carter, Bob S. and Dale, Anders Martin and Chen, Clark C.}, + doi = {10.1371/journal.pone.0152472}, + issn = {1932-6203}, + journal = {PLOS ONE}, + number = 3, + pages = {e0152472}, + title = {Characterization and Correction of Geometric Distortions in 814 Diffusion Weighted Images}, + url = {http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0152472}, + volume = 11, + year = 2016 +} + +@article{flirt, + title = {A global optimisation method for robust affine registration of brain images}, + volume = {5}, + issn = {1361-8415}, + url = {http://www.sciencedirect.com/science/article/pii/S1361841501000366}, + doi = {10.1016/S1361-8415(01)00036-6}, + number = {2}, + urldate = {2018-07-27}, + journal = {Medical Image Analysis}, + author = {Jenkinson, Mark and Smith, Stephen}, + year = {2001}, + keywords = {Affine transformation, flirt, fsl, Global optimisation, Multi-resolution search, Multimodal registration, Robustness}, + pages = {143--156} +} + +@article{mcflirt, + author = {Jenkinson, Mark and Bannister, Peter and Brady, Michael and Smith, Stephen}, + doi = {10.1006/nimg.2002.1132}, + issn = {1053-8119}, + journal = {NeuroImage}, + number = 2, + pages = {825-841}, + title = {Improved Optimization for the Robust and Accurate Linear Registration and Motion Correction of Brain Images}, + url = {http://www.sciencedirect.com/science/article/pii/S1053811902911328}, + volume = 17, + year = 2002 +} + +@article{bbr, + author = {Greve, Douglas N and Fischl, Bruce}, + doi = {10.1016/j.neuroimage.2009.06.060}, + issn = {1095-9572}, + journal = {NeuroImage}, + number = 1, + pages = {63-72}, + title = {Accurate and robust brain image alignment using boundary-based registration}, + volume = 48, + year = 2009 +} + +@article{aroma, + author = {Pruim, Raimon H. R. and Mennes, Maarten and van Rooij, Daan and Llera, Alberto and Buitelaar, Jan K. and Beckmann, Christian F.}, + doi = {10.1016/j.neuroimage.2015.02.064}, + issn = {1053-8119}, + journal = {NeuroImage}, + number = {Supplement C}, + pages = {267-277}, + shorttitle = {ICA-AROMA}, + title = {ICA-{AROMA}: A robust {ICA}-based strategy for removing motion artifacts from fMRI data}, + url = {http://www.sciencedirect.com/science/article/pii/S1053811915001822}, + volume = 112, + year = 2015 +} + +@article{power_fd_dvars, + author = {Power, Jonathan D. and Mitra, Anish and Laumann, Timothy O. and Snyder, Abraham Z. and Schlaggar, Bradley L. and Petersen, Steven E.}, + doi = {10.1016/j.neuroimage.2013.08.048}, + issn = {1053-8119}, + journal = {NeuroImage}, + number = {Supplement C}, + pages = {320-341}, + title = {Methods to detect, characterize, and remove motion artifact in resting state fMRI}, + url = {http://www.sciencedirect.com/science/article/pii/S1053811913009117}, + volume = 84, + year = 2014 +} + +@article{nilearn, + author = {Abraham, Alexandre and Pedregosa, Fabian and Eickenberg, Michael and Gervais, Philippe and Mueller, Andreas and Kossaifi, Jean and Gramfort, Alexandre and Thirion, Bertrand and Varoquaux, Gael}, + doi = {10.3389/fninf.2014.00014}, + issn = {1662-5196}, + journal = {Frontiers in Neuroinformatics}, + language = {English}, + title = {Machine learning for neuroimaging with scikit-learn}, + url = {https://www.frontiersin.org/articles/10.3389/fninf.2014.00014/full}, + volume = 8, + year = 2014 +} + +@article{lanczos, + author = {Lanczos, C.}, + doi = {10.1137/0701007}, + issn = {0887-459X}, + journal = {Journal of the Society for Industrial and Applied Mathematics Series B Numerical Analysis}, + number = 1, + pages = {76-85}, + title = {Evaluation of Noisy Data}, + url = {http://epubs.siam.org/doi/10.1137/0701007}, + volume = 1, + year = 1964 +} + +@article{compcor, + author = {Behzadi, Yashar and Restom, Khaled and Liau, Joy and Liu, Thomas T.}, + doi = {10.1016/j.neuroimage.2007.04.042}, + issn = {1053-8119}, + journal = {NeuroImage}, + number = 1, + pages = {90-101}, + title = {A component based noise correction method ({CompCor}) for {BOLD} and perfusion based fMRI}, + url = {http://www.sciencedirect.com/science/article/pii/S1053811907003837}, + volume = 37, + year = 2007 +} + +@article{hcppipelines, + author = {Glasser, Matthew F. and Sotiropoulos, Stamatios N. and Wilson, J. Anthony and Coalson, Timothy S. and Fischl, Bruce and Andersson, Jesper L. and Xu, Junqian and Jbabdi, Saad and Webster, Matthew and Polimeni, Jonathan R. and Van Essen, David C. and Jenkinson, Mark}, + doi = {10.1016/j.neuroimage.2013.04.127}, + issn = {1053-8119}, + journal = {NeuroImage}, + pages = {105-124}, + series = {Mapping the Connectome}, + title = {The minimal preprocessing pipelines for the Human Connectome Project}, + url = {http://www.sciencedirect.com/science/article/pii/S1053811913005053}, + volume = 80, + year = 2013 +} + +@article{fs_template, + author = {Reuter, Martin and Rosas, Herminia Diana and Fischl, Bruce}, + doi = {10.1016/j.neuroimage.2010.07.020}, + journal = {NeuroImage}, + number = 4, + pages = {1181-1196}, + title = {Highly accurate inverse consistent registration: A robust approach}, + volume = 53, + year = 2010 +} + +@article{afni, + author = {Cox, Robert W. and Hyde, James S.}, + doi = {10.1002/(SICI)1099-1492(199706/08)10:4/5<171::AID-NBM453>3.0.CO;2-L}, + journal = {NMR in Biomedicine}, + number = {4-5}, + pages = {171-178}, + title = {Software tools for analysis and visualization of fMRI data}, + volume = 10, + year = 1997 +} + +@article{posse_t2s, + author = {Posse, Stefan and Wiese, Stefan and Gembris, Daniel and Mathiak, Klaus and Kessler, Christoph and Grosse-Ruyken, Maria-Liisa and Elghahwagi, Barbara and Richards, Todd and Dager, Stephen R. and Kiselev, Valerij G.}, + doi = {10.1002/(SICI)1522-2594(199907)42:1<87::AID-MRM13>3.0.CO;2-O}, + journal = {Magnetic Resonance in Medicine}, + number = 1, + pages = {87-97}, + title = {Enhancement of {BOLD}-contrast sensitivity by single-shot multi-echo functional {MR} imaging}, + volume = 42, + year = 1999 +} + +@article{dwidenoise1, + title={Denoising of diffusion MRI using random matrix theory}, + author={Veraart, Jelle and Novikov, Dmitry S and Christiaens, Daan and Ades-Aron, Benjamin and Sijbers, Jan and Fieremans, Els}, + journal={NeuroImage}, + volume={142}, + pages={394--406}, + year={2016}, + publisher={Elsevier} +} + +@article{dwidenoise2, + title={Diffusion MRI noise mapping using random matrix theory}, + author={Veraart, Jelle and Fieremans, Els and Novikov, Dmitry S}, + journal={Magnetic resonance in medicine}, + volume={76}, + number={5}, + pages={1582--1593}, + year={2016}, + publisher={Wiley Online Library} +} + +@article{merlet3dshore, + title={Continuous diffusion signal, EAP and ODF estimation via compressive sensing in diffusion MRI}, + author={Merlet, Sylvain L and Deriche, Rachid}, + journal={Medical image analysis}, + volume={17}, + number={5}, + pages={556--572}, + year={2013}, + publisher={Elsevier} +} + +@article{pncprocessing, + title={Neuroimaging of the Philadelphia neurodevelopmental cohort}, + author={Satterthwaite, Theodore D and Elliott, Mark A and Ruparel, Kosha and Loughead, James and Prabhakaran, Karthik and Calkins, Monica E and Hopson, Ryan and Jackson, Chad and Keefe, Jack and Riley, Marisa and others}, + journal={Neuroimage}, + volume={86}, + pages={544--553}, + year={2014}, + publisher={Elsevier} +} + +@inproceedings{dhollander2019response, + title={Improved white matter response function estimation for 3-tissue constrained spherical deconvolution}, + author={Dhollander, T and Mito, R and Raffelt, D and Connelly, A}, + booktitle={Proc. Intl. Soc. Mag. Reson. Med}, + pages={555}, + year={2019} +} + +@inproceedings{dhollander2016unsupervised, + title={Unsupervised 3-tissue response function estimation from single-shell or multi-shell diffusion MR data without a co-registered T1 image}, + author={Dhollander, Thijs and Raffelt, David and Connelly, Alan}, + booktitle={ISMRM Workshop on Breaking the Barriers of Diffusion MRI}, + volume={5}, + pages={5}, + year={2016} +} + +@article{msmt5tt, + title={Multi-tissue constrained spherical deconvolution for improved analysis of multi-shell diffusion MRI data}, + author={Jeurissen, Ben and Tournier, Jacques-Donald and Dhollander, Thijs and Connelly, Alan and Sijbers, Jan}, + journal={NeuroImage}, + volume={103}, + pages={411--426}, + year={2014}, + publisher={Elsevier} +} + +@article{mrtrix3, + title = {MRtrix3: A fast, flexible and open software framework for medical image processing and visualisation}, + author = {J-Donald and Smith, Robert and Raffelt, David and Tabbara, Rami and Dhollander, Thijs and Pietsch, Maximilian and Christiaens, Daan and Jeurissen, Ben and Yeh, Chun-Hung and Connelly, Alan"}, + journal = {NeuroImage}, + volume = {202}, + pages = {116137}, + year = {2019}, + issn={1053-8119}, +} + +@article{originalcsd, + title={Direct estimation of the fiber orientation density function from diffusion-weighted MRI data using spherical deconvolution}, + author={Tournier, J-Donald and Calamante, Fernando and Gadian, David G and Connelly, Alan}, + journal={NeuroImage}, + volume={23}, + number={3}, + pages={1176--1185}, + year={2004}, + publisher={Elsevier} +} + +@article{tournier2007robust, + title={Robust determination of the fibre orientation distribution in diffusion MRI: non-negativity constrained super-resolved spherical deconvolution}, + author={Tournier, J-Donald and Calamante, Fernando and Connelly, Alan}, + journal={Neuroimage}, + volume={35}, + number={4}, + pages={1459--1472}, + year={2007}, + publisher={Elsevier} +} + +@article{tournier2008csd, + title={Resolving crossing fibres using constrained spherical deconvolution: validation using diffusion-weighted imaging phantom data}, + author={Tournier, J-Donald and Yeh, Chun-Hung and Calamante, Fernando and Cho, Kuan-Hung and Connelly, Alan and Lin, Ching-Po}, + journal={Neuroimage}, + volume={42}, + number={2}, + pages={617--625}, + year={2008}, + publisher={Elsevier} +} + +@inproceedings{mtnormalize, + title={Bias field correction and intensity normalisation for quantitative analysis of apparent fibre density}, + author={Raffelt, David and Dhollander, Thijs and Tournier, J-Donald and Tabbara, Rami and Smith, Robert E and Pierre, Eric and Connelly, Alan}, + booktitle={Proc. Intl. Soc. Mag. Reson. Med}, + volume={25}, + pages={3541}, + year={2017} +} + +@article{yeh2010gqi, + title={Generalized $q$-sampling imaging}, + author={Yeh, Fang-Cheng and Wedeen, Van Jay and Tseng, Wen-Yih Isaac}, + journal={IEEE transactions on medical imaging}, + volume={29}, + number={9}, + pages={1626--1635}, + year={2010}, + publisher={IEEE} +} + +@article{anderssoneddy, + title={An integrated approach to correction for off-resonance effects and subject movement in diffusion MR imaging}, + author={Andersson, Jesper LR and Sotiropoulos, Stamatios N}, + journal={Neuroimage}, + volume={125}, + pages={1063--1078}, + year={2016}, + publisher={Elsevier} +} + +@article{eddyrepol, + title={Incorporating outlier detection and replacement into a non-parametric framework for movement and distortion correction of diffusion MR images}, + author={Andersson, Jesper LR and Graham, Mark S and Zsoldos, Enik{\H{o}} and Sotiropoulos, Stamatios N}, + journal={Neuroimage}, + volume={141}, + pages={556--572}, + year={2016}, + publisher={Elsevier} +} + +@article{fsllsr, + title={How to correct susceptibility distortions in spin-echo echo-planar images: application to diffusion tensor imaging}, + author={Andersson, Jesper LR and Skare, Stefan and Ashburner, John}, + journal={Neuroimage}, + volume={20}, + number={2}, + pages={870--888}, + year={2003}, + publisher={Elsevier} +} + + +@article{eddysus, + title={Susceptibility-induced distortion that varies due to motion: correction in diffusion MR without acquiring additional data}, + author={Andersson, Jesper LR and Graham, Mark S and Drobnjak, Ivana and Zhang, Hui and Campbell, Jon}, + journal={Neuroimage}, + volume={171}, + pages={277--295}, + year={2018}, + publisher={Elsevier} +} + +@article{eddys2v, + title={Towards a comprehensive framework for movement and distortion correction of diffusion MR images: Within volume movement}, + author={Andersson, Jesper LR and Graham, Mark S and Drobnjak, Ivana and Zhang, Hui and Filippini, Nicola and Bastiani, Matteo}, + journal={Neuroimage}, + volume={152}, + pages={450--466}, + year={2017}, + publisher={Elsevier} +} + +@article{topup, + title={How to correct susceptibility distortions in spin-echo echo-planar images: application to diffusion tensor imaging}, + author={Andersson, Jesper LR and Skare, Stefan and Ashburner, John}, + journal={Neuroimage}, + volume={20}, + number={2}, + pages={870--888}, + year={2003}, + publisher={Elsevier} +} + +@article{mrdegibbs, + title={Gibbs-ringing artifact removal based on local subvoxel-shifts}, + author={Kellner, Elias and Dhital, Bibek and Kiselev, Valerij G and Reisert, Marco}, + journal={Magnetic resonance in medicine}, + volume={76}, + number={5}, + pages={1574--1581}, + year={2016}, + publisher={Wiley Online Library} +} + +@article{patch2self, + title={Patch2Self: Denoising Diffusion MRI with Self-Supervised Learning​}, + author={Fadnavis, Shreyas and Batson, Joshua and Garyfallidis, Eleftherios}, + journal={Advances in Neural Information Processing Systems}, + volume={33}, + year={2020} +} + +@article{noddi, + title={NODDI: practical in vivo neurite orientation dispersion and density imaging of the human brain}, + author={Zhang, Hui and Schneider, Torben and Wheeler-Kingshott, Claudia A and Alexander, Daniel C}, + journal={Neuroimage}, + volume={61}, + number={4}, + pages={1000--1016}, + year={2012}, + publisher={Elsevier} +} + +@article{amico, + title={Accelerated microstructure imaging via convex optimization (AMICO) from diffusion MRI data}, + author={Daducci, Alessandro and Canales-Rodr{\'\i}guez, Erick J and Zhang, Hui and Dyrby, Tim B and Alexander, Daniel C and Thiran, Jean-Philippe}, + journal={NeuroImage}, + volume={105}, + pages={32--44}, + year={2015}, + publisher={Elsevier} +} + +@article{drbuddi, + title={DR-BUDDI (Diffeomorphic Registration for Blip-Up blip-Down Diffusion Imaging) method for correcting echo planar imaging distortions}, + author={Irfanoglu, M Okan and Modi, Pooja and Nayak, Amritha and Hutchinson, Elizabeth B and Sarlls, Joelle and Pierpaoli, Carlo}, + journal={Neuroimage}, + volume={106}, + pages={284--299}, + year={2015}, + publisher={Elsevier} +} + +@inproceedings{tortoisev3, + title={TORTOISE v3: Improvements and new features of the NIH diffusion MRI processing pipeline}, + author={Irfanoglu, Mustafa Okan and Nayak, Amritha and Jenkins, Jeffrey and Pierpaoli, Carlo}, + booktitle={Program and proceedings of the ISMRM 25th annual meeting and exhibition, Honolulu, HI, USA}, + year={2017} +} + +@article{pfgibbs, + title={Removal of partial Fourier-induced Gibbs (RPG) ringing artifacts in MRI}, + author={Lee, Hong-Hsi and Novikov, Dmitry S and Fieremans, Els}, + journal={Magnetic Resonance in Medicine}, + volume={86}, + number={5}, + pages={2733--2750}, + year={2021}, + publisher={Wiley Online Library} +} + +@article{synthstrip, + title={SynthStrip: skull-stripping for any brain image}, + author={Hoopes, Andrew and Mora, Jocelyn S and Dalca, Adrian V and Fischl, Bruce and Hoffmann, Malte}, + journal={NeuroImage}, + volume={260}, + pages={119474}, + year={2022}, + publisher={Elsevier} +} + +@article{synthseg1, + title={SynthSeg: Segmentation of brain MRI scans of any contrast and resolution without retraining}, + author={Billot, Benjamin and Greve, Douglas N and Puonti, Oula and Thielscher, Axel and Van Leemput, Koen and Fischl, Bruce and Dalca, Adrian V and Iglesias, Juan Eugenio and others}, + journal={Medical image analysis}, + volume={86}, + pages={102789}, + year={2023}, + publisher={Elsevier} +} + +@article{synthseg2, + title={Robust machine learning segmentation for large-scale analysis of heterogeneous clinical brain MRI datasets}, + author={Billot, Benjamin and Magdamo, Colin and Cheng, You and Arnold, Steven E and Das, Sudeshna and Iglesias, Juan Eugenio}, + journal={Proceedings of the National Academy of Sciences}, + volume={120}, + number={9}, + pages={e2216399120}, + year={2023}, + publisher={National Acad Sciences} +} + +@article{yeh2013deterministic, + title={Deterministic diffusion fiber tracking improved by quantitative anisotropy}, + author={Yeh, Fang-Cheng and Verstynen, Timothy D and Wang, Yibao and Fern{\'a}ndez-Miranda, Juan C and Tseng, Wen-Yih Isaac}, + journal={PloS one}, + volume={8}, + number={11}, + pages={e80713}, + year={2013}, + publisher={Public Library of Science San Francisco, USA} +} + +@article{autotrack, + title={Shape analysis of the human association pathways}, + author={Yeh, Fang-Cheng}, + journal={Neuroimage}, + volume={223}, + pages={117329}, + year={2020}, + publisher={Elsevier} +} diff --git a/src/keprep/interfaces/data/keprep.json b/src/keprep/data/keprep.json similarity index 99% rename from src/keprep/interfaces/data/keprep.json rename to src/keprep/data/keprep.json index 43a0075..a86ceb1 100644 --- a/src/keprep/interfaces/data/keprep.json +++ b/src/keprep/data/keprep.json @@ -182,4 +182,4 @@ "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}][_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}", "sub-{subject}/{datatype}/sub-{subject}[_ses-{session}]_task-{task}[_acq-{acquisition}][_ce-{ceagent}][_rec-{reconstruction}][_dir-{direction}][_run-{run}][_echo-{echo}][_part-{part}][_space-{space}][_cohort-{cohort}][_desc-{desc}]_{suffix}{extension<.html|.svg>|.svg}" ] -} \ No newline at end of file +} diff --git a/src/keprep/data/quality_assurance/__init__.py b/src/keprep/data/quality_assurance/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/keprep/data/quality_assurance/reports.py b/src/keprep/data/quality_assurance/reports.py new file mode 100644 index 0000000..6132f16 --- /dev/null +++ b/src/keprep/data/quality_assurance/reports.py @@ -0,0 +1,148 @@ +# emacs: -*- mode: python; py-indent-offset: 4; indent-tabs-mode: nil -*- +# vi: set ft=python sts=4 ts=4 sw=4 et: +# +# Copyright The NiPreps Developers +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# We support and encourage derived works from this project, please read +# about our expectations at +# +# https://www.nipreps.org/community/licensing/ +# +from pathlib import Path + +from nireports.assembler.report import Report + +from keprep import config, data + + +def run_reports( + output_dir, + subject_label, + run_uuid, + bootstrap_file=None, + out_filename="report.html", + reportlets_dir=None, + errorname="report.err", + **entities, +): + """ + Run the reports. + """ + robj = Report( + output_dir, + run_uuid, + bootstrap_file=bootstrap_file, + out_filename=out_filename, + reportlets_dir=reportlets_dir, + plugins=None, + plugin_meta=None, + metadata=None, + **entities, + ) + + # Count nbr of subject for which report generation failed + try: + robj.generate_report() + except: # noqa: E722 + import sys + import traceback + + # Store the list of subjects for which report generation failed + traceback.print_exception( + *sys.exc_info(), file=str(Path(output_dir) / "logs" / errorname) + ) + return subject_label + + return None + + +def generate_reports( + subject_list, + output_dir, + run_uuid, + session_list=None, + bootstrap_file=None, + work_dir=None, +): + """Generate reports for a list of subjects.""" + reportlets_dir = None + if work_dir is not None: + reportlets_dir = Path(work_dir) / "reportlets" + + if isinstance(subject_list, str): + subject_list = [subject_list] + + errors = [] + for subject_label in subject_list: + # The number of sessions is intentionally not based on session_list but + # on the total number of sessions, because I want the final derivatives + # folder to be the same whether sessions were run one at a time or all-together. + n_ses = len(config.execution.layout.get_sessions(subject=subject_label)) + html_report = "report.html" + + bootstrap_file = data.load("quality_assurance/templates/reports-spec.yml") + html_report = "report.html" + + report_error = run_reports( + output_dir, + subject_label, + run_uuid, + bootstrap_file=bootstrap_file, + out_filename=html_report, + reportlets_dir=reportlets_dir, + errorname=f"report-{run_uuid}-{subject_label}.err", + subject=subject_label, + ) + # If the report generation failed, append the subject label for which it failed + if report_error is not None: + errors.append(report_error) + + if n_ses > config.execution.aggr_ses_reports: + # Beyond a certain number of sessions per subject, + # we separate the functional reports per session + if session_list is None: + all_filters = config.execution.bids_filters or {} + filters = all_filters.get("bold", {}) + session_list = config.execution.layout.get_sessions( + subject=subject_label, **filters + ) + + # Drop ses- prefixes + session_list = [ + ses[4:] if ses.startswith("ses-") else ses for ses in session_list + ] + + for session_label in session_list: + bootstrap_file = data.load("reports-spec-func.yml") + html_report = ( + f'sub-{subject_label.lstrip("sub-")}_ses-{session_label}_func.html' + ) + + report_error = run_reports( + output_dir, + subject_label, + run_uuid, + bootstrap_file=bootstrap_file, + out_filename=html_report, + reportlets_dir=reportlets_dir, + errorname=f"report-{run_uuid}-{subject_label}-func.err", + subject=subject_label, + session=session_label, + ) + # If the report generation failed, append the subject label for which it failed + if report_error is not None: + errors.append(report_error) + + return errors diff --git a/src/keprep/data/quality_assurance/templates/__init__.py b/src/keprep/data/quality_assurance/templates/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/keprep/data/quality_assurance/templates/reports-spec copy.yml b/src/keprep/data/quality_assurance/templates/reports-spec copy.yml new file mode 100644 index 0000000..73068e1 --- /dev/null +++ b/src/keprep/data/quality_assurance/templates/reports-spec copy.yml @@ -0,0 +1,199 @@ +package: fmriprep +title: Visual report for participant '{subject}' - fMRIPrep +sections: +- name: Summary + reportlets: + - bids: {datatype: figures, desc: summary, suffix: T1w} +- name: Anatomical + reportlets: + - bids: + datatype: figures + desc: conform + extension: [.html] + suffix: T1w + - bids: {datatype: figures, suffix: dseg} + caption: This panel shows the final, preprocessed T1-weighted image, + with contours delineating the detected brain mask and brain tissue segmentations. + subtitle: Brain mask and brain tissue segmentation of the T1w + - bids: {datatype: figures, space: .*, suffix: T1w, regex_search: True} + caption: Spatial normalization of the T1w image to the {space} template. + description: Results of nonlinear alignment of the T1w reference one or more template + space(s). Hover on the panels with the mouse pointer to transition between both + spaces. + static: false + subtitle: Spatial normalization of the anatomical T1w reference + - bids: {datatype: figures, desc: reconall, suffix: T1w} + caption: Surfaces (white and pial) reconstructed with FreeSurfer (recon-all) + overlaid on the participant's T1w template. + subtitle: Surface reconstruction + +- name: B0 field mapping + ordering: session,acquisition,run,fmapid + reportlets: + - bids: {datatype: figures, desc: mapped, suffix: fieldmap} + caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions + along the phase-encoding direction of the image. Some scanners produce a B0 + mapping of the field, using Spiral Echo Imaging (SEI) or postprocessing a "phase-difference" + acquisition. The plot below shows an anatomical "magnitude" reference and the corresponding + fieldmap. + description: Hover over the panels with the mouse pointer to also visualize the intensity of the + field inhomogeneity in Hertz. + static: false + subtitle: "Preprocessed B0 mapping acquisition" + - bids: {datatype: figures, desc: phasediff, suffix: fieldmap} + caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions + along the phase-encoding direction of the image. A Gradient-Recalled Echo (GRE) scheme was included for the + mapping of the B0 inhomogeneities by subtracting the phase maps obtained at + two subsequent echoes. The plot below shows an anatomical "magnitude" reference and the corresponding + fieldmap. + description: Hover over the panels with the mouse pointer to also visualize the intensity of the + field inhomogeneity in Hertz. + static: false + subtitle: "Preprocessed mapping of phase-difference acquisition" + - bids: {datatype: figures, desc: pepolar, suffix: fieldmap} + caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions + along the phase-encoding direction of the image. Utilizing two or more images with different + phase-encoding polarities (PEPolar) or directions, it is possible to estimate the inhomogeneity + of the field. The plot below shows a reference EPI (echo-planar imaging) volume generated + using two or more EPI images with varying phase-encoding blips. + description: Hover on the panels with the mouse pointer to also visualize the intensity of the + inhomogeneity of the field in Hertz. + static: false + subtitle: "Preprocessed estimation with varying Phase-Encoding (PE) blips" + - bids: {datatype: figures, desc: anat, suffix: fieldmap} + caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions + along the phase-encoding direction of the image. Utilizing an anatomically-correct acquisition + (for instance, T1w or T2w), it is possible to estimate the inhomogeneity of the field by means of nonlinear + registration. The plot below shows a reference EPI (echo-planar imaging) volume generated + using two or more EPI images with the same PE encoding, after alignment to the anatomical scan. + description: Hover on the panels with the mouse pointer to also visualize the intensity of the + inhomogeneity of the field in Hertz. + static: false + subtitle: "Preprocessed estimation by nonlinear registration to an anatomical scan (“fieldmap-less”)" + +- name: Functional + ordering: session,task,acquisition,ceagent,reconstruction,direction,run,echo + reportlets: + - bids: {datatype: figures, desc: summary, suffix: bold} + - bids: {datatype: figures, desc: validation, suffix: bold} + - bids: {datatype: figures, desc: fmapCoreg, suffix: bold} + caption: The estimated fieldmap was aligned to the corresponding EPI reference + with a rigid-registration process of the fieldmap reference image, + using antsRegistration. + Overlaid on top of the co-registration results, the final BOLD mask is represented + with a red contour for reference. + static: false + subtitle: Alignment between the anatomical reference of the fieldmap and the target EPI + - bids: {datatype: figures, desc: fieldmap, suffix: bold} + caption: Estimated fieldmap, as reconstructed on the target BOLD run space to allow + the assessment of its alignment with the distorted data. + The anatomical reference is the fieldmap's reference moved into the target EPI's grid through + the estimated transformation. + In other words, this plot should be equivalent to that of the + Preprocessed estimation with varying Phase-Encoding (PE) blips shown above in the + fieldmap section. + Therefore, the fieldmap should be positioned relative to the anatomical reference exactly + as it is positioned in the reportlet above. + static: false + subtitle: "Reconstructed B0 map in the corresponding run's space (debug mode)" + - bids: {datatype: figures, desc: sdc, suffix: bold} + caption: Results of performing susceptibility distortion correction (SDC) on the + BOLD reference image. The "distorted" image is the image that would be used to + align to the anatomical reference if SDC were not applied. The "corrected" + image is the image that was used. + static: false + subtitle: Susceptibility distortion correction + - bids: {datatype: figures, desc: forcedsyn, suffix: bold} + caption: The dataset contained some fieldmap information, but the argument --force-syn + was used. The higher-priority SDC method was used. Here, we show the results + of performing SyN-based SDC on the EPI for comparison. + static: false + subtitle: Experimental fieldmap-less susceptibility distortion correction + - bids: {datatype: figures, desc: t2scomp, suffix: bold} + caption: A T2* map was calculated from the echos. Here, we show the comparison + of the T2* map and the BOLD reference map used for BOLD-T1w coregistration. + The red contour shows the anatomical gray-matter mask resampled into BOLD space. + static: false + subtitle: T2* map + - bids: {datatype: figures, desc: t2starhist, suffix: bold} + caption: A histogram of estimated T2* values within the anatomically-derived gray-matter mask + shown in the previous plot. Note that values are clipped at 100ms, so any extreme outliers will + appear in the 100ms bin. + static: false + subtitle: T2* gray-matter values + - bids: {datatype: figures, desc: coreg, suffix: bold} + caption: This panel shows the alignment of the reference EPI (BOLD) image to the + anatomical (T1-weighted) image. + The reference EPI has been contrast enhanced and susceptibility-distortion + corrected (if applicable) for improved anatomical fidelity. + The anatomical image has been resampled into EPI space, as well as the + anatomical white matter mask, which appears as a red contour. + static: false + subtitle: Alignment of functional and anatomical MRI data (coregistration) + - bids: {datatype: figures, desc: rois, suffix: bold} + caption: Brain mask calculated on the BOLD signal (red contour), along with the + regions of interest (ROIs) used for the estimation of physiological and movement + confounding components that can be then used as nuisance regressors in analysis.
+ The anatomical CompCor ROI (magenta contour) is a mask combining + CSF and WM (white-matter), where voxels containing a minimal partial volume + of GM have been removed.
+ The temporal CompCor ROI (blue contour) contains the top 2% most + variable voxels within the brain mask.
+ The brain edge (or crown) ROI (green contour) picks signals + outside but close to the brain, which are decomposed into 24 principal components. + subtitle: Brain mask and (anatomical/temporal) CompCor ROIs + - bids: + datatype: figures + desc: '[at]compcor' + extension: [.html] + suffix: bold + - bids: {datatype: figures, desc: 'compcorvar', suffix: bold} + caption: The cumulative variance explained by the first k components of the + t/aCompCor decomposition, plotted for all values of k. + The number of components that must be included in the model in order to + explain some fraction of variance in the decomposition mask can be used + as a feature selection criterion for confound regression. + subtitle: Variance explained by t/aCompCor components + - bids: {datatype: figures, desc: carpetplot, suffix: bold} + caption: Summary statistics are plotted, which may reveal trends or artifacts + in the BOLD data. Global signals calculated within the whole-brain (GS), within + the white-matter (WM) and within cerebro-spinal fluid (CSF) show the mean BOLD + signal in their corresponding masks. DVARS and FD show the standardized DVARS + and framewise-displacement measures for each time point.
+ A carpet plot shows the time series for all voxels within the brain mask, + or if --cifti-output was enabled, all grayordinates. + See the figure legend for specific color mappings. + "Ctx" = cortex, "Cb" = cerebellum, "WM" = white matter, "CSF" = cerebrospinal fluid. + "d" and "s" prefixes indicate "deep" and "shallow" relative to the cortex. + "Edge" indicates regions just outside the brain. + subtitle: BOLD Summary + - bids: {datatype: figures, desc: 'confoundcorr', suffix: bold} + caption: | + Left: Heatmap summarizing the correlation structure among confound variables. + (Cosine bases and PCA-derived CompCor components are inherently orthogonal.) + Right: magnitude of the correlation between each confound time series and the + mean global signal. Strong correlations might be indicative of partial volume + effects and can inform decisions about feature orthogonalization prior to + confound regression. + subtitle: Correlations among nuisance regressors +- name: About + nested: true + reportlets: + - bids: {datatype: figures, desc: about, suffix: T1w} + - custom: boilerplate + path: '{out_dir}/logs' + bibfile: ['keprep', 'data/boilerplate.bib'] + caption: | +

We kindly ask to report results preprocessed with this tool using the following boilerplate.

+ + title: Methods + - custom: errors + path: '{out_dir}/sub-{subject}/log/{run_uuid}' + captions: NiReports may have recorded failure conditions. + title: Errors diff --git a/src/keprep/data/quality_assurance/templates/reports-spec.yml b/src/keprep/data/quality_assurance/templates/reports-spec.yml new file mode 100644 index 0000000..50b68ef --- /dev/null +++ b/src/keprep/data/quality_assurance/templates/reports-spec.yml @@ -0,0 +1,67 @@ +package: keprep +title: Visual report for participant '{subject}' - KePrep +sections: +- name: Summary + reportlets: + - bids: {datatype: figures, desc: summary, suffix: T1w} +- name: Anatomical + reportlets: + - bids: + datatype: figures + desc: conform + extension: [.html] + suffix: T1w + - bids: {datatype: figures, suffix: dseg} + caption: This panel shows the final, preprocessed T1-weighted image, + with contours delineating the detected brain mask and brain tissue segmentations. + subtitle: Brain mask and brain tissue segmentation of the T1w + - bids: {datatype: figures, space: .*, suffix: T1w, regex_search: True} + caption: Spatial normalization of the T1w image to the {space} template. + description: Results of nonlinear alignment of the T1w reference one or more template + space(s). Hover on the panels with the mouse pointer to transition between both + spaces. + static: false + subtitle: Spatial normalization of the anatomical T1w reference + - bids: {datatype: figures, desc: reconall, suffix: T1w} + caption: Surfaces (white and pial) reconstructed with FreeSurfer (recon-all) + overlaid on the participant's T1w template. + subtitle: Surface reconstruction + + +- name: Diffusion + ordering: session + reportlets: + - bids: {datatype: figures, suffix: dwi, extension: [.html]} + caption: This panel shows the final, preprocessed diffusion-weighted image. + subtitle: Diffusion-weighted image (DWI) + - bids: {datatype: figures, desc: sdc, suffix: dwi} + caption: Susceptibility distortion correction (TOPUP) applied to the DWI. + subtitle: Susceptibility distortion correction (TOPUP). + static: false + - bids: {datatype: figures, desc: coreg, suffix: dwi} + caption: b=0 to anatomical reference registration + subtitle: Coregistration of the DWI to the anatomical T1w image using FSL's FLIRT. + static: false + + +- name: About + nested: true + reportlets: + - bids: {datatype: figures, desc: about, suffix: T1w} + - custom: boilerplate + path: '{out_dir}/logs' + bibfile: ['keprep', 'data/boilerplate.bib'] + caption: | +

We kindly ask to report results preprocessed with this tool using the following boilerplate.

+ + title: Methods + - custom: errors + path: '{out_dir}/sub-{subject}/log/{run_uuid}' + captions: NiReports may have recorded failure conditions. + title: Errors diff --git a/src/keprep/interfaces/reports/__init__.py b/src/keprep/interfaces/reports/__init__.py index e69de29..d531c92 100644 --- a/src/keprep/interfaces/reports/__init__.py +++ b/src/keprep/interfaces/reports/__init__.py @@ -0,0 +1,5 @@ +from keprep.interfaces.reports.reports import ( # noqa: F401 + AboutSummary, + DiffusionSummary, + SubjectSummary, +) diff --git a/src/keprep/interfaces/reports/reports.py b/src/keprep/interfaces/reports/reports.py index 285f328..85ed3db 100644 --- a/src/keprep/interfaces/reports/reports.py +++ b/src/keprep/interfaces/reports/reports.py @@ -49,6 +49,18 @@ \t """ +DIFFUSION_TEMPLATE = """\t\t

Summary

+\t\t
    +\t\t\t
  • Phase-encoding (PE) direction: {pedir}
  • +\t\t\t
  • Susceptibility distortion correction: {sdc}
  • +\t\t\t
  • Coregistration Transform: {coregistration}
  • +\t\t\t
  • Denoising Method: {denoise_method}
  • +\t\t\t
  • Denoising Window: {denoise_window}
  • +\t\t\t
  • HMC Model: {hmc_model}
  • +\t\t
+""" +# {validation_reports} + ABOUT_TEMPLATE = """\t
    \t\t
  • KePrep version: {version}
  • \t\t
  • KePrep command: {command}
  • @@ -153,3 +165,66 @@ def _generate_segment(self): command=self.inputs.command, date=time.strftime("%Y-%m-%d %H:%M:%S %z"), ) + + +class DiffusionSummaryInputSpec(BaseInterfaceInputSpec): + distortion_correction = traits.Str( + default_value="TOPUP", + desc="Susceptibility distortion correction method", + mandatory=False, + ) + pe_direction = traits.Enum( + None, + "i", + "i-", + "j", + "j-", + mandatory=True, + desc="Phase-encoding direction detected", + ) + impute_slice_threshold = traits.CFloat(desc="threshold for imputing a slice") + hmc_model = traits.Str(desc="model used for hmc") + b0_to_t1w_transform = traits.Enum( + "Rigid", "Affine", desc="Transform type for coregistration" + ) + denoise_method = traits.Str(desc="method used for image denoising") + dwi_denoise_window = traits.Either( + traits.Int(), traits.Str(), desc="window size for dwidenoise" + ) + output_spaces = traits.List(desc="Target spaces") + confounds_file = File(exists=True, desc="Confounds file") + validation_reports = InputMultiObject(File(exists=True)) + + +class DiffusionSummary(SummaryInterface): + input_spec = DiffusionSummaryInputSpec + + def _generate_segment(self): + if self.inputs.pe_direction is None: + pedir = "MISSING - Assuming Anterior-Posterior" + else: + pedir = {"i": "Left-Right", "j": "Anterior-Posterior"}[ + self.inputs.pe_direction[0] + ] + + if isdefined(self.inputs.confounds_file): + with open(self.inputs.confounds_file) as cfh: + conflist = cfh.readline().strip("\n").strip() # noqa: F841 + else: + conflist = "" # noqa: F841 + + validation_summaries = [] # noqa: F841 + # for summary in self.inputs.validation_reports: + # with open(summary, "r") as summary_f: + # validation_summaries.extend(summary_f.readlines()) + # validation_summary = "\n".join(validation_summaries) + + return DIFFUSION_TEMPLATE.format( + pedir=pedir, + sdc=self.inputs.distortion_correction, + coregistration=self.inputs.b0_to_t1w_transform, + hmc_model=self.inputs.hmc_model, + denoise_method=self.inputs.denoise_method, + denoise_window=self.inputs.dwi_denoise_window, + # validation_reports=validation_summary, + ) diff --git a/src/keprep/workflows/base/workflow.py b/src/keprep/workflows/base/workflow.py index 496c68c..a3c319b 100644 --- a/src/keprep/workflows/base/workflow.py +++ b/src/keprep/workflows/base/workflow.py @@ -14,7 +14,7 @@ write_bidsignore, write_derivative_description, ) -from keprep.interfaces.reports.reports import AboutSummary, SubjectSummary +from keprep.interfaces.reports import AboutSummary, SubjectSummary from keprep.workflows.base.messages import ( ANAT_DERIVATIVES_FAILED, BASE_POSTDESC, @@ -237,8 +237,8 @@ def init_single_subject_wf(subject_id: str): summary = pe.Node( SubjectSummary( - std_spaces=spaces.get_spaces(nonstandard=False), - nstd_spaces=spaces.get_spaces(standard=False), + std_spaces=spaces.get_spaces(nonstandard=False), # type: ignore[attr-defined] + nstd_spaces=spaces.get_spaces(standard=False), # type: ignore[attr-defined] ), name="summary", run_without_submitting=True, @@ -252,7 +252,7 @@ def init_single_subject_wf(subject_id: str): ds_report_summary = pe.Node( DerivativesDataSink( - base_directory=str(config.execution.keprep_dir), + base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] desc="summary", datatype="figures", ), @@ -262,7 +262,7 @@ def init_single_subject_wf(subject_id: str): ds_report_about = pe.Node( DerivativesDataSink( - base_directory=str(config.execution.keprep_dir), + base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] desc="about", datatype="figures", ), diff --git a/src/keprep/workflows/dwi/stages/eddy.py b/src/keprep/workflows/dwi/stages/eddy.py index ce0db9e..2e30ad2 100644 --- a/src/keprep/workflows/dwi/stages/eddy.py +++ b/src/keprep/workflows/dwi/stages/eddy.py @@ -119,7 +119,7 @@ def init_eddy_wf(name: str = "eddy_wf") -> pe.Workflow: dwifslpreproc = pe.Node( DWIPreproc( - eddy_options=" --fwhm=0 --flm='quadratic'", + eddy_options=f" {config.workflow.eddy_config}", rpe_options="pair", align_seepi=True, nthreads=config.nipype.omp_nthreads, diff --git a/src/keprep/workflows/dwi/stages/post_eddy.py b/src/keprep/workflows/dwi/stages/post_eddy.py index e9e79b9..d86fadb 100644 --- a/src/keprep/workflows/dwi/stages/post_eddy.py +++ b/src/keprep/workflows/dwi/stages/post_eddy.py @@ -48,15 +48,6 @@ def init_post_eddy_wf(name: str = "post_eddy_wf") -> pe.Workflow: name="outputnode", ) - bias_correct = pe.Node( - mrt.DWIBiasCorrect( - out_file="bias_corrected.mif", - use_ants=True, - nthreads=config.nipype.omp_nthreads, - ), - name="bias_correct", - ) - mrconvert_dwi = pe.Node( MRConvert( out_file="dwi.nii.gz", @@ -68,30 +59,60 @@ def init_post_eddy_wf(name: str = "post_eddy_wf") -> pe.Workflow: ), name="mrconvert_dwi", ) + if config.workflow.dwi_no_biascorr: + workflow.connect( + [ + ( + inputnode, + mrconvert_dwi, + [ + ("dwi_preproc", "in_file"), + ], + ), + ( + inputnode, + outputnode, + [("dwi_preproc", "dwi_mif")], + ), + ] + ) + else: + bias_correct = pe.Node( + mrt.DWIBiasCorrect( + out_file="bias_corrected.mif", + use_ants=True, + nthreads=config.nipype.omp_nthreads, + ), + name="bias_correct", + ) + workflow.connect( + [ + ( + inputnode, + bias_correct, + [ + ("dwi_preproc", "in_file"), + ], + ), + ( + bias_correct, + mrconvert_dwi, + [ + ("out_file", "in_file"), + ], + ), + ( + bias_correct, + outputnode, + [ + ("out_file", "dwi_mif"), + ], + ), + ] + ) workflow.connect( [ - ( - inputnode, - bias_correct, - [ - ("dwi_preproc", "in_file"), - ], - ), - ( - bias_correct, - mrconvert_dwi, - [ - ("out_file", "in_file"), - ], - ), - ( - bias_correct, - outputnode, - [ - ("out_file", "dwi_mif"), - ], - ), ( mrconvert_dwi, outputnode, diff --git a/src/keprep/workflows/dwi/utils.py b/src/keprep/workflows/dwi/utils.py new file mode 100644 index 0000000..42de6ea --- /dev/null +++ b/src/keprep/workflows/dwi/utils.py @@ -0,0 +1,34 @@ +def read_field_from_json(json_file, field): + """Read a field from a JSON file.""" + import json + + with open(json_file, "r") as f: + data = json.load(f) + return data[field] + + +def calculate_denoise_window(dwi_file: str) -> int: + """ + select the smallest isotropic patch size that exceeds the number of + DW images in the input data, e.g., 5x5x5 for data with <= 125 DWI volumes, + 7x7x7 for data with <= 343 DWI volumes, etc. Must be an odd number. + + Parameters + ---------- + dwi_file : str + path to dwi file + + Returns + ------- + int + window size for dwidenoise + """ + import nibabel as nib + import numpy as np + + img = nib.load(dwi_file) + n_volumes = img.shape[-1] # type: ignore[attr-defined] + window_size = int(np.ceil(n_volumes ** (1 / 3))) + if window_size % 2 == 0: + window_size += 1 + return window_size diff --git a/src/keprep/workflows/dwi/workflow.py b/src/keprep/workflows/dwi/workflow.py index 0240806..87f0c61 100644 --- a/src/keprep/workflows/dwi/workflow.py +++ b/src/keprep/workflows/dwi/workflow.py @@ -6,10 +6,13 @@ from keprep import config from keprep.interfaces.bids import get_fieldmap +from keprep.interfaces.bids.bids import DerivativesDataSink +from keprep.interfaces.reports.reports import DiffusionSummary from keprep.workflows.dwi.stages.coregister import init_dwi_coregister_wf from keprep.workflows.dwi.stages.derivatives import init_derivatives_wf from keprep.workflows.dwi.stages.eddy import init_eddy_wf from keprep.workflows.dwi.stages.post_eddy import init_post_eddy_wf +from keprep.workflows.dwi.utils import calculate_denoise_window, read_field_from_json def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): @@ -74,6 +77,69 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): ), name="outputnode", ) + + if ( + config.workflow.denoise_method == "dwidenoise" + and config.workflow.dwi_denoise_window == "auto" + ): + dwi_denoise_window = calculate_denoise_window(dwi_file) # type: ignore[arg-type] + + bo_to_t1w = "Rigid" if config.workflow.dwi2t1w_dof == 6 else "Affine" + summary = pe.Node( + DiffusionSummary( + distortion_correction="TOPUP", + hmc_model=config.workflow.hmc_model, + b0_to_t1w_transform=bo_to_t1w, + denoise_method=config.workflow.denoise_method, + dwi_denoise_window=dwi_denoise_window, + ), + name="summary", + run_without_submitting=True, + ) + + read_pe_direction = pe.Node( + niu.Function( + input_names=["json_file", "field"], + output_names=["pe_dir"], + function=read_field_from_json, + ), + name="read_pe_direction", + ) + read_pe_direction.inputs.field = "PhaseEncodingDirection" + + # Reporting + ds_report_summary = pe.Node( + DerivativesDataSink( + base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] + datatype="figures", + suffix="dwi", + desc="summary", + source_file=dwi_file, + dismiss_entities=["direction"], + ), + name="ds_report_summary", + run_without_submitting=True, + ) + workflow.connect( + [ + ( + inputnode, + read_pe_direction, + [("dwi_json", "json_file")], + ), + ( + read_pe_direction, + summary, + [("pe_dir", "pe_direction")], + ), + ( + summary, + ds_report_summary, + [("out_report", "in_file")], + ), + ] + ) + dwi_conversion_to_mif_node = pe.Node( interface=mrt.MRConvert( out_file="dwi.mif", nthreads=config.nipype.omp_nthreads @@ -115,7 +181,8 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): dwi_denoise_node = pe.Node( interface=mrt.DWIDenoise( out_file="dwi_denoised.mif", - noise="noise.mif", + extent=(dwi_denoise_window, dwi_denoise_window, dwi_denoise_window), + noise="noise.nii.gz", nthreads=config.nipype.omp_nthreads, ), name="dwi_denoise", From 4ccde584184f273a2187f5ce5a33ac8566e8e764 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Mon, 5 Aug 2024 15:50:54 +0300 Subject: [PATCH 10/16] added some visualization of eddy qc --- .../workflows/dwi/stages/derivatives.py | 18 +++ src/keprep/workflows/dwi/stages/eddy.py | 27 +--- src/keprep/workflows/dwi/stages/post_eddy.py | 31 +++++ src/keprep/workflows/dwi/utils.py | 121 ++++++++++++++++++ src/keprep/workflows/dwi/workflow.py | 2 + 5 files changed, 176 insertions(+), 23 deletions(-) diff --git a/src/keprep/workflows/dwi/stages/derivatives.py b/src/keprep/workflows/dwi/stages/derivatives.py index 5d91c60..85f3291 100644 --- a/src/keprep/workflows/dwi/stages/derivatives.py +++ b/src/keprep/workflows/dwi/stages/derivatives.py @@ -54,6 +54,7 @@ def init_derivatives_wf(name: str = "derivatives_wf") -> pe.Workflow: "coreg_report", "unsifted_tck", "sifted_tck", + "eddy_qc_plot", ] ), name="inputnode", @@ -69,6 +70,18 @@ def init_derivatives_wf(name: str = "derivatives_wf") -> pe.Workflow: run_without_submitting=True, ) + ds_eddy_qc_plot = pe.Node( + DerivativesDataSink( + base_directory=output_dir, + desc="eddyqc", + suffix="dwi", + datatype="figures", + dismiss_entities=["direction"], + ), + name="ds_eddy_qc_plot", + run_without_submitting=True, + ) + ds_sdc_report = pe.Node( DerivativesDataSink( base_directory=output_dir, @@ -201,6 +214,11 @@ def init_derivatives_wf(name: str = "derivatives_wf") -> pe.Workflow: ds_eddy_qc, [("out_file", "source_file")], ), + ( + inputnode, + ds_eddy_qc_plot, + [("eddy_qc_plot", "in_file"), ("source_file", "source_file")], + ), ( inputnode, ds_sdc_report, diff --git a/src/keprep/workflows/dwi/stages/eddy.py b/src/keprep/workflows/dwi/stages/eddy.py index 2e30ad2..aee6374 100644 --- a/src/keprep/workflows/dwi/stages/eddy.py +++ b/src/keprep/workflows/dwi/stages/eddy.py @@ -5,6 +5,7 @@ from keprep import config from keprep.interfaces.mrtrix3 import DWIPreproc from keprep.workflows.dwi.stages.extract_b0 import init_extract_b0_wf +from keprep.workflows.dwi.utils import read_field_from_json def init_eddy_wf(name: str = "eddy_wf") -> pe.Workflow: @@ -110,12 +111,13 @@ def init_eddy_wf(name: str = "eddy_wf") -> pe.Workflow: query_pe_dir = pe.Node( niu.Function( - input_names=["json_file"], + input_names=["json_file", "field"], output_names=["pe_dir"], - function=get_pe_from_json, + function=read_field_from_json, ), name="query_pe_dir", ) + query_pe_dir.inputs.field = "PhaseEncodingDirection" dwifslpreproc = pe.Node( DWIPreproc( @@ -164,24 +166,3 @@ def init_eddy_wf(name: str = "eddy_wf") -> pe.Workflow: ] ) return workflow - - -def get_pe_from_json(json_file: str) -> str: - """ - Query the phase encoding direction from a json file. - - Parameters - ---------- - json_file : str - path to json file - - Returns - ------- - str - phase encoding direction - """ - import json - - with open(json_file) as f: - data = json.load(f) - return data["PhaseEncodingDirection"] diff --git a/src/keprep/workflows/dwi/stages/post_eddy.py b/src/keprep/workflows/dwi/stages/post_eddy.py index d86fadb..4245abb 100644 --- a/src/keprep/workflows/dwi/stages/post_eddy.py +++ b/src/keprep/workflows/dwi/stages/post_eddy.py @@ -5,6 +5,7 @@ from keprep import config from keprep.interfaces.mrtrix3 import MRConvert from keprep.workflows.dwi.stages.extract_b0 import init_extract_b0_wf +from keprep.workflows.dwi.utils import plot_eddy_qc def init_post_eddy_wf(name: str = "post_eddy_wf") -> pe.Workflow: @@ -27,6 +28,7 @@ def init_post_eddy_wf(name: str = "post_eddy_wf") -> pe.Workflow: niu.IdentityInterface( fields=[ "dwi_preproc", + "eddy_qc", ] ), name="inputnode", @@ -43,11 +45,40 @@ def init_post_eddy_wf(name: str = "post_eddy_wf") -> pe.Workflow: "dwi_json", "dwi_reference", "dwi_reference_json", + "eddy_qc_plot", ] ), name="outputnode", ) + plot_eddy_qc_node = pe.Node( + niu.Function( + input_names=["eddy_qc", "out_file"], + output_names=["out_file"], + function=plot_eddy_qc, + ), + name="plot_eddy_qc", + ) + plot_eddy_qc_node.inputs.out_file = "eddy_qc_plot.png" + workflow.connect( + [ + ( + inputnode, + plot_eddy_qc_node, + [ + ("eddy_qc", "eddy_qc"), + ], + ), + ( + plot_eddy_qc_node, + outputnode, + [ + ("out_file", "eddy_qc_plot"), + ], + ), + ] + ) + mrconvert_dwi = pe.Node( MRConvert( out_file="dwi.nii.gz", diff --git a/src/keprep/workflows/dwi/utils.py b/src/keprep/workflows/dwi/utils.py index 42de6ea..210df8f 100644 --- a/src/keprep/workflows/dwi/utils.py +++ b/src/keprep/workflows/dwi/utils.py @@ -32,3 +32,124 @@ def calculate_denoise_window(dwi_file: str) -> int: if window_size % 2 == 0: window_size += 1 return window_size + + +def plot_eddy_qc( + eddy_qc: str, + out_file: str, + dpi: int = 300, +): + """ + Plot the eddy QC. + + Parameters + ---------- + eddy_qc : str + path to the eddy qc file + out_file : str + path to the output file + title : str, optional + title of the plot (default: "Eddy QC") + dpi : int, optional + dpi of the plot (default: 300) + """ + from pathlib import Path + + import matplotlib.pyplot as plt + import numpy as np + import pandas as pd + import seaborn as sns + + sns.set_style("whitegrid") + sns.set_context("paper", font_scale=1.5) + sns.set_palette("bright") + + eddy_qc = Path(eddy_qc) + params = np.genfromtxt(eddy_qc / "eddy_parameters", dtype=float) + motion = np.genfromtxt(eddy_qc / "eddy_movement_rms", dtype=float) + + df_params = pd.DataFrame( + { + "x": params[:, 0], + "y": params[:, 1], + "z": params[:, 2], + } + ) + df_params["type"] = "absolute" + df_params["volume"] = np.arange(df_params.shape[0]) + # add relative motion from columns 3 to 5 as new lines + df_params = pd.concat( + [ + df_params, + pd.DataFrame( + { + "x": params[:, 3], + "y": params[:, 4], + "z": params[:, 5], + "type": "relative", + "volume": np.arange(df_params.shape[0]), + } + ), + ] + ) + df_params = df_params.melt( + id_vars=["volume", "type"], + value_vars=["x", "y", "z"], + var_name="direction", + value_name="displacement", + ) + + fig_props = { + "absolute": { + "title": "Eddy estimated translations (mm)", + "ylabel": "Translation [mm]", + }, + "relative": { + "title": "Eddy estimated rotations (deg)", + "ylabel": "Rotation [deg]", + }, + } + + fig, axes = plt.subplots(3, 1, figsize=(10, 15)) + for i, movement_type in enumerate(["absolute", "relative"]): + _ = sns.lineplot( + data=df_params[df_params["type"] == movement_type], + x="volume", + y="displacement", + hue="direction", + ax=axes[i], + palette={"x": "r", "y": "g", "z": "b"}, + linewidth=2, + ) + axes[i].set_xlabel("Volume") + axes[i].set_ylabel(fig_props[movement_type]["ylabel"]) + axes[i].set_title( + fig_props[movement_type]["title"], fontweight="bold", fontsize=20 + ) + + df_motion = pd.DataFrame(motion, columns=["Absolute", "Relative"]) + df_motion["Volume"] = np.arange(df_motion.shape[0]) + df_motion = df_motion.melt( + id_vars=["Volume"], var_name="Type", value_name="Displacement" + ) + _ = sns.lineplot( + data=df_motion, + x="Volume", + y="Displacement", + hue="Type", + ax=axes[2], + linewidth=2, + palette={"Absolute": "r", "Relative": "b"}, + ) + axes[2].set_xlabel("Volume") + axes[2].set_ylabel("Displacement [mm]") + axes[2].set_title("Estimated mean displacement", fontweight="bold", fontsize=20) + axes[2].legend(loc="best", frameon=True, framealpha=0.5) + axes[2].set_ylim(0, 0.5 + np.max(df_motion["Displacement"])) + plt.tight_layout() + + # save the plot with transparent background + plt.savefig(out_file, dpi=dpi, bbox_inches="tight", transparent=True) + plt.close() + + return out_file diff --git a/src/keprep/workflows/dwi/workflow.py b/src/keprep/workflows/dwi/workflow.py index 87f0c61..c4082e6 100644 --- a/src/keprep/workflows/dwi/workflow.py +++ b/src/keprep/workflows/dwi/workflow.py @@ -227,6 +227,7 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): post_eddy, [ ("outputnode.dwi_preproc", "inputnode.dwi_preproc"), + ("outputnode.eddy_qc", "inputnode.eddy_qc"), ], ), ] @@ -337,6 +338,7 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): "outputnode.dwi_reference_json", "inputnode.dwi_reference_json", ), + ("outputnode.eddy_qc_plot", "inputnode.eddy_qc_plot"), ], ), ( From a0d7f4ff98e60928438cd0803c564613cbb9c53e Mon Sep 17 00:00:00 2001 From: GalKepler Date: Mon, 5 Aug 2024 15:54:42 +0300 Subject: [PATCH 11/16] added some visualization of eddy qc --- src/keprep/data/quality_assurance/reports.py | 3 ++- src/keprep/workflows/base/workflow.py | 8 +++--- src/keprep/workflows/dwi/utils.py | 26 ++++++++++---------- src/keprep/workflows/dwi/workflow.py | 4 +-- 4 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/keprep/data/quality_assurance/reports.py b/src/keprep/data/quality_assurance/reports.py index 6132f16..6a6d4de 100644 --- a/src/keprep/data/quality_assurance/reports.py +++ b/src/keprep/data/quality_assurance/reports.py @@ -141,7 +141,8 @@ def generate_reports( subject=subject_label, session=session_label, ) - # If the report generation failed, append the subject label for which it failed + # If the report generation failed, + # append the subject label for which it failed if report_error is not None: errors.append(report_error) diff --git a/src/keprep/workflows/base/workflow.py b/src/keprep/workflows/base/workflow.py index a3c319b..4f4d3b5 100644 --- a/src/keprep/workflows/base/workflow.py +++ b/src/keprep/workflows/base/workflow.py @@ -237,8 +237,8 @@ def init_single_subject_wf(subject_id: str): summary = pe.Node( SubjectSummary( - std_spaces=spaces.get_spaces(nonstandard=False), # type: ignore[attr-defined] - nstd_spaces=spaces.get_spaces(standard=False), # type: ignore[attr-defined] + std_spaces=spaces.get_spaces(nonstandard=False), # type: ignore[attr-defined] # noqa: E501 + nstd_spaces=spaces.get_spaces(standard=False), # type: ignore[attr-defined] # noqa: E501 ), name="summary", run_without_submitting=True, @@ -252,7 +252,7 @@ def init_single_subject_wf(subject_id: str): ds_report_summary = pe.Node( DerivativesDataSink( - base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] + base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] # noqa: E501 desc="summary", datatype="figures", ), @@ -262,7 +262,7 @@ def init_single_subject_wf(subject_id: str): ds_report_about = pe.Node( DerivativesDataSink( - base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] + base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] # noqa: E501 desc="about", datatype="figures", ), diff --git a/src/keprep/workflows/dwi/utils.py b/src/keprep/workflows/dwi/utils.py index 210df8f..c3ca1fc 100644 --- a/src/keprep/workflows/dwi/utils.py +++ b/src/keprep/workflows/dwi/utils.py @@ -64,9 +64,9 @@ def plot_eddy_qc( sns.set_context("paper", font_scale=1.5) sns.set_palette("bright") - eddy_qc = Path(eddy_qc) - params = np.genfromtxt(eddy_qc / "eddy_parameters", dtype=float) - motion = np.genfromtxt(eddy_qc / "eddy_movement_rms", dtype=float) + eddy_qc = Path(eddy_qc) # type: ignore[assignment] + params = np.genfromtxt(eddy_qc / "eddy_parameters", dtype=float) # type: ignore[type-var, operator] # noqa: E501 + motion = np.genfromtxt(eddy_qc / "eddy_movement_rms", dtype=float) # type: ignore[type-var, operator] # noqa: E501 df_params = pd.DataFrame( { @@ -117,13 +117,13 @@ def plot_eddy_qc( x="volume", y="displacement", hue="direction", - ax=axes[i], + ax=axes[i], # type: ignore[index] palette={"x": "r", "y": "g", "z": "b"}, linewidth=2, ) - axes[i].set_xlabel("Volume") - axes[i].set_ylabel(fig_props[movement_type]["ylabel"]) - axes[i].set_title( + axes[i].set_xlabel("Volume") # type: ignore[index] + axes[i].set_ylabel(fig_props[movement_type]["ylabel"]) # type: ignore[index] + axes[i].set_title( # type: ignore[index] fig_props[movement_type]["title"], fontweight="bold", fontsize=20 ) @@ -137,15 +137,15 @@ def plot_eddy_qc( x="Volume", y="Displacement", hue="Type", - ax=axes[2], + ax=axes[2], # type: ignore[index] linewidth=2, palette={"Absolute": "r", "Relative": "b"}, ) - axes[2].set_xlabel("Volume") - axes[2].set_ylabel("Displacement [mm]") - axes[2].set_title("Estimated mean displacement", fontweight="bold", fontsize=20) - axes[2].legend(loc="best", frameon=True, framealpha=0.5) - axes[2].set_ylim(0, 0.5 + np.max(df_motion["Displacement"])) + axes[2].set_xlabel("Volume") # type: ignore[index] + axes[2].set_ylabel("Displacement [mm]") # type: ignore[index] + axes[2].set_title("Estimated mean displacement", fontweight="bold", fontsize=20) # type: ignore[index] # noqa: E501 + axes[2].legend(loc="best", frameon=True, framealpha=0.5) # type: ignore[index] + axes[2].set_ylim(0, 0.5 + np.max(df_motion["Displacement"])) # type: ignore[index] plt.tight_layout() # save the plot with transparent background diff --git a/src/keprep/workflows/dwi/workflow.py b/src/keprep/workflows/dwi/workflow.py index c4082e6..d4f2d2d 100644 --- a/src/keprep/workflows/dwi/workflow.py +++ b/src/keprep/workflows/dwi/workflow.py @@ -82,7 +82,7 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): config.workflow.denoise_method == "dwidenoise" and config.workflow.dwi_denoise_window == "auto" ): - dwi_denoise_window = calculate_denoise_window(dwi_file) # type: ignore[arg-type] + dwi_denoise_window = calculate_denoise_window(dwi_file) # type: ignore[arg-type] # noqa: E501 bo_to_t1w = "Rigid" if config.workflow.dwi2t1w_dof == 6 else "Affine" summary = pe.Node( @@ -110,7 +110,7 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): # Reporting ds_report_summary = pe.Node( DerivativesDataSink( - base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] + base_directory=str(config.execution.keprep_dir), # type: ignore[attr-defined] # noqa: E501 datatype="figures", suffix="dwi", desc="summary", From 972a5f2dde63a92cf3cd223933e9718fb55b3229 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Mon, 5 Aug 2024 18:16:32 +0300 Subject: [PATCH 12/16] added eddy qc to report --- .../templates/reports-spec copy.yml | 199 ------------------ .../templates/reports-spec.yml | 3 + src/keprep/workflows/dwi/stages/post_eddy.py | 2 +- src/keprep/workflows/dwi/utils.py | 2 + 4 files changed, 6 insertions(+), 200 deletions(-) delete mode 100644 src/keprep/data/quality_assurance/templates/reports-spec copy.yml diff --git a/src/keprep/data/quality_assurance/templates/reports-spec copy.yml b/src/keprep/data/quality_assurance/templates/reports-spec copy.yml deleted file mode 100644 index 73068e1..0000000 --- a/src/keprep/data/quality_assurance/templates/reports-spec copy.yml +++ /dev/null @@ -1,199 +0,0 @@ -package: fmriprep -title: Visual report for participant '{subject}' - fMRIPrep -sections: -- name: Summary - reportlets: - - bids: {datatype: figures, desc: summary, suffix: T1w} -- name: Anatomical - reportlets: - - bids: - datatype: figures - desc: conform - extension: [.html] - suffix: T1w - - bids: {datatype: figures, suffix: dseg} - caption: This panel shows the final, preprocessed T1-weighted image, - with contours delineating the detected brain mask and brain tissue segmentations. - subtitle: Brain mask and brain tissue segmentation of the T1w - - bids: {datatype: figures, space: .*, suffix: T1w, regex_search: True} - caption: Spatial normalization of the T1w image to the {space} template. - description: Results of nonlinear alignment of the T1w reference one or more template - space(s). Hover on the panels with the mouse pointer to transition between both - spaces. - static: false - subtitle: Spatial normalization of the anatomical T1w reference - - bids: {datatype: figures, desc: reconall, suffix: T1w} - caption: Surfaces (white and pial) reconstructed with FreeSurfer (recon-all) - overlaid on the participant's T1w template. - subtitle: Surface reconstruction - -- name: B0 field mapping - ordering: session,acquisition,run,fmapid - reportlets: - - bids: {datatype: figures, desc: mapped, suffix: fieldmap} - caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions - along the phase-encoding direction of the image. Some scanners produce a B0 - mapping of the field, using Spiral Echo Imaging (SEI) or postprocessing a "phase-difference" - acquisition. The plot below shows an anatomical "magnitude" reference and the corresponding - fieldmap. - description: Hover over the panels with the mouse pointer to also visualize the intensity of the - field inhomogeneity in Hertz. - static: false - subtitle: "Preprocessed B0 mapping acquisition" - - bids: {datatype: figures, desc: phasediff, suffix: fieldmap} - caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions - along the phase-encoding direction of the image. A Gradient-Recalled Echo (GRE) scheme was included for the - mapping of the B0 inhomogeneities by subtracting the phase maps obtained at - two subsequent echoes. The plot below shows an anatomical "magnitude" reference and the corresponding - fieldmap. - description: Hover over the panels with the mouse pointer to also visualize the intensity of the - field inhomogeneity in Hertz. - static: false - subtitle: "Preprocessed mapping of phase-difference acquisition" - - bids: {datatype: figures, desc: pepolar, suffix: fieldmap} - caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions - along the phase-encoding direction of the image. Utilizing two or more images with different - phase-encoding polarities (PEPolar) or directions, it is possible to estimate the inhomogeneity - of the field. The plot below shows a reference EPI (echo-planar imaging) volume generated - using two or more EPI images with varying phase-encoding blips. - description: Hover on the panels with the mouse pointer to also visualize the intensity of the - inhomogeneity of the field in Hertz. - static: false - subtitle: "Preprocessed estimation with varying Phase-Encoding (PE) blips" - - bids: {datatype: figures, desc: anat, suffix: fieldmap} - caption: Inhomogeneities of the B0 field introduce (oftentimes severe) spatial distortions - along the phase-encoding direction of the image. Utilizing an anatomically-correct acquisition - (for instance, T1w or T2w), it is possible to estimate the inhomogeneity of the field by means of nonlinear - registration. The plot below shows a reference EPI (echo-planar imaging) volume generated - using two or more EPI images with the same PE encoding, after alignment to the anatomical scan. - description: Hover on the panels with the mouse pointer to also visualize the intensity of the - inhomogeneity of the field in Hertz. - static: false - subtitle: "Preprocessed estimation by nonlinear registration to an anatomical scan (“fieldmap-less”)" - -- name: Functional - ordering: session,task,acquisition,ceagent,reconstruction,direction,run,echo - reportlets: - - bids: {datatype: figures, desc: summary, suffix: bold} - - bids: {datatype: figures, desc: validation, suffix: bold} - - bids: {datatype: figures, desc: fmapCoreg, suffix: bold} - caption: The estimated fieldmap was aligned to the corresponding EPI reference - with a rigid-registration process of the fieldmap reference image, - using antsRegistration. - Overlaid on top of the co-registration results, the final BOLD mask is represented - with a red contour for reference. - static: false - subtitle: Alignment between the anatomical reference of the fieldmap and the target EPI - - bids: {datatype: figures, desc: fieldmap, suffix: bold} - caption: Estimated fieldmap, as reconstructed on the target BOLD run space to allow - the assessment of its alignment with the distorted data. - The anatomical reference is the fieldmap's reference moved into the target EPI's grid through - the estimated transformation. - In other words, this plot should be equivalent to that of the - Preprocessed estimation with varying Phase-Encoding (PE) blips shown above in the - fieldmap section. - Therefore, the fieldmap should be positioned relative to the anatomical reference exactly - as it is positioned in the reportlet above. - static: false - subtitle: "Reconstructed B0 map in the corresponding run's space (debug mode)" - - bids: {datatype: figures, desc: sdc, suffix: bold} - caption: Results of performing susceptibility distortion correction (SDC) on the - BOLD reference image. The "distorted" image is the image that would be used to - align to the anatomical reference if SDC were not applied. The "corrected" - image is the image that was used. - static: false - subtitle: Susceptibility distortion correction - - bids: {datatype: figures, desc: forcedsyn, suffix: bold} - caption: The dataset contained some fieldmap information, but the argument --force-syn - was used. The higher-priority SDC method was used. Here, we show the results - of performing SyN-based SDC on the EPI for comparison. - static: false - subtitle: Experimental fieldmap-less susceptibility distortion correction - - bids: {datatype: figures, desc: t2scomp, suffix: bold} - caption: A T2* map was calculated from the echos. Here, we show the comparison - of the T2* map and the BOLD reference map used for BOLD-T1w coregistration. - The red contour shows the anatomical gray-matter mask resampled into BOLD space. - static: false - subtitle: T2* map - - bids: {datatype: figures, desc: t2starhist, suffix: bold} - caption: A histogram of estimated T2* values within the anatomically-derived gray-matter mask - shown in the previous plot. Note that values are clipped at 100ms, so any extreme outliers will - appear in the 100ms bin. - static: false - subtitle: T2* gray-matter values - - bids: {datatype: figures, desc: coreg, suffix: bold} - caption: This panel shows the alignment of the reference EPI (BOLD) image to the - anatomical (T1-weighted) image. - The reference EPI has been contrast enhanced and susceptibility-distortion - corrected (if applicable) for improved anatomical fidelity. - The anatomical image has been resampled into EPI space, as well as the - anatomical white matter mask, which appears as a red contour. - static: false - subtitle: Alignment of functional and anatomical MRI data (coregistration) - - bids: {datatype: figures, desc: rois, suffix: bold} - caption: Brain mask calculated on the BOLD signal (red contour), along with the - regions of interest (ROIs) used for the estimation of physiological and movement - confounding components that can be then used as nuisance regressors in analysis.
    - The anatomical CompCor ROI (magenta contour) is a mask combining - CSF and WM (white-matter), where voxels containing a minimal partial volume - of GM have been removed.
    - The temporal CompCor ROI (blue contour) contains the top 2% most - variable voxels within the brain mask.
    - The brain edge (or crown) ROI (green contour) picks signals - outside but close to the brain, which are decomposed into 24 principal components. - subtitle: Brain mask and (anatomical/temporal) CompCor ROIs - - bids: - datatype: figures - desc: '[at]compcor' - extension: [.html] - suffix: bold - - bids: {datatype: figures, desc: 'compcorvar', suffix: bold} - caption: The cumulative variance explained by the first k components of the - t/aCompCor decomposition, plotted for all values of k. - The number of components that must be included in the model in order to - explain some fraction of variance in the decomposition mask can be used - as a feature selection criterion for confound regression. - subtitle: Variance explained by t/aCompCor components - - bids: {datatype: figures, desc: carpetplot, suffix: bold} - caption: Summary statistics are plotted, which may reveal trends or artifacts - in the BOLD data. Global signals calculated within the whole-brain (GS), within - the white-matter (WM) and within cerebro-spinal fluid (CSF) show the mean BOLD - signal in their corresponding masks. DVARS and FD show the standardized DVARS - and framewise-displacement measures for each time point.
    - A carpet plot shows the time series for all voxels within the brain mask, - or if --cifti-output was enabled, all grayordinates. - See the figure legend for specific color mappings. - "Ctx" = cortex, "Cb" = cerebellum, "WM" = white matter, "CSF" = cerebrospinal fluid. - "d" and "s" prefixes indicate "deep" and "shallow" relative to the cortex. - "Edge" indicates regions just outside the brain. - subtitle: BOLD Summary - - bids: {datatype: figures, desc: 'confoundcorr', suffix: bold} - caption: | - Left: Heatmap summarizing the correlation structure among confound variables. - (Cosine bases and PCA-derived CompCor components are inherently orthogonal.) - Right: magnitude of the correlation between each confound time series and the - mean global signal. Strong correlations might be indicative of partial volume - effects and can inform decisions about feature orthogonalization prior to - confound regression. - subtitle: Correlations among nuisance regressors -- name: About - nested: true - reportlets: - - bids: {datatype: figures, desc: about, suffix: T1w} - - custom: boilerplate - path: '{out_dir}/logs' - bibfile: ['keprep', 'data/boilerplate.bib'] - caption: | -

    We kindly ask to report results preprocessed with this tool using the following boilerplate.

    - - title: Methods - - custom: errors - path: '{out_dir}/sub-{subject}/log/{run_uuid}' - captions: NiReports may have recorded failure conditions. - title: Errors diff --git a/src/keprep/data/quality_assurance/templates/reports-spec.yml b/src/keprep/data/quality_assurance/templates/reports-spec.yml index 50b68ef..9e333f6 100644 --- a/src/keprep/data/quality_assurance/templates/reports-spec.yml +++ b/src/keprep/data/quality_assurance/templates/reports-spec.yml @@ -42,6 +42,9 @@ sections: caption: b=0 to anatomical reference registration subtitle: Coregistration of the DWI to the anatomical T1w image using FSL's FLIRT. static: false + - bids: {datatype: figures, desc: eddyqc, suffix: dwi} + caption: EDDY Quality Control + subtitle: QC for head motion correction as conducted by FSL's EDDY. - name: About diff --git a/src/keprep/workflows/dwi/stages/post_eddy.py b/src/keprep/workflows/dwi/stages/post_eddy.py index 4245abb..fb354a0 100644 --- a/src/keprep/workflows/dwi/stages/post_eddy.py +++ b/src/keprep/workflows/dwi/stages/post_eddy.py @@ -59,7 +59,7 @@ def init_post_eddy_wf(name: str = "post_eddy_wf") -> pe.Workflow: ), name="plot_eddy_qc", ) - plot_eddy_qc_node.inputs.out_file = "eddy_qc_plot.png" + plot_eddy_qc_node.inputs.out_file = "eddy_qc_plot.svg" workflow.connect( [ ( diff --git a/src/keprep/workflows/dwi/utils.py b/src/keprep/workflows/dwi/utils.py index c3ca1fc..902d53e 100644 --- a/src/keprep/workflows/dwi/utils.py +++ b/src/keprep/workflows/dwi/utils.py @@ -53,6 +53,7 @@ def plot_eddy_qc( dpi : int, optional dpi of the plot (default: 300) """ + import os from pathlib import Path import matplotlib.pyplot as plt @@ -149,6 +150,7 @@ def plot_eddy_qc( plt.tight_layout() # save the plot with transparent background + out_file = os.getcwd() + "/" + out_file plt.savefig(out_file, dpi=dpi, bbox_inches="tight", transparent=True) plt.close() From 9195afc1c7eb195c59a7bfa46236d0a983f05bb6 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Tue, 6 Aug 2024 16:47:14 +0300 Subject: [PATCH 13/16] WIP generating methods --- pyproject.toml | 2 +- src/keprep/config.py | 4 +- src/keprep/data/boilerplate.bib | 37 ++++++++ src/keprep/data/quality_assurance/reports.py | 84 +++++++++++++++++++ src/keprep/workflows/base/messages.py | 21 ++--- src/keprep/workflows/base/workflow.py | 4 - src/keprep/workflows/dwi/descriptions/base.py | 19 +++++ src/keprep/workflows/dwi/descriptions/eddy.py | 17 ++++ .../workflows/dwi/descriptions/post_eddy.py | 5 ++ src/keprep/workflows/dwi/stages/eddy.py | 6 +- src/keprep/workflows/dwi/stages/post_eddy.py | 6 +- src/keprep/workflows/dwi/workflow.py | 19 ++++- 12 files changed, 197 insertions(+), 27 deletions(-) create mode 100644 src/keprep/workflows/dwi/descriptions/base.py create mode 100644 src/keprep/workflows/dwi/descriptions/eddy.py create mode 100644 src/keprep/workflows/dwi/descriptions/post_eddy.py diff --git a/pyproject.toml b/pyproject.toml index 9acb6e6..b36000f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -96,4 +96,4 @@ omit = [ [tool.flake8] max-line-length = 88 -per-file-ignores = ["src/keprep/config.py:E501", "src/keprep/interfaces/*.py:E501"] +per-file-ignores = ["src/keprep/config.py:E501", "src/keprep/workflows/dwi/descriptions/*.py:E501","src/keprep/interfaces/*.py:E501"] diff --git a/src/keprep/config.py b/src/keprep/config.py index 85c5c17..09c732d 100644 --- a/src/keprep/config.py +++ b/src/keprep/config.py @@ -477,10 +477,12 @@ class workflow(_Config): """Window size in voxels for image-based denoising, integer or "auto".""" dwi_no_biascorr = False """DEPRECATED: see --b1-biascorrect-stage.""" - eddy_config = "--fwhm=0 --flm='quadratic'" + eddy_config = "--fwhm=0 --flm='quadratic' --repol" """Configuration for running Eddy.""" hmc_model = "eddy" """Model used to generate target images for hmc.""" + b0_threshold = 100 + """any value in the .bval file less than this will be considered a b=0 image.""" class loggers: diff --git a/src/keprep/data/boilerplate.bib b/src/keprep/data/boilerplate.bib index e5da0e1..bd47d85 100644 --- a/src/keprep/data/boilerplate.bib +++ b/src/keprep/data/boilerplate.bib @@ -645,3 +645,40 @@ @article{autotrack year={2020}, publisher={Elsevier} } + +@article{fsl, + series = {20 {YEARS} {OF} {fMRI}}, + title = {{FSL}}, + volume = {62}, + issn = {1053-8119}, + url = {https://www.sciencedirect.com/science/article/pii/S1053811911010603}, + doi = {10.1016/j.neuroimage.2011.09.015}, + abstract = {FSL (the FMRIB Software Library) is a comprehensive library of analysis tools for functional, structural and diffusion MRI brain imaging data, written mainly by members of the Analysis Group, FMRIB, Oxford. For this NeuroImage special issue on “20 years of fMRI” we have been asked to write about the history, developments and current status of FSL. We also include some descriptions of parts of FSL that are not well covered in the existing literature. We hope that some of this content might be of interest to users of FSL, and also maybe to new research groups considering creating, releasing and supporting new software packages for brain image analysis.}, + number = {2}, + urldate = {2024-08-06}, + journal = {NeuroImage}, + author = {Jenkinson, Mark and Beckmann, Christian F. and Behrens, Timothy E. J. and Woolrich, Mark W. and Smith, Stephen M.}, + month = aug, + year = {2012}, + keywords = {FSL, Software}, + pages = {782--790}, + file = {ScienceDirect Snapshot:/home/galkepler/Zotero/storage/AKPNE6UP/S1053811911010603.html:text/html;Submitted Version:/home/galkepler/Zotero/storage/WSMH855W/Jenkinson et al. - 2012 - FSL.pdf:application/pdf}, +} + +@article{eddyqc, + title = {Automated quality control for within and between studies diffusion {MRI} data using a non-parametric framework for movement and distortion correction}, + volume = {184}, + issn = {1095-9572}, + doi = {10.1016/j.neuroimage.2018.09.073}, + abstract = {Diffusion MRI data can be affected by hardware and subject-related artefacts that can adversely affect downstream analyses. Therefore, automated quality control (QC) is of great importance, especially in large population studies where visual QC is not practical. In this work, we introduce an automated diffusion MRI QC framework for single subject and group studies. The QC is based on a comprehensive, non-parametric approach for movement and distortion correction: FSL EDDY, which allows us to extract a rich set of QC metrics that are both sensitive and specific to different types of artefacts. Two different tools are presented: QUAD (QUality Assessment for DMRI), for single subject QC and SQUAD (Study-wise QUality Assessment for DMRI), which is designed to enable group QC and facilitate cross-studies harmonisation efforts.}, + language = {eng}, + journal = {Neuroimage}, + author = {Bastiani, Matteo and Cottaar, Michiel and Fitzgibbon, Sean P. and Suri, Sana and Alfaro-Almagro, Fidel and Sotiropoulos, Stamatios N. and Jbabdi, Saad and Andersson, Jesper L. R.}, + month = jan, + year = {2019}, + pmid = {30267859}, + pmcid = {PMC6264528}, + keywords = {Artifacts, Brain, Brain Mapping, Diffusion Magnetic Resonance Imaging, Diffusion MRI, Diffusion Tensor Imaging, Eddy current, Female, Humans, Image Processing, Computer-Assisted, Male, Movement, Quality control, Quality Control, Reproducibility of Results, Signal-To-Noise Ratio, Susceptibility}, + pages = {801--812}, + file = {Full Text:/home/galkepler/Zotero/storage/7CKISWDD/Bastiani et al. - 2019 - Automated quality control for within and between s.pdf:application/pdf}, +} diff --git a/src/keprep/data/quality_assurance/reports.py b/src/keprep/data/quality_assurance/reports.py index 6a6d4de..8505a61 100644 --- a/src/keprep/data/quality_assurance/reports.py +++ b/src/keprep/data/quality_assurance/reports.py @@ -22,11 +22,95 @@ # from pathlib import Path +from nipype.pipeline import engine as pe from nireports.assembler.report import Report from keprep import config, data +def build_boilerplate(config_file: dict | str | Path, workflow: pe.Workflow): + """Write boilerplate in an isolated process.""" + from keprep import config + + if isinstance(config_file, str) or isinstance(config_file, Path): + config.load(config_file) + elif isinstance(config_file, dict): + config.from_dict(config_file) + logs_path = config.execution.keprep_dir / "logs" # type: ignore[attr-defined] + logs_path.mkdir(parents=True, exist_ok=True) + boilerplate = workflow.visit_desc() + citation_files = { + ext: logs_path / f"CITATION.{ext}" for ext in ("bib", "tex", "md", "html") + } + + if boilerplate: + # To please git-annex users and also to guarantee consistency + # among different renderings of the same file, first remove any + # existing one + for citation_file in citation_files.values(): + try: + citation_file.unlink() + except FileNotFoundError: + pass + + citation_files["md"].write_text(boilerplate) + + if citation_files["md"].exists(): + from subprocess import CalledProcessError, TimeoutExpired, check_call + + from keprep import data + + bib_text = data.load.readable("boilerplate.bib").read_text() + citation_files["bib"].write_text( + bib_text.replace("KePrep ", f"KePrep {config.environment.version}") + ) + + # Generate HTML file resolving citations + cmd = [ + "pandoc", + "-s", + "--bibliography", + str(citation_files["bib"]), + "--citeproc", + "--metadata", + 'pagetitle="fMRIPrep citation boilerplate"', + str(citation_files["md"]), + "-o", + str(citation_files["html"]), + ] + + config.loggers.cli.info( + "Generating an HTML version of the citation boilerplate..." + ) + try: + check_call(cmd, timeout=10) + except (FileNotFoundError, CalledProcessError, TimeoutExpired): + config.loggers.cli.warning( + "Could not generate CITATION.html file:\n%s", " ".join(cmd) + ) + + # Generate LaTex file resolving citations + cmd = [ + "pandoc", + "-s", + "--bibliography", + str(citation_files["bib"]), + "--natbib", + str(citation_files["md"]), + "-o", + str(citation_files["tex"]), + ] + config.loggers.cli.info( + "Generating a LaTeX version of the citation boilerplate..." + ) + try: + check_call(cmd, timeout=10) + except (FileNotFoundError, CalledProcessError, TimeoutExpired): + config.loggers.cli.warning( + "Could not generate CITATION.tex file:\n%s", " ".join(cmd) + ) + + def run_reports( output_dir, subject_label, diff --git a/src/keprep/workflows/base/messages.py b/src/keprep/workflows/base/messages.py index 7a087c8..f3c847f 100644 --- a/src/keprep/workflows/base/messages.py +++ b/src/keprep/workflows/base/messages.py @@ -13,18 +13,17 @@ """ BASE_POSTDESC = """ -Many internal operations of *fMRIPrep* use -*Nilearn* {nilearn_ver} [@nilearn, RRID:SCR_001362], -mostly within the functional processing workflow. +Many internal operations of *KePrep* use +*Nilearn* {nilearn_ver} [@nilearn, RRID:SCR_001362] and *MRtrix* [@mrtrix3, SCR_006971]. For more details of the pipeline, see [the section corresponding -to workflows in *fMRIPrep*'s documentation]\ -(https://fmriprep.readthedocs.io/en/latest/workflows.html \ -"FMRIPrep's documentation"). +to workflows in *KePrep*'s documentation]\ +(https://keprep.readthedocs.io/en/latest/workflows.html \ +"KePrep's documentation"). ### Copyright Waiver -The above boilerplate text was automatically generated by fMRIPrep +The above boilerplate text was automatically generated by KePrep with the express intention that users should copy and paste this text into their manuscripts *unchanged*. It is released under the [CC0]\ @@ -33,11 +32,3 @@ ### References """ - -DIFFUSION_WORKFLOW_DESCRIPTION = """ -Diffusion data preprocessing - -: For each of the {n_dwi} DWI scans found per subject - (across all sessions), the following preprocessing was - performed. -""" # TODO: add more details diff --git a/src/keprep/workflows/base/workflow.py b/src/keprep/workflows/base/workflow.py index 4f4d3b5..21aca80 100644 --- a/src/keprep/workflows/base/workflow.py +++ b/src/keprep/workflows/base/workflow.py @@ -19,7 +19,6 @@ ANAT_DERIVATIVES_FAILED, BASE_POSTDESC, BASE_WORKFLOW_DESCRIPTION, - DIFFUSION_WORKFLOW_DESCRIPTION, ) from keprep.workflows.dwi.workflow import init_dwi_preproc_wf @@ -325,9 +324,6 @@ def init_single_subject_wf(subject_id: str): for dwi_file in subject_data["dwi"]: dwi_preproc_wf = init_dwi_preproc_wf(dwi_file, subject_data) - dwi_preproc_wf.__desc__ = DIFFUSION_WORKFLOW_DESCRIPTION.format( - n_dwi=len(subject_data["dwi"]) - ) workflow.connect( [ ( diff --git a/src/keprep/workflows/dwi/descriptions/base.py b/src/keprep/workflows/dwi/descriptions/base.py new file mode 100644 index 0000000..eb31bbd --- /dev/null +++ b/src/keprep/workflows/dwi/descriptions/base.py @@ -0,0 +1,19 @@ +DIFFUSION_WORKFLOW_DESCRIPTION_MULTI_SESSIONS = """ +**Diffusion data preprocessing** + +: For each of the {n_dwi} DWI scans found (across all sessions), +the following preprocessing was performed. + +""" + + +DIFFUSION_WORKFLOW_DESCRIPTION_SINGLE_SESSION = """ +**Diffusion data preprocessing** + +The following preprocessing procedures were applied to the DWI scan. +""" + +DENOISING = """Any images with a b-value less than {b0_threshold} s/mm^2 were treated as a b=0 image. + +MP-PCA denoising as implemented in MRtrix3's `dwidenoise` [@dwidenoise1] was applied with a {denoise_window}-voxel window. +""" diff --git a/src/keprep/workflows/dwi/descriptions/eddy.py b/src/keprep/workflows/dwi/descriptions/eddy.py new file mode 100644 index 0000000..b08c37e --- /dev/null +++ b/src/keprep/workflows/dwi/descriptions/eddy.py @@ -0,0 +1,17 @@ +RPE_DESCRIPTION = """ +Data was collected with reversed phase-encoded directions, +resulting in pairs of images with distortions going in opposite directions. +""" + +RPE_DWIFSLPREPROC = """Here, the mean b=0 reference image with reversed phase encoding directions was +used along with a corresponding mean b=0 image extracted from the DWI scans. +The susceptibility-induced off-resonance field was estimated based on this pair +using a method similar to that described in [@topup], as implemented in FSL’s [@fsl, RRID:SCR_002823] `topup` [@topup]. +The fieldmaps were ultimately incorporated into the Eddy current and head motion correction conducted using FSL’s `eddy` [@anderssoneddy], +configured with a no q-space smoothing factor (FWHM = 0), a total of 5 iterations, and 1000 voxels used to estimate hyperparameters. +A quadratic first level model was used to characterize Eddy current-related spatial distortion. +Outlier slices were defined as such whose average intensity is at least 4 standard deviations lower than expected intensity, +where the expectation is given by a Gaussian Process prediction. +Slices that were deemed as outliers were replaced with predictions made by the Gaussian Process [@eddyrepol]. +Quality control metrices were estimated for this process using eddy QC tools as implemented in `eddy_quad` [@eddyqc]. +""" diff --git a/src/keprep/workflows/dwi/descriptions/post_eddy.py b/src/keprep/workflows/dwi/descriptions/post_eddy.py new file mode 100644 index 0000000..f8683cb --- /dev/null +++ b/src/keprep/workflows/dwi/descriptions/post_eddy.py @@ -0,0 +1,5 @@ +DWIBIASCORRECT = """ +Following the Susceptibility Distortion Correction (SDC), +B1 field inhomogeneity was corrected using `dwibiascorrect` +from MRtrix3 with the N4 algorithm [@n4]. +""" diff --git a/src/keprep/workflows/dwi/stages/eddy.py b/src/keprep/workflows/dwi/stages/eddy.py index aee6374..5a922b7 100644 --- a/src/keprep/workflows/dwi/stages/eddy.py +++ b/src/keprep/workflows/dwi/stages/eddy.py @@ -1,9 +1,11 @@ import nipype.pipeline.engine as pe from nipype.interfaces import mrtrix3 as mrt from nipype.interfaces import utility as niu +from niworkflows.engine.workflows import LiterateWorkflow as Workflow from keprep import config from keprep.interfaces.mrtrix3 import DWIPreproc +from keprep.workflows.dwi.descriptions.eddy import RPE_DESCRIPTION, RPE_DWIFSLPREPROC from keprep.workflows.dwi.stages.extract_b0 import init_extract_b0_wf from keprep.workflows.dwi.utils import read_field_from_json @@ -22,8 +24,8 @@ def init_eddy_wf(name: str = "eddy_wf") -> pe.Workflow: pe.Workflow the workflow """ - workflow = pe.Workflow(name=name) - + workflow = Workflow(name=name) + workflow.__desc__ = RPE_DESCRIPTION + RPE_DWIFSLPREPROC inputnode = pe.Node( niu.IdentityInterface( fields=[ diff --git a/src/keprep/workflows/dwi/stages/post_eddy.py b/src/keprep/workflows/dwi/stages/post_eddy.py index fb354a0..7c01d82 100644 --- a/src/keprep/workflows/dwi/stages/post_eddy.py +++ b/src/keprep/workflows/dwi/stages/post_eddy.py @@ -1,9 +1,11 @@ import nipype.pipeline.engine as pe from nipype.interfaces import mrtrix3 as mrt from nipype.interfaces import utility as niu +from niworkflows.engine.workflows import LiterateWorkflow as Workflow from keprep import config from keprep.interfaces.mrtrix3 import MRConvert +from keprep.workflows.dwi.descriptions.post_eddy import DWIBIASCORRECT from keprep.workflows.dwi.stages.extract_b0 import init_extract_b0_wf from keprep.workflows.dwi.utils import plot_eddy_qc @@ -22,8 +24,8 @@ def init_post_eddy_wf(name: str = "post_eddy_wf") -> pe.Workflow: pe.Workflow the workflow """ - workflow = pe.Workflow(name=name) - + workflow = Workflow(name=name) + workflow.__desc__ = DWIBIASCORRECT inputnode = pe.Node( niu.IdentityInterface( fields=[ diff --git a/src/keprep/workflows/dwi/workflow.py b/src/keprep/workflows/dwi/workflow.py index d4f2d2d..addf42e 100644 --- a/src/keprep/workflows/dwi/workflow.py +++ b/src/keprep/workflows/dwi/workflow.py @@ -3,11 +3,17 @@ from bids import BIDSLayout from nipype.interfaces import utility as niu from nipype.pipeline import engine as pe +from niworkflows.engine.workflows import LiterateWorkflow as Workflow from keprep import config from keprep.interfaces.bids import get_fieldmap from keprep.interfaces.bids.bids import DerivativesDataSink from keprep.interfaces.reports.reports import DiffusionSummary +from keprep.workflows.dwi.descriptions.base import ( + DENOISING, + DIFFUSION_WORKFLOW_DESCRIPTION_MULTI_SESSIONS, + DIFFUSION_WORKFLOW_DESCRIPTION_SINGLE_SESSION, +) from keprep.workflows.dwi.stages.coregister import init_dwi_coregister_wf from keprep.workflows.dwi.stages.derivatives import init_derivatives_wf from keprep.workflows.dwi.stages.eddy import init_eddy_wf @@ -38,7 +44,7 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): raise FileNotFoundError(f"No fieldmap found for <{dwi_file}>") # Build workflow - workflow = pe.Workflow(name=_get_wf_name(dwi_file)) + workflow = Workflow(name=_get_wf_name(dwi_file)) inputnode = pe.Node( niu.IdentityInterface( @@ -70,7 +76,6 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): inputnode.inputs.fmap_bvec = Path(layout.get_bvec(fieldmap)) inputnode.inputs.fmap_bval = Path(layout.get_bval(fieldmap)) inputnode.inputs.fmap_json = Path(layout.get_nearest(fieldmap, extension="json")) - outputnode = pe.Node( # noqa: F841 niu.IdentityInterface( fields=["dwi_preproc", "dwi_reference", "dwi_mask"], @@ -83,6 +88,15 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): and config.workflow.dwi_denoise_window == "auto" ): dwi_denoise_window = calculate_denoise_window(dwi_file) # type: ignore[arg-type] # noqa: E501 + n_dwis = len(subject_data["dwi"]) + desc = ( + DIFFUSION_WORKFLOW_DESCRIPTION_MULTI_SESSIONS + if n_dwis > 1 + else DIFFUSION_WORKFLOW_DESCRIPTION_SINGLE_SESSION + ) + workflow.__desc__ = desc.format(n_dwi=n_dwis) + DENOISING.format( + b0_threshold=config.workflow.b0_threshold, denoise_window=dwi_denoise_window + ) bo_to_t1w = "Rigid" if config.workflow.dwi2t1w_dof == 6 else "Affine" summary = pe.Node( @@ -152,6 +166,7 @@ def init_dwi_preproc_wf(dwi_file: str | Path, subject_data: dict): ), name="fmap_mifconv", ) + workflow.connect( [ ( From b6b3cc6cd2731f466e15d561ec2009b6e0dfa5ed Mon Sep 17 00:00:00 2001 From: GalKepler Date: Tue, 6 Aug 2024 17:34:36 +0300 Subject: [PATCH 14/16] most of the report is done --- src/keprep/config.py | 4 + .../workflows/dwi/descriptions/coregister.py | 19 ++ .../workflows/dwi/descriptions/post_eddy.py | 3 +- src/keprep/workflows/dwi/stages/coregister.py | 171 ++++++++++++------ 4 files changed, 137 insertions(+), 60 deletions(-) create mode 100644 src/keprep/workflows/dwi/descriptions/coregister.py diff --git a/src/keprep/config.py b/src/keprep/config.py index 09c732d..c87b186 100644 --- a/src/keprep/config.py +++ b/src/keprep/config.py @@ -447,6 +447,10 @@ class workflow(_Config): anat_only = False """Execute the anatomical preprocessing only.""" + dwi2t1w_method = "epireg" + """ + Method to use for DWI-to-T1w coregistration. Either "epireg" (default) or "flirt" + """ dwi2t1w_dof = 6 """Degrees of freedom of the DWI-to-T1w registration steps.""" dwi2t1w_init = "register" diff --git a/src/keprep/workflows/dwi/descriptions/coregister.py b/src/keprep/workflows/dwi/descriptions/coregister.py new file mode 100644 index 0000000..fd150bd --- /dev/null +++ b/src/keprep/workflows/dwi/descriptions/coregister.py @@ -0,0 +1,19 @@ +COREG_EPIREG = """ +Once previously described confounds were removed, +a reference mean b=0 image was estimated from the preprocessed DWI series +to use for co-registration purposes: +EPI-to-T1w co-registration was performed using Boundary-Based Registration technique, +as implemented in FSL’s `epi_reg` [@flirt]. +While the resulting transformation matrix was not applied to the DWI series (which was kept in its original space), +it was inversed and the two matrices are provided for further applications. +""" + +COREG_FLIRT = """ +Once previously described confounds were removed, +a reference mean b=0 image was estimated from the preprocessed DWI series +to use for co-registration purposes: +EPI-to-T1w co-registration was performed using FSL`s `FLIRT` [@flirt], configured with +{dof} Degrees of Freedom (DOF). +While the resulting transformation matrix was not applied to the DWI series (which was kept in its original space), +it was inversed and the two matrices are provided for further applications. +""" diff --git a/src/keprep/workflows/dwi/descriptions/post_eddy.py b/src/keprep/workflows/dwi/descriptions/post_eddy.py index f8683cb..ae1c728 100644 --- a/src/keprep/workflows/dwi/descriptions/post_eddy.py +++ b/src/keprep/workflows/dwi/descriptions/post_eddy.py @@ -1,5 +1,4 @@ -DWIBIASCORRECT = """ -Following the Susceptibility Distortion Correction (SDC), +DWIBIASCORRECT = """Following the Susceptibility Distortion Correction (SDC), B1 field inhomogeneity was corrected using `dwibiascorrect` from MRtrix3 with the N4 algorithm [@n4]. """ diff --git a/src/keprep/workflows/dwi/stages/coregister.py b/src/keprep/workflows/dwi/stages/coregister.py index e6d9679..6aaaf44 100644 --- a/src/keprep/workflows/dwi/stages/coregister.py +++ b/src/keprep/workflows/dwi/stages/coregister.py @@ -2,8 +2,10 @@ from nipype.interfaces import fsl from nipype.interfaces import mrtrix3 as mrt from nipype.interfaces import utility as niu +from niworkflows.engine.workflows import LiterateWorkflow as Workflow from keprep import config +from keprep.workflows.dwi.descriptions.coregister import COREG_EPIREG, COREG_FLIRT def init_dwi_coregister_wf(name: str = "dwi_coregister_wf") -> pe.Workflow: @@ -20,7 +22,7 @@ def init_dwi_coregister_wf(name: str = "dwi_coregister_wf") -> pe.Workflow: pe.Workflow the workflow """ - workflow = pe.Workflow(name=name) + workflow = Workflow(name=name) inputnode = pe.Node( niu.IdentityInterface( fields=[ @@ -54,20 +56,6 @@ def init_dwi_coregister_wf(name: str = "dwi_coregister_wf") -> pe.Workflow: name="apply_mask", ) - filrt_node = pe.Node( - fsl.FLIRT( - dof=config.workflow.dwi2t1w_dof, - out_file="dwi2t1w.nii.gz", - out_matrix_file="dwi2t1w.mat", - searchr_x=[-90, 90], - searchr_y=[-90, 90], - searchr_z=[-90, 90], - cost="normmi", - bins=256, - ), - name="filrt_node", - ) - convert_xfm = pe.Node( fsl.ConvertXFM( invert_xfm=True, @@ -84,45 +72,119 @@ def init_dwi_coregister_wf(name: str = "dwi_coregister_wf") -> pe.Workflow: ), name="apply_xfm", ) + if config.workflow.dwi2t1w_method == "epireg": + coreg_node = pe.Node(fsl.EpiReg(), name="epireg_node") + workflow.__desc__ = COREG_EPIREG + workflow.connect( + [ + ( + inputnode, + apply_mask, + [ + ("t1w_preproc", "in_file"), + ("t1w_mask", "mask_file"), + ], + ), + ( + inputnode, + coreg_node, + [("dwi_reference", "epi"), ("t1w_preproc", "t1_head")], + ), + ( + coreg_node, + outputnode, + [ + ("out_file", "dwi_in_t1w"), + ], + ), + ( + apply_mask, + coreg_node, + [ + ("out_file", "t1_brain"), + ], + ), + ( + coreg_node, + convert_xfm, + [ + ("epi2str_mat", "in_file"), + ], + ), + ( + coreg_node, + outputnode, + [ + ("epi2str_mat", "dwi2t1w_aff"), + ], + ), + ] + ) + elif config.workflow.dwi2t1w_method == "flirt": + coreg_node = pe.Node( + fsl.FLIRT( + dof=config.workflow.dwi2t1w_dof, + out_file="dwi2t1w.nii.gz", + out_matrix_file="dwi2t1w.mat", + searchr_x=[-90, 90], + searchr_y=[-90, 90], + searchr_z=[-90, 90], + cost="normmi", + bins=256, + ), + name="flirt_node", + ) + workflow.__desc__ = COREG_FLIRT.format(dof=config.workflow.dwi2t1w_dof) + workflow.connect( + [ + ( + inputnode, + apply_mask, + [ + ("t1w_preproc", "in_file"), + ("t1w_mask", "mask_file"), + ], + ), + ( + inputnode, + coreg_node, + [ + ("dwi_reference", "in_file"), + ], + ), + ( + coreg_node, + outputnode, + [ + ("out_file", "dwi_in_t1w"), + ], + ), + ( + apply_mask, + coreg_node, + [ + ("out_file", "reference"), + ], + ), + ( + coreg_node, + convert_xfm, + [ + ("out_matrix_file", "in_file"), + ], + ), + ( + coreg_node, + outputnode, + [ + ("out_matrix_file", "dwi2t1w_aff"), + ], + ), + ] + ) workflow.connect( [ - ( - inputnode, - apply_mask, - [ - ("t1w_preproc", "in_file"), - ("t1w_mask", "mask_file"), - ], - ), - ( - inputnode, - filrt_node, - [ - ("dwi_reference", "in_file"), - ], - ), - ( - filrt_node, - outputnode, - [ - ("out_file", "dwi_in_t1w"), - ], - ), - ( - apply_mask, - filrt_node, - [ - ("out_file", "reference"), - ], - ), - ( - filrt_node, - convert_xfm, - [ - ("out_matrix_file", "in_file"), - ], - ), ( convert_xfm, outputnode, @@ -130,13 +192,6 @@ def init_dwi_coregister_wf(name: str = "dwi_coregister_wf") -> pe.Workflow: ("out_file", "t1w2dwi_aff"), ], ), - ( - filrt_node, - outputnode, - [ - ("out_matrix_file", "dwi2t1w_aff"), - ], - ), ( apply_mask, outputnode, From 47efa0cbe6b3f2f66c2d946d793772cd9b497911 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Tue, 6 Aug 2024 17:56:11 +0300 Subject: [PATCH 15/16] most of the report is done --- src/keprep/data/boilerplate.bib | 44 +++++++++++++++++++++++++++ src/keprep/workflows/base/workflow.py | 1 - 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/src/keprep/data/boilerplate.bib b/src/keprep/data/boilerplate.bib index bd47d85..7a236e9 100644 --- a/src/keprep/data/boilerplate.bib +++ b/src/keprep/data/boilerplate.bib @@ -682,3 +682,47 @@ @article{eddyqc pages = {801--812}, file = {Full Text:/home/galkepler/Zotero/storage/7CKISWDD/Bastiani et al. - 2019 - Automated quality control for within and between s.pdf:application/pdf}, } + +@article{templateflow, + author = {Ciric, R. and Thompson, William H. and Lorenz, R. and Goncalves, M. and MacNicol, E. and Markiewicz, C. J. and Halchenko, Y. O. and Ghosh, S. S. and Gorgolewski, K. J. and Poldrack, R. A. and Esteban, O.}, + title = {{TemplateFlow}: {FAIR}-sharing of multi-scale, multi-species brain models}, + volume = {19}, + pages = {1568--1571}, + year = {2022}, + doi = {10.1038/s41592-022-01681-2}, + journal = {Nature Methods} +} + +@article{mni152lin, + title = {A {Probabilistic} {Atlas} of the {Human} {Brain}: {Theory} and {Rationale} for {Its} {Development}: {The} {International} {Consortium} for {Brain} {Mapping} ({ICBM})}, + author = {Mazziotta, John C. and Toga, Arthur W. and Evans, Alan and Fox, Peter and Lancaster, Jack}, + volume = {2}, + issn = {1053-8119}, + shorttitle = {A {Probabilistic} {Atlas} of the {Human} {Brain}}, + doi = {10.1006/nimg.1995.1012}, + number = {2, Part A}, + journal = {NeuroImage}, + year = {1995}, + pages = {89--101} +} + +@article{mni152nlin2009casym, + title = {Unbiased nonlinear average age-appropriate brain templates from birth to adulthood}, + author = {Fonov, VS and Evans, AC and McKinstry, RC and Almli, CR and Collins, DL}, + doi = {10.1016/S1053-8119(09)70884-5}, + journal = {NeuroImage}, + pages = {S102}, + volume = {47, Supplement 1}, + year = 2009 +} + +@article{mni152nlin6asym, + author = {Evans, AC and Janke, AL and Collins, DL and Baillet, S}, + title = {Brain templates and atlases}, + doi = {10.1016/j.neuroimage.2012.01.024}, + journal = {NeuroImage}, + volume = {62}, + number = {2}, + pages = {911--922}, + year = 2012 +} diff --git a/src/keprep/workflows/base/workflow.py b/src/keprep/workflows/base/workflow.py index 21aca80..96fc5f1 100644 --- a/src/keprep/workflows/base/workflow.py +++ b/src/keprep/workflows/base/workflow.py @@ -108,7 +108,6 @@ def init_keprep_wf(): ) log_dir.mkdir(exist_ok=True, parents=True) config.to_filename(log_dir / "keprep.toml") - return keprep_wf From c30ca3887c23d221309df5c1651783c1ce227f73 Mon Sep 17 00:00:00 2001 From: GalKepler Date: Wed, 7 Aug 2024 18:34:25 +0300 Subject: [PATCH 16/16] passing gha --- poetry.lock | 879 ++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 616 insertions(+), 263 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3dd6900..8ea7086 100644 --- a/poetry.lock +++ b/poetry.lock @@ -56,13 +56,13 @@ test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] [[package]] name = "attrs" -version = "24.1.0" +version = "24.2.0" description = "Classes Without Boilerplate" optional = false python-versions = ">=3.7" files = [ - {file = "attrs-24.1.0-py3-none-any.whl", hash = "sha256:377b47448cb61fea38533f671fba0d0f8a96fd58facd4dc518e3dac9dbea0905"}, - {file = "attrs-24.1.0.tar.gz", hash = "sha256:adbdec84af72d38be7628e353a09b6a6790d15cd71819f6e9d7b0faa8a125745"}, + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, ] [package.extras] @@ -75,15 +75,41 @@ tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] [[package]] name = "bids-validator" -version = "1.14.6" +version = "1.14.7.post0" description = "Validator for the Brain Imaging Data Structure" optional = false python-versions = ">=3.8" files = [ - {file = "bids_validator-1.14.6-py3-none-any.whl", hash = "sha256:e7194193d97bedc6fb173b8606f6d3ed5a467c141f01bca11cd0f38ad1717941"}, - {file = "bids_validator-1.14.6.tar.gz", hash = "sha256:df2b6b5d1aaad61d34ccad0494f2ed73ce3082825ada31954c4e14c2538d485c"}, + {file = "bids_validator-1.14.7.post0-py3-none-any.whl", hash = "sha256:a1ee196eae8e5cf3b3fe9fd1985e03997e3e21a40ea3bcb494ff1e0dcec86a89"}, + {file = "bids_validator-1.14.7.post0.tar.gz", hash = "sha256:e6005a500b75f8a961593fb67d46085107dadb116f59a5c3b524aa0697945b66"}, ] +[package.dependencies] +bidsschematools = ">=0.10" + +[[package]] +name = "bidsschematools" +version = "0.10.0" +description = "Python tools for working with the BIDS schema." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bidsschematools-0.10.0-py3-none-any.whl", hash = "sha256:1165b1d3b1a19a38c73752c5cd6be7d439a0abbcaf417dbf7ef4ac1cf9308975"}, + {file = "bidsschematools-0.10.0.tar.gz", hash = "sha256:689fd368b38703451efd76b7b95f1bce1c4c6392da851954078fc045a6679b1e"}, +] + +[package.dependencies] +click = "*" +jsonschema = "*" +pyyaml = "*" + +[package.extras] +all = ["codecov", "coverage[toml]", "flake8", "flake8-black", "flake8-isort", "markdown-it-py", "pandas", "pyparsing", "pytest", "pytest-cov", "sphinx (>=1.5.3)", "sphinx-rtd-theme", "tabulate"] +doc = ["sphinx (>=1.5.3)", "sphinx-rtd-theme"] +expressions = ["pyparsing"] +render = ["markdown-it-py", "pandas", "tabulate"] +tests = ["codecov", "coverage[toml]", "flake8", "flake8-black", "flake8-isort", "pytest", "pytest-cov"] + [[package]] name = "black" version = "24.8.0" @@ -154,63 +180,78 @@ files = [ [[package]] name = "cffi" -version = "1.16.0" +version = "1.17.0" description = "Foreign Function Interface for Python calling C code." optional = false python-versions = ">=3.8" files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, ] [package.dependencies] @@ -460,63 +501,83 @@ test-no-images = ["pytest", "pytest-cov", "pytest-xdist", "wurlitzer"] [[package]] name = "coverage" -version = "7.6.0" +version = "7.6.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" files = [ - {file = "coverage-7.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd"}, - {file = "coverage-7.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791"}, - {file = "coverage-7.6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6"}, - {file = "coverage-7.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb"}, - {file = "coverage-7.6.0-cp310-cp310-win32.whl", hash = "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c"}, - {file = "coverage-7.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933"}, - {file = "coverage-7.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1"}, - {file = "coverage-7.6.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d"}, - {file = "coverage-7.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63"}, - {file = "coverage-7.6.0-cp311-cp311-win32.whl", hash = "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713"}, - {file = "coverage-7.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b"}, - {file = "coverage-7.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807"}, - {file = "coverage-7.6.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee"}, - {file = "coverage-7.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605"}, - {file = "coverage-7.6.0-cp312-cp312-win32.whl", hash = "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da"}, - {file = "coverage-7.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b"}, - {file = "coverage-7.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b"}, - {file = "coverage-7.6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6"}, - {file = "coverage-7.6.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b"}, - {file = "coverage-7.6.0-cp38-cp38-win32.whl", hash = "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428"}, - {file = "coverage-7.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c"}, - {file = "coverage-7.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b"}, - {file = "coverage-7.6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166"}, - {file = "coverage-7.6.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd"}, - {file = "coverage-7.6.0-cp39-cp39-win32.whl", hash = "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2"}, - {file = "coverage-7.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca"}, - {file = "coverage-7.6.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6"}, - {file = "coverage-7.6.0.tar.gz", hash = "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16"}, + {file = "coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc"}, + {file = "coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c"}, + {file = "coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959"}, + {file = "coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232"}, + {file = "coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93"}, + {file = "coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d"}, + {file = "coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234"}, + {file = "coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133"}, + {file = "coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c"}, + {file = "coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778"}, + {file = "coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d"}, + {file = "coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a"}, + {file = "coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d"}, + {file = "coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5"}, + {file = "coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106"}, + {file = "coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a"}, + {file = "coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388"}, + {file = "coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155"}, + {file = "coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a"}, + {file = "coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e"}, + {file = "coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704"}, + {file = "coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223"}, + {file = "coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3"}, + {file = "coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f"}, + {file = "coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0"}, + {file = "coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3"}, + {file = "coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569"}, + {file = "coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989"}, + {file = "coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7"}, + {file = "coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255"}, + {file = "coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a"}, + {file = "coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb"}, + {file = "coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36"}, + {file = "coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c"}, + {file = "coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca"}, + {file = "coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df"}, + {file = "coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d"}, ] [package.extras] @@ -539,13 +600,33 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "debugpy" -version = "1.8.3" +version = "1.8.5" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" files = [ - {file = "debugpy-1.8.3-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:0df2c400853150af14996b8d1a4f54d45ffa98e76c0f3de30665e89e273ea293"}, - {file = "debugpy-1.8.3.zip", hash = "sha256:0f5a6326d9fc375b864ed368d06cddf2dabe5135511e71cde3758be699847d36"}, + {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, + {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, + {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, + {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, + {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, + {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, + {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, + {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, + {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, + {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, + {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, + {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, + {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, + {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, + {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, + {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, + {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, + {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, + {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, + {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, + {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, + {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, ] [[package]] @@ -750,13 +831,13 @@ typing = ["typing-extensions (>=4.8)"] [[package]] name = "flake8" -version = "7.1.0" +version = "7.1.1" description = "the modular source code checker: pep8 pyflakes and co" optional = false python-versions = ">=3.8.1" files = [ - {file = "flake8-7.1.0-py2.py3-none-any.whl", hash = "sha256:2e416edcc62471a64cea09353f4e7bdba32aeb079b6e360554c659a122b1bc6a"}, - {file = "flake8-7.1.0.tar.gz", hash = "sha256:48a07b626b55236e0fb4784ee69a465fbf59d79eec1f5b4785c3d3bc57d17aa5"}, + {file = "flake8-7.1.1-py2.py3-none-any.whl", hash = "sha256:597477df7860daa5aa0fdd84bf5208a043ab96b8e96ab708770ae0364dd03213"}, + {file = "flake8-7.1.1.tar.gz", hash = "sha256:049d058491e228e03e67b390f311bbf88fce2dbaa8fa673e7aea87b7198b8d38"}, ] [package.dependencies] @@ -1330,6 +1411,41 @@ files = [ {file = "joblib-1.4.2.tar.gz", hash = "sha256:2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e"}, ] +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + [[package]] name = "jupyter-client" version = "8.6.2" @@ -1755,40 +1871,40 @@ files = [ [[package]] name = "matplotlib" -version = "3.9.1" +version = "3.9.1.post1" description = "Python plotting package" optional = false python-versions = ">=3.9" files = [ - {file = "matplotlib-3.9.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:7ccd6270066feb9a9d8e0705aa027f1ff39f354c72a87efe8fa07632f30fc6bb"}, - {file = "matplotlib-3.9.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:591d3a88903a30a6d23b040c1e44d1afdd0d778758d07110eb7596f811f31842"}, - {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2a59ff4b83d33bca3b5ec58203cc65985367812cb8c257f3e101632be86d92"}, - {file = "matplotlib-3.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0fc001516ffcf1a221beb51198b194d9230199d6842c540108e4ce109ac05cc0"}, - {file = "matplotlib-3.9.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:83c6a792f1465d174c86d06f3ae85a8fe36e6f5964633ae8106312ec0921fdf5"}, - {file = "matplotlib-3.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:421851f4f57350bcf0811edd754a708d2275533e84f52f6760b740766c6747a7"}, - {file = "matplotlib-3.9.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b3fce58971b465e01b5c538f9d44915640c20ec5ff31346e963c9e1cd66fa812"}, - {file = "matplotlib-3.9.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a973c53ad0668c53e0ed76b27d2eeeae8799836fd0d0caaa4ecc66bf4e6676c0"}, - {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82cd5acf8f3ef43f7532c2f230249720f5dc5dd40ecafaf1c60ac8200d46d7eb"}, - {file = "matplotlib-3.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ab38a4f3772523179b2f772103d8030215b318fef6360cb40558f585bf3d017f"}, - {file = "matplotlib-3.9.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2315837485ca6188a4b632c5199900e28d33b481eb083663f6a44cfc8987ded3"}, - {file = "matplotlib-3.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:a0c977c5c382f6696caf0bd277ef4f936da7e2aa202ff66cad5f0ac1428ee15b"}, - {file = "matplotlib-3.9.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b"}, - {file = "matplotlib-3.9.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a"}, - {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d"}, - {file = "matplotlib-3.9.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b"}, - {file = "matplotlib-3.9.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c"}, - {file = "matplotlib-3.9.1-cp312-cp312-win_amd64.whl", hash = "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7"}, - {file = "matplotlib-3.9.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:0c584210c755ae921283d21d01f03a49ef46d1afa184134dd0f95b0202ee6f03"}, - {file = "matplotlib-3.9.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:11fed08f34fa682c2b792942f8902e7aefeed400da71f9e5816bea40a7ce28fe"}, - {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0000354e32efcfd86bda75729716b92f5c2edd5b947200be9881f0a671565c33"}, - {file = "matplotlib-3.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4db17fea0ae3aceb8e9ac69c7e3051bae0b3d083bfec932240f9bf5d0197a049"}, - {file = "matplotlib-3.9.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:208cbce658b72bf6a8e675058fbbf59f67814057ae78165d8a2f87c45b48d0ff"}, - {file = "matplotlib-3.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:dc23f48ab630474264276be156d0d7710ac6c5a09648ccdf49fef9200d8cbe80"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98"}, - {file = "matplotlib-3.9.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9"}, - {file = "matplotlib-3.9.1.tar.gz", hash = "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010"}, + {file = "matplotlib-3.9.1.post1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3779ad3e8b72df22b8a622c5796bbcfabfa0069b835412e3c1dec8ee3de92d0c"}, + {file = "matplotlib-3.9.1.post1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ec400340f8628e8e2260d679078d4e9b478699f386e5cc8094e80a1cb0039c7c"}, + {file = "matplotlib-3.9.1.post1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82c18791b8862ea095081f745b81f896b011c5a5091678fb33204fef641476af"}, + {file = "matplotlib-3.9.1.post1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:621a628389c09a6b9f609a238af8e66acecece1cfa12febc5fe4195114ba7446"}, + {file = "matplotlib-3.9.1.post1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9a54734ca761ebb27cd4f0b6c2ede696ab6861052d7d7e7b8f7a6782665115f5"}, + {file = "matplotlib-3.9.1.post1-cp310-cp310-win_amd64.whl", hash = "sha256:0721f93db92311bb514e446842e2b21c004541dcca0281afa495053e017c5458"}, + {file = "matplotlib-3.9.1.post1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:b08b46058fe2a31ecb81ef6aa3611f41d871f6a8280e9057cb4016cb3d8e894a"}, + {file = "matplotlib-3.9.1.post1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:22b344e84fcc574f561b5731f89a7625db8ef80cdbb0026a8ea855a33e3429d1"}, + {file = "matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4b49fee26d64aefa9f061b575f0f7b5fc4663e51f87375c7239efa3d30d908fa"}, + {file = "matplotlib-3.9.1.post1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89eb7e89e2b57856533c5c98f018aa3254fa3789fcd86d5f80077b9034a54c9a"}, + {file = "matplotlib-3.9.1.post1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c06e742bade41fda6176d4c9c78c9ea016e176cd338e62a1686384cb1eb8de41"}, + {file = "matplotlib-3.9.1.post1-cp311-cp311-win_amd64.whl", hash = "sha256:c44edab5b849e0fc1f1c9d6e13eaa35ef65925f7be45be891d9784709ad95561"}, + {file = "matplotlib-3.9.1.post1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bf28b09986aee06393e808e661c3466be9c21eff443c9bc881bce04bfbb0c500"}, + {file = "matplotlib-3.9.1.post1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:92aeb8c439d4831510d8b9d5e39f31c16c7f37873879767c26b147cef61e54cd"}, + {file = "matplotlib-3.9.1.post1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f15798b0691b45c80d3320358a88ce5a9d6f518b28575b3ea3ed31b4bd95d009"}, + {file = "matplotlib-3.9.1.post1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d59fc6096da7b9c1df275f9afc3fef5cbf634c21df9e5f844cba3dd8deb1847d"}, + {file = "matplotlib-3.9.1.post1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ab986817a32a70ce22302438691e7df4c6ee4a844d47289db9d583d873491e0b"}, + {file = "matplotlib-3.9.1.post1-cp312-cp312-win_amd64.whl", hash = "sha256:0d78e7d2d86c4472da105d39aba9b754ed3dfeaeaa4ac7206b82706e0a5362fa"}, + {file = "matplotlib-3.9.1.post1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:bd07eba6431b4dc9253cce6374a28c415e1d3a7dc9f8aba028ea7592f06fe172"}, + {file = "matplotlib-3.9.1.post1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ca230cc4482010d646827bd2c6d140c98c361e769ae7d954ebf6fff2a226f5b1"}, + {file = "matplotlib-3.9.1.post1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ace27c0fdeded399cbc43f22ffa76e0f0752358f5b33106ec7197534df08725a"}, + {file = "matplotlib-3.9.1.post1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a4f3aeb7ba14c497dc6f021a076c48c2e5fbdf3da1e7264a5d649683e284a2f"}, + {file = "matplotlib-3.9.1.post1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:23f96fbd4ff4cfa9b8a6b685a65e7eb3c2ced724a8d965995ec5c9c2b1f7daf5"}, + {file = "matplotlib-3.9.1.post1-cp39-cp39-win_amd64.whl", hash = "sha256:2808b95452b4ffa14bfb7c7edffc5350743c31bda495f0d63d10fdd9bc69e895"}, + {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ffc91239f73b4179dec256b01299d46d0ffa9d27d98494bc1476a651b7821cbe"}, + {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f965ebca9fd4feaaca45937c4849d92b70653057497181100fcd1e18161e5f29"}, + {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:801ee9323fd7b2da0d405aebbf98d1da77ea430bbbbbec6834c0b3af15e5db44"}, + {file = "matplotlib-3.9.1.post1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:50113e9b43ceb285739f35d43db36aa752fb8154325b35d134ff6e177452f9ec"}, + {file = "matplotlib-3.9.1.post1.tar.gz", hash = "sha256:c91e585c65092c975a44dc9d4239ba8c594ba3c193d7c478b6d178c4ef61f406"}, ] [package.dependencies] @@ -2070,6 +2186,28 @@ docs = ["furo (>=2021.10.09,<2021.11.0)", "pydot (>=1.2.3)", "pydotplus", "sphin test = ["coverage", "matplotlib", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx"] tests = ["coverage", "matplotlib", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx"] +[[package]] +name = "nitransforms" +version = "21.0.0" +description = "NiTransforms -- Neuroimaging spatial transforms in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "nitransforms-21.0.0-py3-none-any.whl", hash = "sha256:3341a3ac73b46d358c8ff0b9e241142e4b360b6a4750d718ccad024dfe8be3a6"}, + {file = "nitransforms-21.0.0.tar.gz", hash = "sha256:9e326a1ea5d5c6577219f99d33c1a680a760213e243182f370ce7e6b2476103a"}, +] + +[package.dependencies] +h5py = "*" +nibabel = ">=3.0" +numpy = "*" +scipy = "*" + +[package.extras] +all = ["codecov", "pytest", "pytest-cov"] +test = ["codecov", "pytest", "pytest-cov"] +tests = ["codecov", "pytest", "pytest-cov"] + [[package]] name = "nitransforms" version = "23.0.1" @@ -2207,6 +2345,60 @@ files = [ {file = "numpy-1.26.4.tar.gz", hash = "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010"}, ] +[[package]] +name = "numpy" +version = "2.0.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, + {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, + {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, + {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, + {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, + {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, + {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, + {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, + {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, + {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, +] + [[package]] name = "ordered-set" version = "4.1.0" @@ -2625,13 +2817,13 @@ tutorial = ["ipykernel", "jinja2", "jupyter-client", "markupsafe", "nbconvert"] [[package]] name = "pycodestyle" -version = "2.12.0" +version = "2.12.1" description = "Python style guide checker" optional = false python-versions = ">=3.8" files = [ - {file = "pycodestyle-2.12.0-py2.py3-none-any.whl", hash = "sha256:949a39f6b86c3e1515ba1787c2022131d165a8ad271b11370a8819aa070269e4"}, - {file = "pycodestyle-2.12.0.tar.gz", hash = "sha256:442f950141b4f43df752dd303511ffded3a04c2b6fb7f65980574f0c31e6e79c"}, + {file = "pycodestyle-2.12.1-py2.py3-none-any.whl", hash = "sha256:46f0fb92069a7c28ab7bb558f05bfc0110dac69a0cd23c61ea0040283a9d78b3"}, + {file = "pycodestyle-2.12.1.tar.gz", hash = "sha256:6838eae08bbce4f6accd5d5572075c63626a15ee3e6f842df996bf62f6d73521"}, ] [[package]] @@ -2808,62 +3000,64 @@ files = [ [[package]] name = "pyyaml" -version = "6.0.1" +version = "6.0.2" description = "YAML parser and emitter for Python" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" files = [ - {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, - {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, - {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, - {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, - {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, - {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, - {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, - {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, - {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, - {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, - {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, - {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, - {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, - {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, - {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, - {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, - {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, - {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, - {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, - {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, - {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, - {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, - {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, - {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, - {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, - {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, - {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, - {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, - {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, - {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, - {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, - {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, - {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, ] [[package]] @@ -3008,6 +3202,21 @@ html = ["html5lib (>=1.0,<2.0)"] lxml = ["lxml (>=4.3.0,<5.0.0)"] networkx = ["networkx (>=2.0.0,<3.0.0)"] +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + [[package]] name = "requests" version = "2.32.3" @@ -3042,6 +3251,118 @@ files = [ [package.dependencies] docutils = ">=0.11,<1.0" +[[package]] +name = "rpds-py" +version = "0.20.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, +] + [[package]] name = "ruff" version = "0.4.10" @@ -3203,6 +3524,38 @@ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodest doc = ["jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.13.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0)", "sphinx-design (>=0.4.0)"] test = ["Cython", "array-api-strict", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "sdcflows" +version = "2.5.2" +description = "Susceptibility Distortion Correction (SDC) workflows for EPI MR schemes." +optional = false +python-versions = ">=3.8" +files = [ + {file = "sdcflows-2.5.2-py3-none-any.whl", hash = "sha256:281428fd35a0f2b67de2810d7dae96feb1a0108b52a0afe9aee4e80e652cbe3f"}, + {file = "sdcflows-2.5.2.tar.gz", hash = "sha256:c32ef718ef0311f7dd13a8718e3b2d8f2e0884514788180c1018b4197d45a9ce"}, +] + +[package.dependencies] +attrs = ">=20.1.0" +nibabel = ">=3.1.0" +nipype = ">=1.8.5,<2.0" +nitransforms = ">=21.0.0" +niworkflows = ">=1.7.0" +numpy = ">=1.21.0" +pybids = ">=0.15.1" +scikit-image = ">=0.18" +scipy = ">=1.8.1" +templateflow = "*" +traits = "<6.4" + +[package.extras] +all = ["coverage", "furo (>=2021.10.09,<2021.11.0)", "psutil", "pydot", "pydotplus", "pytest", "pytest-cov", "pytest-env", "pytest-xdist", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +doc = ["furo (>=2021.10.09,<2021.11.0)", "pydot", "pydotplus", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +docs = ["furo (>=2021.10.09,<2021.11.0)", "pydot", "pydotplus", "sphinx", "sphinxcontrib-apidoc", "sphinxcontrib-napoleon"] +mem = ["psutil"] +test = ["coverage", "pytest", "pytest-cov", "pytest-env", "pytest-xdist"] +tests = ["coverage", "pytest", "pytest-cov", "pytest-env", "pytest-xdist"] + [[package]] name = "sdcflows" version = "2.10.0" @@ -3452,60 +3805,60 @@ tests = ["coverage", "pytest", "pytest-cov", "pytest-env"] [[package]] name = "sqlalchemy" -version = "2.0.31" +version = "2.0.32" description = "Database Abstraction Library" optional = false python-versions = ">=3.7" files = [ - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f2a213c1b699d3f5768a7272de720387ae0122f1becf0901ed6eaa1abd1baf6c"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9fea3d0884e82d1e33226935dac990b967bef21315cbcc894605db3441347443"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3ad7f221d8a69d32d197e5968d798217a4feebe30144986af71ada8c548e9fa"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f2bee229715b6366f86a95d497c347c22ddffa2c7c96143b59a2aa5cc9eebbc"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cd5b94d4819c0c89280b7c6109c7b788a576084bf0a480ae17c227b0bc41e109"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:750900a471d39a7eeba57580b11983030517a1f512c2cb287d5ad0fcf3aebd58"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win32.whl", hash = "sha256:7bd112be780928c7f493c1a192cd8c5fc2a2a7b52b790bc5a84203fb4381c6be"}, - {file = "SQLAlchemy-2.0.31-cp310-cp310-win_amd64.whl", hash = "sha256:5a48ac4d359f058474fadc2115f78a5cdac9988d4f99eae44917f36aa1476327"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f68470edd70c3ac3b6cd5c2a22a8daf18415203ca1b036aaeb9b0fb6f54e8298"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2c38c2a4c5c634fe6c3c58a789712719fa1bf9b9d6ff5ebfce9a9e5b89c1ca"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd15026f77420eb2b324dcb93551ad9c5f22fab2c150c286ef1dc1160f110203"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2196208432deebdfe3b22185d46b08f00ac9d7b01284e168c212919891289396"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:352b2770097f41bff6029b280c0e03b217c2dcaddc40726f8f53ed58d8a85da4"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:56d51ae825d20d604583f82c9527d285e9e6d14f9a5516463d9705dab20c3740"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win32.whl", hash = "sha256:6e2622844551945db81c26a02f27d94145b561f9d4b0c39ce7bfd2fda5776dac"}, - {file = "SQLAlchemy-2.0.31-cp311-cp311-win_amd64.whl", hash = "sha256:ccaf1b0c90435b6e430f5dd30a5aede4764942a695552eb3a4ab74ed63c5b8d3"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3b74570d99126992d4b0f91fb87c586a574a5872651185de8297c6f90055ae42"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f77c4f042ad493cb8595e2f503c7a4fe44cd7bd59c7582fd6d78d7e7b8ec52c"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd1591329333daf94467e699e11015d9c944f44c94d2091f4ac493ced0119449"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74afabeeff415e35525bf7a4ecdab015f00e06456166a2eba7590e49f8db940e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b9c01990d9015df2c6f818aa8f4297d42ee71c9502026bb074e713d496e26b67"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:66f63278db425838b3c2b1c596654b31939427016ba030e951b292e32b99553e"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win32.whl", hash = "sha256:0b0f658414ee4e4b8cbcd4a9bb0fd743c5eeb81fc858ca517217a8013d282c96"}, - {file = "SQLAlchemy-2.0.31-cp312-cp312-win_amd64.whl", hash = "sha256:fa4b1af3e619b5b0b435e333f3967612db06351217c58bfb50cee5f003db2a5a"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:f43e93057cf52a227eda401251c72b6fbe4756f35fa6bfebb5d73b86881e59b0"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d337bf94052856d1b330d5fcad44582a30c532a2463776e1651bd3294ee7e58b"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c06fb43a51ccdff3b4006aafee9fcf15f63f23c580675f7734245ceb6b6a9e05"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:b6e22630e89f0e8c12332b2b4c282cb01cf4da0d26795b7eae16702a608e7ca1"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:79a40771363c5e9f3a77f0e28b3302801db08040928146e6808b5b7a40749c88"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win32.whl", hash = "sha256:501ff052229cb79dd4c49c402f6cb03b5a40ae4771efc8bb2bfac9f6c3d3508f"}, - {file = "SQLAlchemy-2.0.31-cp37-cp37m-win_amd64.whl", hash = "sha256:597fec37c382a5442ffd471f66ce12d07d91b281fd474289356b1a0041bdf31d"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dc6d69f8829712a4fd799d2ac8d79bdeff651c2301b081fd5d3fe697bd5b4ab9"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23b9fbb2f5dd9e630db70fbe47d963c7779e9c81830869bd7d137c2dc1ad05fb"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21c97efcbb9f255d5c12a96ae14da873233597dfd00a3a0c4ce5b3e5e79704"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26a6a9837589c42b16693cf7bf836f5d42218f44d198f9343dd71d3164ceeeac"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:dc251477eae03c20fae8db9c1c23ea2ebc47331bcd73927cdcaecd02af98d3c3"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:2fd17e3bb8058359fa61248c52c7b09a97cf3c820e54207a50af529876451808"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win32.whl", hash = "sha256:c76c81c52e1e08f12f4b6a07af2b96b9b15ea67ccdd40ae17019f1c373faa227"}, - {file = "SQLAlchemy-2.0.31-cp38-cp38-win_amd64.whl", hash = "sha256:4b600e9a212ed59355813becbcf282cfda5c93678e15c25a0ef896b354423238"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b6cf796d9fcc9b37011d3f9936189b3c8074a02a4ed0c0fbbc126772c31a6d4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:78fe11dbe37d92667c2c6e74379f75746dc947ee505555a0197cfba9a6d4f1a4"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2fc47dc6185a83c8100b37acda27658fe4dbd33b7d5e7324111f6521008ab4fe"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a41514c1a779e2aa9a19f67aaadeb5cbddf0b2b508843fcd7bafdf4c6864005"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:afb6dde6c11ea4525318e279cd93c8734b795ac8bb5dda0eedd9ebaca7fa23f1"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:3f9faef422cfbb8fd53716cd14ba95e2ef655400235c3dfad1b5f467ba179c8c"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win32.whl", hash = "sha256:fc6b14e8602f59c6ba893980bea96571dd0ed83d8ebb9c4479d9ed5425d562e9"}, - {file = "SQLAlchemy-2.0.31-cp39-cp39-win_amd64.whl", hash = "sha256:3cb8a66b167b033ec72c3812ffc8441d4e9f5f78f5e31e54dcd4c90a4ca5bebc"}, - {file = "SQLAlchemy-2.0.31-py3-none-any.whl", hash = "sha256:69f3e3c08867a8e4856e92d7afb618b95cdee18e0bc1647b77599722c9a28911"}, - {file = "SQLAlchemy-2.0.31.tar.gz", hash = "sha256:b607489dd4a54de56984a0c7656247504bd5523d9d0ba799aef59d4add009484"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0c9045ecc2e4db59bfc97b20516dfdf8e41d910ac6fb667ebd3a79ea54084619"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1467940318e4a860afd546ef61fefb98a14d935cd6817ed07a228c7f7c62f389"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5954463675cb15db8d4b521f3566a017c8789222b8316b1e6934c811018ee08b"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:167e7497035c303ae50651b351c28dc22a40bb98fbdb8468cdc971821b1ae533"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b27dfb676ac02529fb6e343b3a482303f16e6bc3a4d868b73935b8792edb52d0"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bf2360a5e0f7bd75fa80431bf8ebcfb920c9f885e7956c7efde89031695cafb8"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win32.whl", hash = "sha256:306fe44e754a91cd9d600a6b070c1f2fadbb4a1a257b8781ccf33c7067fd3e4d"}, + {file = "SQLAlchemy-2.0.32-cp310-cp310-win_amd64.whl", hash = "sha256:99db65e6f3ab42e06c318f15c98f59a436f1c78179e6a6f40f529c8cc7100b22"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:21b053be28a8a414f2ddd401f1be8361e41032d2ef5884b2f31d31cb723e559f"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b178e875a7a25b5938b53b006598ee7645172fccafe1c291a706e93f48499ff5"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:723a40ee2cc7ea653645bd4cf024326dea2076673fc9d3d33f20f6c81db83e1d"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:295ff8689544f7ee7e819529633d058bd458c1fd7f7e3eebd0f9268ebc56c2a0"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:49496b68cd190a147118af585173ee624114dfb2e0297558c460ad7495f9dfe2"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:acd9b73c5c15f0ec5ce18128b1fe9157ddd0044abc373e6ecd5ba376a7e5d961"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win32.whl", hash = "sha256:9365a3da32dabd3e69e06b972b1ffb0c89668994c7e8e75ce21d3e5e69ddef28"}, + {file = "SQLAlchemy-2.0.32-cp311-cp311-win_amd64.whl", hash = "sha256:8bd63d051f4f313b102a2af1cbc8b80f061bf78f3d5bd0843ff70b5859e27924"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bab3db192a0c35e3c9d1560eb8332463e29e5507dbd822e29a0a3c48c0a8d92"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:19d98f4f58b13900d8dec4ed09dd09ef292208ee44cc9c2fe01c1f0a2fe440e9"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cd33c61513cb1b7371fd40cf221256456d26a56284e7d19d1f0b9f1eb7dd7e8"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d6ba0497c1d066dd004e0f02a92426ca2df20fac08728d03f67f6960271feec"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2b6be53e4fde0065524f1a0a7929b10e9280987b320716c1509478b712a7688c"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:916a798f62f410c0b80b63683c8061f5ebe237b0f4ad778739304253353bc1cb"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win32.whl", hash = "sha256:31983018b74908ebc6c996a16ad3690301a23befb643093fcfe85efd292e384d"}, + {file = "SQLAlchemy-2.0.32-cp312-cp312-win_amd64.whl", hash = "sha256:4363ed245a6231f2e2957cccdda3c776265a75851f4753c60f3004b90e69bfeb"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8afd5b26570bf41c35c0121801479958b4446751a3971fb9a480c1afd85558e"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c750987fc876813f27b60d619b987b057eb4896b81117f73bb8d9918c14f1cad"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ada0102afff4890f651ed91120c1120065663506b760da4e7823913ebd3258be"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:78c03d0f8a5ab4f3034c0e8482cfcc415a3ec6193491cfa1c643ed707d476f16"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:3bd1cae7519283ff525e64645ebd7a3e0283f3c038f461ecc1c7b040a0c932a1"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win32.whl", hash = "sha256:01438ebcdc566d58c93af0171c74ec28efe6a29184b773e378a385e6215389da"}, + {file = "SQLAlchemy-2.0.32-cp37-cp37m-win_amd64.whl", hash = "sha256:4979dc80fbbc9d2ef569e71e0896990bc94df2b9fdbd878290bd129b65ab579c"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c742be912f57586ac43af38b3848f7688863a403dfb220193a882ea60e1ec3a"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:62e23d0ac103bcf1c5555b6c88c114089587bc64d048fef5bbdb58dfd26f96da"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:251f0d1108aab8ea7b9aadbd07fb47fb8e3a5838dde34aa95a3349876b5a1f1d"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0ef18a84e5116340e38eca3e7f9eeaaef62738891422e7c2a0b80feab165905f"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:3eb6a97a1d39976f360b10ff208c73afb6a4de86dd2a6212ddf65c4a6a2347d5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0c1c9b673d21477cec17ab10bc4decb1322843ba35b481585facd88203754fc5"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win32.whl", hash = "sha256:c41a2b9ca80ee555decc605bd3c4520cc6fef9abde8fd66b1cf65126a6922d65"}, + {file = "SQLAlchemy-2.0.32-cp38-cp38-win_amd64.whl", hash = "sha256:8a37e4d265033c897892279e8adf505c8b6b4075f2b40d77afb31f7185cd6ecd"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:52fec964fba2ef46476312a03ec8c425956b05c20220a1a03703537824b5e8e1"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:328429aecaba2aee3d71e11f2477c14eec5990fb6d0e884107935f7fb6001632"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85a01b5599e790e76ac3fe3aa2f26e1feba56270023d6afd5550ed63c68552b3"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aaf04784797dcdf4c0aa952c8d234fa01974c4729db55c45732520ce12dd95b4"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:4488120becf9b71b3ac718f4138269a6be99a42fe023ec457896ba4f80749525"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:14e09e083a5796d513918a66f3d6aedbc131e39e80875afe81d98a03312889e6"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win32.whl", hash = "sha256:0d322cc9c9b2154ba7e82f7bf25ecc7c36fbe2d82e2933b3642fc095a52cfc78"}, + {file = "SQLAlchemy-2.0.32-cp39-cp39-win_amd64.whl", hash = "sha256:7dd8583df2f98dea28b5cd53a1beac963f4f9d087888d75f22fcc93a07cf8d84"}, + {file = "SQLAlchemy-2.0.32-py3-none-any.whl", hash = "sha256:e567a8793a692451f706b363ccf3c45e056b67d90ead58c3bc9471af5d212202"}, + {file = "SQLAlchemy-2.0.32.tar.gz", hash = "sha256:c1b88cc8b02b6a5f0efb0345a03672d4c897dc7d92585176f88c67346f565ea8"}, ] [package.dependencies] @@ -3643,13 +3996,13 @@ zarr = ["fsspec", "zarr"] [[package]] name = "tokenize-rt" -version = "5.2.0" +version = "6.0.0" description = "A wrapper around the stdlib `tokenize` which roundtrips." optional = false python-versions = ">=3.8" files = [ - {file = "tokenize_rt-5.2.0-py2.py3-none-any.whl", hash = "sha256:b79d41a65cfec71285433511b50271b05da3584a1da144a0752e9c621a285289"}, - {file = "tokenize_rt-5.2.0.tar.gz", hash = "sha256:9fe80f8a5c1edad2d3ede0f37481cc0cc1538a2f442c9c2f9e4feacd2792d054"}, + {file = "tokenize_rt-6.0.0-py2.py3-none-any.whl", hash = "sha256:d4ff7ded2873512938b4f8cbb98c9b07118f01d30ac585a30d7a88353ca36d22"}, + {file = "tokenize_rt-6.0.0.tar.gz", hash = "sha256:b9711bdfc51210211137499b5e355d3de5ec88a85d2025c520cbb921b5194367"}, ] [[package]] @@ -3696,17 +4049,17 @@ files = [ [[package]] name = "tox" -version = "4.16.0" +version = "4.17.0" description = "tox is a generic virtualenv management and test command line tool" optional = false python-versions = ">=3.8" files = [ - {file = "tox-4.16.0-py3-none-any.whl", hash = "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0"}, - {file = "tox-4.16.0.tar.gz", hash = "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748"}, + {file = "tox-4.17.0-py3-none-any.whl", hash = "sha256:82ef41e7e54182e2143daf0b2920d9030c2e1c4291e12091ebad66860c7be7a4"}, + {file = "tox-4.17.0.tar.gz", hash = "sha256:b1e2e1dfbfdc174d9be95ae78ec2c4d2cf4800d4c15571deddb197a2c90d2de6"}, ] [package.dependencies] -cachetools = ">=5.3.3" +cachetools = ">=5.4" chardet = ">=5.2" colorama = ">=0.4.6" filelock = ">=3.15.4" @@ -3718,8 +4071,8 @@ tomli = {version = ">=2.0.1", markers = "python_version < \"3.11\""} virtualenv = ">=20.26.3" [package.extras] -docs = ["furo (>=2024.5.6)", "sphinx (>=7.3.7)", "sphinx-argparse-cli (>=1.16)", "sphinx-autodoc-typehints (>=2.2.2)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] -testing = ["build[virtualenv] (>=1.2.1)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=9.1)", "distlib (>=0.3.8)", "flaky (>=3.8.1)", "hatch-vcs (>=0.4)", "hatchling (>=1.25)", "psutil (>=6)", "pytest (>=8.2.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-xdist (>=3.6.1)", "re-assert (>=1.1)", "setuptools (>=70.2)", "time-machine (>=2.14.2)", "wheel (>=0.43)"] +docs = ["furo (>=2024.7.18)", "sphinx (>=7.4.7)", "sphinx-argparse-cli (>=1.16)", "sphinx-autodoc-typehints (>=2.2.3)", "sphinx-copybutton (>=0.5.2)", "sphinx-inline-tabs (>=2023.4.21)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.11)"] +testing = ["build[virtualenv] (>=1.2.1)", "covdefaults (>=2.3)", "detect-test-pollution (>=1.2)", "devpi-process (>=1)", "diff-cover (>=9.1.1)", "distlib (>=0.3.8)", "flaky (>=3.8.1)", "hatch-vcs (>=0.4)", "hatchling (>=1.25)", "psutil (>=6)", "pytest (>=8.3.2)", "pytest-cov (>=5)", "pytest-mock (>=3.14)", "pytest-xdist (>=3.6.1)", "re-assert (>=1.1)", "setuptools (>=70.3)", "time-machine (>=2.14.2)", "wheel (>=0.43)"] [[package]] name = "tqdm"