Repository: dPys/PyNets (language: python)

Issue:
[DOC] cleanup docstring for track.py



Discussion / hints:

Fix patch:
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 9352a2af..82f644af 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -101,7 +101,7 @@ jobs:
 
   build_docs:
     docker:
-      - image: python:3.7.4
+      - image: python:3.8.4
     working_directory: /tmp/src/pynets
     environment:
       - FSLOUTPUTTYPE: 'NIFTI'
@@ -117,9 +117,9 @@ jobs:
       - run:
           name: Check Python version and upgrade pip
           command: |
-            python --version
             python --version
             python -m pip install -U pip
+            python -m pip install --upgrade pip setuptools
       - run:
           name: Install graphviz
           command: |
@@ -148,12 +148,12 @@ jobs:
       - run:
           name: Download OSF test data
           command: |
-            mkdir -p tests
-            wget --retry-connrefused --waitretry=5 --read-timeout=60 --timeout=60 -t 0 -q -O examples.tar.gz "https://osf.io/ye4vf/download" && tar -xvzf examples.tar.gz -C /tmp/src/pynets/tests
+            mkdir -p /tmp/src/pynets/data
+            wget --retry-connrefused --waitretry=5 --read-timeout=60 --timeout=60 -t 0 -O examples.tar.gz "https://osf.io/vgxs9/download" && tar -xvzf examples.tar.gz -C /tmp/src/pynets/data
       - persist_to_workspace:
           root: /tmp/src/pynets
           paths:
-            - tests/*
+            - data/*
 
   unit_and_integration_tests:
     machine:
@@ -171,11 +171,11 @@ jobs:
       - attach_workspace:
           at: /tmp/src/pynets
       - run:
-          name: "Switch to Python v3.7"
+          name: "Switch to Python v3.8"
           no_output_timeout: 30m
           command: |
             pyenv local --unset
-            pyenv uninstall -f 3.7.0 || true
+            pyenv uninstall -f 3.8.0 || true
             sudo add-apt-repository ppa:deadsnakes/ppa
             sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 5DC22404A6F9F1CA
             sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 78BD65473CB3BD13
@@ -184,9 +184,9 @@ jobs:
             sudo apt-get clean
             sudo apt-get update -qq
             sudo apt-get upgrade -y
-            pyenv install -f 3.7.0 || true
+            pyenv install -f 3.8.0 || true
             eval "$(pyenv init -)"
-            pyenv global 3.7.0
+            pyenv global 3.8.0
             echo "export PATH=/opt/circleci/.pyenv/bin:"$PATH"" >> $BASH_ENV
             echo "export PATH=/opt/circleci/.pyenv/libexec:"$PATH"" >> $BASH_ENV
             source $BASH_ENV
@@ -195,10 +195,10 @@ jobs:
           command: |
             which python
             python -m pip install -U pip
-            python -m pip install --upgrade pip setuptools
+            python -m pip install --upgrade setuptools numpy pytess perlcompat scipy matplotlib wheel importlib-metadata typing-extensions
       - run:
           name: Install pytest
-          command: python -m pip install pytest pytest-cov pytest-sugar pytest-circleci-parallelized pytest-split pytest-xdist[psutil] coverage
+          command: python -m pip install pytest pytest-cov pytest-sugar pytest-circleci-parallelized pytest-split pytest-xdist[psutil] pytest-timeout pytest-forked coverage
       - run:
           name: Install system dependencies and LFS
           no_output_timeout: 30m
@@ -224,13 +224,21 @@ jobs:
           no_output_timeout: 30m
           command: |
             python setup.py install
+      - run:
+          name: Dependency cleanup and configurations
+          no_output_timeout: 30m
+          command: |
             python -c "from matplotlib import font_manager"
             sed -i 's/\(backend *: \).*$/\1Agg/g' $( python -c "import matplotlib; print(matplotlib.matplotlib_fname())" )
             mkdir -p ~/.nipype
+            mkdir -p ~/.dipy
+            mkdir -p ~/.nilearn
             echo "[monitoring]" > ~/.nipype/nipype.cfg
             echo "enabled = true" >> ~/.nipype/nipype.cfg
-            python -m pip install --upgrade numpy
-            python -m pip install hyppo==0.1.3
+            dipy_fetch stanford_hardi --out_dir ~/.dipy
+            dipy_fetch stanford_t1 --out_dir ~/.dipy
+            dipy_fetch stanford_pve_maps --out_dir ~/.dipy
+            dipy_fetch tissue_data --out_dir ~/.dipy
       - run:
           name: Install FSL
           no_output_timeout: 40m
@@ -249,7 +257,7 @@ jobs:
             curl -fsSL https://keys.openpgp.org/vks/v1/by-fingerprint/793CEFE14DBC851A2BFB1222612DEFB798507F25 | sudo apt-key add -
             sudo apt-get update -qq
             sudo apt-get install --allow-unauthenticated -y libatlas-base-dev python3-graph-tool
-            sudo ln -sf /usr/lib/python3/dist-packages/graph_tool /opt/circleci/.pyenv/versions/3.7.0/lib/python3.7/site-packages/graph_tool
+            sudo ln -sf /usr/lib/python3/dist-packages/graph_tool /opt/circleci/.pyenv/versions/3.8.0/lib/python3.8/site-packages/graph_tool
             python -c "import graph_tool.all as gt"
       - run:
           name: Update PATH and Define Environment Variable at Runtime
@@ -269,10 +277,11 @@ jobs:
           no_output_timeout: 6h
           command: |
             set -e
-            TEST_FILES=$(circleci tests glob "tests/test_*.py" | circleci tests split --split-by=timings)
+            TEST_FILES=$(circleci tests glob "pynets/*/tests/test_*.py" | circleci tests split --split-by=timings)
             mkdir test-results
             export PYTHONUNBUFFERED=1
-            python -m coverage run -p --rcfile=.coveragerc -m pytest -s --disable-warnings --store-durations --numprocesses=auto --circleci-parallelize --verbose --junitxml="test-results/junit.xml" $TEST_FILES
+            ulimit -s unlimited
+            python -m coverage run -p --rcfile=.coveragerc -m pytest --circleci-parallelize --junitxml="test-results/junit.xml" $TEST_FILES
             sudo chmod 777 -R /usr/lib/python3/dist-packages
       - persist_to_workspace:
           root: /tmp/src/pynets
@@ -303,20 +312,20 @@ jobs:
       - attach_workspace:
           at: /tmp/src/pynets
       - run:
-          name: "Switch to Python v3.6"
+          name: "Switch to Python v3.8"
           no_output_timeout: 30m
           command: |
             pyenv local --unset
-            pyenv uninstall -f 3.7.0 || true
+            pyenv uninstall -f 3.8.0 || true
             sudo add-apt-repository ppa:deadsnakes/ppa
             sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 5DC22404A6F9F1CA
             sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 78BD65473CB3BD13
             sudo apt-get update -qq
             sudo apt-get upgrade -y
             sudo apt-get install -y make build-essential software-properties-common libbz2-dev llvm libncurses5-dev libncursesw5-dev liblzma-dev libatlas-base-dev
-            pyenv install -f 3.7.0 || true
+            pyenv install -f 3.8.0 || true
             eval "$(pyenv init -)"
-            pyenv global 3.7.0
+            pyenv global 3.8.0
             echo "export PATH=/opt/circleci/.pyenv/bin:"$PATH"" >> $BASH_ENV
             echo "export PATH=/opt/circleci/.pyenv/libexec:"$PATH"" >> $BASH_ENV
             source $BASH_ENV
@@ -324,7 +333,7 @@ jobs:
           name: Check Python version and upgrade pip
           command: |
             python -m pip install -U pip
-            python -m pip install --upgrade pip setuptools numpy pytess perlcompat scipy matplotlib
+            python -m pip install --upgrade pip setuptools numpy pytess perlcompat scipy matplotlib wheel
       - run:
           name: Install graph_tool
           no_output_timeout: 30m
@@ -333,7 +342,7 @@ jobs:
             curl -fsSL https://keys.openpgp.org/vks/v1/by-fingerprint/793CEFE14DBC851A2BFB1222612DEFB798507F25 | sudo apt-key add -
             sudo apt-get update -qq
             sudo apt-get install --allow-unauthenticated -y libatlas-base-dev python3-graph-tool
-            sudo ln -sf /usr/lib/python3/dist-packages/graph_tool /opt/circleci/.pyenv/versions/3.7.0/lib/python3.7/site-packages/graph_tool
+            sudo ln -sf /usr/lib/python3/dist-packages/graph_tool /opt/circleci/.pyenv/versions/3.8.0/lib/python3.8/site-packages/graph_tool
             python -c "import graph_tool.all as gt"
       - run:
           name: Update codecov
@@ -428,7 +437,7 @@ jobs:
       - run:
           name: Build pynets
           command: |
-            pyenv local 3.7.0
+            pyenv local 3.8.0
             pip install --upgrade "pip>=19.1"
             pip install setuptools_rust twine
             THISVERSION=$( python get_version.py )
@@ -445,7 +454,7 @@ jobs:
       - run:
           name: Check sdist distribution
           command: |
-            pyenv local 3.7.0
+            pyenv local 3.8.0
             THISVERSION=$( python get_version.py )
             THISVERSION=${THISVERSION%.dirty*}
             THISVERSION=${CIRCLE_TAG:-$THISVERSION}
@@ -465,7 +474,7 @@ jobs:
       - run:
           name: Check wheel distribution
           command: |
-            pyenv local 3.7.0
+            pyenv local 3.8.0
             THISVERSION=$( python get_version.py )
             THISVERSION=${THISVERSION%.dirty*}
             THISVERSION=${CIRCLE_TAG:-$THISVERSION}
@@ -496,16 +505,16 @@ jobs:
           command: |
             sudo setfacl -d -m group:$(id -gn):rwx /tmp/src/pynets
             sudo setfacl -m group:$(id -gn):rwx /tmp/src/pynets
-            pyenv local 3.7.0
+            pyenv local 3.8.0
             THISVERSION=$( python get_version.py )
             echo "${CIRCLE_TAG:-$THISVERSION}" > pynets/VERSION
-            docker run --rm=false --entrypoint=/bin/bash -v `pwd`:/io -w /io python:3.6.9 -c "pip install numpy && python setup.py sdist"
+            docker run --rm=false --entrypoint=/bin/bash -v `pwd`:/io -w /io python:3.8 -c "pip install numpy && python setup.py sdist"
             docker run --rm=false -e PLAT='manylinux1_x86_64' -e PKGNAME='pynets' -v `pwd`:/io \
                 quay.io/pypa/manylinux1_x86_64 /io/.circleci/pypi_wheel/build-wheels.sh
       - run:
           name: Upload packages to PyPI
           command: |
-            pyenv local 3.7.0
+            pyenv local 3.8.0
             pip install twine
             INSTALLED_VERSION=$(pynets --version)
             THISVERSION=$( python get_version.py )
@@ -526,7 +535,7 @@ workflows:
             branches:
               ignore:
                 - /docs?\/.*/
-                - /tests?\/.*/
+                - /licenses?\/.*/
                 - /docker\/.*/
             tags:
               only: /.*/
@@ -537,6 +546,8 @@ workflows:
             branches:
               ignore:
                 - /docs?\/.*/
+                - /licenses?\/.*/
+                - /docker\/.*/
             tags:
               only: /.*/
       - coverage:
@@ -545,8 +556,11 @@ workflows:
             - unit_and_integration_tests
           filters:
             branches:
+              only: master
               ignore:
                 - /docs?\/.*/
+                - /licenses?\/.*/
+                - /docker\/.*/
             tags:
               only: /.*/
       - build:
@@ -557,6 +571,8 @@ workflows:
             branches:
               ignore:
                 - /docs?\/.*/
+                - /licenses?\/.*/
+                - /docker\/.*/
             tags:
               only: /.*/
 
@@ -566,20 +582,14 @@ workflows:
             - unit_and_integration_tests
           filters:
             branches:
+              only: master
               ignore:
-                - /docs\/.*/
+                - /docs?\/.*/
+                - /licenses?\/.*/
                 - /docker\/.*/
             tags:
               only: /.*/
 
-      - deploy_docker_patches:
-          requires:
-            - build
-            - test_deploy_pypi
-          filters:
-            branches:
-              only: /docker\/.*/
-
       - deployable:
           requires:
             - build
diff --git a/.codecov.yml b/.codecov.yml
index e5e75aea..0f643eaf 100644
--- a/.codecov.yml
+++ b/.codecov.yml
@@ -23,50 +23,57 @@ coverage:
         flags:
           - "smoketests"
   ignore:
-    - "pynets/templates/*"
-    - "pynets/rsns/*"
-    - "pynets/core/atlases/*"
-    - "pynets/core/labels/*"
-    - "pynets/runconfig.yaml"
-    - "pynets/conftest.py"
-    - "pynets/cloudconfig.json"
-    - "pynets/bidsconfig.json"
-    - "pynets/stats/nodal_graph_measures.yaml"
-    - "pynets/stats/global_graph_measures.yaml"
-    - "docs/*"
-    - "tests/*"
-    - "pynets/__about__.py"
-    - "pynets/_version.py"
-    - "get_version.py"
-    - "versioneer.py"
-    - "setup.py"
-    - "*__init__*"
-    - "*__pycache__*"
-    - "*.json"
-    - "setup.cfg"
-    - "tox.ini"
-    - "requirements.txt"
-    - "README.rst"
-    - "README.md"
-    - "MANIFEST.ini"
-    - "Makefile"
-    - "Dockerfile"
-    - "CONTRIBUTING.rst"
-    - "AUTHORS.rst"
-    - "docker/*"
-    - "pynets/cli/*"
-    - "pynets/plotting/connectogram.js"
-    - "pynets/plotting/FD_graph.json"
-    - "pynets/plotting/fdg.js"
-    - "pynets/plotting/index.html"
-    - "pynets/stats/netmotifs.py"
-    - "pynets/stats/benchmarking.py"
-    - "pynets/stats/embeddings.py"
-    - "pynets/stats/prediction.py"
-    - "pynets/stats/utils.py"
-    - "pynets/core/cloud_utils.py"
-    - "pynets/registration/register.py"
-    - "pynets/core/interfaces.py"
+	- "*__init__*"
+	- "*__pycache__*"
+	- "docs/*"
+	- "*.json"
+	- "*.circleci/*"
+	- "*.github/*"
+	- "*.test_durations"
+	- "*.gitignore"
+	- "*.gitattributes"
+	- "setup.py"
+	- "setup.cfg"
+	- "tox.ini"
+	- "requirements.txt"
+	- "optional-requirements.txt"
+	- "pytest.ini"
+	- "README.rst"
+	- "README.md"
+	- "NOTICE"
+	- "MANIFEST.ini"
+	- "Makefile"
+	- "Dockerfile"
+	- "CONTRIBUTING.rst"
+	- "AUTHORS.rst"
+	- "docker/*"
+	- "licenses/*"
+	- "data/*"
+	- "get_version.py"
+	- "versioneer.py"
+	- "pynets/__about__.py"
+	- "pynets/_version.py"
+	- "pynets/__init__.py"
+	- "pynets/advanced.yaml"
+	- "pynets/citations.py"
+	- "pynets/cli/*"
+    - "pynets/core/tests/*"
+    - "pynets/core/__init__.py"
+    - "pynets/dmri/tests/*"
+    - "pynets/dmri/__init__.py"
+    - "pynets/fmri/tests/*"
+    - "pynets/fmri/__init__.py"
+    - "pynets/plotting/tests/*"
+    - "pynets/plotting/__init__.py"
+    - "pynets/registration/tests/*"
+    - "pynets/registration/__init__.py"
+    - "pynets/statistics/tests/*"
+    - "pynets/statistics/individual/*.yaml"
+    - "pynets/statistics/individual/__init__.py"
+    - "pynets/statistics/group/__init__.py"
+    - "pynets/statistics/__init__.py"
+    - "pynets/templates/__init__.py"
+    - "pynets/templates/*/*"
 
 codecov:
   token: d62ad7b3-39a6-4657-a2e3-6acf2362d36d
diff --git a/.coveragerc b/.coveragerc
index 28d1fe9e..b9b793ac 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -2,45 +2,55 @@
 omit =
 	*__init__*
 	*__pycache__*
-	tests/*
 	docs/*
 	*.json
+	*.circleci/*
+	*.github/*
+	*.test_durations
+	*.gitignore
+	*.gitattributes
 	setup.py
 	setup.cfg
 	tox.ini
 	requirements.txt
+	optional-requirements.txt
+	pytest.ini
 	README.rst
 	README.md
+	NOTICE
 	MANIFEST.ini
 	Makefile
 	Dockerfile
 	CONTRIBUTING.rst
 	AUTHORS.rst
 	docker/*
-	pynets/__about__.py
-	pynets/cli/*
-	pynets/_version.py
+	licenses/*
+	data/*
 	get_version.py
 	versioneer.py
-	pynets/plotting/connectogram.js
-	pynets/plotting/FD_graph.json
-	pynets/plotting/fdg.js
-	pynets/plotting/index.html
-	pynets/templates/*
-	pynets/rsnrefs/*
-	pynets/core/atlases/*
-	pynets/core/labelcharts/*
-	pynets/runconfig.yaml
-	pynets/stats/nodal_graph_measures.yaml
-	pynets/stats/global_graph_measures.yaml
-	pynets/stats/netmotifs.py
-	pynets/stats/benchmarking.py
-	pynets/stats/embeddings.py
-	pynets/stats/prediction.py
-    pynets/stats/utils.py
-	pynets/registration/register.py
-	pynets/core/interfaces.py
-	pynets/core/cloud_utils.py
+	pynets/__about__.py
+	pynets/_version.py
+	pynets/__init__.py
+	pynets/advanced.yaml
+	pynets/citations.py
+	pynets/cli/*
+    pynets/core/tests/*
+    pynets/core/__init__.py
+    pynets/dmri/tests/*
+    pynets/dmri/__init__.py
+    pynets/fmri/tests/*
+    pynets/fmri/__init__.py
+    pynets/plotting/tests/*
+    pynets/plotting/__init__.py
+    pynets/registration/tests/*
+    pynets/registration/__init__.py
+    pynets/statistics/tests/*
+    pynets/statistics/individual/*.yaml
+    pynets/statistics/individual/__init__.py
+    pynets/statistics/group/__init__.py
+    pynets/statistics/__init__.py
+    pynets/templates/__init__.py
+    pynets/templates/*/*
 
 [report]
 # Regexes for lines to exclude from consideration
diff --git a/.gitignore b/.gitignore
index 163e88c2..e3ff21ef 100644
--- a/.gitignore
+++ b/.gitignore
@@ -41,11 +41,11 @@ htmlcov/
 .coverage
 .coverage.*
 .cache
+.pytest_cache
+__pycache__
 nosetests.xml
 *,cover
-.hypothesis/
-tests/examples*
-tests/summary*
+data/*
 pynets/.idea/*
 .idea/*
 
diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
index aa1bd00b..09cc06c2 100644
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -30,6 +30,7 @@
       <option name="ignoredErrors">
         <list>
           <option value="N803" />
+          <option value="N806" />
         </list>
       </option>
     </inspection_tool>
diff --git a/.zenodo.json b/.zenodo.json
index 529c1ee6..3720611b 100644
--- a/.zenodo.json
+++ b/.zenodo.json
@@ -4,7 +4,6 @@
   "maintainers": [
     {
       "name": "Pisner, Derek",
-      "affiliation": "Department of Psychology, University of Texas at Austin, TX, USA",
       "orcid": "0000-0002-1228-0201"
     }
   ],
@@ -18,6 +17,7 @@
     "dmri",
     "gaussian-graphical-models",
     "ensemble-sampling",
+    "ensemble-learning",
     "networks",
     "graph-analysis",
     "connectomics",
@@ -34,6 +34,6 @@
       "scheme": "url"
     }
   ],
-  "license": "GNU GENERAL PUBLIC LICENSE",
+  "license": "GNU AFFERO GENERAL PUBLIC LICENSE",
   "upload_type": "software"
 }
diff --git a/Dockerfile b/Dockerfile
index 8819838e..5a7c4b93 100755
--- a/Dockerfile
+++ b/Dockerfile
@@ -117,6 +117,7 @@ RUN echo "FSLDIR=/usr/share/fsl/5.0" >> /home/neuro/.bashrc && \
     && pip install --upgrade pip \
     && rm -rf Miniconda3-${miniconda_version}-Linux-x86_64.sh \
     && pip install numpy requests psutil sqlalchemy importlib-metadata>=0.12 pytest pingouin>=0.3.7 imbalanced-learn>=0.8.0 \
+    && pip install --upgrade pyopenssl \
     && git clone https://github.com/dPys/multinetx.git /home/neuro/multinetx \
     && cd /home/neuro/multinetx && \
     pip install -r requirements.txt && \
diff --git a/MANIFEST.in b/MANIFEST.in
index ef9dce04..831901d2 100644
--- a/MANIFEST.in
+++ b/MANIFEST.in
@@ -14,6 +14,7 @@ recursive-include * *.html
 recursive-include * *.js
 recursive-include * *.txt
 recursive-include * *.csv
+recursive-include data *
 recursive-include pynets/cli *
 recursive-include pynets/core *
 recursive-include pynets/initializers *
@@ -30,7 +31,6 @@ recursive-include pynets/plotting *
 recursive-include pynets/statistics *
 recursive-include pynets/statistics/individual *
 recursive-include pynets/statistics/group *
-recursive-exclude tests *
 recursive-exclude * *__pycache__
 recursive-exclude * *.py[co]
 recursive-include * *.yaml
diff --git a/README.md b/README.md
index fe561c52..c87ab872 100644
--- a/README.md
+++ b/README.md
@@ -4,8 +4,9 @@ PyNets®
 [![codecov](https://codecov.io/gh/dPys/PyNets/branch/master/graph/badge.svg)](https://codecov.io/gh/dPys/PyNets?branch=master)
 [![PyPI - Version](https://img.shields.io/pypi/v/omniduct.svg)](https://pypi.org/project/pynets/)
 ![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pynets.svg)
-[![License: GPL v3](https://img.shields.io/badge/License-GPLv3-blue.svg)](https://www.gnu.org/licenses/gpl-3.0)
+[![License: AGPL v3](https://img.shields.io/badge/License-AGPL_v3-blue.svg)](https://www.gnu.org/licenses/agpl-3.0)
 [![https://www.singularity-hub.org/static/img/hosted-singularity--hub-%23e32929.svg](https://www.singularity-hub.org/static/img/hosted-singularity--hub-%23e32929.svg)](https://singularity-hub.org/collections/5228)
+[![Docker](https://badgen.net/badge/icon/docker?icon=docker&label)](https://https://docker.com/)
 [![brainlife.io/app](https://img.shields.io/badge/brainlife.io-app-green.svg)](https://brainlife.io/app/6041f75166d5ce1daf6efb55)
 
 About
@@ -20,8 +21,8 @@ docker pull dpys/pynets
 ```
 
 ## Manual
-(REQUIRES a local dependency install of [FSL](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation) version >=5.0.9, as well as an
-installation of [Python3.6+](https://www.python.org/download/releases/3.0/) with GUI programming enabled (See [tkinter](https://docs.python.org/3/library/tkinter.html#module-tkinter))
+A local dependency install of [FSL](https://fsl.fmrib.ox.ac.uk/fsl/fslwiki/FslInstallation) version >=5.0.9
+An installation of [Python3.8+](https://www.python.org/download/releases/3.0/) with GUI programming enabled (See [tkinter](https://docs.python.org/3/library/tkinter.html#module-tkinter)
 ```
 [sudo] pip install pynets [--user]
 ```
@@ -89,10 +90,10 @@ where the `-config` flag specifies that path to a .json configuration spec that
             "es": "['mean', 'median']" # Indicates the method(s) of nodal time-series signal extraction.
         },
     "dwi": { # dMRI options. If you only have structural (i.e. DWI) data, set each of the `func` options to "None"
-            "dg": "det", # The directional assumptions of tractography (e.g. deterministic, probabilistic)
+            "dg": "det", # The traversal method of tractography (e.g. deterministic, probabilistic)
             "ml": "40", # The minimum length criterion for streamlines in tractography
             "mod": "csd", # The diffusion model type
-            "tol": "8" # The tolerance distance (in the units of the streamlines, usually mm). If any node in the streamline is within this distance from the center of any voxel in the ROI, then the connection is counted as an edge"
+            "em": "8" # The tolerance distance (in the units of the streamlines, usually mm). If any node in the streamline is within this distance from the center of any voxel in the ROI, then the connection is counted as an edge"
         },
     "gen": { # These are general options that apply to all modalities
             "a":  "['BrainnetomeAtlasFan2016', 'atlas_harvard_oxford', 'destrieux2009_rois']", # Anatomical atlases to define nodes.
@@ -136,12 +137,13 @@ No problem-- you can still run pynets manually:
     -anat '/Users/dPys/PyNets/tests/examples/sub-002/ses-1/anat/ANAT_PREPROCESSED_NATIVE.nii.gz' \ # The T1w anatomical image.
     -a '/Users/dPys/.atlases/MyCustomParcellation-scale1.nii.gz' '/Users/dPys/.atlases/MyCustomParcellation-scale2.nii.gz' \ # The parcellations.
     -mod 'csd' 'csa' 'sfm' \ # The (diffusion) connectivity model(s).
-    -dg 'prob' 'det'  \ # The tractography direction-getting method.
+    -dg 'prob' 'det'  \ # The tractography traversal method.
     -mst -min_thr 0.20 -max_thr 0.80 -step_thr 0.10 # Multi-thresholding from the Minimum-Spanning Tree, with AUC graph analysis.
     -n 'Default' # The resting-state network definition to restrict node-making.
 ```
 
 ![Multiplex Layers](docs/_static/structural_functional_multiplex.png)
 ![Multiplex Glass](docs/_static/glassbrain_mplx.png)
+![Ensemble Connectome](docs/_static/omnetome.png)
 ![Yeo7](docs/_static/yeo7_mosaic.png)
-![Workflow DAG](docs/_static/graph.png)
+![Workflow DAG](docs/_static/OHBM_Poster_2020.pdf)
diff --git a/pynets/__about__.py b/pynets/__about__.py
index e7b5e93c..2290dd49 100644
--- a/pynets/__about__.py
+++ b/pynets/__about__.py
@@ -6,7 +6,7 @@
 # from ._version import get_versions
 # __version__ = get_versions()['version']
 # del get_versions
-__version__ = "1.23"
+__version__ = "1.25"
 
 __packagename__ = "pynets"
 __copyright__ = "Copyright 2017, Derek Pisner"
diff --git a/pynets/advanced.yaml b/pynets/advanced.yaml
index c73dadfd..a0606bbb 100755
--- a/pynets/advanced.yaml
+++ b/pynets/advanced.yaml
@@ -26,8 +26,8 @@ tracking:
         - False
     tracking_method: # a tracking algorithm for dmri connectome estimation. Options are: local and particle.
         - 'local'
-    tracking_samples: # Indicates the number of cumulative streamline samples for each tractogram. *Note that we should keep this relatively low since total streamlines will actually sum cumulatively across a given connectome ensemble (e.g. 100 connectomes x 30,000 = 3 million streamlines!)
-        - 30000
+    tracking_samples: # Indicates the number of cumulative streamline samples for each tractogram. *Note that we should keep this relatively low since total streamlines will actually sum cumulatively across a given connectome ensemble (e.g. 100 connectomes x 20,000 = 2 million streamlines!)
+        - 20000
     DSN: # Experimental option. Direct Streamline Normalization attempts to normalize streamlines (i.e. post-reconstruction) to a morphologically standardized scaling (i.e. range of fiber lengths) specific to the template used. This may help to facilitate group/population analysis.
         - False
     maxcrossing: # Maximum crossing fibers per voxel for probabilistic tractography
@@ -74,32 +74,34 @@ template: # `MNI152_T1` is the default and, along with `colin27` is provided by
 #    - 'CN200'
 hub_detection_method: # Valid inputs are richclub, eigenvector centrality, betweenness centrality.
     - 'betweenness'
+min_nodes: # Minimum allowable number of nodes for any connected component subgraph
+    - 1
 graph_analysis_timeout: # Number of seconds before timing out a graph analysis algorithm
     - 240
 graph_analysis_engine: # Either graph_tool / gt or networkx / nx. The former requires an additional installation of graph_tool (See https://graph-tool.skewed.de/).
     - 'nx'
 embed:
     - 'ASE'
-    - 'OMNI'
+#    - 'OMNI'
 #    - 'MASE'
     - 'eigenvector'
 #    - 'degree'
     - 'betweenness'
 #    - 'clustering'
 metaparams_func:
-    - 'rsn'
-    - 'res'
+    - 'subnet'
+    - 'granularity'
     - 'model'
     - 'hpass'
-    - 'extract'
+    - 'signal'
     - 'smooth'
 metaparams_dwi:
-    - 'rsn'
-    - 'res'
+    - 'subnet'
+    - 'granularity'
     - 'model'
-    - 'directget'
+    - 'traversal'
     - 'minlength'
-    - 'tol'
+    - 'error_margin'
 nilearn_parc_atlases:
     - 'atlas_harvard_oxford'
     - 'atlas_aal'
@@ -176,6 +178,7 @@ available_models:
       - 'AdaptiveQuicGraphicalLasso'
     struct_models:
       - 'csa'
+      - 'mcsd'
       - 'csd'
       - 'ten'
       - 'sfm'
@@ -214,29 +217,29 @@ plotting:
               - 'RdBu_r'
 resource_dict: # Nipype workflow resource settings
       - 'pass_meta_ins_node':
-        - (1, 1)
+        - (0.5, 0.5)
       - 'pass_meta_outs_node':
         - (1, 2)
       - 'pass_meta_ins_multi_node':
-        - (1, 1)
+        - (0.5, 0.5)
       - 'pass_meta_outs_multi_node':
         - (1, 2)
       - 'pass_meta_ins_func_node':
-        - (1, 1)
+        - (0.5, 0.5)
       - 'pass_meta_outs_func_node':
         - (1, 2)
       - 'pass_meta_ins_struct_node':
-        - (1, 1)
+        - (0.5, 0.5)
       - 'pass_meta_outs_struct_node':
         - (1, 2)
       - 'fetch_nodes_and_labels_node':
         - (4, 8)
       - 'save_nifti_parcels_node':
-        - (4, 4)
+        - (1, 2)
       - 'gtab_node':
-        - (1, 1)
+        - (0.5, 0.5)
       - 'save_coords_and_labels_node':
-        - (1, 1)
+        - (0.5, 0.5)
       - 'orient_reslice_func_node':
         - (2, 4)
       - 'orient_reslice_mask_node':
@@ -254,11 +257,11 @@ resource_dict: # Nipype workflow resource settings
       - 'orient_reslice_dwi_node':
         - (2, 4)
       - 'get_anisopwr_node':
-        - (2, 2)
+        - (1.5, 1.5)
       - 'extract_ts_node':
         - (4, 8)
       - 'extract_ts_info_node':
-        - (1, 2)
+        - (1, 1)
       - 'clustering_node':
         - (4, 8)
       - 'get_conn_matrix_node':
@@ -276,11 +279,11 @@ resource_dict: # Nipype workflow resource settings
       - 'RegisterParcellation2MNIFunc_node':
         - (2, 4)
       - 'get_fa_node':
-        - (2, 2)
+        - (1.5, 1.5)
       - 'run_tracking_node':
         - (4, 8)
       - 'dsn_node':
-        - (1, 2)
+        - (1, 1)
       - 'plot_all_node':
         - (1, 2)
       - 'streams2graph_node':
@@ -324,7 +327,7 @@ resource_dict: # Nipype workflow resource settings
       - 'clust_join_node':
         - (1, 1)
       - 'NetworkAnalysis':
-        - (1, 4)
+        - (1, 3)
       - 'AggregateOutputs':
         - (1, 3)
       - 'load_mat_node':
@@ -359,7 +362,7 @@ execution_dict: # Nipype workflow global settings
     - 'raise_insufficient':
         - False
     - 'poll_sleep_duration':
-        - 0.2
+        - 0.1
     - 'hash_method':
         - 'timestamp'
     - 'local_hash_check':
diff --git a/pynets/cli/__init__.py b/pynets/cli/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/cli/pynets_benchmark.py b/pynets/cli/pynets_benchmark.py
old mode 100644
new mode 100755
diff --git a/pynets/cli/pynets_bids.py b/pynets/cli/pynets_bids.py
old mode 100644
new mode 100755
index 274220bc..814bae51
--- a/pynets/cli/pynets_bids.py
+++ b/pynets/cli/pynets_bids.py
@@ -856,8 +856,6 @@ def main():
 
     sys.exit(0)
 
-    return
-
 
 if __name__ == "__main__":
     import warnings
diff --git a/pynets/cli/pynets_cloud.py b/pynets/cli/pynets_cloud.py
old mode 100644
new mode 100755
index 2730a6ae..7c88bb29
--- a/pynets/cli/pynets_cloud.py
+++ b/pynets/cli/pynets_cloud.py
@@ -154,7 +154,7 @@ def crawl_bucket(bucket, path, jobdir):
         all_seshs = [re.findall(sesh_pattern, obj) for obj in all_seshfiles]
         sesh = list(set([i for i in flatten(all_seshs)]))
 
-        if sesh != []:
+        if not isinstance(sesh, list):
             seshs[subj] = sesh
             print(f"{subj} added to sessions.")
         else:
diff --git a/pynets/cli/pynets_config.py b/pynets/cli/pynets_config.py
old mode 100644
new mode 100755
diff --git a/pynets/cli/pynets_predict.py b/pynets/cli/pynets_predict.py
old mode 100644
new mode 100755
diff --git a/pynets/cli/pynets_run.py b/pynets/cli/pynets_run.py
index c6e2ba38..b75e94af 100755
--- a/pynets/cli/pynets_run.py
+++ b/pynets/cli/pynets_run.py
@@ -5,7 +5,6 @@
 Copyright (C) 2017
 """
 import warnings
-
 warnings.filterwarnings("ignore")
 
 
@@ -186,6 +185,7 @@ def get_parser():
             "csa",
             "csd",
             "sfm",
+            "mcsd",
         ],
         help="(hyperparameter): Specify connectivity estimation model. "
              "For fMRI, possible models include: corr for correlation, "
@@ -194,7 +194,8 @@ def get_parser():
              "installed (https://github.com/skggm/skggm), then "
              "QuicGraphicalLasso, QuicGraphicalLassoCV, "
              "QuicGraphicalLassoEBIC, and AdaptiveQuicGraphicalLasso. For "
-             "dMRI, current models include csa, csd, and sfm.\n",
+             "dMRI, current models include csa, csd, sfm, and mcsd (for "
+             "multishell data).\n",
     )
     parser.add_argument(
         "-a",
@@ -433,15 +434,17 @@ def get_parser():
     parser.add_argument(
         "-p",
         metavar="Pruning Strategy",
-        default=3,
+        default=1,
         nargs=1,
         choices=["0", "1", "2", "3"],
-        help="Include this flag to (1) prune the graph of any "
-             "isolated + fully disconnected nodes (i.e. anti-fragmentation),"
-             " (2) prune the graph of all but hubs as defined by any of a "
-             "variety of definitions (see ruconfig.yaml), or (3) retain only "
-             "the largest connected component subgraph. Default is no pruning."
-             " Include `-p 1` to enable fragmentation-protection.\n",
+        help="(Optional) Include this flag to (0) retain isolated nodes "
+             "(1) retain only connected components "
+             "of a minimal size. (2) prune the graph of "
+             "all but hubs as defined by any of a "
+             "variety of definitions (see advanced.yaml), or (3) retain only "
+             "the largest connected component subgraph. Default is (1), "
+             "which is equivalent to defragmenting only isolated nodes, "
+             "unless the minimum threshold is >1 (see advanced.yaml).\n",
     )
     parser.add_argument(
         "-df",
@@ -2166,6 +2169,11 @@ def build_workflow(args, retval):
                       f"absolute paths.")
                 retval["return_code"] = 1
                 return retval
+
+    # Force Fisher's normalization for correlation-like models
+    if (conn_model == "corr") or (conn_model == "partcorr"):
+        norm = 7
+
     print(Style.RESET_ALL)
     print(
         "\n-------------------------------------------------------------------"
@@ -2382,7 +2390,149 @@ def init_wf_single_subject(
         signal_list,
         outdir,
     ):
-        """A function interface for generating a single-subject workflow"""
+        """
+        A function interface for generating a single-subject workflow
+
+        Parameters
+        ----------
+        ID : str
+            A subject ID or other unique identifier
+        func_file : str
+            File path to a 4D Nifti1Image containing fMRI data
+        atlas : str
+            Name of atlas parcellation used
+        subnet : str
+            Resting-state network based on Yeo-7 and Yeo-17 naming
+            (e.g. 'Default') used to filter nodes in the study of brain
+            subgraphs
+        node_radius : int
+            spherical centroid node size in the case that coordinate-based
+            centroids are used as ROI's
+        roi : str
+            File path to binarized/boolean region-of-interest Nifti1Image file
+        thr : float
+            A value, between 0 and 1, to threshold the graph using any variety
+            of methods triggered through other options.
+        parcellation : str
+            File path to atlas parcellation Nifti1Image in MNI template space.
+        multi_nets  list
+            List of Yeo RSN's specified in workflow(s)
+        conn_model : str
+            Connectivity estimation model (e.g. corr for correlation, cov for
+            covariance, sps for precision covariance, partcorr for partial
+            correlation). sps type is used by default.
+        dens_thresh : bool
+            Indicates whether a target graph density is to be used as the basis
+            for thresholding.
+        conf : str
+            File path to a confound regressor file for reduce noise in the
+            time-series when extracting from ROI's.
+        plot_switch : bool
+            Activate summary plotting (histograms, ROC curves, etc.)
+        dwi_file : str
+            File path to diffusion weighted image.
+        multi_thr :
+        multi_atlas :
+        min_thr : int
+            If performing multi-thresholding, a minimum threshold
+        max_thr : int
+            If performing multi-thresholding, a maximum threshold
+        step_thr : int
+            If performing multi-thresholding, a threshold interval size
+        anat_file :
+        parc : bool
+            Indicates whether to use parcels instead of coordinates as ROI nodes
+        ref_txt :
+        procmem :
+        k : int
+            Number of clusters that will be generated
+        clust_mask : str
+            File path to a 3D NIFTI file containing a mask, which restricts the
+            voxels used in the clustering
+        k_list :
+        k_clustering :
+        user_atlas_list :
+        clust_mask_list :
+        prune : bool
+            Indicates whether to prune final graph of disconnected
+            nodes/isolates.
+        node_radius_list :
+        graph :
+        conn_model_list :
+        min_span_tree : bool
+             Indicates whether local thresholding from the Minimum Spanning
+             Tree should be used.
+        verbose :
+        plugin_type :
+        use_parcel_naming :
+        multi_graph :
+        smooth : int
+            Smoothing width (mm fwhm) to apply to time-series when extracting
+            signal from ROI's.
+        smooth_list :
+        disp_filt : bool
+            Indicates whether local thresholding using a disparity filter and
+            'backbone network' should be used.
+        clust_type : str
+            Type of clustering to be performed (e.g. 'ward', 'kmeans',
+            'complete', 'average')
+        clust_type_list :
+        mask : str
+             File path to a 3D NIFTI file containing a mask, which restricts
+             the voxels used in the analysis.
+        norm : int
+            Indicates method of normalizing resulting graph.
+        binary : bool
+            Indicates whether to binarize resulting graph edges to form an
+            unweighted graph.
+        fbval :
+        fbvec :
+        curv_thr_list : list
+            List of integer curvature thresholds used to perform ensemble
+            tracking
+        step_list : list
+            List of float step-sizes used to perform ensemble tracking
+        track_type : str
+            Tracking algorithm used (e.g. 'local' or 'particle').
+        min_length : int
+            Minimum fiber length threshold in mm to restrict tracking.
+        maxcrossing : int
+            Maximum number if diffusion directions that can be assumed per voxel
+        error_margin : int
+            Euclidean margin of error for classifying a streamline as a
+            connection to an ROI. Default is 2 voxels.
+        traversal : str
+            The statistical approach to tracking. Options are:
+            det (deterministic), closest (clos), boot (bootstrapped), and
+            prob (probabilistic)
+        tiss_class : str
+            Tissue classification method
+        runtime_dict :
+        execution_dict :
+            Nipype workflow global settings
+        embed :
+        multi_traversal :
+        multimodal : bool
+            Indicates whether multiple modalities of input data have been
+            specified.
+        hpass : bool
+             High-pass filter values (Hz) to apply to node-extracted time-series
+        hpass_list :
+        vox_size :
+        multiplex :
+        waymask :
+        local_corr : str
+             Type of local connectivity to use as the basis for clustering
+             methods. Options are tcorr or scorr. Default is tcorr
+        min_length_list :
+        error_margin_list :
+        signal : str
+            The name of a valid function used to reduce the time-series region
+            extraction
+        signal_list :
+        outdir : str
+            Path to base derivatives directory
+        """
         import warnings
 
         warnings.filterwarnings("ignore")
@@ -2579,11 +2729,7 @@ def init_wf_single_subject(
             name="NetworkAnalysis",
             iterfield=[
                 "ID",
-                "subnet",
-                "thr",
-                "conn_model",
                 "est_path",
-                "roi",
                 "prune",
                 "norm",
                 "binary",
@@ -2689,11 +2835,7 @@ def init_wf_single_subject(
                         net_mets_node,
                         [
                             ("est_path_iterlist", "est_path"),
-                            ("network_iterlist", "subnet"),
-                            ("thr_iterlist", "thr"),
                             ("ID_iterlist", "ID"),
-                            ("conn_model_iterlist", "conn_model"),
-                            ("roi_iterlist", "roi"),
                             ("prune_iterlist", "prune"),
                             ("norm_iterlist", "norm"),
                             ("binary_iterlist", "binary"),
@@ -2816,8 +2958,152 @@ def wf_multi_subject(
         signal_list,
         outdir,
     ):
-        """A function interface for generating multiple single-subject
-        workflows -- i.e. a 'multi-subject' workflow"""
+        """
+        A function interface for generating multiple single-subject
+        workflows -- i.e. a 'multi-subject' workflow
+
+        Parameters
+        ----------
+        ID : str
+            A subject ID or other unique identifier
+        func_file_list : str
+            List of file paths to 4D Nifti1Images containing fMRI data
+        dwi_file_list
+        mask_list
+        fbvec_list
+        fbval_list
+        conf_list
+        anat_file_list
+        atlas : str
+            name of atlas parcellation used
+        network : str
+            Resting-state network based on Yeo-7 and Yeo-17 naming
+            (e.g. 'Default') used to filter nodes in the study of brain subgraphs
+        node_radius : int
+            spherical centroid node size in the case that coordinate-based
+            centroids are used as ROI's
+        roi : str
+            File path to binarized/boolean region-of-interest Nifti1Image file
+        thr : float
+            A value, between 0 and 1, to threshold the graph using any variety
+            of methods triggered through other options
+        parcellation : str
+        multi_nets : list
+            List of Yeo RSN's specified in workflow(s)
+        conn_model : str
+            Connectivity estimation model (e.g. corr for correlation, cov for
+            covariance, sps for precision covariance, partcorr for partial
+            correlation). sps type is used by default
+        dens_thresh : bool
+            Indicates whether a target graph density is to be used as the basis
+            for thresholding
+        conf : str
+            File path to a confound regressor file for reduce noise in the
+            time-series when extracting from ROI's
+        plot_switch : bool
+            Activate summary plotting (histograms, ROC curves, etc.)
+        dwi_file : str
+            File path to diffusion weighted image
+        multi_thr
+        multi_atlas
+        min_thr
+        max_thr
+        step_thr
+        anat_file
+        parc : bool
+            Indicates whether to use parcels instead of coordinates as ROI nodes
+        ref_txt
+        procmem
+        k : int
+            Number of clusters that will be generated
+        clust_mask : str
+            File path to a 3D NIFTI file containing a mask, which restricts the
+            voxels used in the clustering
+        k_list
+        k_clustering
+        user_atlas_list
+        clust_mask_list
+        prune : bool
+            Indicates whether to prune final graph of disconnected
+            nodes/isolates
+        node_radius_list
+        conn_model_list
+        min_span_tree : bool
+             Indicates whether local thresholding from the Minimum Spanning
+             Tree should be used
+        verbose
+        plugin_type
+        use_parcel_naming
+        multi_subject_graph
+        multi_subject_multigraph
+        smooth : int
+            Smoothing width (mm fwhm) to apply to time-series when extracting
+            signal from ROI's
+        smooth_list
+        disp_filt : bool
+            Indicates whether local thresholding using a disparity filter and
+            'backbone network' should be used
+        clust_type : str
+            Type of clustering to be performed (e.g. 'ward', 'kmeans',
+            'complete', 'average')
+        clust_type_list
+        mask : str
+             File path to a 3D NIFTI file containing a mask, which restricts
+             the voxels used in the analysis
+        norm : int
+            Indicates method of normalizing resulting graph
+        binary : bool
+            Indicates whether to binarize resulting graph edges to form an
+            unweighted graph
+        fbval
+        fbvec
+        curv_thr_list : list
+            List of integer curvature thresholds used to perform ensemble
+            tracking
+        step_list : list
+            List of float step-sizes used to perform ensemble tracking
+        track_type : str
+            Tracking algorithm used (e.g. 'local' or 'particle'
+        min_length : int
+            Minimum fiber length threshold in mm to restrict tracking
+        maxcrossing : int
+            Maximum number if diffusion directions that can be assumed per voxel
+        error_margin : int
+            Euclidean margin of error for classifying a streamline as a
+            connection to an ROI. Default is 2 voxels
+        traversal : str
+            The statistical approach to tracking. Options are:
+            det (deterministic), closest (clos), boot (bootstrapped), and
+            prob (probabilistic)
+        tiss_class : str
+            Tissue classification method
+        runtime_dict
+        execution_dict :
+            Nipype workflow global settings
+        embed
+        multi_traversal
+        multimodal : bool
+            Indicates whether multiple modalities of input data have been
+            specified
+        hpass : bool
+             High-pass filter values (Hz) to apply to node-extracted time-series
+        hpass_list
+        vox_size
+        multiplex
+        waymask
+        local_corr : str
+             Type of local connectivity to use as the basis for clustering
+             methods. Options are tcorr or scorr. Default is tcorr
+        min_length_list
+        error_margin_list
+        signal : str
+            The name of a valid function used to reduce the time-series region
+            extraction
+        signal_list
+        outdir : str
+            Path to base derivatives directory
+
+        """
         import warnings
 
         warnings.filterwarnings("ignore")
@@ -3548,7 +3834,8 @@ def main():
     mp.set_start_method("forkserver")
     with mp.Manager() as mgr:
         retval = mgr.dict()
-        p = mp.Process(target=build_workflow, args=(args, retval))
+        p = mp.Process(target=build_workflow,
+                       args=(args, retval))
         p.start()
         p.join()
 
diff --git a/pynets/core/__init__.py b/pynets/core/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/core/cloud.py b/pynets/core/cloud.py
old mode 100644
new mode 100755
diff --git a/pynets/core/nodemaker.py b/pynets/core/nodemaker.py
old mode 100644
new mode 100755
index 6b94a7a7..2fcf6bac
--- a/pynets/core/nodemaker.py
+++ b/pynets/core/nodemaker.py
@@ -86,19 +86,16 @@ def create_parcel_atlas(parcel_list, label_intensities=None):
         parcel_list = [i for i in parcel_list]
 
     template_image = parcel_list[0]
+    template_affine = template_image.affine
 
-    parcel_list_exp = iter_img([
+    concatted_parcels = concat_imgs(iter_img([
         new_img_like(
             template_image,
             np.zeros(
                 template_image.shape,
-                dtype=bool))] + parcel_list)
-
+                dtype=bool))] + parcel_list), dtype=np.float16)
     del parcel_list
-    gc.collect()
-
-    concatted_parcels = concat_imgs(parcel_list_exp, dtype=np.float16)
-    del parcel_list_exp
+    template_image.uncache()
     gc.collect()
 
     if label_intensities is not None:
@@ -121,13 +118,11 @@ def create_parcel_atlas(parcel_list, label_intensities=None):
 
     for out in outs:
         parcel_sum[parcel_sum == out] = 0
-    net_parcels_map_nifti = nib.Nifti1Image(
-        parcel_sum, affine=template_image.affine)
 
-    del parcel_sum
+    del outs
     gc.collect()
 
-    return net_parcels_map_nifti, parcel_values
+    return nib.Nifti1Image(parcel_sum, affine=template_affine), parcel_values
 
 
 def fetch_nilearn_atlas_coords(atlas):
@@ -516,8 +511,8 @@ def get_node_membership(
         rsn_img, template_img, interpolation="nearest"
     )
 
-    RSN_ix = list(ref_dict.keys())[list(ref_dict.values()).index(subnet)]
-    RSNmask = np.asarray(rsn_img_res.dataobj)[:, :, :, RSN_ix]
+    RSNmask = np.asarray(rsn_img_res.dataobj)[:, :, :,
+              list(ref_dict.keys())[list(ref_dict.values()).index(subnet)]]
 
     coords_vox = []
     for i in coords:
@@ -853,8 +848,6 @@ def coords_masker(roi, coords, labels, error, vox_size='2mm'):
     import sys
     from pynets.core.utils import load_runconfig
 
-    mask_img = math_img("img > 0", img=nib.load(roi))
-
     hardcoded_params = load_runconfig()
     try:
         template_name = hardcoded_params["template"][0]
@@ -882,11 +875,13 @@ def coords_masker(roi, coords, labels, error, vox_size='2mm'):
                   f"installed?")
 
     mask_img_res = resample_to_img(
-        mask_img, template_img, interpolation='nearest'
+        math_img("img > 0", img=nib.load(roi)), template_img,
+        interpolation='nearest'
     )
 
     mask_data = mask_img_res.get_fdata().astype('bool')
     mask_aff = mask_img_res.affine
+    mask_img_res.uncache()
 
     x_vox = np.diagonal(mask_aff[:3, 0:3])[0]
     y_vox = np.diagonal(mask_aff[:3, 0:3])[1]
@@ -979,16 +974,13 @@ def get_names_and_coords_of_parcels(parcellation, background_label=0):
             "\nUser-specified atlas input not found! Check that "
             "the file(s) specified with the -a flag exist(s)")
 
-    atlas = parcellation.split("/")[-1].split(".")[0]
-
     [coords, label_intensities] = find_parcellation_cut_coords(
         parcellation, background_label, return_label_names=True
     )
     print(f"Parcel intensities:\n{label_intensities}")
 
-    par_max = len(coords)
-
-    return coords, atlas, par_max, label_intensities
+    return coords, parcellation.split("/")[-1].split(".")[0], len(coords), \
+           label_intensities
 
 
 def gen_img_list(parcellation):
@@ -1033,18 +1025,11 @@ def gen_img_list(parcellation):
             bna_data_for_coords_uniq[idx].astype("uint16")
         img_stack.append(roi_img.astype("uint16"))
     img_stack = np.array(img_stack)
-    del bna_data
-
-    img_list = []
-    for idy in range(par_max):
-        img_list.append(new_img_like(bna_img, img_stack[idy]))
-
-    del img_stack
-
-    bna_img.uncache()
+    del bna_data, bna_data_for_coords_uniq
     gc.collect()
 
-    return iter_img(img_list)
+    return iter_img([new_img_like(bna_img, img_stack[idy]) for idy in
+                     range(par_max)])
 
 
 def enforce_hem_distinct_consecutive_labels(parcellation, label_names=None,
@@ -1078,9 +1063,11 @@ def enforce_hem_distinct_consecutive_labels(parcellation, label_names=None,
     # Grab number of unique values in 3d image
     unique_labels = set(np.unique(labels_data)) - set([background_label])
     x, y, z = coord_transform(0, 0, 0, np.linalg.inv(labels_affine))
+
     new_labs = []
     if label_names is not None:
         new_lab_names = []
+
     ix = 0
     for lab in unique_labels:
         cur_dat = labels_data == lab
@@ -1351,11 +1338,9 @@ def parcel_naming(coords, vox_size):
                                                          f"/templates/atlases/"
                                                          f"{label_atlas}"
                                                          f".nii.gz")
-
-        label_img = nib.load(label_img_path)
-
         label_img_res = resample_to_img(
-            label_img, template_img, interpolation="nearest", copy=False
+            nib.load(label_img_path), template_img,
+            interpolation="nearest", copy=False
         )
         label_img_dict[label_atlas]['affine'] = label_img_res.affine
         label_img_dict[label_atlas]['data'] = np.asarray(
@@ -1598,7 +1583,7 @@ def node_gen(coords, parcel_list, labels, dir_path, ID, parc, atlas,
     if isinstance(parcel_list, str):
         parcel_list_img = nib.load(parcel_list)
         parcel_list = iter_img([index_img(parcel_list_img, i) for i in
-                       range(parcel_list_img.shape[-1])])
+                                range(parcel_list_img.shape[-1])])
 
     if any(isinstance(sub, tuple) for sub in labels):
         label_intensities = [i[1] for i in labels]
diff --git a/pynets/core/thresholding.py b/pynets/core/thresholding.py
old mode 100644
new mode 100755
diff --git a/pynets/core/utils.py b/pynets/core/utils.py
old mode 100644
new mode 100755
index 63aab6ac..98ff6c86
--- a/pynets/core/utils.py
+++ b/pynets/core/utils.py
@@ -1243,24 +1243,37 @@ def check_est_path_existence(est_path_list):
 
 
 def load_runconfig(location=None):
-    import pkg_resources
+    import time
+    import psutil
     import yaml
-    import tempfile
-    import shutil
-    import os
-
-    fd, temp_path = tempfile.mkstemp()
+    import pkg_resources
 
     if not location:
         location = pkg_resources.resource_filename("pynets", "advanced.yaml")
 
-    shutil.copy2(location, temp_path)
-    with open(temp_path, mode='r+') as stream:
-        hardcoded_params = yaml.load(stream, Loader=yaml.FullLoader)
-    stream.close()
-    os.remove(temp_path)
-    del stream
-    return hardcoded_params
+    # asynchronous config parsing
+    def proc_access(location, proc):
+        try:
+            return [location == f for f in proc.open_files()]
+        except psutil.NoSuchProcess as e:
+            # Catches race condition
+            return [False]
+        except psutil.AccessDenied as e:
+            # If we're not root/admin sometimes we can't query processes
+            return [False]
+
+    while sum(list(flatten([proc_access(location, p) for p in
+         psutil.process_iter(attrs=['name']) if ('python' in p.info['name'])
+                                                and p.is_running() and
+                                                p.username() != 'root']))
+              ) > 0:
+        time.sleep(1)
+
+    with open(location, mode='r') as f:
+        stream = f.read()
+    f.close()
+
+    return yaml.load(stream, Loader=yaml.FullLoader)
 
 
 def save_coords_and_labels_to_json(coords, labels, dir_path,
diff --git a/pynets/core/workflows.py b/pynets/core/workflows.py
old mode 100644
new mode 100755
index aef2620a..6d840db3
--- a/pynets/core/workflows.py
+++ b/pynets/core/workflows.py
@@ -1082,7 +1082,7 @@ def workflow_selector(
             if 'OMNI' in embedding_methods:
                 omni_embedding_node_func = pe.Node(
                     niu.Function(
-                        input_names=["est_path_iterlist", "ID"],
+                        input_names=["est_path_iterlist"],
                         output_names=["out_paths_dwi", "out_paths_func"],
                         function=spectral.build_omnetome,
                     ),
@@ -1096,14 +1096,12 @@ def workflow_selector(
                             omni_embedding_node_func,
                             [("est_path_iterlist", "est_path_iterlist")],
                         ),
-                        (meta_inputnode,
-                         omni_embedding_node_func, [("ID", "ID")])
                     ]
                 )
             if 'ASE' in embedding_methods:
                 ase_embedding_node_func = pe.Node(
                     niu.Function(
-                        input_names=["est_path_iterlist", "ID"],
+                        input_names=["est_path_iterlist"],
                         output_names=["out_paths"],
                         function=spectral.build_asetomes,
                     ),
@@ -1117,8 +1115,6 @@ def workflow_selector(
                             ase_embedding_node_func,
                             [("est_path_iterlist", "est_path_iterlist")],
                         ),
-                        (meta_inputnode, ase_embedding_node_func,
-                         [("ID", "ID")]),
                     ]
                 )
     if dwi_file and not func_file:
@@ -1145,7 +1141,7 @@ def workflow_selector(
             if 'OMNI' in embedding_methods:
                 omni_embedding_node_struct = pe.Node(
                     niu.Function(
-                        input_names=["est_path_iterlist", "ID"],
+                        input_names=["est_path_iterlist"],
                         output_names=["out_paths_dwi", "out_paths_func"],
                         function=spectral.build_omnetome,
                     ),
@@ -1159,14 +1155,12 @@ def workflow_selector(
                             omni_embedding_node_struct,
                             [("est_path_iterlist", "est_path_iterlist")],
                         ),
-                        (meta_inputnode, omni_embedding_node_struct,
-                         [("ID", "ID")])
                     ]
                 )
             if 'ASE' in embedding_methods:
                 ase_embedding_node_struct = pe.Node(
                     niu.Function(
-                        input_names=["est_path_iterlist", "ID"],
+                        input_names=["est_path_iterlist"],
                         output_names=["out_paths"],
                         function=spectral.build_asetomes,
                     ),
@@ -1180,15 +1174,13 @@ def workflow_selector(
                             ase_embedding_node_struct,
                             [("est_path_iterlist", "est_path_iterlist")],
                         ),
-                        (meta_inputnode, ase_embedding_node_struct,
-                         [("ID", "ID")]),
                     ]
                 )
     if multimodal is True:
         # print("Multiplex connectome modeling is temporarily unsupported.")
         mase_embedding_node = pe.Node(
             niu.Function(
-                input_names=["est_path_iterlist", "ID"],
+                input_names=["est_path_iterlist"],
                 output_names=["out_paths"],
                 function=spectral.build_masetome,
             ),
@@ -1222,7 +1214,7 @@ def workflow_selector(
                 build_multigraphs
             build_multigraphs_node = pe.Node(
                 niu.Function(
-                    input_names=["est_path_iterlist", "ID"],
+                    input_names=["est_path_iterlist"],
                     output_names=[
                         "multigraph_list_all",
                         "graph_path_list_top",
@@ -1242,7 +1234,6 @@ def workflow_selector(
                         build_multigraphs_node,
                         [("est_path_iterlist", "est_path_iterlist")],
                     ),
-                    (meta_inputnode, build_multigraphs_node, [("ID", "ID")]),
                 ]
             )
 
@@ -1294,7 +1285,6 @@ def workflow_selector(
                             mase_embedding_node,
                             [("graph_path_list_top", "est_path_iterlist")],
                         ),
-                        (meta_inputnode, mase_embedding_node, [("ID", "ID")]),
                     ]
                 )
 
@@ -1424,10 +1414,12 @@ def dmri_connectometry(
     if template_name == "MNI152_T1" or template_name == "colin27" or \
             template_name == "CN200":
         template = pkg_resources.resource_filename(
-            "pynets", f"templates/standard/{template_name}_brain_{vox_size}.nii.gz"
+            "pynets", f"templates/standard/{template_name}_brain_"
+                      f"{vox_size}.nii.gz"
         )
         template_mask = pkg_resources.resource_filename(
-            "pynets", f"templates/standard/{template_name}_brain_mask_{vox_size}.nii.gz"
+            "pynets", f"templates/standard/{template_name}_brain_mask_"
+                      f"{vox_size}.nii.gz"
         )
         utils.check_template_loads(template, template_mask, template_name)
     else:
diff --git a/pynets/dmri/__init__.py b/pynets/dmri/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/dmri/estimation.py b/pynets/dmri/estimation.py
index a59e4cb4..950b648f 100755
--- a/pynets/dmri/estimation.py
+++ b/pynets/dmri/estimation.py
@@ -311,7 +311,8 @@ def csd_mod_est(gtab, data, B0_mask, sh_order=8):
     return csd_mod.astype("float32"), model
 
 
-def mcsd_mod_est(gtab, data, B0_mask, gm_in_dwi, vent_csf_in_dwi, sh_order=8):
+def mcsd_mod_est(gtab, data, B0_mask, wm_in_dwi, gm_in_dwi, vent_csf_in_dwi,
+                 sh_order=8, roi_radii=10):
     """
     Estimate a Constrained Spherical Deconvolution (CSD) model from dwi data.
 
@@ -350,56 +351,78 @@ def mcsd_mod_est(gtab, data, B0_mask, gm_in_dwi, vent_csf_in_dwi, sh_order=8):
     """
     import dipy.reconst.dti as dti
     from nilearn.image import math_img
-    from dipy.reconst.csdeconv import auto_response
-    from dipy.reconst.mcsd import MultiShellDeconvModel, \
-        multi_shell_fiber_response
+    from dipy.core.gradients import unique_bvals_tolerance
+    from dipy.reconst.mcsd import (mask_for_response_msmt,
+                                   response_from_mask_msmt,
+                                   multi_shell_fiber_response,
+                                   MultiShellDeconvModel)
 
     print("Reconstructing using MCSD...")
+
     B0_mask_data = np.nan_to_num(np.asarray(
         nib.load(B0_mask).dataobj)).astype("bool")
 
-    # Construct the  DTI model
-    tenmodel = dti.TensorModel(gtab)
-
-    # fit the denoised data with DTI model
-    tenfit = tenmodel.fit(data)
-
-    # obtain the FA and MD metrics
-    FA = tenfit.fa
-    MD = tenfit.md
-
     # Load tissue maps and prepare tissue classifier
-    gm_mask_img = math_img("img > 0.95", img=gm_in_dwi)
+    gm_mask_img = math_img("img > 0.10", img=gm_in_dwi)
     gm_data = np.asarray(gm_mask_img.dataobj, dtype=np.float32)
-    vent_csf_in_dwi_img = math_img("img > 0.01", img=vent_csf_in_dwi)
+
+    wm_mask_img = math_img("img > 0.15", img=wm_in_dwi)
+    wm_data = np.asarray(wm_mask_img.dataobj, dtype=np.float32)
+
+    vent_csf_in_dwi_img = math_img("img > 0.50", img=vent_csf_in_dwi)
     vent_csf_in_dwi_data = np.asarray(vent_csf_in_dwi_img.dataobj,
                                       dtype=np.float32)
 
-    indices_csf = np.where(((FA < 0.2) & (vent_csf_in_dwi_data > 0.95)))
-    indices_gm = np.where(((FA < 0.2) & (gm_data > 0.95)))
+    # Fit a simple DTI model
+    tenfit = dti.TensorModel(gtab).fit(data)
+
+    # Obtain the FA and MD metrics
+    FA = tenfit.fa
+    MD = tenfit.md
+
+    indices_csf = np.where(((FA < 0.2) & (vent_csf_in_dwi_data > 0.50)))
+    indices_gm = np.where(((FA < 0.2) & (gm_data > 0.10)))
+    indices_wm = np.where(((FA >= 0.2) & (wm_data > 0.15)))
 
     selected_csf = np.zeros(FA.shape, dtype='bool')
     selected_gm = np.zeros(FA.shape, dtype='bool')
+    selected_wm = np.zeros(FA.shape, dtype='bool')
 
     selected_csf[indices_csf] = True
     selected_gm[indices_gm] = True
-
-    csf_md = np.nanmean(MD[selected_csf])
-    gm_md = np.nanmean(MD[selected_gm])
-
-    response, ratio = auto_response(gtab, data, roi_radius=10,
-                                    fa_thr=0.7)
-
-    response_mcsd = multi_shell_fiber_response(sh_order=sh_order,
-                                               bvals=gtab.bvals,
-                                               evals=response[0], csf_md=csf_md,
-                                               gm_md=gm_md)
-
-    model = MultiShellDeconvModel(gtab, response_mcsd)
-
+    selected_wm[indices_wm] = True
+
+    mask_wm, mask_gm, mask_csf = mask_for_response_msmt(
+        gtab, data, roi_radii=roi_radii,
+        wm_fa_thr=np.nanmean(FA[selected_wm]),
+        gm_fa_thr=np.nanmean(FA[selected_gm]),
+        csf_fa_thr=np.nanmean(FA[selected_csf]),
+        gm_md_thr=np.nanmean(MD[selected_gm]),
+        csf_md_thr=np.nanmean(MD[selected_csf]))
+
+    mask_wm *= wm_data.astype('int64')
+    mask_gm *= gm_data.astype('int64')
+    mask_csf *= vent_csf_in_dwi_data.astype('int64')
+
+    # nvoxels_wm = np.sum(mask_wm)
+    # nvoxels_gm = np.sum(mask_gm)
+    # nvoxels_csf = np.sum(mask_csf)
+
+    response_wm, response_gm, response_csf = response_from_mask_msmt(
+        gtab, data, mask_wm, mask_gm, mask_csf)
+
+    response_mcsd = multi_shell_fiber_response(sh_order=8,
+                                               bvals=unique_bvals_tolerance(
+                                                   gtab.bvals),
+                                               wm_rf=response_wm,
+                                               gm_rf=response_gm,
+                                               csf_rf=response_csf)
+
+    model = MultiShellDeconvModel(gtab, response_mcsd, sh_order=sh_order)
     mcsd_mod = model.fit(data, B0_mask_data).shm_coeff
+
     mcsd_mod = np.clip(mcsd_mod, 0, np.max(mcsd_mod, -1)[..., None])
-    del response, B0_mask_data
+    del response_mcsd, B0_mask_data
     return mcsd_mod.astype("float32"), model
 
 
@@ -448,6 +471,66 @@ def sfm_mod_est(gtab, data, B0_mask):
     return sf_odf.astype("float32"), model
 
 
+def reconstruction(conn_model, gtab, dwi_data, B0_mask):
+    """
+    Estimate a tensor model from dwi data.
+
+    Parameters
+    ----------
+    conn_model : str
+        Connectivity reconstruction method (e.g. 'csa', 'tensor', 'csd',
+        'sfm').
+    gtab : Obj
+        DiPy object storing diffusion gradient information.
+    dwi_data : array
+        4D array of dwi data.
+    B0_mask : str
+        File path to B0 brain mask.
+
+    Returns
+    -------
+    mod_fit : ndarray
+        Fitted connectivity reconstruction model.
+    mod : obj
+        Connectivity reconstruction model.
+
+    References
+    ----------
+    .. [1] Soares, J. M., Marques, P., Alves, V., & Sousa, N. (2013).
+      A hitchhiker’s guide to diffusion tensor imaging.
+      Frontiers in Neuroscience. https://doi.org/10.3389/fnins.2013.00031
+    """
+    from pynets.dmri.estimation import (
+        csa_mod_est,
+        csd_mod_est,
+        sfm_mod_est,
+        tens_mod_est,
+        mcsd_mod_est
+    )
+
+    if conn_model == "csa" or conn_model == "CSA":
+        [mod_fit, mod] = csa_mod_est(gtab, dwi_data, B0_mask)
+    # elif conn_model == "mcsd" or conn_model == "MCSD":
+    #     [mod_fit, mod] = mcsd_mod_est(gtab, dwi_data, B0_mask, wm_in_dwi,
+    #                                   gm_in_dwi, vent_csf_in_dwi)
+    elif conn_model == "csd" or conn_model == "CSD":
+        [mod_fit, mod] = csd_mod_est(gtab, dwi_data, B0_mask)
+    elif conn_model == "sfm" or conn_model == "SFM":
+        [mod_fit, mod] = sfm_mod_est(gtab, dwi_data, B0_mask)
+    elif conn_model == "ten" or conn_model == "tensor" or \
+            conn_model == "TEN":
+        [mod_fit, mod] = tens_mod_est(gtab, dwi_data, B0_mask)
+    else:
+        raise ValueError(
+            "Error: No valid reconstruction model specified. See the "
+            "`-mod` flag."
+        )
+
+    del dwi_data
+
+    return mod_fit, mod
+
+
 def streams2graph(
     atlas_for_streams,
     streams,
@@ -668,6 +751,24 @@ def streams2graph(
             )
         ]
 
+        # Remove streamlines with negative voxel indices
+        lin_T, offset = _mapping_to_voxel(np.eye(4))
+        streams_filtered = []
+        neg_vox = False
+        for sl in streamlines:
+            inds = np.dot(sl, lin_T)
+            inds += offset
+            if not inds.min().round(decimals=6) < 0:
+                streams_filtered.append(sl)
+            else:
+                neg_vox = True
+
+        if neg_vox is True:
+            print(UserWarning("Negative voxel indices detected! "
+                              "Check FOV"))
+
+        streamlines = streams_filtered
+        del streams_filtered
         # from fury import actor, window, colormap
         # renderer = window.Renderer()
         # template_actor = actor.contour_from_roi(roi_img.get_fdata(),
@@ -703,6 +804,7 @@ def streams2graph(
         total_streamlines = len(streamlines)
         sl = [generate_sl(i) for i in streamlines]
         del streamlines
+        gc.collect()
 
         # Instantiate empty networkX graph object & dictionary and create
         # voxel-affine mapping
@@ -785,7 +887,9 @@ def streams2graph(
                                        k, count in edge_dict.items()])
 
             del lab_arr, endlabels
+            gc.collect()
 
+        del sl
         gc.collect()
 
         # Add fiber density attributes for each edge
diff --git a/pynets/dmri/interfaces.py b/pynets/dmri/interfaces.py
index 380546cd..25a874a5 100755
--- a/pynets/dmri/interfaces.py
+++ b/pynets/dmri/interfaces.py
@@ -110,8 +110,8 @@ def _run_interface(self, runtime):
         from dipy.data import get_sphere
         from pynets.core import utils
         from pynets.core.utils import load_runconfig
+        from pynets.dmri.estimation import reconstruction
         from pynets.dmri.track import (
-            reconstruction,
             create_density_map,
             track_ensemble,
         )
@@ -239,7 +239,6 @@ def _run_interface(self, runtime):
                     dir_path,
                     streamlines,
                     self.inputs.conn_model,
-                    target_samples,
                     self.inputs.node_radius,
                     self.inputs.curv_thr_list,
                     self.inputs.step_list,
@@ -303,12 +302,12 @@ def _run_interface(self, runtime):
             # Only re-run the reconstruction if we have to
             if not os.path.isfile(f"{namer_dir}/{op.basename(recon_path)}"):
                 import h5py
-                model, _ = reconstruction(
+                model = reconstruction(
                     self.inputs.conn_model,
                     gtab,
                     dwi_data,
                     B0_mask_tmp_path,
-                )
+                )[0]
                 with h5py.File(recon_path, 'w') as hf:
                     hf.create_dataset("reconstruction",
                                       data=model.astype('float32'), dtype='f4')
@@ -335,12 +334,12 @@ def _run_interface(self, runtime):
                 time.sleep(5)
             else:
                 import h5py
-                model, _ = reconstruction(
+                model = reconstruction(
                     self.inputs.conn_model,
                     gtab,
                     dwi_data,
                     B0_mask_tmp_path,
-                )
+                )[0]
                 with h5py.File(recon_path, 'w') as hf:
                     hf.create_dataset("reconstruction",
                                       data=model.astype('float32'), dtype='f4')
@@ -549,7 +548,6 @@ def _run_interface(self, runtime):
                         dir_path,
                         streamlines,
                         self.inputs.conn_model,
-                        target_samples,
                         self.inputs.node_radius,
                         self.inputs.curv_thr_list,
                         self.inputs.step_list,
diff --git a/pynets/dmri/track.py b/pynets/dmri/track.py
old mode 100644
new mode 100755
index 71034367..52e1cf40
--- a/pynets/dmri/track.py
+++ b/pynets/dmri/track.py
@@ -14,62 +14,6 @@
 warnings.filterwarnings("ignore")
 
 
-def reconstruction(conn_model, gtab, dwi_data, B0_mask):
-    """
-    Estimate a tensor model from dwi data.
-
-    Parameters
-    ----------
-    conn_model : str
-        Connectivity reconstruction method (e.g. 'csa', 'tensor', 'csd',
-        'sfm').
-    gtab : Obj
-        DiPy object storing diffusion gradient information.
-    dwi_data : array
-        4D array of dwi data.
-    B0_mask : str
-        File path to B0 brain mask.
-
-    Returns
-    -------
-    mod_fit : ndarray
-        Fitted connectivity reconstruction model.
-    mod : obj
-        Connectivity reconstruction model.
-
-    References
-    ----------
-    .. [1] Soares, J. M., Marques, P., Alves, V., & Sousa, N. (2013).
-      A hitchhiker’s guide to diffusion tensor imaging.
-      Frontiers in Neuroscience. https://doi.org/10.3389/fnins.2013.00031
-    """
-    from pynets.dmri.estimation import (
-        csa_mod_est,
-        csd_mod_est,
-        sfm_mod_est,
-        tens_mod_est,
-    )
-
-    if conn_model == "csa" or conn_model == "CSA":
-        [mod_fit, mod] = csa_mod_est(gtab, dwi_data, B0_mask)
-    elif conn_model == "csd" or conn_model == "CSD":
-        [mod_fit, mod] = csd_mod_est(gtab, dwi_data, B0_mask)
-    elif conn_model == "sfm" or conn_model == "SFM":
-        [mod_fit, mod] = sfm_mod_est(gtab, dwi_data, B0_mask)
-    elif conn_model == "ten" or conn_model == "tensor" or \
-            conn_model == "TEN":
-        [mod_fit, mod] = tens_mod_est(gtab, dwi_data, B0_mask)
-    else:
-        raise ValueError(
-            "Error: No valid reconstruction model specified. See the "
-            "`-mod` flag."
-        )
-
-    del dwi_data
-
-    return mod_fit, mod
-
-
 def prep_tissues(
         t1_mask,
         gm_in_dwi,
@@ -604,14 +548,71 @@ def load_tissue_data(tissues4d):
         print(Style.RESET_ALL)
         #return None
 
-
 def run_tracking(step_curv_combinations, recon_shelved,
                  n_seeds_per_iter, traversal, maxcrossing, max_length,
                  pft_back_tracking_dist, pft_front_tracking_dist,
                  particle_count, roi_neighborhood_tol, min_length,
                  track_type, min_separation_angle, sphere, tiss_class,
                  tissue_shelved, verbose=False):
+    """
+    Create a density map of the list of streamlines.
 
+    Parameters
+    ----------
+    step_curv_combinations : list
+        List of tuples representing all pair combinations of step sizes and
+        curvature thresholds from which to sample streamlines.
+    recon_path : str
+        File path to diffusion reconstruction model.
+    n_seeds_per_iter : int
+        Number of seeds from which to initiate tracking for each unique
+        ensemble combination. By default this is set to 250.
+    directget : str
+        The statistical approach to tracking. Options are: det (deterministic),
+        closest (clos), boot (bootstrapped), and prob (probabilistic).
+    maxcrossing : int
+        Maximum number if diffusion directions that can be assumed per voxel
+        while tracking.
+    max_length : int
+        Maximum number of steps to restrict tracking.
+    pft_back_tracking_dist : float
+        Distance in mm to back track before starting the particle filtering
+        tractography. The total particle filtering tractography distance is
+        equal to back_tracking_dist + front_tracking_dist. By default this is
+        set to 2 mm.
+    pft_front_tracking_dist : float
+        Distance in mm to run the particle filtering tractography after the
+        the back track distance. The total particle filtering tractography
+        distance is equal to back_tracking_dist + front_tracking_dist. By
+        default this is set to 1 mm.
+    particle_count : int
+        Number of particles to use in the particle filter.
+    roi_neighborhood_tol : float
+        Distance (in the units of the streamlines, usually mm). If any
+        coordinate in the streamline is within this distance from the center
+        of any voxel in the ROI, the filtering criterion is set to True for
+        this streamline, otherwise False. Defaults to the distance between
+        the center of each voxel and the corner of the voxel.
+    waymask_data : ndarray
+        Tractography constraint mask array in native diffusion space.
+    min_length : int
+        Minimum fiber length threshold in mm to restrict tracking.
+    track_type : str
+        Tracking algorithm used (e.g. 'local' or 'particle').
+    min_separation_angle : float
+        The minimum angle between directions [0, 90].
+    sphere : obj
+        DiPy object for modeling diffusion directions on a sphere.
+    tiss_class : str
+        Tissue classification method.
+    tissue_shelved : str
+        File path to joblib-shelved 4D T1w tissue segmentations in native diffusion space.
+
+    Returns
+    -------
+    streamlines : ArraySequence
+        DiPy list/array-like object of streamline points from tractography.
+    """
     import gc
     import time
     import numpy as np
diff --git a/pynets/dmri/utils.py b/pynets/dmri/utils.py
old mode 100644
new mode 100755
diff --git a/pynets/due.py b/pynets/due.py
deleted file mode 100644
index f729f843..00000000
--- a/pynets/due.py
+++ /dev/null
@@ -1,74 +0,0 @@
-# emacs: at the end of the file
-# ex: set sts=4 ts=4 sw=4 et:
-# ## ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### ### #
-"""
-
-Stub file for a guaranteed safe import of duecredit constructs:  if duecredit
-is not available.
-
-To use it, place it into your project codebase to be imported, e.g. copy as
-
-    cp stub.py /path/tomodule/module/due.py
-
-Note that it might be better to avoid naming it duecredit.py to avoid shadowing
-installed duecredit.
-
-Then use in your code as
-
-    from .due import due, Doi, BibTeX, Text
-
-See  https://github.com/duecredit/duecredit/blob/master/README.md for examples.
-
-Origin:     Originally a part of the duecredit
-Copyright:  2015-2021  DueCredit developers
-License:    BSD-2
-"""
-
-__version__ = '0.0.9'
-
-
-class InactiveDueCreditCollector(object):
-    """Just a stub at the Collector which would not do anything"""
-    def _donothing(self, *args, **kwargs):
-        """Perform no good and no bad"""
-        pass
-
-    def dcite(self, *args, **kwargs):
-        """If I could cite I would"""
-        def nondecorating_decorator(func):
-            return func
-        return nondecorating_decorator
-
-    active = False
-    activate = add = cite = dump = load = _donothing
-
-    def __repr__(self):
-        return self.__class__.__name__ + '()'
-
-
-def _donothing_func(*args, **kwargs):
-    """Perform no good and no bad"""
-    pass
-
-
-try:
-    from duecredit import due, BibTeX, Doi, Url, Text  # lgtm [py/unused-import]
-    if 'due' in locals() and not hasattr(due, 'cite'):
-        raise RuntimeError(
-            "Imported due lacks .cite. DueCredit is now disabled")
-except Exception as e:
-    if not isinstance(e, ImportError):
-        import logging
-        logging.getLogger("duecredit").error(
-            "Failed to import duecredit due to %s" % str(e))
-    # Initiate due stub
-    due = InactiveDueCreditCollector()
-    BibTeX = Doi = Url = Text = _donothing_func
-
-# Emacs mode definitions
-# Local Variables:
-# mode: python
-# py-indent-offset: 4
-# tab-width: 4
-# indent-tabs-mode: nil
-# End:
diff --git a/pynets/fmri/__init__.py b/pynets/fmri/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/fmri/clustering.py b/pynets/fmri/clustering.py
old mode 100644
new mode 100755
index 599e9f2f..98f03711
--- a/pynets/fmri/clustering.py
+++ b/pynets/fmri/clustering.py
@@ -67,7 +67,8 @@ def indx_3dto1d(idx, sz):
     return idx1
 
 
-def ncut(W, nbEigenValues):
+def ncut(W, nbEigenValues, offset=0.5, maxiterations=100,
+         eigsErrorTolerence=1e-6, eps=2.2204e-16):
     """
     This function performs the first step of normalized cut spectral
     clustering. The normalized LaPlacian is calculated on the similarity
@@ -107,33 +108,28 @@ def ncut(W, nbEigenValues):
       Ieee. doi: 10.1109/ICCV.2003.1238361
 
     """
-    from scipy.sparse.linalg import eigsh
-    from scipy.sparse import spdiags
-    from numpy.linalg import norm
-
-    # Parameters
-    offset = 0.5
-    maxiterations = 100
-    eigsErrorTolerence = 1e-6
-    eps = 2.2204e-16
+    import gc
+    import scipy.sparse as sps
 
     m = np.shape(W)[1]
 
-    d = abs(W).sum(0)
-    dr = 0.5 * (d - W.sum(0))
-    d = d + offset * 2
-    dr = dr + offset
+    d = abs(W).sum(0) + offset * 2
+    dr = 0.5 * (d - W.sum(0)) + offset
 
     # Calculation of the normalized LaPlacian
-    W = W + spdiags(dr, [0], m, m, "csc")
-    Dinvsqrt = spdiags((1.0 / np.sqrt(d + eps)), [0], m, m, "csc")
-    P = Dinvsqrt * (W * Dinvsqrt)
+    Dinvsqrt = sps.spdiags((1.0 / np.sqrt(d + eps)), [0], m, m, "csc")
 
     # Perform the eigen decomposition
-    eigen_val, eigen_vec = eigsh(
-        P, nbEigenValues, maxiter=maxiterations, tol=eigsErrorTolerence,
+    eigen_val, eigen_vec = sps.linalg.eigsh(
+        Dinvsqrt * ((W + sps.spdiags(dr, [0], m, m, "csc")) * Dinvsqrt),
+        nbEigenValues, maxiter=maxiterations, tol=eigsErrorTolerence,
         which="LA")
 
+    norm_ones = np.linalg.norm(np.ones((m, 1)))
+
+    del d, dr, W, m
+    gc.collect()
+
     # Sort the eigen_vals so that the first is the largest
     i = np.argsort(-eigen_val)
     eigen_val = eigen_val[i]
@@ -141,16 +137,17 @@ def ncut(W, nbEigenValues):
 
     # Normalize the returned eigenvectors
     eigen_vec = Dinvsqrt * np.array(eigen_vec)
-    norm_ones = norm(np.ones((m, 1)))
+
     for i in range(0, np.shape(eigen_vec)[1]):
-        eigen_vec[:, i] = (eigen_vec[:, i] / norm(eigen_vec[:, i])) * norm_ones
+        eigen_vec[:, i] = (eigen_vec[:, i] / np.linalg.norm(
+            eigen_vec[:, i])) * norm_ones
         if eigen_vec[0, i] != 0:
             eigen_vec[:, i] = -1 * eigen_vec[:, i] * np.sign(eigen_vec[0, i])
 
     return eigen_val, eigen_vec
 
 
-def discretisation(eigen_vec):
+def discretisation(eigen_vec, eps=2.2204e-16):
     """
     This function performs the second step of normalized cut clustering which
     assigns features to clusters based on the eigen vectors from the LaPlacian
@@ -198,21 +195,18 @@ def discretisation(eigen_vec):
       (1), 313-319 vol.1. Ieee. doi: 10.1109/ICCV.2003.1238361
 
     """
+    import gc
     import scipy as sp
-    from scipy.sparse import csc_matrix
-    from scipy.linalg import LinAlgError, svd
-
-    eps = 2.2204e-16
+    import scipy.sparse as sps
 
     # normalize the eigenvectors
     [n, k] = np.shape(eigen_vec)
-    vm = np.kron(
+
+    eigen_vec = np.divide(eigen_vec, np.reshape(np.kron(
         np.ones(
             (1, k)), np.sqrt(
             np.multiply(
-                eigen_vec, eigen_vec).sum(1)))
-    out_vec = np.reshape(vm, eigen_vec.shape)
-    eigen_vec = np.divide(eigen_vec, out_vec)
+                eigen_vec, eigen_vec).sum(1))), eigen_vec.shape))
 
     svd_restarts = 0
     exitLoop = 0
@@ -249,7 +243,7 @@ def discretisation(eigen_vec):
             # Discretise the result by setting the max of each row=1 and other
             # values to 0
             j = np.reshape(np.asarray(tDiscrete.argmax(1)), n)
-            eigenvec_discrete = csc_matrix(
+            eigenvec_discrete = sps.csc_matrix(
                 (np.ones(
                     len(j)), (list(
                         range(
@@ -257,13 +251,12 @@ def discretisation(eigen_vec):
                     n, k))
 
             # Calculate a rotation to bring the discrete eigenvectors cluster
-            # to the original eigenvectors
-            tSVD = eigenvec_discrete.transpose() * eigen_vec
-
-            # Catch a SVD convergence error and restart
+            # to the original eigenvectors and catch a SVD convergence error
+            # and restart
             try:
-                [U, S, Vh] = svd(tSVD)
-            except LinAlgError as e:
+                [U, S, Vh] = sp.linalg.svd(
+                    eigenvec_discrete.transpose() * eigen_vec)
+            except sp.linalg.LinAlgError as e:
                 # Catch exception and go back to the beginning of the loop
                 print(e, "SVD did not converge. "
                          "Randomizing and trying again...")
@@ -312,13 +305,14 @@ def parcellate_ncut(W, k, mask_img):
       https://doi.org/10.1002/hbm.21333
 
     """
+    import gc
+
     # We only have to calculate the eigendecomposition of the LaPlacian once,
     # for the largest number of clusters provided. This provides a significant
     # speedup, without any difference to the results.
-    [_, eigenvec] = ncut(W, k)
 
     # Calculate each desired clustering result
-    eigenvec_discrete = discretisation(eigenvec[:, :k])
+    eigenvec_discrete = discretisation(ncut(W, k)[1][:, :k])
 
     # Transform the discretised eigenvectors into a single vector where the
     # value corresponds to the cluster # of the corresponding ROI
@@ -327,6 +321,9 @@ def parcellate_ncut(W, k, mask_img):
     for i in range(1, k):
         a = a + (i + 1) * eigenvec_discrete[:, i]
 
+    del eigenvec_discrete
+    gc.collect()
+
     unique_a = sorted(set(np.array(a.flatten().tolist()[0])))
 
     # Renumber clusters to make them non-contiguous
@@ -335,13 +332,17 @@ def parcellate_ncut(W, k, mask_img):
         b[a == unique_a[i]] = i + 1
 
     imdat = mask_img.get_fdata()
+    mask_aff = mask_img.get_affine()
+    mask_hdr = mask_img.get_header()
     imdat[imdat > 0] = 1
     imdat[imdat > 0] = np.short(b[0: int(np.sum(imdat))].flatten())
 
     del a, b, W
+    mask_img.uncache()
+    gc.collect()
 
     return nib.Nifti1Image(
-        imdat.astype("uint16"), mask_img.get_affine(), mask_img.get_header()
+        imdat.astype("uint16"), mask_aff, mask_hdr
     )
 
 
@@ -379,6 +380,7 @@ def make_local_connectivity_scorr(func_img, clust_mask_img, thresh):
       https://doi.org/10.1002/hbm.21333
 
     """
+    import gc
     from scipy.sparse import csc_matrix
     from itertools import product
 
@@ -413,6 +415,7 @@ def make_local_connectivity_scorr(func_img, clust_mask_img, thresh):
     # Reshape fmri data to a num_voxels x num_timepoints array
     func_data = func_img.get_fdata(dtype=np.float32)
     imdat = np.reshape(func_data, (np.prod(sz[:3]), sz[3]))
+    func_img.uncache()
     del func_data
 
     # Mask the datset to only the in-mask voxels
@@ -430,6 +433,8 @@ def make_local_connectivity_scorr(func_img, clust_mask_img, thresh):
 
     # Set values with no variance to zero
     imdat[imdat_s == 0] = 0
+    del imdat_s, imdat_sz, imdat_m
+
     imdat[np.isnan(imdat)] = 0
 
     # Remove voxels with zero variance, do this here
@@ -524,6 +529,7 @@ def make_local_connectivity_scorr(func_img, clust_mask_img, thresh):
     )
 
     del imdat, msk, mskdat, outlist, m, sparse_i, sparse_j, sparse_w
+    gc.collect()
 
     return W
 
@@ -561,6 +567,7 @@ def make_local_connectivity_tcorr(func_img, clust_mask_img, thresh):
       https://doi.org/10.1002/hbm.21333
 
     """
+    import gc
     from scipy.sparse import csc_matrix
     from itertools import product
 
@@ -597,6 +604,7 @@ def make_local_connectivity_tcorr(func_img, clust_mask_img, thresh):
     # Reshape fmri data to a num_voxels x num_timepoints array
     func_data = func_img.get_fdata(dtype=np.float32)
     imdat = np.reshape(func_data, (np.prod(sz[:3]), sz[3]))
+    func_img.uncache()
     del func_data
 
     # Construct a sparse matrix from the mask
@@ -686,6 +694,7 @@ def make_local_connectivity_tcorr(func_img, clust_mask_img, thresh):
     )
 
     del imdat, msk, mskdat, outlist, m, sparse_i, sparse_j, sparse_w
+    gc.collect()
 
     return W
 
@@ -710,11 +719,10 @@ def ensemble_parcellate(infiles, k):
             W = conn
         else:
             W = W + conn
+        del img_data, shape, conn
 
     # compute the average
-    W = W / len(infiles)
-
-    out_img = parcellate_ncut(W, k, img)
+    out_img = parcellate_ncut(W / len(infiles), k, img)
     out_img.set_data_dtype(np.uint16)
 
     return out_img
@@ -795,7 +803,6 @@ def parcellate(func_boot_img, local_corr, clust_type, _local_conn_mat_path,
             n_jobs=1,
         )
 
-
         if conf is not None:
             import pandas as pd
             import random
diff --git a/pynets/fmri/estimation.py b/pynets/fmri/estimation.py
old mode 100644
new mode 100755
index 8c6766fb..a05bd1e2
--- a/pynets/fmri/estimation.py
+++ b/pynets/fmri/estimation.py
@@ -13,10 +13,10 @@
 warnings.filterwarnings("ignore")
 
 
-def get_optimal_cov_estimator(time_series):
+def get_optimal_cov_estimator(time_series, cv=5, max_iter=200):
     from sklearn.covariance import GraphicalLassoCV
 
-    estimator = GraphicalLassoCV(cv=5, assume_centered=True)
+    estimator = GraphicalLassoCV(cv=cv, assume_centered=True)
     print("\nSearching for best Lasso...\n")
     try:
         estimator.fit(time_series)
@@ -29,7 +29,7 @@ def get_optimal_cov_estimator(time_series):
                 not hasattr(estimator, 'precision_') and ix < 3:
             for t in [0.1, 0.01, 0.001, 0.0001]:
                 print(f"Tolerance={t}")
-                estimator = GraphicalLassoCV(cv=5, max_iter=200, tol=t,
+                estimator = GraphicalLassoCV(cv=cv, max_iter=max_iter, tol=t,
                                              assume_centered=True)
                 try:
                     estimator.fit(time_series)
diff --git a/pynets/plotting/__init__.py b/pynets/plotting/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/plotting/adjacency.py b/pynets/plotting/adjacency.py
old mode 100644
new mode 100755
diff --git a/pynets/plotting/brain.py b/pynets/plotting/brain.py
old mode 100644
new mode 100755
index 5107a3e1..4bbe8c76
--- a/pynets/plotting/brain.py
+++ b/pynets/plotting/brain.py
@@ -130,9 +130,9 @@ def getIndexPositions(listOfElements, element):
 
     partition = [
         getIndexPositions(
-            communities.tolist(),
+            list(communities),
             i) for i in set(
-            communities.tolist())]
+            list(communities))]
 
     n_communities = min(len(partition), len(COLOR))
     fig = plt.figure(figsize=figsize)
@@ -220,14 +220,15 @@ def create_gb_palette(
     from matplotlib import colors
     from sklearn.preprocessing import minmax_scale
     from pynets.statistics.individual.algorithms import \
-        community_resolution_selection, prune_disconnected
+        community_resolution_selection, defragment
+    import graspologic.utils as gu
 
     plt.style.use("cyberpunk")
 
     mat = np.array(np.array(thresholding.autofix(mat)))
     if prune is True:
-        [G, pruned_nodes] = prune_disconnected(
-            nx.from_numpy_matrix(np.abs(mat)), fallback_lcc=False)
+        [G, pruned_nodes] = defragment(
+            nx.from_numpy_matrix(gu.remove_loops(gu.symmetrize(np.abs(mat)))))
         pruned_nodes.sort(reverse=True)
         coords_pre = list(coords)
         labels_pre = list(labels)
@@ -662,6 +663,7 @@ def plot_all_func(
                     line.set_lw(edge_size)
                     mod_lines.append(line)
                 connectome.axes[view].ax.lines = mod_lines
+                connectome.axes[view].ax.patches = []
 
             zorder = 10000
             for view in views:
@@ -1017,6 +1019,7 @@ def plot_all_struct(
                     line.set_lw(edge_size * 0.20)
                     mod_lines.append(line)
                 connectome.axes[view].ax.lines = mod_lines
+                connectome.axes[view].ax.patches = []
                 mplcyberpunk.make_lines_glow(connectome.axes[view].ax,
                                              n_glow_lines=10,
                                              diff_linewidth=0.80,
diff --git a/pynets/plotting/connectogram.py b/pynets/plotting/connectogram.py
old mode 100644
new mode 100755
diff --git a/pynets/registration/__init__.py b/pynets/registration/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/registration/interfaces.py b/pynets/registration/interfaces.py
index 043d2706..99f8bfe1 100755
--- a/pynets/registration/interfaces.py
+++ b/pynets/registration/interfaces.py
@@ -114,7 +114,8 @@ def _run_interface(self, runtime):
             for i in glob.glob(f"{self.inputs.in_dir}"
                                f"/*_desc-brain_mask.nii.gz")
             if "MNI" not in i
-        ]
+        ] + glob.glob(
+            f"{runtime.cwd}/../../*/register_node/*/imgs/t1w_brain_mask.nii.gz")
 
         # Copy T1w mask, if provided, else use existing, if detected, else
         # compute a fresh one
@@ -147,8 +148,8 @@ def _run_interface(self, runtime):
                 mask_tmp_path = None
 
         gm_mask_existing = glob.glob(
-            self.inputs.in_dir +
-            "/*_label-GM_probseg.nii.gz")
+            f"{self.inputs.in_dir}/*_label-GM_probseg.nii.gz") + glob.glob(
+            f"{runtime.cwd}/../../*/register_node/*/imgs/t1w_seg_pve_1.nii.gz")
         if len(gm_mask_existing) > 0:
             gm_mask = fname_presuffix(gm_mask_existing[0], newpath=runtime.cwd)
             copyfile(
@@ -163,8 +164,8 @@ def _run_interface(self, runtime):
             gm_mask = None
 
         wm_mask_existing = glob.glob(
-            self.inputs.in_dir +
-            "/*_label-WM_probseg.nii.gz")
+            f"{self.inputs.in_dir}/*_label-WM_probseg.nii.gz") + glob.glob(
+            f"{runtime.cwd}/../../*/register_node/*/imgs/t1w_seg_pve_0.nii.gz")
         if len(wm_mask_existing) > 0:
             wm_mask = fname_presuffix(wm_mask_existing[0], newpath=runtime.cwd)
             copyfile(
@@ -179,8 +180,9 @@ def _run_interface(self, runtime):
             wm_mask = None
 
         csf_mask_existing = glob.glob(
-            self.inputs.in_dir + "/*_label-CSF_probseg.nii.gz"
-        )
+            f"{self.inputs.in_dir}/*_label-CSF_probseg.nii.gz"
+        ) + glob.glob(
+            f"{runtime.cwd}/../../*/register_node/*/imgs/t1w_seg_pve_2.nii.gz")
         if len(csf_mask_existing) > 0:
             csf_mask = fname_presuffix(
                 csf_mask_existing[0], newpath=runtime.cwd)
@@ -971,7 +973,9 @@ def _run_interface(self, runtime):
             for i in glob.glob(self.inputs.in_dir +
                                "/*_desc-brain_mask.nii.gz")
             if "MNI" not in i
-        ]
+        ] + glob.glob(
+            f"{runtime.cwd}/../../*/register_node/*/imgs/"
+            f"t1w_brain_mask.nii.gz")
 
         # Copy T1w mask, if provided, else use existing, if detected, else
         # compute a fresh one
@@ -1006,7 +1010,8 @@ def _run_interface(self, runtime):
 
         gm_mask_existing = glob.glob(
             self.inputs.in_dir +
-            "/*_label-GM_probseg.nii.gz")
+            "/*_label-GM_probseg.nii.gz") + glob.glob(
+            f"{runtime.cwd}/../../*/register_node/*/imgs/t1w_seg_pve_1.nii.gz")
         if len(gm_mask_existing) > 0:
             gm_mask = fname_presuffix(gm_mask_existing[0],
                                       newpath=runtime.cwd)
@@ -1023,7 +1028,8 @@ def _run_interface(self, runtime):
 
         wm_mask_existing = glob.glob(
             self.inputs.in_dir +
-            "/*_label-WM_probseg.nii.gz")
+            "/*_label-WM_probseg.nii.gz") + glob.glob(
+            f"{runtime.cwd}/../../*/register_node/*/imgs/t1w_seg_pve_0.nii.gz")
         if len(wm_mask_existing) > 0:
             wm_mask = fname_presuffix(wm_mask_existing[0],
                                       newpath=runtime.cwd)
diff --git a/pynets/registration/register.py b/pynets/registration/register.py
index 1cd1d3dc..175e7dd6 100755
--- a/pynets/registration/register.py
+++ b/pynets/registration/register.py
@@ -297,15 +297,8 @@ def direct_streamline_norm(
         warped_fa_affine = warped_fa_img.affine
         warped_fa_shape = warped_fa_img.shape
 
-        adjusted_affine = affine_map.affine.copy()
-        adjusted_affine[0][3] = -adjusted_affine[0][3]
-        adjusted_affine[1][3] = -adjusted_affine[1][3]
-        adjusted_affine[2][3] = -adjusted_affine[2][3]
-        # adjusted_affine[..., 3] = np.dot(adjusted_affine,
-        #                                  np.array([0.5, 0.5, 0.5, 1]))
-
         streams_in_curr_grid = transform_streamlines(
-            streamlines, adjusted_affine)
+            streamlines, affine_map.affine_inv)
 
         streams_final_filt = regutils.warp_streamlines(t1w_brain_img.affine,
                                                        fa_img.affine,
@@ -326,7 +319,7 @@ def direct_streamline_norm(
         # Save streamlines
         stf = StatefulTractogram(
             streams_final_filt_final,
-            reference=atlas_t1w_img,
+            reference=t1w_brain_img,
             space=Space.VOXMM,
             origin=Origin.NIFTI,
         )
@@ -595,12 +588,10 @@ def gen_mask(self, mask):
 
         if op.isfile(self.t1w_brain) is False:
             import shutil
-
             shutil.copyfile(self.t1w, self.t1w_head)
-
-        [self.t1w_brain, self.t1w_brain_mask] = regutils.gen_mask(
-            self.t1w_head, self.t1w_brain, mask
-        )
+            [self.t1w_brain, self.t1w_brain_mask] = regutils.gen_mask(
+                self.t1w_head, self.t1w_brain, mask
+            )
         return
 
     def gen_tissue(
@@ -916,14 +907,17 @@ def tissue2dwi_align(self):
                             self.input_mni_brain),
                         interpolation='nearest').to_filename(self.mni_roi_ref)
 
-        out = gen_img_list(self.mni_roi_ref)
-        roi_parcels = [i for j, i in enumerate(out)]
+        roi_parcels = [i for j, i in enumerate(gen_img_list(self.mni_roi_ref))]
 
         ventricle_roi = math_img("img1 + img2", img1=roi_parcels[2],
                                  img2=roi_parcels[13])
 
+        self.mni_vent_loc = fname_presuffix(
+            self.mni_vent_loc, suffix="_tmp",
+            newpath=op.dirname(self.reg_path_img)
+        )
         ventricle_roi.to_filename(self.mni_vent_loc)
-        del roi_parcels, out, ventricle_roi
+        del roi_parcels, ventricle_roi
 
         # Create transform from the HarvardOxford atlas in MNI to T1w.
         # This will be used to transform the ventricles to dwi space.
@@ -1208,9 +1202,9 @@ def gen_mask(self, mask):
         if op.isfile(self.t1w_brain) is False:
             import shutil
             shutil.copyfile(self.t1w, self.t1w_head)
-        [self.t1w_brain, self.t1w_brain_mask] = regutils.gen_mask(
-            self.t1w_head, self.t1w_brain, mask
-        )
+            [self.t1w_brain, self.t1w_brain_mask] = regutils.gen_mask(
+                self.t1w_head, self.t1w_brain, mask
+            )
         return
 
     def gen_tissue(self, wm_mask_existing, gm_mask_existing, overwrite):
diff --git a/pynets/registration/utils.py b/pynets/registration/utils.py
old mode 100644
new mode 100755
index 557721ff..e7f7816a
--- a/pynets/registration/utils.py
+++ b/pynets/registration/utils.py
@@ -53,8 +53,7 @@ def gen_mask(t1w_head, t1w_brain, mask):
     math_img("img > 0.0001", img=nib.load(t1w_brain_mask)
              ).to_filename(t1w_brain_mask)
 
-    t1w_brain = apply_mask_to_image(t1w_head, t1w_brain_mask,
-                                             t1w_brain)
+    t1w_brain = apply_mask_to_image(t1w_head, t1w_brain_mask, t1w_brain)
 
     assert op.isfile(t1w_brain)
     assert op.isfile(t1w_brain_mask)
@@ -544,7 +543,7 @@ def atlas2t1w_align(
     return aligned_atlas_gm, aligned_atlas_skull
 
 
-def segment_t1w(t1w, basename, nclass=3, beta=0.1):
+def segment_t1w(t1w, basename, nclass=3, beta=0.1, max_iter=100):
     """
     A function to use FSL's FAST to segment an anatomical
     image into GM, WM, and CSF prob maps.
@@ -570,7 +569,8 @@ def segment_t1w(t1w, basename, nclass=3, beta=0.1):
 
     t1w_img = nib.load(t1w)
     hmrf = TissueClassifierHMRF()
-    PVE = hmrf.classify(t1w_img.get_fdata(), nclass, beta)[2]
+    PVE = hmrf.classify(t1w_img.get_fdata(), nclass, beta,
+                        max_iter=max_iter)[2]
 
     new_img_like(t1w_img, PVE[..., 2]).to_filename(
         f"{os.path.dirname(os.path.abspath(t1w))}/{basename}_{'pve_0.nii.gz'}")
@@ -909,19 +909,20 @@ def warp_streamlines(
             streams_in_curr_grid,
         )
     ]
-    streams_final_filt = Streamlines(
-        utils.target_line_based(
-            transform_streamlines(
-                transform_streamlines(
-                    streams_in_brain,
-                    np.linalg.inv(adjusted_affine)),
-                np.linalg.inv(
-                    warped_fa_img.affine),
-            ),
-            np.eye(4),
-            brain_mask,
-            include=True,
-        ))
+    streams_final_filt = streams_in_brain
+    # streams_final_filt = Streamlines(
+    #     utils.target_line_based(
+    #         transform_streamlines(
+    #             transform_streamlines(
+    #                 streams_in_brain,
+    #                 np.linalg.inv(adjusted_affine)),
+    #             np.linalg.inv(
+    #                 warped_fa_img.affine),
+    #         ),
+    #         np.eye(4),
+    #         brain_mask,
+    #         include=True,
+    #     ))
 
     return streams_final_filt
 
diff --git a/pynets/statistics/__init__.py b/pynets/statistics/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/statistics/group/__init__.py b/pynets/statistics/group/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/statistics/group/benchmarking.py b/pynets/statistics/group/benchmarking.py
old mode 100644
new mode 100755
index a84f69ac..dc166e92
--- a/pynets/statistics/group/benchmarking.py
+++ b/pynets/statistics/group/benchmarking.py
@@ -213,16 +213,16 @@ def benchmark_reproducibility(base_dir, comb, modality, alg, par_dict, disc,
 
     if modality == 'func':
         try:
-            extract, hpass, model, res, atlas, smooth = comb
+            signal, hpass, model, granularity, parcellation, smooth = comb
         except BaseException:
             print(f"Missing {comb}...")
-            extract, hpass, model, res, atlas = comb
+            signal, hpass, model, granularity, parcellation = comb
             smooth = '0'
-        # comb_tuple = (atlas, extract, hpass, model, res, smooth)
+        # comb_tuple = (parcellation, signal, hpass, model, granularity, smooth)
         comb_tuple = comb
     else:
-        directget, minlength, model, res, atlas, tol = comb
-        # comb_tuple = (atlas, directget, minlength, model, res, tol)
+        traversal, minlength, model, granularity, parcellation, error_margin = comb
+        # comb_tuple = (parcellation, traversal, minlength, model, granularity, error_margin)
         comb_tuple = comb
 
     df_summary.at[0, "grid"] = comb_tuple
@@ -286,7 +286,7 @@ def benchmark_reproducibility(base_dir, comb, modality, alg, par_dict, disc,
                                     node_files = glob.glob(
                                         f"{base_dir}/pynets/sub-{ID}/ses-"
                                         f"{ses}/{modality}/subnet-"
-                                        f"{atlas}_res-{res}/nodes/*.json")
+                                        f"{parcellation}_granularity-{granularity}/nodes/*.json")
                                     emb_data = par_dict[ID][str(ses)][
                                         modality][alg][comb_tuple]['data']
 
@@ -342,8 +342,8 @@ def benchmark_reproducibility(base_dir, comb, modality, alg, par_dict, disc,
                                         [str(tuple(x)) for x in
                                          coords]).T
                                     df_coords.columns = [
-                                        f"subnet-{atlas}_res-"
-                                        f"{res}_{i}"
+                                        f"subnet-{parcellation}_granularity-"
+                                        f"{granularity}_{i}"
                                         for i in ixs]
                                     # labels = [
                                     #     list(i['label'])[7] for i
@@ -352,8 +352,8 @@ def benchmark_reproducibility(base_dir, comb, modality, alg, par_dict, disc,
                                     df_labels = pd.DataFrame(
                                         labels).T
                                     df_labels.columns = [
-                                        f"subnet-{atlas}_res-"
-                                        f"{res}_{i}"
+                                        f"subnet-{parcellation}_granularity-"
+                                        f"{granularity}_{i}"
                                         for i in ixs]
                                     coords_frames.append(df_coords)
                                     labels_frames.append(df_labels)
@@ -370,8 +370,8 @@ def benchmark_reproducibility(base_dir, comb, modality, alg, par_dict, disc,
                                     df_pref = pd.DataFrame(emb_data.T,
                                                            columns=[
                                                                f"{alg}_{i}_rsn"
-                                                               f"-{atlas}_res-"
-                                                               f"{res}"
+                                                               f"-{parcellation}_granularity-"
+                                                               f"{granularity}"
                                                                for i in ixs])
                                     df_pref['id'] = ID
                                     df_pref['ses'] = ses
diff --git a/pynets/statistics/group/prediction.py b/pynets/statistics/group/prediction.py
old mode 100644
new mode 100755
index 40b05092..32054d0e
--- a/pynets/statistics/group/prediction.py
+++ b/pynets/statistics/group/prediction.py
@@ -2050,23 +2050,24 @@ def build_predict_workflow(args, retval, verbose=True):
     if modality == "func":
         for comb in grid_param_combos:
             try:
-                signal, hpass, model, granularity, atlas, tol = comb
+                signal, hpass, model, granularity, parcellation, smooth = comb
             except:
                 try:
-                    signal, hpass, model, granularity, atlas = comb
-                    tol = "0"
+                    signal, hpass, model, granularity, parcellation = comb
+                    smooth = "0"
                 except:
                     raise ValueError(f"Failed to parse recipe: {comb}")
-            grid_params_mod.append([signal, hpass, model, granularity, atlas,
-                                    tol])
+            grid_params_mod.append([signal, hpass, model, granularity,
+                                    parcellation, smooth])
     elif modality == "dwi":
         for comb in grid_param_combos:
             try:
-                traversal, minlength, model, granularity, atlas, tol = comb
+                traversal, minlength, model, granularity, parcellation, \
+                error_margin = comb
             except:
                 raise ValueError(f"Failed to parse recipe: {comb}")
             grid_params_mod.append([traversal, minlength, model, granularity,
-                                    atlas, tol])
+                                    parcellation, error_margin])
 
     meta_inputnode = pe.Node(
         niu.IdentityInterface(
diff --git a/pynets/statistics/individual/__init__.py b/pynets/statistics/individual/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/statistics/individual/algorithms.py b/pynets/statistics/individual/algorithms.py
old mode 100644
new mode 100755
index ff5164de..da31016d
--- a/pynets/statistics/individual/algorithms.py
+++ b/pynets/statistics/individual/algorithms.py
@@ -6,17 +6,15 @@
 @author: Derek Pisner
 """
 from pynets.core.utils import load_runconfig
-import pandas as pd
 import numpy as np
 import warnings
 import networkx as nx
-from pynets.core import thresholding
 from pynets.core.utils import timeout
 warnings.filterwarnings("ignore")
 
 
-hardcoded_params = load_runconfig()
 try:
+    hardcoded_params = load_runconfig()
     DEFAULT_TIMEOUT = hardcoded_params["graph_analysis_timeout"][0]
     DEFAULT_ENGINE = hardcoded_params["graph_analysis_engine"][0]
 except FileNotFoundError as e:
@@ -1043,14 +1041,16 @@ def weighted_transitivity(G):
     return 0 if triangles == 0 else triangles / contri
 
 
-def prune_disconnected(G, min_nodes=10, fallback_lcc=True):
+def prune_small_components(G, min_nodes):
     """
-    Returns a copy of G with isolates pruned.
+    Returns a recomposed graph of all connected components of a minimum size
 
     Parameters
     ----------
     G : Obj
         NetworkX graph with isolated nodes present.
+    min_nodes: int
+        Minimum number of nodes permitted in a connected subgraph
 
     Returns
     -------
@@ -1070,42 +1070,31 @@ def prune_disconnected(G, min_nodes=10, fallback_lcc=True):
       subnet Analysis. https://doi.org/10.1016/C2012-0-06036-X
 
     """
-    print("Pruning disconnected...")
 
     G_tmp = G.copy()
 
     # List because it returns a generator
     components = list(nx.connected_components(G_tmp))
+    del G_tmp
+
     components.sort(key=len, reverse=True)
-    components_connected = list(components[0])
-    isolates = [n for (n, d) in G_tmp.degree() if d == 0]
+    print(f"{len(components)} connected component(s) detected...")
 
-    # if len(G_tmp.nodes()) - len(isolates) < min_nodes:
-    #     if fallback_lcc is True:
-    #         from graspologic.utils import largest_connected_component
-    #         print(UserWarning('Warning: Too many isolates to defragment, '
-    #                           'grabbing the largest connected component...'))
-    #
-    #         lcc, pruned_nodes = largest_connected_component(G_tmp,
-    #         return_inds=True)
-    #         return lcc, pruned_nodes.tolist()
-    #     else:
-    #         print(UserWarning('Warning: Too many isolates to defragment, '
-    #                           'skipping defragmentation.
-    #                           Consider fallback to lcc...'))
-    #         return G_tmp, []
-
-    # Remove disconnected nodes
-    pruned_nodes = []
-    s = 0
-    for node in list(G_tmp.nodes()):
-        if node not in components_connected or node in isolates:
-            print(f"Removing {node}")
-            G_tmp.remove_node(node)
-            pruned_nodes.append(s)
-        s = s + 1
+    # Iterate across cc subgraphs
+    good_components = []
+    c = 0
+    for comp in components:
+        print(f"Component {c}: {len(comp)} nodes")
+        if len(comp) > min_nodes:
+            good_components.append(nx.subgraph(G_tmp, comp))
+        c = c + 1
 
-    return G_tmp, pruned_nodes
+    del components
+
+    if len(good_components) == 0:
+        raise ValueError(f"No components with a minimum of {min_nodes} found")
+
+    return nx.compose_all(good_components)
 
 
 def most_important(G, method="betweenness", sd=1, engine=DEFAULT_ENGINE):
@@ -1159,22 +1148,28 @@ def most_important(G, method="betweenness", sd=1, engine=DEFAULT_ENGINE):
             pruned_nodes.append(i)
         i = i + 1
 
-    # List because it returns a generator
-    components = list(nx.connected_components(Gt))
-    components.sort(key=len, reverse=True)
-    components_connected = list(components[0])
+    return defragment(G)
+
 
-    isolates = [n for (n, d) in Gt.degree() if d == 0]
+def defragment(G):
+    G_tmp = G.copy()
+
+    isolates = [n for (n, d) in G_tmp.degree() if d == 0]
 
     # Remove any lingering isolates
     s = 0
-    for node in list(Gt.nodes()):
-        if node not in components_connected or node in isolates:
-            Gt.remove_node(node)
+    pruned_nodes = []
+    for node in list(G_tmp.nodes()):
+        if node in isolates:
+            G_tmp.remove_node(node)
             pruned_nodes.append(s)
         s = s + 1
 
-    return Gt, pruned_nodes
+    for edge in list(G_tmp.edges()):
+        if (str(edge[0]) in pruned_nodes) or (str(edge[1]) in pruned_nodes):
+            G_tmp.remove_edge(edge)
+
+    return G_tmp, pruned_nodes
 
 
 def raw_mets(G, i, engine=DEFAULT_ENGINE):
@@ -1300,234 +1295,6 @@ def raw_mets(G, i, engine=DEFAULT_ENGINE):
     return net_met_val
 
 
-class CleanGraphs(object):
-    """
-    A Class for cleaning graphs in preparation for subnet analysis.
-
-    Parameters
-    ----------
-    thr : float
-        The value, between 0 and 1, used to threshold the graph using any
-        variety of methods triggered through other options.
-    conn_model : str
-       Connectivity estimation model (e.g. corr for correlation, cov for
-       covariance, sps for precision covariance,
-       partcorr for partial correlation). sps type is used by default.
-    est_path : str
-        File path to the thresholded graph, conn_matrix_thr, saved as a numpy
-        array in .npy format.
-    prune : int
-        Indicates whether to prune final graph of disconnected nodes/isolates.
-    norm : int
-        Indicates method of normalizing resulting graph.
-
-    Returns
-    -------
-    out_path : str
-        Path to .csv file where graph analysis results are saved.
-
-    References
-    ----------
-    .. [1] Qin, Tai, and Karl Rohe. "Regularized spectral clustering
-      under the degree-corrected stochastic blockmodel." In Advances
-      in Neural Information Processing Systems, pp. 3120-3128. 2013
-    .. [2] Rohe, Karl, Tai Qin, and Bin Yu. "Co-clustering directed graphs to
-      discover asymmetries and directional communities." Proceedings of the
-      National Academy of Sciences 113.45 (2016): 12679-12684.
-
-    """
-
-    def __init__(
-            self,
-            thr,
-            conn_model,
-            est_path,
-            prune,
-            norm,
-            out_fmt="gpickle"):
-        from pynets.core import utils
-
-        self.thr = thr
-        self.conn_model = conn_model
-        self.est_path = est_path
-        self.prune = prune
-        self.norm = norm
-        self.out_fmt = out_fmt
-        self.in_mat = None
-
-        # Load and threshold matrix
-        self.in_mat_raw = utils.load_mat(self.est_path)
-
-        # De-diagnal and remove nan's and inf's, ensure edge weights are
-        # positive
-        self.in_mat = np.array(
-            np.array(
-                thresholding.autofix(
-                    np.array(np.abs(
-                        self.in_mat_raw)))))
-
-        # Load numpy matrix as networkx graph
-        self.G = nx.from_numpy_array(self.in_mat)
-
-    def normalize_graph(self):
-
-        # Get hyperbolic tangent (i.e. fischer r-to-z transform) of matrix if
-        # non-covariance
-        if (self.conn_model == "corr") or (self.conn_model == "partcorr"):
-            self.in_mat = np.arctanh(self.in_mat)
-
-        # Normalize connectivity matrix
-        if self.norm == 3 or self.norm == 4 or self.norm == 5:
-            from graspologic.utils.ptr import pass_to_ranks
-
-        # By maximum edge weight
-        if self.norm == 1:
-            self.in_mat = thresholding.normalize(np.nan_to_num(self.in_mat))
-        # Apply log10
-        elif self.norm == 2:
-            self.in_mat = np.log10(np.nan_to_num(self.in_mat))
-        # Apply PTR simple-nonzero
-        elif self.norm == 3:
-            self.in_mat = pass_to_ranks(
-                np.nan_to_num(self.in_mat), method="simple-nonzero"
-            )
-        # Apply PTR simple-all
-        elif self.norm == 4:
-            self.in_mat = pass_to_ranks(
-                np.nan_to_num(
-                    self.in_mat),
-                method="simple-all")
-        # Apply PTR zero-boost
-        elif self.norm == 5:
-            self.in_mat = pass_to_ranks(
-                np.nan_to_num(
-                    self.in_mat),
-                method="zero-boost")
-        # Apply standardization [0, 1]
-        elif self.norm == 6:
-            self.in_mat = thresholding.standardize(np.nan_to_num(self.in_mat))
-        else:
-            pass
-
-        self.in_mat = thresholding.autofix(self.in_mat)
-        self.G = nx.from_numpy_array(self.in_mat)
-
-        return self.G
-
-    def prune_graph(self, remove_self_loops=True):
-        from pynets.core import utils
-        from graspologic.utils import largest_connected_component, \
-            remove_loops, symmetrize
-
-        # Prune irrelevant nodes (i.e. nodes who are fully disconnected
-        # from the graph and/or those whose betweenness
-        # centrality are > 3 standard deviations below the mean)
-        if int(self.prune) == 1:
-            if nx.is_connected(self.G) is False:
-                print("Graph fragmentation detected...\n")
-            try:
-                [self.G, _] = prune_disconnected(self.G)
-            except BaseException:
-                print(UserWarning(f"Warning: Pruning failed for "
-                                  f"{self.est_path}"))
-        elif int(self.prune) == 2:
-            print("Filtering for hubs...")
-            from pynets.core.utils import load_runconfig
-            hardcoded_params = load_runconfig()
-            try:
-                hub_detection_method = hardcoded_params[
-                    "hub_detection_method"][0]
-                [self.G, _] = most_important(self.G,
-                                             method=hub_detection_method)
-            except FileNotFoundError as e:
-                import sys
-                print(e, "Failed to parse advanced.yaml")
-
-        elif int(self.prune) == 3:
-            print("Pruning all but the largest connected "
-                  "component subgraph...")
-            #self.G = self.G.subgraph(largest_connected_component(self.G))
-            self.G = largest_connected_component(self.G)
-        else:
-            print("No graph anti-fragmentation applied...")
-
-        if remove_self_loops is True:
-            self.in_mat = remove_loops(symmetrize(self.in_mat))
-        else:
-            self.in_mat = symmetrize(self.in_mat)
-
-        self.G = nx.from_numpy_array(self.in_mat)
-
-        if nx.is_empty(self.G) is True or \
-            (np.abs(self.in_mat) < 0.0000001).all() or \
-                self.G.number_of_edges() == 0:
-            print(UserWarning(f"Warning: {self.est_path} "
-                              f"empty after pruning!"))
-            return self.in_mat, None
-
-        # Saved pruned
-        if (self.prune != 0) and (self.prune is not None):
-            final_mat_path = f"{self.est_path.split('.npy')[0]}{'_pruned'}"
-            utils.save_mat(self.in_mat, final_mat_path, self.out_fmt)
-            print(f"{'Source File: '}{final_mat_path}")
-        elif self.prune == 0:
-            final_mat_path = f"{self.est_path.split('.npy')[0]}"
-            utils.save_mat(self.in_mat, final_mat_path, self.out_fmt)
-            print(f"{'Source File: '}{final_mat_path}")
-        else:
-            raise ValueError(f"Pruning option {self.prune} invalid!")
-
-        return self.in_mat, final_mat_path
-
-    def print_summary(self):
-        print(f"\n\nThreshold: {100 * float(self.thr):.2f}%")
-
-        info_list = list(nx.info(self.G).split("\n"))[2:]
-        for i in info_list:
-            print(i)
-        return
-
-    def binarize_graph(self):
-        from pynets.core import thresholding
-
-        in_mat_bin = thresholding.binarize(self.in_mat)
-
-        # Load numpy matrix as networkx graph
-        G_bin = nx.from_numpy_array(in_mat_bin)
-        return in_mat_bin, G_bin
-
-    def create_length_matrix(self):
-        in_mat_len = thresholding.weight_conversion(self.in_mat, "lengths")
-
-        # Load numpy matrix as networkx graph
-        G_len = nx.from_numpy_array(in_mat_len)
-        return in_mat_len, G_len
-
-
-def save_netmets(
-        dir_path,
-        est_path,
-        metric_list_names,
-        net_met_val_list_final):
-    from pynets.core import utils
-    import os
-    # And save results to csv
-    out_path_neat = (
-        f"{utils.create_csv_path(dir_path, est_path).split('.csv')[0]}"
-        f"{'_neat.csv'}"
-    )
-    zipped_dict = dict(zip(metric_list_names, net_met_val_list_final))
-    df = pd.DataFrame.from_dict(
-        zipped_dict, orient="index", dtype="float32"
-    ).transpose()
-    if os.path.isfile(out_path_neat):
-        os.remove(out_path_neat)
-    df.to_csv(out_path_neat, index=False)
-    del df, zipped_dict, net_met_val_list_final, metric_list_names
-
-    return out_path_neat
-
-
 def iterate_nx_global_measures(G, metric_list_glob):
     import time
 
@@ -1962,444 +1729,6 @@ def get_rich_club_coeff(G, metric_list_names, net_met_val_list_final,
     return metric_list_names, net_met_val_list_final
 
 
-def extractnetstats(
-        ID,
-        subnet,
-        thr,
-        conn_model,
-        est_path,
-        roi,
-        prune,
-        norm,
-        binary):
-    """
-    Function interface for performing fully-automated graph analysis.
-
-    Parameters
-    ----------
-    ID : str
-        A subject id or other unique identifier.
-    subnet : str
-        Resting-state subnet based on Yeo-7 and Yeo-17 naming
-        (e.g. 'Default') used to filter nodes in the study of brain subgraphs.
-    thr : float
-        The value, between 0 and 1, used to threshold the graph using any
-        variety of methods triggered through other options.
-    conn_model : str
-       Connectivity estimation model (e.g. corr for correlation, cov for
-       covariance, sps for precision covariance,
-       partcorr for partial correlation). sps type is used by default.
-    est_path : str
-        File path to the thresholded graph, conn_matrix_thr, saved as a numpy
-        array in .npy format.
-    roi : str
-        File path to binarized/boolean region-of-interest Nifti1Image file.
-    prune : int
-        Indicates whether to prune final graph of disconnected nodes/isolates.
-    norm : int
-        Indicates method of normalizing resulting graph.
-    binary : bool
-        Indicates whether to binarize resulting graph edges to form an
-        unweighted graph.
-
-    Returns
-    -------
-    out_path : str
-        Path to .csv file where graph analysis results are saved.
-
-    References
-    ----------
-    .. [1] Fornito, A., Zalesky, A., & Bullmore, E. T. (2016).
-      Fundamentals of Brain subnet Analysis. In Fundamentals of Brain subnet
-      Analysis. https://doi.org/10.1016/C2012-0-06036-X
-    .. [2] Aric A. Hagberg, Daniel A. Schult and Pieter J. Swart,
-      “Exploring subnet structure, dynamics, and function using NetworkX”,
-      in Proceedings of the 7th Python in Science Conference (SciPy2008),
-      Gäel Varoquaux, Travis Vaught, and Jarrod Millman (Eds),
-      (Pasadena, CA USA), pp. 11–15, Aug 2008
-
-    """
-    import time
-    import gc
-    import os
-    import os.path as op
-    import yaml
-
-    # import random
-    import pkg_resources
-    import networkx
-    from pathlib import Path
-    from pynets.statistics.individual import algorithms
-
-    # Load netstats config and parse graph algorithms as objects
-    with open(
-        pkg_resources.resource_filename("pynets",
-                                        "statistics/individual/global.yaml"),
-        "r",
-    ) as stream:
-        try:
-            nx_algs = [
-                "degree_assortativity_coefficient",
-                "average_clustering",
-                "average_shortest_path_length",
-                "graph_number_of_cliques",
-            ]
-            pynets_algs = [
-                "average_local_efficiency",
-                "global_efficiency",
-                "smallworldness",
-                "weighted_transitivity",
-            ]
-            metric_dict_global = yaml.load(stream, Loader=yaml.FullLoader)
-            metric_list_global = metric_dict_global["metric_list_global"]
-            if metric_list_global is not None:
-                metric_list_global = [
-                    getattr(networkx.algorithms, i)
-                    for i in metric_list_global
-                    if i in nx_algs
-                ] + [
-                    getattr(algorithms, i)
-                    for i in metric_list_global
-                    if i in pynets_algs
-                ]
-                metric_list_global_names = [
-                    str(i).split("<function ")[1].split(" at")[0]
-                    for i in metric_list_global
-                ]
-                if binary is False:
-                    from functools import partial
-
-                    metric_list_global = [
-                        partial(i, weight="weight")
-                        if "weight" in i.__code__.co_varnames
-                        else i
-                        for i in metric_list_global
-                    ]
-                print(
-                    f"\n\nGlobal Topographic Metrics:"
-                    f"\n{metric_list_global_names}\n")
-            else:
-                print("No global topographic metrics selected!")
-                metric_list_global = []
-                metric_list_global_names = []
-        except FileNotFoundError as e:
-            import sys
-            print(e, "Failed to parse global.yaml")
-
-    with open(
-        pkg_resources.resource_filename("pynets",
-                                        "statistics/individual/local.yaml"),
-        "r",
-    ) as stream:
-        try:
-            metric_dict_nodal = yaml.load(stream, Loader=yaml.FullLoader)
-            metric_list_nodal = metric_dict_nodal["metric_list_nodal"]
-            if metric_list_nodal is not None:
-                print(f"\nNodal Topographic Metrics:\n{metric_list_nodal}\n\n")
-            else:
-                print("No nodal topographic metrics selected!")
-                metric_list_nodal = []
-        except FileNotFoundError as e:
-            import sys
-            print(e, "Failed to parse local.yaml")
-
-    if os.path.isfile(est_path):
-        cg = CleanGraphs(thr, conn_model, est_path, prune, norm)
-
-        tmp_graph_path = None
-        if float(prune) >= 1:
-            [_, tmp_graph_path] = cg.prune_graph()
-
-        if float(norm) >= 1:
-            try:
-                cg.normalize_graph()
-            except ValueError as e:
-                print(e, f"Graph normalization failed for {est_path}.")
-
-        if 'modality-func' in est_path and 'model-sps' not in est_path:
-            binary = True
-
-        if binary is True:
-            try:
-                in_mat, G = cg.binarize_graph()
-            except ValueError as e:
-                print(e, f"Graph binarization failed for {est_path}.")
-                in_mat = np.zeros(1, 1)
-                G = nx.Graph()
-        else:
-            in_mat, G = cg.in_mat, cg.G
-
-        cg.print_summary()
-
-        dir_path = op.dirname(op.realpath(est_path))
-
-        # Deal with empty graphs
-        if nx.is_empty(G) is True or (np.abs(in_mat) < 0.0000001).all() or \
-                G.number_of_edges() == 0 or len(G) < 3:
-            out_path_neat = save_netmets(
-                dir_path, est_path, [""], [np.nan])
-            print(UserWarning(f"Warning: Empty graph detected for {ID}: "
-                              f"{est_path}..."))
-        else:
-            try:
-                in_mat_len, G_len = cg.create_length_matrix()
-            except ValueError as e:
-                print(e, f"Failed to create length matrix for {est_path}.")
-                G_len = None
-
-            if len(metric_list_global) > 0:
-                # Iteratively run functions from above metric list that
-                # generate single scalar output
-                net_met_val_list_final, metric_list_names = \
-                    iterate_nx_global_measures(G, metric_list_global)
-
-                # Run miscellaneous functions that generate multiple outputs
-                # Calculate modularity using the Louvain algorithm
-                if "louvain_modularity" in metric_list_global:
-                    try:
-                        start_time = time.time()
-                        net_met_val_list_final, metric_list_names, ci = \
-                            get_community(G, net_met_val_list_final,
-                                          metric_list_names)
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Louvain modularity calculation is undefined for"
-                              " G")
-                        # np.save("%s%s%s" % ('/tmp/community_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G)))
-                        ci = None
-                        pass
-                else:
-                    ci = None
-            else:
-                metric_list_names = []
-                net_met_val_list_final = []
-                ci = None
-
-            if len(metric_list_nodal) > 0:
-                # Participation Coefficient by louvain community
-                if ci and "participation_coefficient" in metric_list_nodal:
-                    try:
-                        if not ci:
-                            raise KeyError(
-                                "Participation coefficient cannot be "
-                                "calculated for G in the absence of a "
-                                "community affiliation vector")
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_participation(in_mat, ci, metric_list_names,
-                                              net_met_val_list_final)
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Participation coefficient cannot be calculated "
-                              "for G")
-                        # np.save("%s%s%s" % ('/tmp/partic_coeff_failure',
-                        # random.randint(1, 400), '.npy'), in_mat)
-                        pass
-                else:
-                    if not ci and "participation_coefficient" in \
-                            metric_list_nodal:
-                        print(UserWarning("Skipping participation coefficient "
-                                          "because community affiliation is "
-                                          "empty for G..."))
-
-                # Diversity Coefficient by louvain community
-                if ci and "diversity_coefficient" in metric_list_nodal:
-                    try:
-                        if not ci:
-                            raise KeyError(
-                                "Diversity coefficient cannot be calculated "
-                                "for G in the absence of a community "
-                                "affiliation vector")
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_diversity(in_mat, ci, metric_list_names,
-                                          net_met_val_list_final
-                                          )
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Diversity coefficient cannot be calculated for "
-                              "G")
-                        # np.save("%s%s%s" % ('/tmp/div_coeff_failure',
-                        # random.randint(1, 400), '.npy'), in_mat)
-                        pass
-                else:
-                    if not ci and "diversity_coefficient" in \
-                            metric_list_nodal:
-                        print(UserWarning("Skipping diversity coefficient "
-                                          "because community affiliation is "
-                                          "empty for G..."))
-
-                # # Link communities
-                # if "link_communities" in metric_list_nodal:
-                #     try:
-                #         if ci is None:
-                #             raise KeyError(
-                #                 "Link communities cannot be calculated for
-                #                 G in the absence of a community affiliation
-                #                 vector")
-                #         start_time = time.time()
-                #         metric_list_names, net_met_val_list_final =
-                #         get_link_communities(
-                #             in_mat, ci, metric_list_names,
-                #             net_met_val_list_final
-                #         )
-                #         print(f"{np.round(time.time() - start_time, 3)}s")
-                #     except BaseException:
-                #         print("Link communities cannot be calculated for G")
-                #         # np.save("%s%s%s" % ('/tmp/link_comms_failure',
-                #         random.randint(1, 400), '.npy'), in_mat)
-                #         pass
-
-                # Local Efficiency
-                if "local_efficiency" in metric_list_nodal:
-                    try:
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_local_efficiency(G, metric_list_names,
-                                                 net_met_val_list_final)
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Local efficiency cannot be calculated for G")
-                        # np.save("%s%s%s" % ('/tmp/local_eff_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G)))
-                        pass
-
-                # Local Clustering
-                if "local_clustering" in metric_list_nodal:
-                    try:
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_clustering(
-                                G, metric_list_names, net_met_val_list_final
-                            )
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Local clustering cannot be calculated for G")
-                        # np.save("%s%s%s" % ('/tmp/local_clust_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G)))
-                        pass
-
-                # Degree centrality
-                if "degree_centrality" in metric_list_nodal:
-                    try:
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_degree_centrality(
-                                G, metric_list_names, net_met_val_list_final
-                            )
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Degree centrality cannot be calculated for G")
-                        # np.save("%s%s%s" % ('/tmp/degree_cent_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G)))
-                        pass
-
-                # Betweenness Centrality
-                if "betweenness_centrality" in metric_list_nodal and \
-                        G_len is not None:
-                    try:
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_betweenness_centrality(
-                                G_len, metric_list_names,
-                                net_met_val_list_final)
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Betweenness centrality cannot be calculated for"
-                              " G")
-                        # np.save("%s%s%s" % ('/tmp/betw_cent_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G_len)))
-                        pass
-                else:
-                    if G_len is None and "betweenness_centrality" in \
-                            metric_list_nodal:
-                        print(UserWarning("Skipping betweenness centrality "
-                                          "because length matrix is empty for "
-                                          "G..."))
-
-                # Eigenvector Centrality
-                if "eigenvector_centrality" in metric_list_nodal:
-                    try:
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_eigen_centrality(
-                                G, metric_list_names, net_met_val_list_final
-                            )
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Eigenvector centrality cannot be calculated for"
-                              " G")
-                        # np.save("%s%s%s" % ('/tmp/eig_cent_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G)))
-                        pass
-
-                # Communicability Centrality
-                if "communicability_centrality" in metric_list_nodal:
-                    try:
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_comm_centrality(
-                                G, metric_list_names, net_met_val_list_final
-                            )
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Communicability centrality cannot be "
-                              "calculated for G")
-                        # np.save("%s%s%s" % ('/tmp/comm_cent_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G)))
-                        pass
-
-                # Rich club coefficient
-                if "rich_club_coefficient" in metric_list_nodal:
-                    try:
-                        start_time = time.time()
-                        metric_list_names, net_met_val_list_final = \
-                            get_rich_club_coeff(
-                                G, metric_list_names, net_met_val_list_final
-                            )
-                        print(f"{np.round(time.time() - start_time, 3)}{'s'}")
-                    except BaseException:
-                        print("Rich club coefficient cannot be calculated for "
-                              "G")
-                        # np.save("%s%s%s" % ('/tmp/rich_club_failure',
-                        # random.randint(1, 400), '.npy'),
-                        #         np.array(nx.to_numpy_matrix(G)))
-                        pass
-            if len(metric_list_nodal) > 0 or len(metric_list_global) > 0:
-                out_path_neat = save_netmets(
-                    dir_path, est_path, metric_list_names,
-                    net_met_val_list_final
-                )
-                # Cleanup
-                if tmp_graph_path:
-                    if os.path.isfile(tmp_graph_path):
-                        os.remove(tmp_graph_path)
-
-                del net_met_val_list_final, metric_list_names, \
-                    metric_list_global
-                gc.collect()
-            else:
-                out_path_neat = save_netmets(
-                    dir_path, est_path, [""], [np.nan],
-                )
-    else:
-        print(UserWarning(f"Warning: Empty graph detected for {ID}: "
-                          f"{est_path}..."))
-        dir_path = op.dirname(op.realpath(est_path))
-        out_path_neat = save_netmets(
-            dir_path, est_path, [""], [np.nan],
-        )
-    return out_path_neat
-
-
 def collect_pandas_df_make(
     net_mets_csv_list,
     ID,
diff --git a/pynets/statistics/individual/multiplex.py b/pynets/statistics/individual/multiplex.py
old mode 100644
new mode 100755
diff --git a/pynets/statistics/individual/spectral.py b/pynets/statistics/individual/spectral.py
old mode 100644
new mode 100755
index a6b93645..09ba0646
--- a/pynets/statistics/individual/spectral.py
+++ b/pynets/statistics/individual/spectral.py
@@ -60,7 +60,7 @@ def _omni_embed(pop_array, atlas, graph_path_list,
     import numpy as np
     from graspologic.embed.omni import OmnibusEmbed
     from graspologic.embed.mds import ClassicalMDS
-    from pynets.statistics.individual.algorithms import CleanGraphs
+    from pynets.statistics.interfaces import CleanGraphs
 
     dir_path = str(Path(os.path.dirname(graph_path_list[0])).parent)
 
@@ -71,22 +71,16 @@ def _omni_embed(pop_array, atlas, graph_path_list,
     clean_mats = []
     i = 0
     for graph_path in graph_path_list:
-        if 'thr-' in graph_path:
-            thr = float(graph_path.split('thr-'
-                                         )[1].split('_')[0].split('.npy')[0])
-        else:
-            thr = 1.0
-        cg = CleanGraphs(thr,
-                         graph_path.split('model-')[1].split('_')[
-                             0], graph_path, prune, norm, pop_array[i])
+        cg = CleanGraphs(graph_path, prune, norm)
 
         if float(norm) >= 1:
-            G = cg.normalize_graph()
-            mat_clean = nx.to_numpy_array(G)
+            mat_clean = nx.to_numpy_array(cg.normalize_graph())
         else:
             mat_clean = pop_array[i]
 
-        mat_clean[np.where(np.isnan(mat_clean) | np.isinf(mat_clean))] = 0
+        if float(prune) >= 1:
+            mat_clean = cg.prune_graph()[0]
+
         if np.isnan(np.sum(mat_clean)) == False:
             clean_mats.append(mat_clean)
         i += 1
@@ -103,13 +97,9 @@ def _omni_embed(pop_array, atlas, graph_path_list,
         mds = ClassicalMDS(n_components=n_components)
         omni_fit = omni.fit_transform(clean_mats)
 
-        # Transform omnibus tensor into dissimilarity feature
-        mds_fit = mds.fit_transform(omni_fit.reshape(omni_fit.shape[1],
-                                                     omni_fit.shape[2],
-                                                     omni_fit.shape[0]))
-
         out_path = (
-            f"{namer_dir}/gradient-OMNI_subnet-{atlas}_res-{subgraph_name}_"
+            f"{namer_dir}/gradient-OMNI_subnet-{atlas}_"
+            f"granularity-{subgraph_name}_"
             f"{os.path.basename(graph_path_list[0]).split('_thrtype')[0]}.npy"
         )
 
@@ -127,17 +117,24 @@ def _omni_embed(pop_array, atlas, graph_path_list,
         # dump(omni, out_path_est_omni)
         # dump(omni, out_path_est_mds)
 
+        # Transform omnibus tensor into dissimilarity feature
+        mds_fit = mds.fit_transform(omni_fit.reshape(omni_fit.shape[1],
+                                                     omni_fit.shape[2],
+                                                     omni_fit.shape[0]))
+
         print("Saving...")
         np.save(out_path, mds_fit)
-        del mds, mds_fit, omni, omni_fit
+        #np.save(out_path, omni_fit)
+        del mds, omni, omni_fit
     else:
         # Add a null tmp file to prevent pool from breaking
         out_path = f"{namer_dir}/gradient-OMNI" \
-                   f"_subnet-{atlas}_res-{subgraph_name}_" \
+                   f"_subnet-{atlas}_granularity-{subgraph_name}_" \
                    f"{os.path.basename(graph_path_list[0])}_NULL"
         # TODO: Replace this band-aid solution with the real fix
         out_path = out_path.replace('subnet-subnet-',
-                                    'subnet-').replace('res-res-', 'res-')
+                                    'subnet-').replace(
+            'granularity-granularity-', 'granularity-')
         if not os.path.exists(out_path):
             open(out_path, 'w').close()
     return out_path
@@ -283,7 +280,7 @@ def _ase_embed(mat, atlas, graph_path, subgraph_name="all_nodes",
     import networkx as nx
     import numpy as np
     from graspologic.embed.ase import AdjacencySpectralEmbed
-    from pynets.statistics.individual.algorithms import CleanGraphs
+    from pynets.statistics.interfaces import CleanGraphs
 
     # Adjacency Spectral embedding
     print(
@@ -292,29 +289,15 @@ def _ase_embed(mat, atlas, graph_path, subgraph_name="all_nodes",
     )
     ase = AdjacencySpectralEmbed(n_components=n_components)
 
-    if 'thr-' in graph_path:
-        thr = float(graph_path.split('thr-')[1].split('_')[0].split('.npy')[0])
-    else:
-        thr = 1.0
-
-    cg = CleanGraphs(thr,
-                     graph_path.split('model-')[1].split('-')[1].split('_')[0],
-                     graph_path, prune, norm, mat)
+    cg = CleanGraphs(graph_path, prune, norm)
 
     if float(norm) >= 1:
-        G = cg.normalize_graph()
-        mat_clean = nx.to_numpy_array(G)
+        mat_clean = nx.to_numpy_array(cg.normalize_graph())
     else:
         mat_clean = mat
 
     if float(prune) >= 1:
-        graph_path_tmp = cg.prune_graph()[1]
-        with open(f"{graph_path_tmp}.pkl", "rb") as input_file:
-            G_pruned = pickle.load(input_file)
-        input_file.close()
-        mat_clean = nx.to_numpy_matrix(G_pruned)
-
-    mat_clean[np.where(np.isnan(mat_clean) | np.isinf(mat_clean))] = 0
+        mat_clean = cg.prune_graph()[0]
 
     if (np.abs(mat_clean) < 0.0000001).all() or np.isnan(np.sum(mat_clean)):
         return None
@@ -328,7 +311,7 @@ def _ase_embed(mat, atlas, graph_path, subgraph_name="all_nodes",
         os.makedirs(namer_dir, exist_ok=True)
 
     out_path = f"{namer_dir}/gradient-ASE" \
-               f"_subnet-{atlas}_res-{subgraph_name}_" \
+               f"_subnet-{atlas}_granularity-{subgraph_name}_" \
                f"{os.path.basename(graph_path)}"
     # out_path_est = f"{namer_dir}/gradient-ASE_{atlas}" \
     #                f"_{subgraph_name}" \
@@ -336,7 +319,7 @@ def _ase_embed(mat, atlas, graph_path, subgraph_name="all_nodes",
 
     # TODO: Replace this band-aid solution with the real fix
     out_path = out_path.replace('subnet-subnet-', 'subnet-').replace(
-        'res-res-', 'res-')
+        'granularity-granularity', 'granularity-')
     #dump(ase, out_path_est)
 
     print("Saving...")
@@ -346,7 +329,7 @@ def _ase_embed(mat, atlas, graph_path, subgraph_name="all_nodes",
     return out_path
 
 
-def build_asetomes(est_path_iterlist, ID):
+def build_asetomes(est_path_iterlist):
     """
     Embeds single graphs using the ASE algorithm.
 
@@ -354,8 +337,6 @@ def build_asetomes(est_path_iterlist, ID):
     ----------
     est_path_iterlist : list
         List of file paths to .npy files, each containing a graph.
-    ID : str
-        A subject id or other unique identifier.
 
     """
     from pathlib import Path
@@ -408,11 +389,12 @@ def build_asetomes(est_path_iterlist, ID):
             if os.path.isdir(namer_dir) is False:
                 os.makedirs(namer_dir, exist_ok=True)
             out_path = f"{namer_dir}/gradient-ASE" \
-                       f"_subnet-{atlas}_res-{subgraph}_" \
+                       f"_subnet-{atlas}_granularity-{subgraph}_" \
                        f"{os.path.basename(file_)}_NULL"
             # TODO: Replace this band-aid solution with the real fix
             out_path = out_path.replace('subnet-subnet-',
-                                        'subnet-').replace('res-res-', 'res-')
+                                        'subnet-').replace(
+                'granularity-granularity-', 'granularity-')
             if not os.path.exists(out_path):
                 open(out_path, 'w').close()
             out_paths.append(out_path)
@@ -420,7 +402,7 @@ def build_asetomes(est_path_iterlist, ID):
     return out_paths
 
 
-def build_masetome(est_path_iterlist, ID):
+def build_masetome(est_path_iterlist):
     """
     Embeds structural-functional graph pairs into a common invariant subspace.
 
@@ -430,8 +412,6 @@ def build_masetome(est_path_iterlist, ID):
         List of list of pairs of file paths (.npy) corresponding to
         structural and functional connectomes matched at a given node
         resolution.
-    ID : str
-        A subject id or other unique identifier.
 
     References
     ----------
@@ -503,7 +483,7 @@ def build_masetome(est_path_iterlist, ID):
     return out_paths
 
 
-def build_omnetome(est_path_iterlist, ID):
+def build_omnetome(est_path_iterlist):
     """
     Embeds ensemble population of graphs into an embedded ensemble feature
     vector.
@@ -512,8 +492,6 @@ def build_omnetome(est_path_iterlist, ID):
     ----------
     est_path_iterlist : list
         List of file paths to .npy file containing graph.
-    ID : str
-        A subject id or other unique identifier.
 
     References
     ----------
diff --git a/pynets/statistics/interfaces.py b/pynets/statistics/interfaces.py
index 44932d48..c935f3d3 100755
--- a/pynets/statistics/interfaces.py
+++ b/pynets/statistics/interfaces.py
@@ -4,8 +4,15 @@
 Created on Fri Nov 10 15:44:46 2017
 Copyright (C) 2017
 """
+import numpy as np
+import networkx as nx
 import warnings
 import sys
+import time
+import gc
+import os
+import os.path as op
+import yaml
 if sys.platform.startswith('win') is False:
     import indexed_gzip
 from nipype.interfaces.base import (
@@ -15,19 +22,204 @@
     File,
     traits,
 )
+from pathlib import Path
+import graspologic.utils as gu
+from pynets.core import utils, thresholding
 
 warnings.filterwarnings("ignore")
 
 
+class CleanGraphs(object):
+    """
+    A Class for cleaning graphs in preparation for subnet analysis.
+
+    Parameters
+    ----------
+    est_path : str
+        File path to the thresholded graph, conn_matrix_thr, saved as a numpy
+        array in .npy format.
+    prune : int
+        Indicates whether to prune final graph of disconnected nodes/isolates.
+    norm : int
+        Indicates method of normalizing resulting graph.
+
+    Returns
+    -------
+    out_path : str
+        Path to .csv file where graph analysis results are saved.
+
+    References
+    ----------
+    .. [1] Qin, Tai, and Karl Rohe. "Regularized spectral clustering
+      under the degree-corrected stochastic blockmodel." In Advances
+      in Neural Information Processing Systems, pp. 3120-3128. 2013
+    .. [2] Rohe, Karl, Tai Qin, and Bin Yu. "Co-clustering directed graphs to
+      discover asymmetries and directional communities." Proceedings of the
+      National Academy of Sciences 113.45 (2016): 12679-12684.
+
+    """
+
+    def __init__(
+            self,
+            est_path,
+            prune,
+            norm,
+            out_fmt="gpickle",
+            remove_self_loops=True):
+
+        self.est_path = est_path
+        self.prune = prune
+        self.norm = norm
+        self.out_fmt = out_fmt
+        self.in_mat = None
+
+        # Load and threshold matrix
+        self.in_mat_raw = utils.load_mat(self.est_path)
+
+        # De-diagnal and remove nan's and inf's, ensure edge weights are
+        # positive
+        self.in_mat = np.array(
+            np.array(
+                thresholding.autofix(
+                    np.array(np.abs(
+                        self.in_mat_raw)))))
+
+        # Remove self-loops and ensure symmetry
+        if remove_self_loops is True:
+            self.in_mat = gu.remove_loops(gu.symmetrize(self.in_mat))
+        else:
+            self.in_mat = gu.symmetrize(self.in_mat)
+
+        self.in_mat[np.where(np.isnan(self.in_mat) |
+                             np.isinf(self.in_mat))] = 0
+
+        # Create nx graph
+        self.G = nx.from_numpy_array(self.in_mat)
+
+    # Normalize connectivity matrix
+    def normalize_graph(self):
+        # By maximum edge weight
+        if self.norm == 1:
+            self.in_mat = thresholding.normalize(np.nan_to_num(self.in_mat))
+        # Apply log10
+        elif self.norm == 2:
+            self.in_mat = np.log10(np.nan_to_num(self.in_mat))
+        # Apply PTR simple-nonzero
+        elif self.norm == 3:
+            self.in_mat = gu.ptr.pass_to_ranks(
+                np.nan_to_num(self.in_mat), method="simple-nonzero"
+            )
+        # Apply PTR simple-all
+        elif self.norm == 4:
+            self.in_mat = gu.ptr.pass_to_ranks(
+                np.nan_to_num(
+                    self.in_mat),
+                method="simple-all")
+        # Apply PTR zero-boost
+        elif self.norm == 5:
+            self.in_mat = gu.ptr.pass_to_ranks(
+                np.nan_to_num(
+                    self.in_mat),
+                method="zero-boost")
+        # Apply standardization [0, 1]
+        elif self.norm == 6:
+            self.in_mat = thresholding.standardize(np.nan_to_num(self.in_mat))
+        elif self.norm == 7:
+            # Get hyperbolic tangent (i.e. fischer r-to-z transform) of matrix
+            # if non-covariance
+            self.in_mat = np.arctanh(self.in_mat)
+        else:
+            pass
+
+        self.in_mat = thresholding.autofix(self.in_mat)
+        self.G = nx.from_numpy_array(self.in_mat)
+
+        return self.G
+
+    def prune_graph(self):
+        from pynets.statistics.individual.algorithms import defragment, \
+            prune_small_components, most_important
+
+        hardcoded_params = utils.load_runconfig()
+
+        if int(self.prune) not in range(0, 4):
+            raise ValueError(f"Pruning option {self.prune} invalid!")
+
+        if self.prune != 0:
+            # Remove isolates
+            G_tmp = self.G.copy()
+            self.G = defragment(G_tmp)[0]
+            del G_tmp
+
+        if int(self.prune) == 1:
+            try:
+                self.G = prune_small_components(self.G,
+                                                min_nodes=hardcoded_params[
+                                                    "min_nodes"][0])
+            except BaseException:
+                print(UserWarning(f"Warning: pruning {self.est_path} "
+                                  f"failed..."))
+        elif int(self.prune) == 2:
+            try:
+                hub_detection_method = \
+                hardcoded_params["hub_detection_method"][0]
+                print(f"Filtering for hubs on the basis of "
+                      f"{hub_detection_method}...\n")
+                self.G = most_important(self.G,
+                                        method=hub_detection_method)[0]
+            except FileNotFoundError as e:
+                import sys
+                print(e, "Failed to parse advanced.yaml")
+
+        elif int(self.prune) == 3:
+            print("Pruning all but the largest connected "
+                  "component subgraph...")
+            self.G = gu.largest_connected_component(self.G)
+        else:
+            print("No graph defragmentation applied...")
+
+        self.G = nx.from_numpy_array(self.in_mat)
+
+        if nx.is_empty(self.G) is True or \
+            (np.abs(self.in_mat) < 0.0000001).all() or \
+                self.G.number_of_edges() == 0:
+            print(UserWarning(f"Warning: {self.est_path} "
+                              f"empty after pruning!"))
+            return self.in_mat, None
+
+        # Saved pruned
+        if (self.prune != 0) and (self.prune is not None):
+            final_mat_path = f"{self.est_path.split('.npy')[0]}{'_pruned'}"
+            utils.save_mat(self.in_mat, final_mat_path, self.out_fmt)
+            print(f"{'Source File: '}{final_mat_path}")
+
+        return self.in_mat, final_mat_path
+
+    def print_summary(self):
+        for i in list(nx.info(self.G).split("\n"))[2:]:
+            print(i)
+        return
+
+    def binarize_graph(self):
+        in_mat_bin = thresholding.binarize(self.in_mat)
+
+        # Load numpy matrix as networkx graph
+        G_bin = nx.from_numpy_array(in_mat_bin)
+        return in_mat_bin, G_bin
+
+    def create_length_matrix(self):
+        in_mat_len = thresholding.weight_conversion(self.in_mat, "lengths")
+
+        # Load numpy matrix as networkx graph
+        G_len = nx.from_numpy_array(in_mat_len)
+        return in_mat_len, G_len
+
+
 class NetworkAnalysisInputSpec(BaseInterfaceInputSpec):
     """Input interface wrapper for NetworkAnalysis"""
 
     ID = traits.Any(mandatory=True)
-    subnet = traits.Any(mandatory=False)
-    thr = traits.Any(mandatory=True)
-    conn_model = traits.Str(mandatory=True)
     est_path = File(exists=True, mandatory=True)
-    roi = traits.Any(mandatory=False)
     prune = traits.Any(mandatory=False)
     norm = traits.Any(mandatory=False)
     binary = traits.Bool(False, usedefault=True)
@@ -46,20 +238,329 @@ class NetworkAnalysis(BaseInterface):
     output_spec = NetworkAnalysisOutputSpec
 
     def _run_interface(self, runtime):
-        from pynets.statistics.individual.algorithms import extractnetstats
-
-        out = extractnetstats(
-            self.inputs.ID,
-            self.inputs.subnet,
-            self.inputs.thr,
-            self.inputs.conn_model,
-            self.inputs.est_path,
-            self.inputs.roi,
-            self.inputs.prune,
-            self.inputs.norm,
-            self.inputs.binary,
-        )
-        setattr(self, "_outpath", out)
+        # import random
+        import pkg_resources
+        from pynets.statistics.individual import algorithms
+        from pynets.statistics.utils import save_netmets
+
+        # Load netstats config and parse graph algorithms as objects
+        with open(
+            pkg_resources.resource_filename("pynets",
+                                            "statistics/individual/"
+                                            "global.yaml"),
+            "r",
+        ) as stream:
+            try:
+                nx_algs = [
+                    "degree_assortativity_coefficient",
+                    "average_clustering",
+                    "average_shortest_path_length",
+                    "graph_number_of_cliques",
+                ]
+                pynets_algs = [
+                    "average_local_efficiency",
+                    "global_efficiency",
+                    "smallworldness",
+                    "weighted_transitivity",
+                ]
+                metric_dict_global = yaml.load(stream, Loader=yaml.FullLoader)
+                metric_list_global = metric_dict_global["metric_list_global"]
+                if metric_list_global is not None:
+                    metric_list_global = [
+                                             getattr(nx.algorithms, i)
+                                             for i in metric_list_global
+                                             if i in nx_algs
+                                         ] + [
+                                             getattr(algorithms, i)
+                                             for i in metric_list_global
+                                             if i in pynets_algs
+                                         ]
+                    metric_list_global_names = [
+                        str(i).split("<function ")[1].split(" at")[0]
+                        for i in metric_list_global
+                    ]
+                    if self.inputs.binary is False:
+                        from functools import partial
+
+                        metric_list_global = [
+                            partial(i, weight="weight")
+                            if "weight" in i.__code__.co_varnames
+                            else i for i in metric_list_global
+                        ]
+                    print(
+                        f"\n\nGlobal Topographic Metrics:"
+                        f"\n{metric_list_global_names}\n")
+                else:
+                    print("No global topographic metrics selected!")
+                    metric_list_global = []
+                    metric_list_global_names = []
+            except FileNotFoundError as e:
+                import sys
+                print(e, "Failed to parse global.yaml")
+
+        with open(
+            pkg_resources.resource_filename("pynets",
+                                            "statistics/individual/"
+                                            "local.yaml"),
+            "r",
+        ) as stream:
+            try:
+                metric_dict_nodal = yaml.load(stream, Loader=yaml.FullLoader)
+                metric_list_nodal = metric_dict_nodal["metric_list_nodal"]
+                if metric_list_nodal is not None:
+                    print(
+                        f"\nNodal Topographic Metrics:"
+                        f"\n{metric_list_nodal}\n\n")
+                else:
+                    print("No nodal topographic metrics selected!")
+                    metric_list_nodal = []
+            except FileNotFoundError as e:
+                import sys
+                print(e, "Failed to parse local.yaml")
+
+        if os.path.isfile(self.inputs.est_path):
+
+            cg = CleanGraphs(self.inputs.est_path, self.inputs.prune,
+                             self.inputs.norm)
+
+            tmp_graph_path = None
+            if float(self.inputs.prune) >= 1:
+                tmp_graph_path = cg.prune_graph()[1]
+
+            if float(self.inputs.norm) >= 1:
+                try:
+                    cg.normalize_graph()
+                except ValueError as e:
+                    print(e, f"Graph normalization failed for "
+                             f"{self.inputs.est_path}.")
+
+            if self.inputs.binary is True:
+                try:
+                    in_mat, G = cg.binarize_graph()
+                except ValueError as e:
+                    print(e, f"Graph binarization failed for "
+                             f"{self.inputs.est_path}.")
+                    in_mat = np.zeros(1, 1)
+                    G = nx.Graph()
+            else:
+                in_mat, G = cg.in_mat, cg.G
+
+            cg.print_summary()
+
+            dir_path = op.dirname(op.realpath(self.inputs.est_path))
+
+            # Deal with empty graphs
+            if nx.is_empty(G) is True or (np.abs(in_mat) < 0.0000001).all() \
+                or G.number_of_edges() == 0 or len(G) < 3:
+                out_path_neat = save_netmets(
+                    dir_path, self.inputs.est_path, [""], [np.nan])
+                print(UserWarning(f"Warning: Empty graph detected for "
+                                  f"{self.inputs.ID}: "
+                                  f"{self.inputs.est_path}..."))
+            else:
+                try:
+                    in_mat_len, G_len = cg.create_length_matrix()
+                except ValueError as e:
+                    print(e, f"Failed to create length matrix for "
+                             f"{self.inputs.est_path}.")
+                    G_len = None
+
+                if len(metric_list_global) > 0:
+                    # Iteratively run functions from above metric list that
+                    # generate single scalar output
+                    net_met_val_list_final, metric_list_names = \
+                        algorithms.iterate_nx_global_measures(
+                            G, metric_list_global)
+
+                    # Run miscellaneous functions that generate multiple
+                    # outputs Calculate modularity using the Louvain algorithm
+                    if "louvain_modularity" in metric_list_global:
+                        try:
+                            start_time = time.time()
+                            net_met_val_list_final, metric_list_names, ci = \
+                                algorithms.get_community(
+                                    G, net_met_val_list_final,
+                                              metric_list_names)
+                            print(
+                                f"{np.round(time.time() - start_time, 3)}"
+                                f"{'s'}")
+                        except BaseException:
+                            print(
+                                "Louvain modularity calculation is undefined "
+                                "for G")
+                            # np.save("%s%s%s" % ('/tmp/community_failure',
+                            # random.randint(1, 400), '.npy'),
+                            #         np.array(nx.to_numpy_matrix(G)))
+                            ci = None
+                            pass
+                    else:
+                        ci = None
+                else:
+                    metric_list_names = []
+                    net_met_val_list_final = []
+                    ci = None
+
+                if len(metric_list_nodal) > 0:
+                    # Participation Coefficient by louvain community
+                    if ci and "participation_coefficient" in metric_list_nodal:
+                        try:
+                            if not ci:
+                                raise KeyError(
+                                    "Participation coefficient cannot be "
+                                    "calculated for G in the absence of a "
+                                    "community affiliation vector")
+                            start_time = time.time()
+                            metric_list_names, net_met_val_list_final = \
+                                algorithms.get_participation(in_mat, ci,
+                                                  metric_list_names,
+                                                  net_met_val_list_final)
+                            print(
+                                f"{np.round(time.time() - start_time, 3)}"
+                                f"{'s'}")
+                        except BaseException:
+                            print(
+                                "Participation coefficient cannot be "
+                                "calculated for G")
+                            # np.save("%s%s%s" % ('/tmp/partic_coeff_failure',
+                            # random.randint(1, 400), '.npy'), in_mat)
+                            pass
+                    else:
+                        if not ci and "participation_coefficient" in \
+                            metric_list_nodal:
+                            print(UserWarning(
+                                "Skipping participation coefficient "
+                                "because community affiliation is "
+                                "empty for G..."))
+
+                    # Diversity Coefficient by louvain community
+                    if ci and "diversity_coefficient" in metric_list_nodal:
+                        try:
+                            if not ci:
+                                raise KeyError(
+                                    "Diversity coefficient cannot be "
+                                    "calculated for G in the absence of a "
+                                    "community affiliation vector")
+                            start_time = time.time()
+                            metric_list_names, net_met_val_list_final = \
+                                algorithms.get_diversity(in_mat, ci,
+                                                         metric_list_names,
+                                              net_met_val_list_final
+                                              )
+                            print(
+                                f"{np.round(time.time() - start_time, 3)}"
+                                f"{'s'}")
+                        except BaseException:
+                            print(
+                                "Diversity coefficient cannot be calculated "
+                                "for G")
+                            # np.save("%s%s%s" % ('/tmp/div_coeff_failure',
+                            # random.randint(1, 400), '.npy'), in_mat)
+                            pass
+                    else:
+                        if not ci and "diversity_coefficient" in \
+                            metric_list_nodal:
+                            print(UserWarning("Skipping diversity coefficient "
+                                              "because community affiliation"
+                                              " is empty for G..."))
+
+                    # # Link communities
+                    # if "link_communities" in metric_list_nodal:
+                    #     try:
+                    #         if ci is None:
+                    #             raise KeyError(
+                    #                 "Link communities cannot be calculated for
+                    #                 G in the absence of a community affiliation
+                    #                 vector")
+                    #         start_time = time.time()
+                    #         metric_list_names, net_met_val_list_final =
+                    #         get_link_communities(
+                    #             in_mat, ci, metric_list_names,
+                    #             net_met_val_list_final
+                    #         )
+                    #         print(f"{np.round(time.time() - start_time, 3)}s")
+                    #     except BaseException:
+                    #         print("Link communities cannot be calculated for G")
+                    #         # np.save("%s%s%s" % ('/tmp/link_comms_failure',
+                    #         random.randint(1, 400), '.npy'), in_mat)
+                    #         pass
+
+                    # Betweenness Centrality
+                    if "betweenness_centrality" in metric_list_nodal and \
+                        G_len is not None:
+                        try:
+                            start_time = time.time()
+                            metric_list_names, net_met_val_list_final = \
+                                algorithms.get_betweenness_centrality(
+                                    G_len, metric_list_names,
+                                    net_met_val_list_final)
+                            print(
+                                f"{np.round(time.time() - start_time, 3)}"
+                                f"{'s'}")
+                        except BaseException:
+                            print(
+                                "Betweenness centrality cannot be calculated "
+                                "for G")
+                            # np.save("%s%s%s" % ('/tmp/betw_cent_failure',
+                            # random.randint(1, 400), '.npy'),
+                            #         np.array(nx.to_numpy_matrix(G_len)))
+                            pass
+                    else:
+                        if G_len is None and "betweenness_centrality" in \
+                            metric_list_nodal:
+                            print(
+                                UserWarning("Skipping betweenness centrality "
+                                            "because length matrix is empty "
+                                            "for G..."))
+
+                    for i in ["local_efficiency", "local_clustering",
+                              "degree_centrality",
+                              "eigen_centrality",
+                              "communicability_centrality",
+                              "rich_club_coefficient"]:
+                        if i in metric_list_nodal:
+                            routine = getattr(algorithms, f"get_{i}")
+                            try:
+                                start_time = time.time()
+                                metric_list_names, net_met_val_list_final = \
+                                    routine(G, metric_list_names,
+                                        net_met_val_list_final)
+                                print(
+                                    f"{np.round(time.time() - start_time, 3)}"
+                                    f"{'s'}")
+                            except BaseException:
+                                print(f"{i} cannot be calculated for G")
+                                # np.save("%s%s%s" % (f"/tmp/local_{i}_failure",
+                                # random.randint(1, 400), '.npy'),
+                                #         np.array(nx.to_numpy_matrix(G)))
+                                pass
+
+                if len(metric_list_nodal) > 0 or len(metric_list_global) > 0:
+                    out_path_neat = save_netmets(
+                        dir_path, self.inputs.est_path, metric_list_names,
+                        net_met_val_list_final
+                    )
+                    # Cleanup
+                    if tmp_graph_path:
+                        if os.path.isfile(tmp_graph_path):
+                            os.remove(tmp_graph_path)
+
+                    del net_met_val_list_final, metric_list_names, \
+                        metric_list_global
+                    gc.collect()
+                else:
+                    out_path_neat = save_netmets(
+                        dir_path, self.inputs.est_path, [""], [np.nan],
+                    )
+        else:
+            print(UserWarning(f"Warning: Empty graph detected for "
+                              f"{self.inputs.ID}: "
+                              f"{self.inputs.est_path}..."))
+            dir_path = op.dirname(op.realpath(self.inputs.est_path))
+            out_path_neat = save_netmets(
+                dir_path, self.inputs.est_path, [""], [np.nan],
+            )
+
+        setattr(self, "_outpath", out_path_neat)
         return runtime
 
     def _list_outputs(self):
diff --git a/pynets/statistics/utils.py b/pynets/statistics/utils.py
old mode 100644
new mode 100755
index 9dd80c4f..8173e030
--- a/pynets/statistics/utils.py
+++ b/pynets/statistics/utils.py
@@ -247,7 +247,7 @@ def get_ensembles_embedding(modality, alg, base_dir):
                 [
                     "subnet-"
                     + i.split('subnet-')[1].split("_")[0]
-                    + "_res-"
+                    + "_granularity-"
                     + i.split('granularity-')[1].split("/")[0]
                     + "_"
                     + os.path.basename(i).split(modality + "_")[1].replace(
@@ -272,7 +272,7 @@ def get_ensembles_embedding(modality, alg, base_dir):
                 [
                     "subnet-"
                     + i.split('subnet-')[1].split("_")[0]
-                    + "_res-"
+                    + "_granularity-"
                     + i.split('granularity-')[1].split("/")[0]
                     + "_"
                     + os.path.basename(i).split(modality + "_")[1].replace(
@@ -364,24 +364,26 @@ def make_feature_space_dict(
     if target_modality == "func":
         for comb in grid_params:
             try:
-                signal, hpass, model, granularity, atlas, tol = comb
+                signal, hpass, model, granularity, parcellation, smooth = comb
                 grid_params_mod.append((signal, hpass, model, granularity,
-                                        atlas, str(tol)))
+                                        parcellation, str(smooth)))
             except:
                 try:
-                    signal, hpass, model, granularity, atlas = comb
-                    tol = "0"
+                    signal, hpass, model, granularity, parcellation = comb
+                    smooth = "0"
                     grid_params_mod.append((signal, hpass, model, granularity,
-                                            atlas, str(tol)))
+                                            parcellation, str(smooth)))
                 except:
                     print(f"Failed to parse: {comb}")
 
     elif target_modality == "dwi":
         for comb in grid_params:
             try:
-                directget, minlength, model, granularity, atlas, tol = comb
-                grid_params_mod.append((directget, minlength, model,
-                                        granularity, atlas, tol))
+                traversal, minlength, model, granularity, parcellation, \
+                error_margin = comb
+                grid_params_mod.append((traversal, minlength, model,
+                                        granularity, parcellation,
+                                        error_margin))
             except:
                 print(f"Failed to parse: {comb}")
 
@@ -431,12 +433,12 @@ def build_grid(modality, hyperparam_dict, metaparams, ensembles):
     return hyperparam_dict, grid
 
 
-def get_index_labels(base_dir, ID, ses, modality, atlas, granularity,
+def get_index_labels(base_dir, ID, ses, modality, parcellation, granularity,
                      emb_shape):
 
     node_files = glob.glob(
         f"{base_dir}/pynets/sub-{ID}/ses-{ses}/{modality}/subnet-"
-        f"{atlas}_res-{granularity}/nodes/*.json")
+        f"{parcellation}_granularity-{granularity}/nodes/*.json")
 
     if len(node_files) > 0:
         ixs, node_dict = parse_closest_ixs(node_files, emb_shape)
@@ -449,6 +451,30 @@ def get_index_labels(base_dir, ID, ses, modality, atlas, granularity,
         return [None]
 
 
+def save_netmets(
+        dir_path,
+        est_path,
+        metric_list_names,
+        net_met_val_list_final):
+    from pynets.core import utils
+    import os
+    # And save results to csv
+    out_path_neat = (
+        f"{utils.create_csv_path(dir_path, est_path).split('.csv')[0]}"
+        f"{'_neat.csv'}"
+    )
+    zipped_dict = dict(zip(metric_list_names, net_met_val_list_final))
+    df = pd.DataFrame.from_dict(
+        zipped_dict, orient="index", dtype="float32"
+    ).transpose()
+    if os.path.isfile(out_path_neat):
+        os.remove(out_path_neat)
+    df.to_csv(out_path_neat, index=False)
+    del df, zipped_dict, net_met_val_list_final, metric_list_names
+
+    return out_path_neat
+
+
 def get_ixs_from_node_dict(node_dict):
     import ast
     if isinstance(node_dict, list):
@@ -631,7 +657,8 @@ def flatten_latent_positions(base_dir, subject_dict, ID, ses, modality,
             if len(ixs) != emb_shape:
                 node_files = glob.glob(
                     f"{base_dir}/pynets/sub-{ID}/ses-{ses}/{modality}/subnet-"
-                    f"{grid_param[-2]}_res-{grid_param[-3]}/nodes/*.json")
+                    f"{grid_param[-2]}_granularity-{grid_param[-3]}/nodes/"
+                    f"*.json")
                 ixs, node_dict = parse_closest_ixs(node_files, emb_shape)
 
             if len(ixs) > 0:
@@ -809,7 +836,7 @@ def split_df_to_dfs_by_prefix(df, prefixes=[]):
     for p in prefixes:
         df_splits.append(df[list(set(list(flatten([c for c in df.columns if
                                                    c.startswith(p)]))))])
-    pref_selected = list(set(list(flatten([i.columns for i in df_splits]))))
+    # pref_selected = list(set(list(flatten([i.columns for i in df_splits]))))
     # df_other = df[[j for j in df.columns if j not in pref_selected]]
     #return df_splits + [df_other]
 
@@ -1251,13 +1278,14 @@ def dwi_grabber(comb, subject_dict, missingness_frame,
     from colorama import Fore, Style
 
     try:
-        directget, minlength, model, granularity, atlas, tol = comb
+        traversal, minlength, model, granularity, parcellation, \
+        error_margin = comb
     except BaseException:
         print(UserWarning(f"{Fore.YELLOW}Failed to parse: "
                           f"{comb}{Style.RESET_ALL}"))
         return subject_dict, missingness_frame
 
-    #comb_tuple = (atlas, directget, minlength, model, granularity, tol)
+    #comb_tuple = (parcellation, traversal, minlength, model, granularity, error_margin)
     comb_tuple = comb
 
     # print(comb_tuple)
@@ -1265,7 +1293,7 @@ def dwi_grabber(comb, subject_dict, missingness_frame,
     if alg != "topology" and alg in embedding_methods:
         embeddings = glob.glob(
             f"{base_dir}/pynets/sub-{ID}/ses-{ses}/{modality}/subnet-"
-            f"{atlas}_res-"
+            f"{parcellation}_granularity-"
             f"{granularity}/"
             f"embeddings/gradient-{alg}*"
         )
@@ -1273,20 +1301,20 @@ def dwi_grabber(comb, subject_dict, missingness_frame,
         if template == 'any':
             embeddings = [i for i in embeddings if (alg in i) and
                           (f"granularity-{granularity}" in i) and
-                          (f"subnet-{atlas}" in i) and
+                          (f"subnet-{parcellation}" in i) and
                           (f"model-{model}" in i) and
-                          (f"directget-{directget}" in i) and
+                          (f"traversal-{traversal}" in i) and
                           (f"minlength-{minlength}" in i) and
-                          (f"tol-{tol}" in i) and ('_NULL' not in i)]
+                          (f"tol-{error_margin}" in i) and ('_NULL' not in i)]
         else:
             embeddings = [i for i in embeddings if (alg in i) and
                           (f"granularity-{granularity}" in i) and
-                          (f"subnet-{atlas}" in i) and
+                          (f"subnet-{parcellation}" in i) and
                           (f"template-{template}" in i) and
                           (f"model-{model}" in i) and
-                          (f"directget-{directget}" in i) and
+                          (f"traversal-{traversal}" in i) and
                           (f"minlength-{minlength}" in i) and
-                          (f"tol-{tol}" in i) and ('_NULL' not in i)]
+                          (f"tol-{error_margin}" in i) and ('_NULL' not in i)]
 
         if len(embeddings) == 0:
             print(
@@ -1314,9 +1342,9 @@ def dwi_grabber(comb, subject_dict, missingness_frame,
                 embedding = embeddings_raw[0]
             else:
                 embeddings_raw = [i for i in embeddings_raw if
-                                  (f"/subnet-{atlas}_res-{granularity}/"
-                                            in i) and
-                                  (atlas in os.path.basename(i)) and
+                                  (f"/subnet-{parcellation}_"
+                                   f"granularity-{granularity}/" in i) and
+                                  (parcellation in os.path.basename(i)) and
                                   (granularity in os.path.basename(i))]
                 if len(embeddings_raw) > 0:
                     sorted_embeddings = sorted(embeddings_raw,
@@ -1372,7 +1400,7 @@ def dwi_grabber(comb, subject_dict, missingness_frame,
                 return subject_dict, missingness_frame
             try:
                 ixs = get_index_labels(base_dir, ID, ses, modality,
-                                       atlas, granularity, emb_shape)
+                                       parcellation, granularity, emb_shape)
             except BaseException:
                 print(f"{Fore.LIGHTYELLOW_EX}Failed to load indices for "
                       f"{embedding}{Style.RESET_ALL}")
@@ -1416,11 +1444,11 @@ def dwi_grabber(comb, subject_dict, missingness_frame,
         data[:] = np.nan
         targets = [
             f"minlength-{minlength}",
-            f"directget-{directget}",
+            f"traversal-{traversal}",
             f"model-{model}",
             f"granularity-{granularity}",
-            f"subnet-{atlas}",
-            f"tol-{tol}",
+            f"subnet-{parcellation}",
+            f"tol-{error_margin}",
             f"thrtype-{thr_type}",
         ]
 
@@ -1494,16 +1522,16 @@ def func_grabber(comb, subject_dict, missingness_frame,
     from colorama import Fore, Style
 
     try:
-        signal, hpass, model, granularity, atlas, tol = comb
+        signal, hpass, model, granularity, parcellation, smooth = comb
     except:
         try:
-            signal, hpass, model, granularity, atlas = comb
-            tol = "0"
+            signal, hpass, model, granularity, parcellation = comb
+            smooth = "0"
         except BaseException:
             print(UserWarning(f"{Fore.YELLOW}Failed to parse: "
                               f"{comb}{Style.RESET_ALL}"))
             return subject_dict, missingness_frame
-    # comb_tuple = (atlas, signal, hpass, model, granularity, str(tol))
+    # comb_tuple = (parcellation, signal, hpass, model, granularity, str(smooth))
     comb_tuple = comb
 
     # print(comb_tuple)
@@ -1511,7 +1539,7 @@ def func_grabber(comb, subject_dict, missingness_frame,
     if alg != "topology" and alg in embedding_methods:
         embeddings = glob.glob(
             f"{base_dir}/pynets/sub-{ID}/ses-{ses}/{modality}/"
-            f"subnet-{atlas}_res-{granularity}/"
+            f"subnet-{parcellation}_granularity-{granularity}/"
             f"embeddings/gradient-{alg}*"
         )
 
@@ -1520,8 +1548,8 @@ def func_grabber(comb, subject_dict, missingness_frame,
                                                     (f"granularity-"
                                                      f"{granularity}" in i)
                                                     and
-                                                    (f"subnet-{atlas}" in i)
-                                                    and
+                                                    (f"subnet-{parcellation}"
+                                                     in i) and
                                                     (f"model-{model}" in i)
                                                     and (f"hpass-{hpass}Hz"
                                                          in i)
@@ -1533,8 +1561,8 @@ def func_grabber(comb, subject_dict, missingness_frame,
                                                     (f"granularity-"
                                                      f"{granularity}" in i)
                                                     and
-                                                    (f"subnet-{atlas}" in i)
-                                                    and
+                                                    (f"subnet-{parcellation}"
+                                                     in i) and
                                                     (f"template-{template}"
                                                      in i) and
                                                     (f"model-{model}" in i)
@@ -1544,17 +1572,17 @@ def func_grabber(comb, subject_dict, missingness_frame,
                                                          i)) and ('_NULL' not
                                                                   in i)]
 
-        if tol == "0":
+        if smooth == "0":
             embeddings = [
                 i
                 for i in embeddings
-                if "tol" not in i
+                if "smooth" not in i
             ]
         else:
             embeddings = [
                 i
                 for i in embeddings
-                if f"tol-{tol}fwhm" in i
+                if f"tol-{smooth}fwhm" in i
             ]
 
         if len(embeddings) == 0:
@@ -1584,8 +1612,10 @@ def func_grabber(comb, subject_dict, missingness_frame,
                 embedding = embeddings_raw[0]
             else:
                 embeddings_raw = [i for i in embeddings_raw if
-                                  f"/subnet-{atlas}_res-{granularity}/"
-                                  in i and (atlas in os.path.basename(i))
+                                  f"/subnet-{parcellation}_" \
+                                  f"granularity-{granularity}/"
+                                  in i and (parcellation in
+                                            os.path.basename(i))
                                   and (granularity in os.path.basename(i))]
                 if len(embeddings_raw) > 0:
                     sorted_embeddings = sorted(embeddings_raw,
@@ -1634,7 +1664,7 @@ def func_grabber(comb, subject_dict, missingness_frame,
                 return subject_dict, missingness_frame
             try:
                 ixs = get_index_labels(base_dir, ID, ses, modality,
-                                       atlas, granularity, emb_shape)
+                                       parcellation, granularity, emb_shape)
             except BaseException:
                 print(f"{Fore.LIGHTYELLOW_EX}Failed to load indices for "
                       f"{embedding} {Style.RESET_ALL}")
@@ -1676,13 +1706,13 @@ def func_grabber(comb, subject_dict, missingness_frame,
     elif alg == "topology":
         data = np.empty([len(mets), 1], dtype=np.float32)
         data[:] = np.nan
-        if tol == '0':
+        if smooth == '0':
             targets = [
                 f"signal-{signal}",
                 f"hpass-{hpass}Hz",
                 f"model-{model}",
                 f"granularity-{granularity}",
-                f"subnet-{atlas}",
+                f"subnet-{parcellation}",
                 f"thrtype-{thr_type}",
             ]
         else:
@@ -1691,8 +1721,8 @@ def func_grabber(comb, subject_dict, missingness_frame,
                 f"hpass-{hpass}Hz",
                 f"model-{model}",
                 f"granularity-{granularity}",
-                f"subnet-{atlas}",
-                f"tol-{tol}fwhm",
+                f"subnet-{parcellation}",
+                f"tol-{smooth}fwhm",
                 f"thrtype-{thr_type}",
             ]
 
@@ -1808,11 +1838,11 @@ def build_mp_dict(file_renamed, modality, hyperparam_dict, metaparams):
 
     for hyperparam in metaparams:
         if (
-            hyperparam != "tol"
+            hyperparam != "smooth"
             and hyperparam != "hpass"
             and hyperparam != "track_type"
-            and hyperparam != "directget"
-            and hyperparam != "tol"
+            and hyperparam != "traversal"
+            and hyperparam != "smooth"
             and hyperparam != "minlength"
             and hyperparam != "samples"
             and hyperparam != "nodetype"
@@ -1831,17 +1861,17 @@ def build_mp_dict(file_renamed, modality, hyperparam_dict, metaparams):
 
     if modality == "func":
         if "tol-" in file_renamed:
-            if "tol" not in hyperparam_dict.keys():
-                hyperparam_dict["tol"] = [str(file_renamed.split(
+            if "smooth" not in hyperparam_dict.keys():
+                hyperparam_dict["smooth"] = [str(file_renamed.split(
                     "tol-")[1].split("_")[0].split("fwhm")[0])]
             else:
-                hyperparam_dict["tol"].append(str(file_renamed.split(
+                hyperparam_dict["smooth"].append(str(file_renamed.split(
                     "tol-")[1].split("_")[0].split("fwhm")[0]))
         else:
-            if 'tol' not in hyperparam_dict.keys():
-                hyperparam_dict['tol'] = [str(0)]
-            hyperparam_dict["tol"].append(str(0))
-            metaparams.append("tol")
+            if 'smooth' not in hyperparam_dict.keys():
+                hyperparam_dict['smooth'] = [str(0)]
+            hyperparam_dict["smooth"].append(str(0))
+            metaparams.append("smooth")
         if "hpass-" in file_renamed:
             if "hpass" not in hyperparam_dict.keys():
                 hyperparam_dict["hpass"] = [str(file_renamed.split(
@@ -1863,16 +1893,16 @@ def build_mp_dict(file_renamed, modality, hyperparam_dict, metaparams):
             metaparams.append("signal")
 
     elif modality == "dwi":
-        if "directget-" in file_renamed:
-            if "directget" not in hyperparam_dict.keys():
-                hyperparam_dict["directget"] = [
-                    str(file_renamed.split("directget-")[1].split("_")[0])
+        if "traversal-" in file_renamed:
+            if "traversal" not in hyperparam_dict.keys():
+                hyperparam_dict["traversal"] = [
+                    str(file_renamed.split("traversal-")[1].split("_")[0])
                 ]
             else:
-                hyperparam_dict["directget"].append(
-                    str(file_renamed.split("directget-")[1].split("_")[0])
+                hyperparam_dict["traversal"].append(
+                    str(file_renamed.split("traversal-")[1].split("_")[0])
                 )
-            metaparams.append("directget")
+            metaparams.append("traversal")
         if "minlength-" in file_renamed:
             if "minlength" not in hyperparam_dict.keys():
                 hyperparam_dict["minlength"] = [
@@ -1884,15 +1914,15 @@ def build_mp_dict(file_renamed, modality, hyperparam_dict, metaparams):
                 )
             metaparams.append("minlength")
         if "tol-" in file_renamed:
-            if "tol" not in hyperparam_dict.keys():
-                hyperparam_dict["tol"] = [
+            if "error_margin" not in hyperparam_dict.keys():
+                hyperparam_dict["error_margin"] = [
                     str(file_renamed.split("tol-")[1].split("_")[0])
                 ]
             else:
-                hyperparam_dict["tol"].append(
+                hyperparam_dict["error_margin"].append(
                     str(file_renamed.split("tol-")[1].split("_")[0])
                 )
-            metaparams.append("tol")
+            metaparams.append("error_margin")
 
     for key in hyperparam_dict:
         hyperparam_dict[key] = list(set(hyperparam_dict[key]))
diff --git a/pynets/initializers/bids_config.json b/pynets/templates/initializers/bids_config.json
similarity index 100%
rename from pynets/initializers/bids_config.json
rename to pynets/templates/initializers/bids_config.json
diff --git a/pynets/initializers/bids_config_anatomical_atlases.json b/pynets/templates/initializers/bids_config_anatomical_atlases.json
similarity index 100%
rename from pynets/initializers/bids_config_anatomical_atlases.json
rename to pynets/templates/initializers/bids_config_anatomical_atlases.json
diff --git a/pynets/initializers/bids_config_bold.json b/pynets/templates/initializers/bids_config_bold.json
similarity index 100%
rename from pynets/initializers/bids_config_bold.json
rename to pynets/templates/initializers/bids_config_bold.json
diff --git a/pynets/initializers/bids_config_clustering.json b/pynets/templates/initializers/bids_config_clustering.json
similarity index 100%
rename from pynets/initializers/bids_config_clustering.json
rename to pynets/templates/initializers/bids_config_clustering.json
diff --git a/pynets/initializers/bids_config_dwi.json b/pynets/templates/initializers/bids_config_dwi.json
similarity index 100%
rename from pynets/initializers/bids_config_dwi.json
rename to pynets/templates/initializers/bids_config_dwi.json
diff --git a/pynets/initializers/bids_config_embed.json b/pynets/templates/initializers/bids_config_embed.json
similarity index 100%
rename from pynets/initializers/bids_config_embed.json
rename to pynets/templates/initializers/bids_config_embed.json
diff --git a/pynets/initializers/bids_config_rsns.json b/pynets/templates/initializers/bids_config_rsns.json
similarity index 100%
rename from pynets/initializers/bids_config_rsns.json
rename to pynets/templates/initializers/bids_config_rsns.json
diff --git a/pynets/initializers/cloud_config.json b/pynets/templates/initializers/cloud_config.json
similarity index 100%
rename from pynets/initializers/cloud_config.json
rename to pynets/templates/initializers/cloud_config.json
diff --git a/pynets/templates/labels/__init__.py b/pynets/templates/labels/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/templates/rois/CorpusCallosum_1mm.nii.gz b/pynets/templates/rois/CorpusCallosum_1mm.nii.gz
index 09caa0a7..c7a14280 100755
Binary files a/pynets/templates/rois/CorpusCallosum_1mm.nii.gz and b/pynets/templates/rois/CorpusCallosum_1mm.nii.gz differ
diff --git a/pynets/templates/rois/CorpusCallosum_2mm.nii.gz b/pynets/templates/rois/CorpusCallosum_2mm.nii.gz
index f4b6683c..348e2dfb 100755
Binary files a/pynets/templates/rois/CorpusCallosum_2mm.nii.gz and b/pynets/templates/rois/CorpusCallosum_2mm.nii.gz differ
diff --git a/pynets/templates/rois/LateralVentricles_1mm.nii.gz b/pynets/templates/rois/LateralVentricles_1mm.nii.gz
index 84273385..e0929689 100755
Binary files a/pynets/templates/rois/LateralVentricles_1mm.nii.gz and b/pynets/templates/rois/LateralVentricles_1mm.nii.gz differ
diff --git a/pynets/templates/rois/LateralVentricles_2mm.nii.gz b/pynets/templates/rois/LateralVentricles_2mm.nii.gz
index 21fdb59a..13f4cf4a 100755
Binary files a/pynets/templates/rois/LateralVentricles_2mm.nii.gz and b/pynets/templates/rois/LateralVentricles_2mm.nii.gz differ
diff --git a/pynets/templates/rois/__init__.py b/pynets/templates/rois/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/templates/rsns/BIGREF1mm.nii.gz b/pynets/templates/rsns/BIGREF1mm.nii.gz
old mode 100644
new mode 100755
diff --git a/pynets/templates/rsns/BIGREF2mm.nii.gz b/pynets/templates/rsns/BIGREF2mm.nii.gz
old mode 100644
new mode 100755
diff --git a/pynets/templates/rsns/SMALLREF1mm.nii.gz b/pynets/templates/rsns/SMALLREF1mm.nii.gz
old mode 100644
new mode 100755
diff --git a/pynets/templates/rsns/SMALLREF2mm.nii.gz b/pynets/templates/rsns/SMALLREF2mm.nii.gz
old mode 100644
new mode 100755
diff --git a/pynets/templates/rsns/Schaefer2018_1000_17nets_ref.txt b/pynets/templates/rsns/Schaefer2018_1000_17nets_ref.txt
old mode 100755
new mode 100644
diff --git a/pynets/templates/standard/CN200_1mm.nii.gz b/pynets/templates/standard/CN200_1mm.nii.gz
index a3b8a7ef..ddfd81a6 100755
Binary files a/pynets/templates/standard/CN200_1mm.nii.gz and b/pynets/templates/standard/CN200_1mm.nii.gz differ
diff --git a/pynets/templates/standard/CN200_2mm.nii.gz b/pynets/templates/standard/CN200_2mm.nii.gz
index cc5b929e..5281de8c 100755
Binary files a/pynets/templates/standard/CN200_2mm.nii.gz and b/pynets/templates/standard/CN200_2mm.nii.gz differ
diff --git a/pynets/templates/standard/CN200_brain_1mm.nii.gz b/pynets/templates/standard/CN200_brain_1mm.nii.gz
index 9a4c044b..c5bbaf99 100755
Binary files a/pynets/templates/standard/CN200_brain_1mm.nii.gz and b/pynets/templates/standard/CN200_brain_1mm.nii.gz differ
diff --git a/pynets/templates/standard/CN200_brain_2mm.nii.gz b/pynets/templates/standard/CN200_brain_2mm.nii.gz
index fc911d17..4855d2f4 100755
Binary files a/pynets/templates/standard/CN200_brain_2mm.nii.gz and b/pynets/templates/standard/CN200_brain_2mm.nii.gz differ
diff --git a/pynets/templates/standard/CN200_brain_mask_1mm.nii.gz b/pynets/templates/standard/CN200_brain_mask_1mm.nii.gz
index edae185d..8447724e 100755
Binary files a/pynets/templates/standard/CN200_brain_mask_1mm.nii.gz and b/pynets/templates/standard/CN200_brain_mask_1mm.nii.gz differ
diff --git a/pynets/templates/standard/CN200_brain_mask_2mm.nii.gz b/pynets/templates/standard/CN200_brain_mask_2mm.nii.gz
index 821cc16a..1a9b7709 100755
Binary files a/pynets/templates/standard/CN200_brain_mask_2mm.nii.gz and b/pynets/templates/standard/CN200_brain_mask_2mm.nii.gz differ
diff --git a/pynets/templates/standard/FA_1mm.nii.gz b/pynets/templates/standard/FA_1mm.nii.gz
index aee31339..d09b04b4 100755
Binary files a/pynets/templates/standard/FA_1mm.nii.gz and b/pynets/templates/standard/FA_1mm.nii.gz differ
diff --git a/pynets/templates/standard/FA_2mm.nii.gz b/pynets/templates/standard/FA_2mm.nii.gz
index 57b75b64..73077dbf 100755
Binary files a/pynets/templates/standard/FA_2mm.nii.gz and b/pynets/templates/standard/FA_2mm.nii.gz differ
diff --git a/pynets/templates/standard/MNI152_T1_1mm.nii.gz b/pynets/templates/standard/MNI152_T1_1mm.nii.gz
index 518e219a..3906472f 100755
Binary files a/pynets/templates/standard/MNI152_T1_1mm.nii.gz and b/pynets/templates/standard/MNI152_T1_1mm.nii.gz differ
diff --git a/pynets/templates/standard/MNI152_T1_2mm.nii.gz b/pynets/templates/standard/MNI152_T1_2mm.nii.gz
index 8667bef2..5271e981 100755
Binary files a/pynets/templates/standard/MNI152_T1_2mm.nii.gz and b/pynets/templates/standard/MNI152_T1_2mm.nii.gz differ
diff --git a/pynets/templates/standard/MNI152_T1_brain_1mm.nii.gz b/pynets/templates/standard/MNI152_T1_brain_1mm.nii.gz
index 5d84ad73..7986ed6d 100755
Binary files a/pynets/templates/standard/MNI152_T1_brain_1mm.nii.gz and b/pynets/templates/standard/MNI152_T1_brain_1mm.nii.gz differ
diff --git a/pynets/templates/standard/MNI152_T1_brain_2mm.nii.gz b/pynets/templates/standard/MNI152_T1_brain_2mm.nii.gz
index 1d891c3f..8f5702a2 100755
Binary files a/pynets/templates/standard/MNI152_T1_brain_2mm.nii.gz and b/pynets/templates/standard/MNI152_T1_brain_2mm.nii.gz differ
diff --git a/pynets/templates/standard/MNI152_T1_brain_mask_1mm.nii.gz b/pynets/templates/standard/MNI152_T1_brain_mask_1mm.nii.gz
index bcbd278d..a3affa4e 100755
Binary files a/pynets/templates/standard/MNI152_T1_brain_mask_1mm.nii.gz and b/pynets/templates/standard/MNI152_T1_brain_mask_1mm.nii.gz differ
diff --git a/pynets/templates/standard/MNI152_T1_brain_mask_2mm.nii.gz b/pynets/templates/standard/MNI152_T1_brain_mask_2mm.nii.gz
index 59713532..b4e6af4f 100755
Binary files a/pynets/templates/standard/MNI152_T1_brain_mask_2mm.nii.gz and b/pynets/templates/standard/MNI152_T1_brain_mask_2mm.nii.gz differ
diff --git a/pynets/templates/standard/__init__.py b/pynets/templates/standard/__init__.py
old mode 100644
new mode 100755
diff --git a/pynets/templates/standard/ch2better.nii.gz b/pynets/templates/standard/ch2better.nii.gz
index 592d7677..a7ae8cc7 100755
Binary files a/pynets/templates/standard/ch2better.nii.gz and b/pynets/templates/standard/ch2better.nii.gz differ
diff --git a/pynets/templates/standard/colin27_1mm.nii.gz b/pynets/templates/standard/colin27_1mm.nii.gz
index 71caaee2..1a81d1cc 100755
Binary files a/pynets/templates/standard/colin27_1mm.nii.gz and b/pynets/templates/standard/colin27_1mm.nii.gz differ
diff --git a/pynets/templates/standard/colin27_brain_1mm.nii.gz b/pynets/templates/standard/colin27_brain_1mm.nii.gz
index 38ef49cc..2606e7c9 100755
Binary files a/pynets/templates/standard/colin27_brain_1mm.nii.gz and b/pynets/templates/standard/colin27_brain_1mm.nii.gz differ
diff --git a/pynets/templates/standard/colin27_brain_mask_1mm.nii.gz b/pynets/templates/standard/colin27_brain_mask_1mm.nii.gz
index 87de84e0..75431dca 100755
Binary files a/pynets/templates/standard/colin27_brain_mask_1mm.nii.gz and b/pynets/templates/standard/colin27_brain_mask_1mm.nii.gz differ
diff --git a/requirements.txt b/requirements.txt
index 0d908c49..e591ed3c 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,29 +1,30 @@
-matplotlib<=3.3.0,>=3.0.0
+matplotlib>=3.1.1
 dill>=0.3.2
 statsmodels>=0.11.1
 Sphinx>=1.4.8
 sphinx-rtd-theme>=0.4.3
 sphinx-argparse>=0.2.5
 docutils>=0.14.0
+numpy>=1.21.5
 numpydoc>=1.1.0
 requests>=2.21
-joblib>=0.17.0
+joblib>=1.0.1
 pandas>=0.24.2
 psutil>=5.6.1
 scipy>=1.4.1
-setuptools>=47.3.0
-nibabel>=3.1.1
+setuptools>=52.0.0
+nibabel>=3.2.1
 indexed_gzip>=1.4.0
-seaborn>=0.10.0
-networkx==2.4
+seaborn>=0.11.0
+networkx>=2.6
 nipype>=1.5.1
 scikit_learn>=0.23.0
-dipy>=1.1.0
+dipy>=1.1
 boto3>=1.9.111
 pybids>=0.6.4
 colorama>=0.3.9
 python-louvain>=0.13
-graspologic>=0.2.0
+graspologic>=1.0.0
 sqlalchemy~=1.3.1
 #duecredit>=0.8.0
 h5py>=2.10.0
diff --git a/setup.py b/setup.py
index 80e1f3e7..2b4a65e7 100644
--- a/setup.py
+++ b/setup.py
@@ -48,8 +48,6 @@
         'Intended Audience :: Developers',
         'License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)',
         'Natural Language :: English',
-        'Programming Language :: Python :: 3.6',
-        'Programming Language :: Python :: 3.7',
         'Programming Language :: Python :: 3.8',
         'Programming Language :: Python :: 3.9'
     ],
diff --git a/tox.ini b/tox.ini
index 0e254529..79faaba2 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,11 +1,11 @@
 [tox]
-envlist = py37, py36, flake8
+envlist = py39, py38, flake8
 skip_missing_interpreters=true
 
 [travis]
 python =
-    3.7: py37
-    3.6: py36
+    3.9: py39
+    3.8: py38
 
 [testenv:flake8]
 basepython=python


Test patch:
diff --git a/.test_durations b/.test_durations
deleted file mode 100644
index ea2fff4f..00000000
--- a/.test_durations
+++ /dev/null
@@ -1,1052 +0,0 @@
-{
-    "tests/test_clustering.py::test_indx_1dto3d": 0.0017287731170654297,
-    "tests/test_clustering.py::test_indx_3dto1d": 0.0014643669128417969,
-    "tests/test_clustering.py::test_make_local_connectivity_scorr": 105.67683577537537,
-    "tests/test_clustering.py::test_make_local_connectivity_tcorr": 28.46056079864502,
-    "tests/test_clustering.py::test_ni_parcellate[average]": 276.18009519577026,
-    "tests/test_clustering.py::test_ni_parcellate[complete]": 233.38811588287354,
-    "tests/test_clustering.py::test_ni_parcellate[ncut]": 270.38635635375977,
-    "tests/test_clustering.py::test_ni_parcellate[rena]": 24.821616172790527,
-    "tests/test_clustering.py::test_ni_parcellate[single]": 19.26537799835205,
-    "tests/test_clustering.py::test_ni_parcellate[ward]": 226.0392029285431,
-    "tests/test_clustering.py::test_ni_parcellate_mult_conn_comps[average]": 13.899936199188232,
-    "tests/test_clustering.py::test_ni_parcellate_mult_conn_comps[complete]": 6.204347133636475,
-    "tests/test_clustering.py::test_ni_parcellate_mult_conn_comps[ncut]": 77.62165784835815,
-    "tests/test_clustering.py::test_ni_parcellate_mult_conn_comps[rena]": 33.735283851623535,
-    "tests/test_clustering.py::test_ni_parcellate_mult_conn_comps[ward]": 24.05590271949768,
-    "tests/test_dmri_utils.py::test_evaluate_streamline_plausibility": 342.86307311058044,
-    "tests/test_dmri_utils.py::test_extract_b0": 33.555440187454224,
-    "tests/test_dmri_utils.py::test_normalize_grads": 21.239481925964355,
-    "tests/test_estimation.py::test_create_anisopowermap": 23.643485069274902,
-    "tests/test_estimation.py::test_csa_mod_est": 11.327585697174072,
-    "tests/test_estimation.py::test_csd_mod_est": 23.048813104629517,
-    "tests/test_estimation.py::test_fill_confound_nans": 0.0157778263092041,
-    "tests/test_estimation.py::test_get_conn_matrix[2-AdaptiveQuicGraphicalLasso]": 0.015671253204345703,
-    "tests/test_estimation.py::test_get_conn_matrix[2-None]": 0.016437053680419922,
-    "tests/test_estimation.py::test_get_conn_matrix[2-QuicGraphicalLassoCV]": 0.04673194885253906,
-    "tests/test_estimation.py::test_get_conn_matrix[2-QuicGraphicalLassoEBIC]": 0.015329837799072266,
-    "tests/test_estimation.py::test_get_conn_matrix[2-QuicGraphicalLasso]": 0.013546228408813477,
-    "tests/test_estimation.py::test_get_conn_matrix[2-corr]": 0.36254072189331055,
-    "tests/test_estimation.py::test_get_conn_matrix[2-cov]": 0.32660484313964844,
-    "tests/test_estimation.py::test_get_conn_matrix[2-partcorr]": 0.29010629653930664,
-    "tests/test_estimation.py::test_get_conn_matrix[2-sps]": 0.20852231979370117,
-    "tests/test_estimation.py::test_get_conn_matrix[50-AdaptiveQuicGraphicalLasso]": 7.767704725265503,
-    "tests/test_estimation.py::test_get_conn_matrix[50-None]": 6.55668306350708,
-    "tests/test_estimation.py::test_get_conn_matrix[50-QuicGraphicalLassoCV]": 5.0396809577941895,
-    "tests/test_estimation.py::test_get_conn_matrix[50-QuicGraphicalLassoEBIC]": 7.4205381870269775,
-    "tests/test_estimation.py::test_get_conn_matrix[50-QuicGraphicalLasso]": 6.416355848312378,
-    "tests/test_estimation.py::test_get_conn_matrix[50-corr]": 10.505576372146606,
-    "tests/test_estimation.py::test_get_conn_matrix[50-cov]": 12.010616064071655,
-    "tests/test_estimation.py::test_get_conn_matrix[50-partcorr]": 13.744461297988892,
-    "tests/test_estimation.py::test_get_conn_matrix[50-sps]": 13.766386985778809,
-    "tests/test_estimation.py::test_sfm_mod_est": 96.025554895401,
-    "tests/test_estimation.py::test_streams2graph[False-False]": 286.07710814476013,
-    "tests/test_estimation.py::test_streams2graph[True-False]": 239.2284860610962,
-    "tests/test_estimation.py::test_tens_mod_est": 108.53158497810364,
-    "tests/test_estimation.py::test_tens_mod_fa_est": 46.759175062179565,
-    "tests/test_estimation.py::test_timeseries_bootstrap": 0.0011608600616455078,
-    "tests/test_estimation.py::test_timseries_extraction[False-False-0-False]": 0.002009868621826172,
-    "tests/test_estimation.py::test_timseries_extraction[False-False-0-True]": 0.0036208629608154297,
-    "tests/test_estimation.py::test_timseries_extraction[False-False-0.028-False]": 0.0025815963745117188,
-    "tests/test_estimation.py::test_timseries_extraction[False-False-0.028-True]": 0.0021140575408935547,
-    "tests/test_estimation.py::test_timseries_extraction[False-False-0.08-False]": 0.0036280155181884766,
-    "tests/test_estimation.py::test_timseries_extraction[False-False-0.08-True]": 0.0027413368225097656,
-    "tests/test_estimation.py::test_timseries_extraction[False-True-0-False]": 0.004065275192260742,
-    "tests/test_estimation.py::test_timseries_extraction[False-True-0-True]": 0.003289937973022461,
-    "tests/test_estimation.py::test_timseries_extraction[False-True-0.028-False]": 0.0029697418212890625,
-    "tests/test_estimation.py::test_timseries_extraction[False-True-0.028-True]": 0.0037317276000976562,
-    "tests/test_estimation.py::test_timseries_extraction[False-True-0.08-False]": 0.0033872127532958984,
-    "tests/test_estimation.py::test_timseries_extraction[False-True-0.08-True]": 0.006237030029296875,
-    "tests/test_estimation.py::test_timseries_extraction[True-False-0-False]": 3.175710916519165,
-    "tests/test_estimation.py::test_timseries_extraction[True-False-0-True]": 4.2355968952178955,
-    "tests/test_estimation.py::test_timseries_extraction[True-False-0.028-False]": 3.271655321121216,
-    "tests/test_estimation.py::test_timseries_extraction[True-False-0.028-True]": 2.347032070159912,
-    "tests/test_estimation.py::test_timseries_extraction[True-False-0.08-False]": 3.2595460414886475,
-    "tests/test_estimation.py::test_timseries_extraction[True-False-0.08-True]": 2.9292759895324707,
-    "tests/test_estimation.py::test_timseries_extraction[True-True-0-False]": 16.990079879760742,
-    "tests/test_estimation.py::test_timseries_extraction[True-True-0-True]": 9.846640586853027,
-    "tests/test_estimation.py::test_timseries_extraction[True-True-0.028-False]": 12.30789303779602,
-    "tests/test_estimation.py::test_timseries_extraction[True-True-0.028-True]": 13.783940315246582,
-    "tests/test_estimation.py::test_timseries_extraction[True-True-0.08-False]": 10.36739206314087,
-    "tests/test_estimation.py::test_timseries_extraction[True-True-0.08-True]": 13.467710256576538,
-    "tests/test_netstats.py::test_average_shortest_path_length_fast[not_weight]": 8.32387375831604,
-    "tests/test_netstats.py::test_average_shortest_path_length_fast[weight]": 8.695923566818237,
-    "tests/test_netstats.py::test_average_shortest_path_length_for_all": 0.03736376762390137,
-    "tests/test_netstats.py::test_clean_graphs[1-0-corr]": 0.022616147994995117,
-    "tests/test_netstats.py::test_clean_graphs[1-0-cov]": 0.022456645965576172,
-    "tests/test_netstats.py::test_clean_graphs[1-0-partcorr]": 0.024965286254882812,
-    "tests/test_netstats.py::test_clean_graphs[1-0-sps]": 0.03397393226623535,
-    "tests/test_netstats.py::test_clean_graphs[1-1-corr]": 0.019215822219848633,
-    "tests/test_netstats.py::test_clean_graphs[1-1-cov]": 0.03643608093261719,
-    "tests/test_netstats.py::test_clean_graphs[1-1-partcorr]": 0.027260780334472656,
-    "tests/test_netstats.py::test_clean_graphs[1-2-corr]": 0.23005914688110352,
-    "tests/test_netstats.py::test_clean_graphs[1-2-partcorr]": 0.1992800235748291,
-    "tests/test_netstats.py::test_clean_graphs[1-3-corr]": 0.031177520751953125,
-    "tests/test_netstats.py::test_clean_graphs[1-3-cov]": 0.030943870544433594,
-    "tests/test_netstats.py::test_clean_graphs[1-3-partcorr]": 0.027654170989990234,
-    "tests/test_netstats.py::test_clean_graphs[1-3-sps]": 0.02541375160217285,
-    "tests/test_netstats.py::test_clean_graphs[2-0-corr]": 0.024599075317382812,
-    "tests/test_netstats.py::test_clean_graphs[2-0-cov]": 0.031404733657836914,
-    "tests/test_netstats.py::test_clean_graphs[2-0-partcorr]": 0.041626930236816406,
-    "tests/test_netstats.py::test_clean_graphs[2-1-corr]": 0.029584407806396484,
-    "tests/test_netstats.py::test_clean_graphs[2-1-partcorr]": 0.027403831481933594,
-    "tests/test_netstats.py::test_clean_graphs[2-2-corr]": 0.14452505111694336,
-    "tests/test_netstats.py::test_clean_graphs[2-2-cov]": 0.13361072540283203,
-    "tests/test_netstats.py::test_clean_graphs[2-2-partcorr]": 0.16631388664245605,
-    "tests/test_netstats.py::test_clean_graphs[2-2-sps]": 0.15802836418151855,
-    "tests/test_netstats.py::test_clean_graphs[2-3-corr]": 0.024226903915405273,
-    "tests/test_netstats.py::test_clean_graphs[2-3-cov]": 0.03358721733093262,
-    "tests/test_netstats.py::test_clean_graphs[2-3-partcorr]": 0.06872773170471191,
-    "tests/test_netstats.py::test_clean_graphs[3-0-corr]": 0.0349736213684082,
-    "tests/test_netstats.py::test_clean_graphs[3-0-partcorr]": 0.029154539108276367,
-    "tests/test_netstats.py::test_clean_graphs[3-1-corr]": 0.023462772369384766,
-    "tests/test_netstats.py::test_clean_graphs[3-1-cov]": 0.02784895896911621,
-    "tests/test_netstats.py::test_clean_graphs[3-1-partcorr]": 0.0330047607421875,
-    "tests/test_netstats.py::test_clean_graphs[3-1-sps]": 0.021216630935668945,
-    "tests/test_netstats.py::test_clean_graphs[3-2-corr]": 0.1282963752746582,
-    "tests/test_netstats.py::test_clean_graphs[3-2-cov]": 0.20044803619384766,
-    "tests/test_netstats.py::test_clean_graphs[3-2-partcorr]": 0.1981351375579834,
-    "tests/test_netstats.py::test_clean_graphs[3-3-corr]": 0.03518867492675781,
-    "tests/test_netstats.py::test_clean_graphs[3-3-partcorr]": 0.02800917625427246,
-    "tests/test_netstats.py::test_clean_graphs[4-0-corr]": 0.027220964431762695,
-    "tests/test_netstats.py::test_clean_graphs[4-0-cov]": 0.025964975357055664,
-    "tests/test_netstats.py::test_clean_graphs[4-0-partcorr]": 0.028383493423461914,
-    "tests/test_netstats.py::test_clean_graphs[4-0-sps]": 0.0308530330657959,
-    "tests/test_netstats.py::test_clean_graphs[4-1-corr]": 0.021306991577148438,
-    "tests/test_netstats.py::test_clean_graphs[4-1-cov]": 0.03579211235046387,
-    "tests/test_netstats.py::test_clean_graphs[4-1-partcorr]": 0.045548439025878906,
-    "tests/test_netstats.py::test_clean_graphs[4-2-corr]": 0.19094157218933105,
-    "tests/test_netstats.py::test_clean_graphs[4-2-partcorr]": 0.19487690925598145,
-    "tests/test_netstats.py::test_clean_graphs[4-3-corr]": 0.030495166778564453,
-    "tests/test_netstats.py::test_clean_graphs[4-3-cov]": 0.028074026107788086,
-    "tests/test_netstats.py::test_clean_graphs[4-3-partcorr]": 0.026492834091186523,
-    "tests/test_netstats.py::test_clean_graphs[4-3-sps]": 0.028183937072753906,
-    "tests/test_netstats.py::test_clean_graphs[5-0-corr]": 0.030377864837646484,
-    "tests/test_netstats.py::test_clean_graphs[5-0-cov]": 0.029445171356201172,
-    "tests/test_netstats.py::test_clean_graphs[5-0-partcorr]": 0.042824745178222656,
-    "tests/test_netstats.py::test_clean_graphs[5-1-corr]": 0.061164140701293945,
-    "tests/test_netstats.py::test_clean_graphs[5-1-partcorr]": 0.03781914710998535,
-    "tests/test_netstats.py::test_clean_graphs[5-2-corr]": 0.1954810619354248,
-    "tests/test_netstats.py::test_clean_graphs[5-2-cov]": 0.13681364059448242,
-    "tests/test_netstats.py::test_clean_graphs[5-2-partcorr]": 0.11914849281311035,
-    "tests/test_netstats.py::test_clean_graphs[5-2-sps]": 0.12681818008422852,
-    "tests/test_netstats.py::test_clean_graphs[5-3-corr]": 0.026571989059448242,
-    "tests/test_netstats.py::test_clean_graphs[5-3-cov]": 0.03435111045837402,
-    "tests/test_netstats.py::test_clean_graphs[5-3-partcorr]": 0.026845932006835938,
-    "tests/test_netstats.py::test_clean_graphs[6-0-corr]": 0.037731170654296875,
-    "tests/test_netstats.py::test_clean_graphs[6-0-partcorr]": 0.03481268882751465,
-    "tests/test_netstats.py::test_clean_graphs[6-1-corr]": 0.04197216033935547,
-    "tests/test_netstats.py::test_clean_graphs[6-1-cov]": 0.022475242614746094,
-    "tests/test_netstats.py::test_clean_graphs[6-1-partcorr]": 0.020992040634155273,
-    "tests/test_netstats.py::test_clean_graphs[6-1-sps]": 0.02734231948852539,
-    "tests/test_netstats.py::test_clean_graphs[6-2-corr]": 0.11721682548522949,
-    "tests/test_netstats.py::test_clean_graphs[6-2-cov]": 0.16352558135986328,
-    "tests/test_netstats.py::test_clean_graphs[6-2-partcorr]": 0.15687274932861328,
-    "tests/test_netstats.py::test_clean_graphs[6-3-corr]": 0.03731513023376465,
-    "tests/test_netstats.py::test_clean_graphs[6-3-partcorr]": 0.035832881927490234,
-    "tests/test_netstats.py::test_collect_pandas_df_make[-1-False-False-False]": 0.1655750274658203,
-    "tests/test_netstats.py::test_collect_pandas_df_make[-1-False-False-True]": 0.2501075267791748,
-    "tests/test_netstats.py::test_collect_pandas_df_make[-1-False-True-False]": 0.16196227073669434,
-    "tests/test_netstats.py::test_collect_pandas_df_make[-1-False-True-True]": 0.21965765953063965,
-    "tests/test_netstats.py::test_collect_pandas_df_make[-1-True-False-False]": 0.13866758346557617,
-    "tests/test_netstats.py::test_collect_pandas_df_make[-1-True-False-True]": 0.21615314483642578,
-    "tests/test_netstats.py::test_collect_pandas_df_make[0-False-False-False]": 0.3772282600402832,
-    "tests/test_netstats.py::test_collect_pandas_df_make[0-False-False-True]": 0.6113827228546143,
-    "tests/test_netstats.py::test_collect_pandas_df_make[0-True-False-False]": 0.6152949333190918,
-    "tests/test_netstats.py::test_collect_pandas_df_make[0-True-False-True]": 0.560399055480957,
-    "tests/test_netstats.py::test_collect_pandas_df_make[0-True-True-True]": 0.5221219062805176,
-    "tests/test_netstats.py::test_collect_pandas_df_make[1-False-False-False]": 0.6452622413635254,
-    "tests/test_netstats.py::test_collect_pandas_df_make[1-False-False-True]": 0.4784083366394043,
-    "tests/test_netstats.py::test_collect_pandas_df_make[1-False-True-True]": 0.48387622833251953,
-    "tests/test_netstats.py::test_collect_pandas_df_make[1-True-False-False]": 0.5201497077941895,
-    "tests/test_netstats.py::test_collect_pandas_df_make[1-True-False-True]": 0.4273562431335449,
-    "tests/test_netstats.py::test_collect_pandas_df_make[1-True-True-False]": 0.3783540725708008,
-    "tests/test_netstats.py::test_collect_pandas_df_make[1-True-True-True]": 0.5944204330444336,
-    "tests/test_netstats.py::test_collect_pandas_df_make[2-False-False-False]": 0.7812771797180176,
-    "tests/test_netstats.py::test_collect_pandas_df_make[2-False-False-True]": 0.6070475578308105,
-    "tests/test_netstats.py::test_collect_pandas_df_make[2-False-True-False]": 2.5208091735839844,
-    "tests/test_netstats.py::test_collect_pandas_df_make[2-False-True-True]": 2.8632802963256836,
-    "tests/test_netstats.py::test_collect_pandas_df_make[2-True-False-False]": 0.5550477504730225,
-    "tests/test_netstats.py::test_collect_pandas_df_make[2-True-False-True]": 0.8523259162902832,
-    "tests/test_netstats.py::test_community_resolution_selection[1-10]": 0.006386280059814453,
-    "tests/test_netstats.py::test_community_resolution_selection[1-1]": 0.017199993133544922,
-    "tests/test_netstats.py::test_community_resolution_selection[1-5]": 0.0017240047454833984,
-    "tests/test_netstats.py::test_community_resolution_selection[10-1]": 0.5909156799316406,
-    "tests/test_netstats.py::test_community_resolution_selection[5-10]": 0.03131270408630371,
-    "tests/test_netstats.py::test_community_resolution_selection[5-1]": 0.1948232650756836,
-    "tests/test_netstats.py::test_create_communities": 0.0010547637939453125,
-    "tests/test_netstats.py::test_diversity_coef_sign": 0.003805875778198242,
-    "tests/test_netstats.py::test_extractnetstats[corr-0-0-True]": 0.40108299255371094,
-    "tests/test_netstats.py::test_extractnetstats[corr-0-1-False]": 0.2840869426727295,
-    "tests/test_netstats.py::test_extractnetstats[corr-0-2-False]": 0.6271936893463135,
-    "tests/test_netstats.py::test_extractnetstats[corr-0-2-True]": 0.49373841285705566,
-    "tests/test_netstats.py::test_extractnetstats[corr-1-0-False]": 0.3639092445373535,
-    "tests/test_netstats.py::test_extractnetstats[corr-1-0-True]": 0.45570969581604004,
-    "tests/test_netstats.py::test_extractnetstats[corr-1-1-False]": 1.2230722904205322,
-    "tests/test_netstats.py::test_extractnetstats[corr-1-1-True]": 0.40467381477355957,
-    "tests/test_netstats.py::test_extractnetstats[corr-1-2-False]": 0.7503619194030762,
-    "tests/test_netstats.py::test_extractnetstats[corr-1-2-True]": 0.6266753673553467,
-    "tests/test_netstats.py::test_extractnetstats[corr-2-0-True]": 0.4738001823425293,
-    "tests/test_netstats.py::test_extractnetstats[corr-2-1-False]": 0.26284122467041016,
-    "tests/test_netstats.py::test_extractnetstats[corr-2-2-False]": 0.8081626892089844,
-    "tests/test_netstats.py::test_extractnetstats[corr-2-2-True]": 0.7602777481079102,
-    "tests/test_netstats.py::test_extractnetstats[corr-3-0-False]": 0.2739691734313965,
-    "tests/test_netstats.py::test_extractnetstats[corr-3-0-True]": 0.40023040771484375,
-    "tests/test_netstats.py::test_extractnetstats[corr-3-1-False]": 0.6290571689605713,
-    "tests/test_netstats.py::test_extractnetstats[corr-3-1-True]": 0.4682610034942627,
-    "tests/test_netstats.py::test_extractnetstats[corr-3-2-False]": 0.6486520767211914,
-    "tests/test_netstats.py::test_extractnetstats[corr-3-2-True]": 0.6365149021148682,
-    "tests/test_netstats.py::test_extractnetstats[corr-4-0-True]": 0.3775060176849365,
-    "tests/test_netstats.py::test_extractnetstats[corr-4-1-False]": 0.3216588497161865,
-    "tests/test_netstats.py::test_extractnetstats[corr-4-2-False]": 0.7248897552490234,
-    "tests/test_netstats.py::test_extractnetstats[corr-4-2-True]": 0.5805680751800537,
-    "tests/test_netstats.py::test_extractnetstats[corr-5-0-False]": 0.28766417503356934,
-    "tests/test_netstats.py::test_extractnetstats[corr-5-0-True]": 0.291912317276001,
-    "tests/test_netstats.py::test_extractnetstats[corr-5-1-False]": 0.49645090103149414,
-    "tests/test_netstats.py::test_extractnetstats[corr-5-1-True]": 0.39804601669311523,
-    "tests/test_netstats.py::test_extractnetstats[corr-5-2-False]": 0.5653223991394043,
-    "tests/test_netstats.py::test_extractnetstats[corr-5-2-True]": 0.5553579330444336,
-    "tests/test_netstats.py::test_extractnetstats[corr-6-0-True]": 0.3363924026489258,
-    "tests/test_netstats.py::test_extractnetstats[corr-6-1-False]": 0.33330273628234863,
-    "tests/test_netstats.py::test_extractnetstats[corr-6-2-False]": 0.7600798606872559,
-    "tests/test_netstats.py::test_extractnetstats[corr-6-2-True]": 0.4754183292388916,
-    "tests/test_netstats.py::test_extractnetstats[cov-0-0-False]": 0.2709214687347412,
-    "tests/test_netstats.py::test_extractnetstats[cov-0-0-True]": 0.3175697326660156,
-    "tests/test_netstats.py::test_extractnetstats[cov-0-1-False]": 0.44225502014160156,
-    "tests/test_netstats.py::test_extractnetstats[cov-0-1-True]": 0.4143412113189697,
-    "tests/test_netstats.py::test_extractnetstats[cov-0-2-False]": 0.7067279815673828,
-    "tests/test_netstats.py::test_extractnetstats[cov-0-2-True]": 0.5570218563079834,
-    "tests/test_netstats.py::test_extractnetstats[cov-1-0-True]": 0.35617899894714355,
-    "tests/test_netstats.py::test_extractnetstats[cov-1-1-False]": 0.3580739498138428,
-    "tests/test_netstats.py::test_extractnetstats[cov-1-2-False]": 0.8023138046264648,
-    "tests/test_netstats.py::test_extractnetstats[cov-1-2-True]": 0.4854319095611572,
-    "tests/test_netstats.py::test_extractnetstats[cov-2-0-False]": 0.2939567565917969,
-    "tests/test_netstats.py::test_extractnetstats[cov-2-0-True]": 0.3293783664703369,
-    "tests/test_netstats.py::test_extractnetstats[cov-2-1-False]": 0.5495400428771973,
-    "tests/test_netstats.py::test_extractnetstats[cov-2-1-True]": 0.44425463676452637,
-    "tests/test_netstats.py::test_extractnetstats[cov-2-2-False]": 0.6531212329864502,
-    "tests/test_netstats.py::test_extractnetstats[cov-2-2-True]": 0.6021289825439453,
-    "tests/test_netstats.py::test_extractnetstats[cov-3-0-True]": 0.3459780216217041,
-    "tests/test_netstats.py::test_extractnetstats[cov-3-1-False]": 0.33538293838500977,
-    "tests/test_netstats.py::test_extractnetstats[cov-3-2-False]": 0.7633399963378906,
-    "tests/test_netstats.py::test_extractnetstats[cov-3-2-True]": 0.47617197036743164,
-    "tests/test_netstats.py::test_extractnetstats[cov-4-0-False]": 0.32383203506469727,
-    "tests/test_netstats.py::test_extractnetstats[cov-4-0-True]": 0.32875609397888184,
-    "tests/test_netstats.py::test_extractnetstats[cov-4-1-False]": 0.5470888614654541,
-    "tests/test_netstats.py::test_extractnetstats[cov-4-1-True]": 0.47391176223754883,
-    "tests/test_netstats.py::test_extractnetstats[cov-4-2-False]": 0.5535671710968018,
-    "tests/test_netstats.py::test_extractnetstats[cov-4-2-True]": 0.8356842994689941,
-    "tests/test_netstats.py::test_extractnetstats[cov-5-0-True]": 0.47911739349365234,
-    "tests/test_netstats.py::test_extractnetstats[cov-5-1-False]": 0.4194197654724121,
-    "tests/test_netstats.py::test_extractnetstats[cov-5-2-False]": 0.7041921615600586,
-    "tests/test_netstats.py::test_extractnetstats[cov-5-2-True]": 0.4870030879974365,
-    "tests/test_netstats.py::test_extractnetstats[cov-6-0-False]": 0.280153751373291,
-    "tests/test_netstats.py::test_extractnetstats[cov-6-0-True]": 0.451951265335083,
-    "tests/test_netstats.py::test_extractnetstats[cov-6-1-False]": 0.5318074226379395,
-    "tests/test_netstats.py::test_extractnetstats[cov-6-1-True]": 0.45047473907470703,
-    "tests/test_netstats.py::test_extractnetstats[cov-6-2-False]": 0.6257562637329102,
-    "tests/test_netstats.py::test_extractnetstats[cov-6-2-True]": 0.7056610584259033,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-0-0-False]": 0.30196309089660645,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-0-0-True]": 0.2765672206878662,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-0-1-False]": 0.49355053901672363,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-0-1-True]": 0.6905703544616699,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-0-2-False]": 0.6442520618438721,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-1-0-True]": 0.46552395820617676,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-1-1-False]": 0.2761850357055664,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-1-2-False]": 0.6548409461975098,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-1-2-True]": 0.5121700763702393,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-2-0-False]": 0.3382542133331299,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-2-0-True]": 0.2963728904724121,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-2-1-False]": 0.4769291877746582,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-2-1-True]": 0.5630161762237549,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-2-2-False]": 0.6861207485198975,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-3-0-True]": 0.3555636405944824,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-3-1-False]": 0.25543212890625,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-3-2-False]": 0.7090837955474854,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-3-2-True]": 0.5030326843261719,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-4-0-False]": 0.2953007221221924,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-4-0-True]": 0.32095861434936523,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-4-1-False]": 0.41426873207092285,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-4-1-True]": 0.5143511295318604,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-4-2-False]": 0.6699280738830566,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-5-0-True]": 0.3619680404663086,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-5-1-False]": 0.2571299076080322,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-5-2-False]": 0.6933705806732178,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-5-2-True]": 0.5267519950866699,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-6-0-False]": 0.32172513008117676,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-6-0-True]": 0.31140947341918945,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-6-1-False]": 0.5570201873779297,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-6-1-True]": 0.4982621669769287,
-    "tests/test_netstats.py::test_extractnetstats[partcorr-6-2-False]": 0.7391469478607178,
-    "tests/test_netstats.py::test_extractnetstats[sps-0-0-True]": 0.447420597076416,
-    "tests/test_netstats.py::test_extractnetstats[sps-0-1-False]": 0.2888331413269043,
-    "tests/test_netstats.py::test_extractnetstats[sps-0-2-False]": 0.7000331878662109,
-    "tests/test_netstats.py::test_extractnetstats[sps-0-2-True]": 0.5148088932037354,
-    "tests/test_netstats.py::test_extractnetstats[sps-1-0-False]": 0.2690458297729492,
-    "tests/test_netstats.py::test_extractnetstats[sps-1-0-True]": 0.4420812129974365,
-    "tests/test_netstats.py::test_extractnetstats[sps-1-1-False]": 0.4549112319946289,
-    "tests/test_netstats.py::test_extractnetstats[sps-1-1-True]": 0.4870905876159668,
-    "tests/test_netstats.py::test_extractnetstats[sps-1-2-False]": 0.597780704498291,
-    "tests/test_netstats.py::test_extractnetstats[sps-1-2-True]": 0.0010449886322021484,
-    "tests/test_netstats.py::test_extractnetstats[sps-2-0-True]": 0.3385035991668701,
-    "tests/test_netstats.py::test_extractnetstats[sps-2-1-False]": 0.25407910346984863,
-    "tests/test_netstats.py::test_extractnetstats[sps-2-2-False]": 0.6155824661254883,
-    "tests/test_netstats.py::test_extractnetstats[sps-2-2-True]": 0.46263909339904785,
-    "tests/test_netstats.py::test_extractnetstats[sps-3-0-False]": 0.3468010425567627,
-    "tests/test_netstats.py::test_extractnetstats[sps-3-0-True]": 0.4185829162597656,
-    "tests/test_netstats.py::test_extractnetstats[sps-3-1-False]": 0.560344934463501,
-    "tests/test_netstats.py::test_extractnetstats[sps-3-1-True]": 0.4497649669647217,
-    "tests/test_netstats.py::test_extractnetstats[sps-3-2-False]": 0.6350140571594238,
-    "tests/test_netstats.py::test_extractnetstats[sps-4-0-True]": 0.3797953128814697,
-    "tests/test_netstats.py::test_extractnetstats[sps-4-1-False]": 0.3442211151123047,
-    "tests/test_netstats.py::test_extractnetstats[sps-4-2-False]": 0.6169650554656982,
-    "tests/test_netstats.py::test_extractnetstats[sps-4-2-True]": 0.5469317436218262,
-    "tests/test_netstats.py::test_extractnetstats[sps-5-0-False]": 0.2717719078063965,
-    "tests/test_netstats.py::test_extractnetstats[sps-5-0-True]": 0.3712749481201172,
-    "tests/test_netstats.py::test_extractnetstats[sps-5-1-False]": 0.5262348651885986,
-    "tests/test_netstats.py::test_extractnetstats[sps-5-1-True]": 0.526540994644165,
-    "tests/test_netstats.py::test_extractnetstats[sps-5-2-False]": 0.6437582969665527,
-    "tests/test_netstats.py::test_extractnetstats[sps-6-0-True]": 0.41284775733947754,
-    "tests/test_netstats.py::test_extractnetstats[sps-6-1-False]": 0.32191991806030273,
-    "tests/test_netstats.py::test_extractnetstats[sps-6-2-False]": 0.6075811386108398,
-    "tests/test_netstats.py::test_extractnetstats[sps-6-2-True]": 0.5795738697052002,
-    "tests/test_netstats.py::test_get_metrics[GT-comm_centrality]": 0.3310868740081787,
-    "tests/test_netstats.py::test_get_metrics[GT-diversity]": 0.009041547775268555,
-    "tests/test_netstats.py::test_get_metrics[GT-local_efficiency]": 11.518312692642212,
-    "tests/test_netstats.py::test_get_metrics[GT-participation]": 0.009021759033203125,
-    "tests/test_netstats.py::test_get_metrics[GT-rich_club_coeff]": 3.797849416732788,
-    "tests/test_netstats.py::test_get_metrics[NX-comm_centrality]": 0.23058295249938965,
-    "tests/test_netstats.py::test_get_metrics[NX-diversity]": 0.007754802703857422,
-    "tests/test_netstats.py::test_get_metrics[NX-participation]": 0.00541996955871582,
-    "tests/test_netstats.py::test_get_metrics[NX-rich_club_coeff]": 3.7786428928375244,
-    "tests/test_netstats.py::test_get_prop_type[2]": 0.0014455318450927734,
-    "tests/test_netstats.py::test_get_prop_type[3.14]": 0.002699136734008789,
-    "tests/test_netstats.py::test_get_prop_type[True]": 0.0016307830810546875,
-    "tests/test_netstats.py::test_get_prop_type[value4]": 0.002608776092529297,
-    "tests/test_netstats.py::test_get_prop_type[word]": 0.00448298454284668,
-    "tests/test_netstats.py::test_iterate_nx_global_measures[False]": 0.010631084442138672,
-    "tests/test_netstats.py::test_iterate_nx_global_measures[True]": 0.004055976867675781,
-    "tests/test_netstats.py::test_link_communities[None]": 0.0036988258361816406,
-    "tests/test_netstats.py::test_link_communities[complete]": 0.7361929416656494,
-    "tests/test_netstats.py::test_link_communities[single]": 0.5694878101348877,
-    "tests/test_netstats.py::test_modularity": 0.02285456657409668,
-    "tests/test_netstats.py::test_most_important[GT-betweenness]": 0.01859307289123535,
-    "tests/test_netstats.py::test_most_important[GT-coreness]": 0.017000436782836914,
-    "tests/test_netstats.py::test_most_important[GT-eigenvector]": 0.02767157554626465,
-    "tests/test_netstats.py::test_most_important[GT-richclub]": 1.0042009353637695,
-    "tests/test_netstats.py::test_most_important[NX-betweenness]": 0.017334938049316406,
-    "tests/test_netstats.py::test_most_important[NX-coreness]": 0.01634049415588379,
-    "tests/test_netstats.py::test_most_important[NX-eigenvector]": 0.01729297637939453,
-    "tests/test_netstats.py::test_most_important[NX-richclub]": 0.9912831783294678,
-    "tests/test_netstats.py::test_np2gt": 7.501526832580566,
-    "tests/test_netstats.py::test_nx2gt": 8.166224718093872,
-    "tests/test_netstats.py::test_participation_coef[in]": 0.0039479732513427734,
-    "tests/test_netstats.py::test_participation_coef[out]": 0.00931239128112793,
-    "tests/test_netstats.py::test_participation_coef[undirected]": 0.005328655242919922,
-    "tests/test_netstats.py::test_participation_coef_sign": 0.0063381195068359375,
-    "tests/test_netstats.py::test_prune_disconnected[False-False]": 0.0020940303802490234,
-    "tests/test_netstats.py::test_prune_disconnected[True-True]": 0.0069942474365234375,
-    "tests/test_netstats.py::test_raw_mets[GT]": 31.065869569778442,
-    "tests/test_netstats.py::test_save_netmets": 0.012927770614624023,
-    "tests/test_netstats.py::test_smallworldness[impossible-clustering]": 8.53574252128601,
-    "tests/test_netstats.py::test_smallworldness[impossible-impossible]": 1.9063043594360352,
-    "tests/test_netstats.py::test_smallworldness[lattice-clustering]": 10.211928844451904,
-    "tests/test_netstats.py::test_smallworldness[lattice-impossible]": 3.4290478229522705,
-    "tests/test_netstats.py::test_smallworldness[lattice-transitivity]": 11.210028886795044,
-    "tests/test_netstats.py::test_smallworldness[random-clustering]": 7.79270601272583,
-    "tests/test_netstats.py::test_smallworldness[random-impossible]": 1.7646217346191406,
-    "tests/test_netstats.py::test_smallworldness[random-transitivity]": 6.677746772766113,
-    "tests/test_nodemaker.py::test_create_spherical_roi_volumes": 4.138444423675537,
-    "tests/test_nodemaker.py::test_drop_bad_ixs": 0.35254621505737305,
-    "tests/test_nodemaker.py::test_drop_coords_labels_from_restricted_parcellation": 48.94312930107117,
-    "tests/test_nodemaker.py::test_enforce_hem_distinct_consecutive_labels": 327.418461561203,
-    "tests/test_nodemaker.py::test_get_sphere": 0.04949498176574707,
-    "tests/test_nodemaker.py::test_mask_roi": 5.282437324523926,
-    "tests/test_nodemaker.py::test_nilearn_atlas_helper[atlas_aal]": 0.012532711029052734,
-    "tests/test_nodemaker.py::test_nilearn_atlas_helper[atlas_talairach_ba]": 0.2753129005432129,
-    "tests/test_nodemaker.py::test_nilearn_atlas_helper[atlas_talairach_lobe]": 0.3312373161315918,
-    "tests/test_nodemaker.py::test_nodemaker_tools_masking_coords_RSN[coords_dosenbach_2010]": 5.884886980056763,
-    "tests/test_nodemaker.py::test_nodemaker_tools_masking_coords_RSN[coords_power_2011]": 9.365879535675049,
-    "tests/test_nodemaker.py::test_nodemaker_tools_masking_parlistfile_RSN": 112.8280885219574,
-    "tests/test_nodemaker.py::test_nodemaker_tools_masking_parlistfile_WB": 0.0006923675537109375,
-    "tests/test_nodemaker.py::test_nodemaker_tools_nilearn_coords_RSN[coords_dosenbach_2010]": 2.6734254360198975,
-    "tests/test_nodemaker.py::test_nodemaker_tools_nilearn_coords_RSN[coords_power_2011]": 4.002592086791992,
-    "tests/test_nodemaker.py::test_nodemaker_tools_nilearn_coords_WB[coords_power_2011]": 0.013927936553955078,
-    "tests/test_nodemaker.py::test_nodemaker_tools_parlistfile_RSN": 107.46647500991821,
-    "tests/test_nodemaker.py::test_nodemaker_tools_parlistfile_WB": 72.52874207496643,
-    "tests/test_nodemaker.py::test_parcel_naming": 1.325587511062622,
-    "tests/test_plotting.py::test_create_gb_palette[3-0]": 110.54146075248718,
-    "tests/test_plotting.py::test_create_gb_palette[False-Set2]": 113.86249995231628,
-    "tests/test_plotting.py::test_plot_all_struct[True]": 273.83375120162964,
-    "tests/test_plotting.py::test_plot_conn_mat_nonet_mask": 109.04870223999023,
-    "tests/test_plotting.py::test_plot_conn_mat_rois_gt_100": 105.8324761390686,
-    "tests/test_plotting.py::test_plot_network_clusters[False]": 114.81515645980835,
-    "tests/test_plotting.py::test_plot_network_clusters[True]": 125.88717317581177,
-    "tests/test_plotting.py::test_plot_timeseries[None]": 113.05371022224426,
-    "tests/test_refs.py::test_bigsmallref": 0.0758371353149414,
-    "tests/test_reg_utils.py::test_align": 0.050750732421875,
-    "tests/test_reg_utils.py::test_align_nonlinear": 0.07812905311584473,
-    "tests/test_reg_utils.py::test_apply_warp": 0.768153190612793,
-    "tests/test_reg_utils.py::test_applyxfm": 9.199009895324707,
-    "tests/test_reg_utils.py::test_combine_xfms": 0.0809621810913086,
-    "tests/test_reg_utils.py::test_deep_skull_strip": 10.603139162063599,
-    "tests/test_reg_utils.py::test_gen_mask[Empty]": 12.126145601272583,
-    "tests/test_reg_utils.py::test_gen_mask[Normal]": 2.7048592567443848,
-    "tests/test_reg_utils.py::test_invwarp": 0.0006630420684814453,
-    "tests/test_reg_utils.py::test_reorient_dwi": 7.390266180038452,
-    "tests/test_reg_utils.py::test_rescale_affine_to_center": 0.026363134384155273,
-    "tests/test_reg_utils.py::test_segment_t1w": 0.0004630088806152344,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size0--0.2-True]": 0.004488945007324219,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size0-0.0-False]": 0.009946823120117188,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size0-0.4-False]": 0.013355016708374023,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size0-0.6-False]": 0.009593009948730469,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size0-0.6-True]": 0.167266845703125,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size0-0.8-True]": 0.21139168739318848,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size0-1.0-True]": 0.2083749771118164,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size1--0.2-False]": 0.004532337188720703,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size1-0.2-False]": 0.04417872428894043,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size1-0.4-False]": 0.0496976375579834,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size1-0.4-True]": 4.8196187019348145,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size1-0.6-True]": 10.481878757476807,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size1-0.8-True]": 13.49357295036316,
-    "tests/test_thresholding.py::test_conn_mat_operations[mat_size1-1.0-False]": 0.07130551338195801,
-    "tests/test_thresholding.py::test_edge_cases[0.6]": 0.02388739585876465,
-    "tests/test_thresholding.py::test_edge_cases[0.8]": 0.025280237197875977,
-    "tests/test_thresholding.py::test_edge_cases[1.0]": 0.04241538047790527,
-    "tests/test_thresholding.py::test_thresh_func[False-False-False-struct-True-True-True]": 1.1471717357635498,
-    "tests/test_thresholding.py::test_thresh_func[False-False-True-either-True-False-True]": 1.2615687847137451,
-    "tests/test_thresholding.py::test_thresh_func[False-True-False-either-False-False-False]": 0.9879794120788574,
-    "tests/test_thresholding.py::test_thresh_func[False-True-False-either-True-False-True]": 1.1805360317230225,
-    "tests/test_thresholding.py::test_thresh_func[False-True-False-struct-True-True-True]": 1.0058667659759521,
-    "tests/test_thresholding.py::test_thresh_func[False-True-True-struct-True-True-True]": 1.1320610046386719,
-    "tests/test_thresholding.py::test_thresh_func[True-False-False-either-True-False-True]": 1.4151890277862549,
-    "tests/test_thresholding.py::test_thresh_func[True-False-True-either-False-False-False]": 244.88249588012695,
-    "tests/test_thresholding.py::test_thresh_func[True-False-True-either-True-False-True]": 242.72529196739197,
-    "tests/test_thresholding.py::test_thresh_func[True-False-True-struct-True-True-True]": 239.7649917602539,
-    "tests/test_thresholding.py::test_thresh_func[True-True-False-struct-True-True-True]": 211.7053382396698,
-    "tests/test_thresholding.py::test_thresh_func[True-True-True-either-True-False-True]": 217.0765986442566,
-    "tests/test_track.py::test_create_density_map": 128.74415016174316,
-    "tests/test_track.py::test_prep_tissues[act]": 3.446342945098877,
-    "tests/test_track.py::test_prep_tissues[wm]": 6.370060682296753,
-    "tests/test_track.py::test_reconstruction[csa]": 11.326787948608398,
-    "tests/test_track.py::test_track_ensemble[300-det]": 0.0009379386901855469,
-    "tests/test_track.py::test_track_ensemble_particle": 0.0016100406646728516,
-    "tests/test_utils.py::test_build_mp_dict[func]": 0.012778282165527344,
-    "tests/test_utils.py::test_collect_pandas_df[False-False]": 1.5971157550811768,
-    "tests/test_utils.py::test_create_csv_path": 0.16394305229187012,
-    "tests/test_utils.py::test_create_est_path_diff[True-6]": 0.14046335220336914,
-    "tests/test_utils.py::test_create_est_path_diff[True-None]": 0.11643123626708984,
-    "tests/test_utils.py::test_create_est_path_func[False-6-100-6]": 0.15089678764343262,
-    "tests/test_utils.py::test_create_est_path_func[True-None-100-6]": 0.14777278900146484,
-    "tests/test_utils.py::test_create_est_path_func[True-None-100-None]": 0.15549921989440918,
-    "tests/test_utils.py::test_create_unthr_path[False-None-100-6]": 0.28856706619262695,
-    "tests/test_utils.py::test_create_unthr_path[False-None-100-None]": 0.2038271427154541,
-    "tests/test_utils.py::test_create_unthr_path[True-6-100-6]": 0.27882981300354004,
-    "tests/test_utils.py::test_create_unthr_path[True-6-100-None]": 0.20287084579467773,
-    "tests/test_utils.py::test_create_unthr_path[True-None-100-6]": 0.28771209716796875,
-    "tests/test_utils.py::test_do_dir_path[dmri-None]": 0.00519108772277832,
-    "tests/test_utils.py::test_do_dir_path[dmri-Smith]": 0.008574724197387695,
-    "tests/test_utils.py::test_do_dir_path[fmri-Power]": 0.0062139034271240234,
-    "tests/test_utils.py::test_merge_dicts": 0.0015671253204345703,
-    "tests/test_utils.py::test_save_coords_and_labels_to_json": 0.011751890182495117,
-    "tests/test_utils.py::test_save_nifti_parcels_map": 0.17542600631713867,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.6846880912780762,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-None]": 0.6203751564025879,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.6452639102935791,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6686921119689941,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.633246898651123,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6844148635864258,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.7822678089141846,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.7128794193267822,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7011942863464355,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7618262767791748,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7260620594024658,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7576172351837158,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.7318341732025146,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-None]": 0.6930279731750488,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.7101955413818359,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6295855045318604,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6529707908630371,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7694239616394043,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.6620030403137207,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.6854612827301025,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6843287944793701,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7255654335021973,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6543068885803223,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6612169742584229,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.718451976776123,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.7761201858520508,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.7390847206115723,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7251434326171875,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.674846887588501,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.728938102722168,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.742727518081665,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.7152483463287354,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.8558757305145264,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.007467985153198242,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.0077702999114990234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.0056192874908447266,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.7297196388244629,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-None]": 0.6857421398162842,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.6883788108825684,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7393736839294434,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6768519878387451,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7076320648193359,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.8034350872039795,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.6774497032165527,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7782580852508545,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.0074803829193115234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.5827460289001465,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.006707668304443359,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.5804862976074219,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-None]": 0.5751290321350098,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.6055562496185303,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.5476891994476318,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.549468994140625,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.5374839305877686,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.5894899368286133,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-None]": 0.6158089637756348,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6140820980072021,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7367255687713623,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6360394954681396,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6331310272216797,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.7555885314941406,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.7232189178466797,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.6456162929534912,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6782729625701904,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.8723740577697754,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6479828357696533,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.7036011219024658,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.7360649108886719,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.9561553001403809,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6656630039215088,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6662571430206299,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7022922039031982,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.6084957122802734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-prob-1.0-None-None-None-False-MST-None]": 0.700620174407959,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.6504151821136475,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6243071556091309,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.7357468605041504,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.660942792892456,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.678443193435669,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.645808219909668,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7346639633178711,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6569998264312744,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6922531127929688,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.9123678207397461,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.9203660488128662,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-None]": 0.6636509895324707,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.7288861274719238,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7112529277801514,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6898198127746582,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7135612964630127,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.6332459449768066,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.6347370147705078,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6388072967529297,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6735246181488037,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.770622730255127,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6998217105865479,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.7297265529632568,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.7322006225585938,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.6809022426605225,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7618873119354248,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.7146728038787842,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.8091332912445068,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.6856672763824463,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.6571898460388184,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7057900428771973,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.769099235534668,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.650123119354248,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6540524959564209,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.6094720363616943,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-None]": 0.5797317028045654,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.5992400646209717,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.5997333526611328,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.623927116394043,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6101348400115967,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.6266705989837646,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.5982232093811035,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6369872093200684,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6292541027069092,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7696409225463867,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6046583652496338,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.782217264175415,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-prob-1.0-None-None-None-False-MST-None]": 0.6244010925292969,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.684424877166748,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6153197288513184,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6057419776916504,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7119059562683105,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.591320276260376,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-traversal1-1.0-None-None-None-False-MST-None]": 0.619088888168335,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6156911849975586,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6940369606018066,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7391798496246338,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6784639358520508,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.6459360122680664,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.5747802257537842,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.5935120582580566,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.5814526081085205,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.5460522174835205,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.5852797031402588,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.5908687114715576,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.5262091159820557,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.583961009979248,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.5536842346191406,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.5802481174468994,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.5816547870635986,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.6995618343353271,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-None]": 0.7990858554840088,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.7107491493225098,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7848780155181885,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.75528883934021,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.806431770324707,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.877903938293457,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.7898390293121338,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7895622253417969,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.8153347969055176,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7623445987701416,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.8648300170898438,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.7344799041748047,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-None]": 0.6977720260620117,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.7214069366455078,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7438437938690186,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6904888153076172,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7126049995422363,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.7237584590911865,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.6796338558197021,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7155318260192871,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7375688552856445,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6965317726135254,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7494387626647949,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.725989818572998,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.6444838047027588,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.6935677528381348,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6875498294830322,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6590044498443604,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6799719333648682,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.6412062644958496,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.6225221157073975,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6353840827941895,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6499426364898682,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.5915515422821045,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6337463855743408,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.7130990028381348,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7145795822143555,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.8098945617675781,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7312819957733154,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7663092613220215,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.6783921718597412,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-prob-1.0-None-None-None-False-MST-None]": 0.6763203144073486,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.694263219833374,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6811552047729492,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.7269124984741211,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7260518074035645,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.8886919021606445,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.7510499954223633,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.8862762451171875,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7178459167480469,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7624480724334717,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7836687564849854,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.8140132427215576,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-prob-1.0-None-None-None-False-MST-None]": 0.6961202621459961,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.8542237281799316,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7449729442596436,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.7297298908233643,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.8659601211547852,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.9108095169067383,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-traversal1-1.0-None-None-None-False-MST-None]": 0.7819678783416748,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7871627807617188,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7474637031555176,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.5974652767181396,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6752710342407227,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.6364667415618896,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.5666658878326416,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.6077919006347656,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-/Users/derekpisner/Applications/PyNets/tests/examples/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz-None-local-wb-csd-None-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6382150650024414,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.8074748516082764,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.8378019332885742,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.8427674770355225,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7628316879272461,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.7654252052307129,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.8200163841247559,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.8816030025482178,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.767880916595459,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7449688911437988,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.8632440567016602,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7244138717651367,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7148056030273438,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.6171083450317383,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-None]": 0.8804385662078857,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.7100200653076172,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7084364891052246,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.5980885028839111,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6474149227142334,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.6771450042724609,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.6095075607299805,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6482832431793213,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6162779331207275,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6313002109527588,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6472318172454834,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.6700665950775146,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-None]": 0.6313648223876953,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.7811179161071777,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.5974311828613281,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.5600070953369141,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.579719066619873,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 1.0826828479766846,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.7200870513916016,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-None]": 0.6782553195953369,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.7319478988647461,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6782970428466797,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6592261791229248,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6910171508789062,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.6631553173065186,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.6459007263183594,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.670612096786499,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6050887107849121,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6163220405578613,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6400778293609619,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.6246838569641113,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.5920712947845459,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.6368670463562012,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6020236015319824,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.5531010627746582,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6210289001464844,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.5820109844207764,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.5903739929199219,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.5967080593109131,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6767940521240234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6309292316436768,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6600561141967773,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.6644330024719238,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.7280607223510742,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.5069029331207275,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-None]": 0.49837708473205566,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.5280721187591553,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.5569901466369629,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.574028730392456,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.5819368362426758,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.6289420127868652,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.5422666072845459,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.5556132793426514,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.5482170581817627,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.565227746963501,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.5876960754394531,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.5916931629180908,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-None]": 0.6111390590667725,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.6947648525238037,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7044370174407959,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.618222713470459,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6359109878540039,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.6665105819702148,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.6265714168548584,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6837019920349121,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6567082405090332,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6723048686981201,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.635009765625,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.6752407550811768,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.7143125534057617,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.765322208404541,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6171040534973145,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6430411338806152,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6811296939849854,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.6124310493469238,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.6322031021118164,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6506829261779785,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6645698547363281,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6967329978942871,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7890238761901855,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.5343632698059082,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.5241093635559082,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.5385220050811768,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.5593612194061279,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.5617079734802246,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.5480601787567139,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.5568599700927734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.5234098434448242,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-None-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.5742902755737305,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.005643129348754883,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-None]": 0.6886630058288574,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.6461968421936035,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6513853073120117,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.63031005859375,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6616296768188477,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.6581635475158691,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.6976058483123779,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7072949409484863,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6915831565856934,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7322094440460205,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6909923553466797,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.688331127166748,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-None]": 0.6871709823608398,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.8153390884399414,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.8952176570892334,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.5678653717041016,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.8475239276885986,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.6711752414703369,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.6558718681335449,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6683347225189209,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7347972393035889,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7251369953155518,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6503119468688965,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.6782662868499756,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.7434937953948975,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.8587632179260254,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6763701438903809,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6621899604797363,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6507236957550049,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.8574211597442627,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.002643108367919922,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.8683693408966064,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.0054168701171875,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-None]": 0.007687091827392578,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.006750583648681641,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.007924795150756836,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.005064725875854492,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005645751953125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.005666255950927734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.0052928924560546875,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.006022453308105469,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.00580906867980957,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.005385398864746094,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.007977724075317383,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.005602836608886719,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-None]": 0.005901336669921875,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.006201982498168945,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.006396055221557617,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.006159782409667969,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.0065021514892578125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.006443023681640625,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-None]": 0.005301237106323242,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.0062220096588134766,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.006928920745849609,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.014101743698120117,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005388975143432617,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.006125926971435547,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.004705667495727539,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.004977703094482422,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.005502462387084961,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.007487058639526367,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.004288673400878906,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.005097866058349609,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.005439281463623047,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.0073430538177490234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.007032155990600586,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.005016803741455078,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.004915714263916016,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.004451274871826172,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-prob-1.0-None-None-None-False-MST-None]": 0.005036592483520508,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.0061817169189453125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.00498652458190918,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.004585981369018555,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.004893779754638672,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.004843473434448242,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.008423805236816406,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.005319833755493164,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.006421089172363281,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.007732868194580078,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.0063207149505615234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.004934549331665039,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-None]": 0.005150556564331055,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.0072023868560791016,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.0047817230224609375,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.012495279312133789,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.009007930755615234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.0051517486572265625,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.007180213928222656,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.011516094207763672,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.006350040435791016,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.004880189895629883,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005427122116088867,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.008864402770996094,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.008835315704345703,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.005968332290649414,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.0053212642669677734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005558967590332031,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.008491992950439453,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.008630037307739258,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.005433797836303711,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.006620883941650391,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.006162405014038086,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.010554075241088867,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.00791478157043457,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-None]": 0.009441375732421875,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.006667613983154297,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.005998134613037109,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.009695291519165039,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.006410837173461914,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.007555246353149414,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.00533747673034668,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.007554054260253906,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.004994392395019531,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.006160259246826172,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.0058629512786865234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.0050961971282958984,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-prob-1.0-None-None-None-False-MST-None]": 0.6232161521911621,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.603867769241333,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.630129337310791,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.621333122253418,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7034916877746582,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.6510958671569824,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-traversal1-1.0-None-None-None-False-MST-None]": 0.628016471862793,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.6507971286773682,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.6875393390655518,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6889646053314209,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.748701810836792,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.6883776187896729,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.681908130645752,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.743276834487915,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7135701179504395,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6490387916564941,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7040762901306152,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.009745121002197266,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.005995988845825195,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.005538225173950195,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.005980491638183594,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.004919767379760742,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-None-conn_model_list1-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.004750967025756836,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.007467746734619141,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-None]": 0.004944324493408203,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.006665945053100586,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.005197763442993164,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.005295515060424805,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.006576061248779297,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.006034374237060547,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.0058977603912353516,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.006154775619506836,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.007463932037353516,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.006211280822753906,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005871295928955078,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.09131121635437012,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-None]": 0.0073812007904052734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.005795717239379883,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.00636744499206543,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.006194114685058594,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005682945251464844,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.006864786148071289,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.005575895309448242,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.010712146759033203,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.005921363830566406,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.005960226058959961,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.008568048477172852,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.0063397884368896484,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.009419918060302734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.011211872100830078,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.006159067153930664,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.006090402603149414,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005645036697387695,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.006232738494873047,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.007261991500854492,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.008532285690307617,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.008835077285766602,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.00596928596496582,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005933046340942383,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.7712526321411133,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-None]": 0.7795097827911377,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.8706674575805664,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.7517061233520508,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.8021044731140137,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7931921482086182,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.8237040042877197,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.8282890319824219,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7398760318756104,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.8395318984985352,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.7246482372283936,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.6852068901062012,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.6918082237243652,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-None]": 0.6607170104980469,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.7281122207641602,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6909916400909424,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.7459344863891602,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7340126037597656,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.8574860095977783,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-None]": 0.7199220657348633,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.9250698089599609,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.7272346019744873,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.760899543762207,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7826039791107178,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.8544821739196777,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.7296264171600342,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.9015390872955322,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.789752721786499,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.8163180351257324,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.9943811893463135,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.791309118270874,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.6846473217010498,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.8528988361358643,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.5639865398406982,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.006135702133178711,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-/Users/derekpisner/Applications/PyNets/tests/examples/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_mask.nii.gz-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.007877826690673828,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-prob-1.0-None-None-None-False-MST-Default]": 0.011063814163208008,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-prob-1.0-None-None-None-False-MST-None]": 0.007038116455078125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.007088899612426758,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.007580757141113281,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.005166769027709961,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.017186403274536133,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.00658726692199707,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-traversal1-1.0-None-None-None-False-MST-None]": 0.007443904876708984,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.00580596923828125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.005984067916870117,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.007315158843994141,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.0075151920318603516,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-prob-1.0-None-None-None-False-MST-Default]": 0.006283760070800781,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-prob-1.0-None-None-None-False-MST-None]": 0.007485151290893555,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.0052337646484375,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.005089282989501953,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6709558963775635,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.006241798400878906,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.7599444389343262,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-traversal1-1.0-None-None-None-False-MST-None]": 0.741847038269043,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.7878737449645996,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.8438410758972168,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.6813645362854004,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7403757572174072,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.6744282245635986,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.8832182884216309,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.696221113204956,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.6478087902069092,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.6967892646789551,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.7684619426727295,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.7780280113220215,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.7288577556610107,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.8566229343414307,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 1.1692867279052734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.9371509552001953,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-False-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.9288406372070312,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-prob-1.0-None-None-None-False-MST-Default]": 0.007452964782714844,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-prob-1.0-None-None-None-False-MST-None]": 0.005929231643676758,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-prob-1.0-None-None-None-False-MST-subnet1]": 0.00826263427734375,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.00800013542175293,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-prob-None-0.8-0.2-0.1-True-prop-None]": 0.0071065425872802734,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.006695270538330078,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-traversal1-1.0-None-None-None-False-MST-Default]": 0.009223461151123047,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-traversal1-1.0-None-None-None-False-MST-None]": 0.0070362091064453125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.007560253143310547,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.006381034851074219,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.006189584732055664,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-0-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.008671045303344727,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-prob-1.0-None-None-None-False-MST-Default]": 0.006883382797241211,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-prob-1.0-None-None-None-False-MST-None]": 0.0057523250579833984,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-prob-1.0-None-None-None-False-MST-subnet1]": 0.0073032379150390625,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.007399797439575195,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-prob-None-0.8-0.2-0.1-True-prop-None]": 0.013976335525512695,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.00543975830078125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-traversal1-1.0-None-None-None-False-MST-Default]": 0.006356716156005859,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-traversal1-1.0-None-None-None-False-MST-None]": 0.00555419921875,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.006097316741943359,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.006275653839111328,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.005929708480834961,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-5-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.006498098373413086,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-prob-1.0-None-None-None-False-MST-Default]": 0.005254983901977539,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-prob-1.0-None-None-None-False-MST-None]": 0.0051212310791015625,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-prob-1.0-None-None-None-False-MST-subnet1]": 0.006182432174682617,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-Default]": 0.007275581359863281,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-None]": 0.016371726989746094,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-prob-None-0.8-0.2-0.1-True-prop-subnet1]": 0.0059850215911865234,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-Default]": 0.005542755126953125,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-None]": 0.00655817985534668,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-traversal1-1.0-None-None-None-False-MST-subnet1]": 0.006906032562255859,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-Default]": 0.006680965423583984,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-None]": 0.009078264236450195,
-    "tests/test_workflows_dwi.py::test_struct_all[True-None-None-None-None-None-user_atlas_list2-local-wb-csd-None-None-True-min_length2-traversal1-None-0.8-0.2-0.1-True-prop-subnet1]": 0.005830049514770508
-}
\ No newline at end of file
diff --git a/pynets/core/tests/__init__.py b/pynets/core/tests/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/pynets/core/tests/conftest.py b/pynets/core/tests/conftest.py
new file mode 100755
index 00000000..3a52fd76
--- /dev/null
+++ b/pynets/core/tests/conftest.py
@@ -0,0 +1,111 @@
+"""Configuration file for pytest for pynets."""
+import os
+import sys
+import pytest
+import matplotlib
+matplotlib.use('agg', force=True)
+import matplotlib.pyplot as plt
+plt.ioff()
+plt.rcParams['figure.dpi'] = 100
+import tempfile
+import pkg_resources
+import numpy as np
+import nibabel as nib
+if sys.platform.startswith('win') is False:
+    import indexed_gzip
+from nilearn.input_data import NiftiLabelsMasker
+from nilearn.connectome import ConnectivityMeasure
+from pynets.core.nodemaker import get_names_and_coords_of_parcels
+from graspologic.simulations.simulations import er_nm, sbm
+from graspologic.utils import symmetrize, remove_loops, \
+    largest_connected_component
+from nilearn._utils import data_gen
+
+
+@pytest.fixture(scope='package')
+def random_mni_roi_data():
+    roi_img = data_gen.generate_mni_space_img(res=2)[1]
+    roi_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    roi_file = str(roi_file_tmp.name)
+    roi_img.to_filename(roi_file)
+
+    yield {'roi_file': roi_file}
+    roi_file_tmp.close()
+
+
+@pytest.fixture(scope='package')
+def gen_mat_data():
+    def _gen_mat_data(n: int=20, m: int=20, p: int=0.50,
+                      mat_type: str='sb', binary: bool=False,
+                      asfile: bool=True, n_graphs: int=1):
+        if binary is True:
+            wt = 1
+        else:
+            wt = np.random.uniform
+
+        mat_list = []
+        mat_file_list = []
+        for nm in range(n_graphs):
+            if mat_type == 'er':
+                mat = largest_connected_component(symmetrize(
+                    remove_loops(er_nm(n, m, wt=np.random.uniform,
+                                       wtargs=dict(low=0, high=1)))))
+            elif mat_type == 'sb':
+                if p is None:
+                    raise ValueError(
+                        f"for mat_type {mat_type}, p cannot be None")
+                mat = largest_connected_component(symmetrize(
+                    remove_loops(sbm(np.array([n]), np.array([[p]]),
+                                     wt=wt, wtargs=dict(low=0,
+                                                        high=1)))))
+            else:
+                raise ValueError(f"mat_type {mat_type} not recognized!")
+
+            mat_list.append(mat)
+
+            if asfile is True:
+                mat_path_tmp = tempfile.NamedTemporaryFile(mode='w+',
+                                                           suffix='.npy',
+                                                           delete=False)
+                mat_path = str(mat_path_tmp.name)
+                np.save(mat_path, mat)
+                mat_file_list.append(mat_path)
+                mat_path_tmp.close()
+
+        return {'mat_list': mat_list, 'mat_file_list': mat_file_list}
+
+    return _gen_mat_data
+
+
+@pytest.fixture(scope='package')
+def connectivity_data():
+    """Fixture for connectivity tests."""
+
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
+    func_file = f"{base_dir}/BIDS/sub-25659/ses-1/func/" \
+                f"sub-25659_ses-1_task-rest_space-T1w_desc-preproc_bold.nii.gz"
+    mask_file = f"{base_dir}/BIDS/sub-25659/ses-1/func/" \
+                f"sub-25659_ses-1_task-rest_space-T1w_desc-preproc_" \
+                f"bold_mask.nii.gz"
+    parcellation = pkg_resources.resource_filename(
+        "pynets", "templates/atlases/DesikanKlein2012.nii.gz"
+    )
+
+    masker = NiftiLabelsMasker(
+        labels_img=nib.load(parcellation), background_label=0,
+        resampling_target="labels", dtype="auto",
+        mask_img=nib.load(mask_file), standardize=True)
+
+    time_series = masker.fit_transform(func_file)
+    conn_measure = ConnectivityMeasure(
+        kind="correlation")
+    conn_matrix = conn_measure.fit_transform([time_series])[0]
+    [coords, _, _, label_intensities] = \
+        get_names_and_coords_of_parcels(parcellation)
+
+    labels = ['ROI_' + str(idx) for idx, val in enumerate(label_intensities)]
+
+    yield {'time_series': time_series, 'conn_matrix': conn_matrix,
+           'labels': labels, 'coords': coords, 'indices': label_intensities}
+
diff --git a/tests/test_nodemaker.py b/pynets/core/tests/test_nodemaker.py
similarity index 95%
rename from tests/test_nodemaker.py
rename to pynets/core/tests/test_nodemaker.py
index e2445efd..fbf02e53 100755
--- a/tests/test_nodemaker.py
+++ b/pynets/core/tests/test_nodemaker.py
@@ -4,6 +4,11 @@
 Created on Wed Dec 27 16:19:14 2017
 """
 import pytest
+import matplotlib
+matplotlib.use('agg', force=True)
+import matplotlib.pyplot as plt
+plt.ioff()
+plt.rcParams['figure.dpi'] = 100
 import numpy as np
 import time
 import nibabel as nib
@@ -77,11 +82,11 @@ def test_nodemaker_tools_parlistfile_RSN():
     os.makedirs(dir_path, exist_ok=True)
     shutil.copy2(parlistfile, f"{dir_path}/{os.path.basename(parlistfile)}")
     parlistfile = f"{dir_path}/{os.path.basename(parlistfile)}"
-    network = "Default"
+    subnet = "Default"
     parc = True
 
     start_time = time.time()
-    [coords, _, _, _] = nodemaker.get_names_and_coords_of_parcels(parlistfile)
+    coords = nodemaker.get_names_and_coords_of_parcels(parlistfile)[0]
     print(
         "%s%s%s"
         % (
@@ -98,8 +103,8 @@ def test_nodemaker_tools_parlistfile_RSN():
 
     parcel_list = nodemaker.gen_img_list(parlistfile)
 
-    [net_coords, net_parcel_list, net_labels, network] = \
-        nodemaker.get_node_membership(network, template, coords, labels,
+    [net_coords, net_parcel_list, net_labels, subnet] = \
+        nodemaker.get_node_membership(subnet, template, coords, labels,
                                       parc, parcel_list
     )
     print(
@@ -125,7 +130,7 @@ def test_nodemaker_tools_parlistfile_RSN():
     )
 
     start_time = time.time()
-    out_path = nodemaker.gen_network_parcels(parlistfile, network, net_labels,
+    out_path = nodemaker.gen_network_parcels(parlistfile, subnet, net_labels,
                                              dir_path)
     print(
         "%s%s%s"
@@ -143,7 +148,7 @@ def test_nodemaker_tools_parlistfile_RSN():
     assert out_path is not None
     assert net_parcels_map_nifti is not None
     assert parcel_list_exp is not None
-    assert network is not None
+    assert subnet is not None
 
 
 @pytest.mark.parametrize("atlas", ["coords_dosenbach_2010",
@@ -156,7 +161,7 @@ def test_nodemaker_tools_nilearn_coords_RSN(atlas):
     template = pkg_resources.resource_filename(
         "pynets", f"templates/standard/MNI152_T1_brain_2mm.nii.gz"
     )
-    network = "Default"
+    subnet = "Default"
     parc = False
     parcel_list = None
     start_time = time.time()
@@ -171,8 +176,8 @@ def test_nodemaker_tools_nilearn_coords_RSN(atlas):
     )
 
     start_time = time.time()
-    [net_coords, _, net_labels, network] = nodemaker.get_node_membership(
-        network, template, coords, labels, parc, parcel_list
+    [net_coords, _, net_labels, subnet] = nodemaker.get_node_membership(
+        subnet, template, coords, labels, parc, parcel_list
     )
     print(
         "%s%s%s"
@@ -187,7 +192,7 @@ def test_nodemaker_tools_nilearn_coords_RSN(atlas):
     assert labels is not None
     assert net_coords is not None
     assert net_labels is not None
-    assert network is not None
+    assert subnet is not None
 
 
 def test_nodemaker_tools_masking_parlistfile_RSN():
@@ -212,7 +217,7 @@ def test_nodemaker_tools_masking_parlistfile_RSN():
     roi = tempfile.NamedTemporaryFile(mode="w+", suffix=".nii.gz").name
     data_gen.generate_mni_space_img()[1].to_filename(roi)
 
-    network = "Default"
+    subnet = "Default"
     ID = "002"
     perc_overlap = 0.10
     parc = True
@@ -233,9 +238,9 @@ def test_nodemaker_tools_masking_parlistfile_RSN():
 
     start_time = time.time()
     parcel_list = nodemaker.gen_img_list(parlistfile)
-    [net_coords, net_parcel_list, net_labels, network] = \
+    [net_coords, net_parcel_list, net_labels, subnet] = \
         nodemaker.get_node_membership(
-        network, template, coords, labels, parc, parcel_list
+        subnet, template, coords, labels, parc, parcel_list
     )
     print(
         "%s%s%s"
@@ -285,7 +290,7 @@ def test_nodemaker_tools_masking_parlistfile_RSN():
 
     start_time = time.time()
     out_path = nodemaker.gen_network_parcels(
-        parlistfile, network, net_labels_masked, dir_path
+        parlistfile, subnet, net_labels_masked, dir_path
     )
     print(
         "%s%s%s"
@@ -306,7 +311,7 @@ def test_nodemaker_tools_masking_parlistfile_RSN():
     assert out_path is not None
     assert net_parcels_map_nifti is not None
     assert parcel_list_exp is not None
-    assert network is not None
+    assert subnet is not None
     tmp.cleanup()
 
 
@@ -325,7 +330,7 @@ def test_nodemaker_tools_masking_coords_RSN(atlas):
     roi = tempfile.NamedTemporaryFile(mode="w+", suffix=".nii.gz").name
     data_gen.generate_mni_space_img()[1].to_filename(roi)
 
-    network = "Default"
+    subnet = "Default"
     parc = False
     parcel_list = None
     error = 2
@@ -342,8 +347,8 @@ def test_nodemaker_tools_masking_coords_RSN(atlas):
     )
 
     start_time = time.time()
-    [net_coords, _, net_labels, network] = nodemaker.get_node_membership(
-        network, template, coords, labels, parc, parcel_list
+    [net_coords, _, net_labels, subnet] = nodemaker.get_node_membership(
+        subnet, template, coords, labels, parc, parcel_list
     )
     print(
         "%s%s%s"
@@ -372,7 +377,7 @@ def test_nodemaker_tools_masking_coords_RSN(atlas):
     assert net_coords_masked is not None
     assert net_labels is not None
     assert net_labels_masked is not None
-    assert network is not None
+    assert subnet is not None
 
 
 def test_nodemaker_tools_parlistfile_WB():
diff --git a/tests/test_refs.py b/pynets/core/tests/test_refs.py
similarity index 97%
rename from tests/test_refs.py
rename to pynets/core/tests/test_refs.py
index d2f3a4a4..477d123c 100755
--- a/tests/test_refs.py
+++ b/pynets/core/tests/test_refs.py
@@ -16,10 +16,10 @@ def test_bigsmallref():
     """
     Test big and small ref files for existence and non-corruption
     """
-    bigref1mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsnrefs/BIGREF1mm.nii.gz"))
-    bigref2mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsnrefs/BIGREF2mm.nii.gz"))
-    smallref1mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsnrefs/SMALLREF1mm.nii.gz"))
-    smallref2mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsnrefs/SMALLREF2mm.nii.gz"))
+    bigref1mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsns/BIGREF1mm.nii.gz"))
+    bigref2mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsns/BIGREF2mm.nii.gz"))
+    smallref1mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsns/SMALLREF1mm.nii.gz"))
+    smallref2mm = nib.load(pkg_resources.resource_filename("pynets", f"templates/rsns/SMALLREF2mm.nii.gz"))
     assert bigref1mm is not None
     assert bigref2mm is not None
     assert smallref1mm is not None
diff --git a/tests/test_thresholding.py b/pynets/core/tests/test_thresholding.py
similarity index 97%
rename from tests/test_thresholding.py
rename to pynets/core/tests/test_thresholding.py
index 47ad3e54..bef43820 100755
--- a/tests/test_thresholding.py
+++ b/pynets/core/tests/test_thresholding.py
@@ -5,7 +5,6 @@
 """
 import os
 import numpy as np
-
 try:
     import cPickle as pickle
 except ImportError:
@@ -234,12 +233,13 @@ def test_edge_cases(thr):
 @pytest.mark.parametrize("min_span_tree", [True, False])
 @pytest.mark.parametrize("disp_filt", [True, False])
 @pytest.mark.parametrize("dens_thresh", [True, False])
-def test_thresh_func(tractography_estimation_data,
-                     type, parc, all_zero, min_span_tree, disp_filt,
+def test_thresh_func(type, parc, all_zero, min_span_tree, disp_filt,
                      dens_thresh, frag_g):
     tmp = tempfile.TemporaryDirectory()
     dir_path = str(tmp.name)
     os.makedirs(dir_path, exist_ok=True)
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
 
     if all_zero == True and type == 'func':
         conn_matrix = np.zeros((10, 10))
@@ -318,7 +318,9 @@ def test_thresh_func(tractography_estimation_data,
     atlas_for_streams = pkg_resources.resource_filename(
         "pynets", "templates/atlases/whole_brain_cluster_labels_PCA200.nii.gz"
     )
-    streams = tractography_estimation_data['trk']
+    streams = f"{base_dir}/miscellaneous/streamlines_model-csd_" \
+              f"nodetype-parc_tracktype-particle_" \
+              f"traversal-prob_minlength-10.trk"
     traversal = 'prob'
     min_length = 20
     error_margin = 6
diff --git a/tests/test_utils.py b/pynets/core/tests/test_utils.py
similarity index 95%
rename from tests/test_utils.py
rename to pynets/core/tests/test_utils.py
index f6ce424f..4e8d1a28 100755
--- a/tests/test_utils.py
+++ b/pynets/core/tests/test_utils.py
@@ -4,6 +4,7 @@
 """
 import numpy as np
 import os
+import pkg_resources
 try:
     import cPickle as pickle
 except ImportError:
@@ -109,7 +110,8 @@ def test_collect_pandas_df(plot_switch, embed):
     Test collect_pandas_df_make functionality
     """
     import glob
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     multi_nets = None
     multimodal = False
     subnet = None
@@ -280,26 +282,23 @@ def test_create_unthr_path(node_size, hpass, smooth, parc):
                                                  marks=pytest.mark.xfail(
                                                      raises=ValueError))])
 @pytest.mark.parametrize("input", ['fmri', 'dmri'])
-def test_do_dir_path(dmri_estimation_data, fmri_estimation_data, atlas, input):
+def test_do_dir_path(atlas, input):
     """
     Test do_dir_path functionality
     """
-    import tempfile
 
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
 
     if input == 'fmri':
-        in_file = fmri_estimation_data['func_file']
+        in_file = f"{base_dir}/003/func/sub-003_ses-01_task-rest_bold.nii.gz"
     elif input == 'dmri':
-        in_file = dmri_estimation_data['dwi_file_small']
+        in_file = f"{base_dir}/003/dmri/sub-003_dwi.nii.gz"
 
     # Delete existing atlas dirs in in_file parent
     dir_path = utils.do_dir_path(
         atlas, f"{os.path.dirname(os.path.realpath(in_file))}")
     assert dir_path is not None
-    tmp.cleanup()
 
 
 def test_flatten():
@@ -383,7 +382,8 @@ def test_pass_meta_ins_multi(gen_mat_data, random_mni_roi_data):
     """
     Test pass_meta_ins_multi functionality
     """
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
 
     conn_model_func = 'cor'
     conn_model_struct = 'cov'
@@ -426,7 +426,8 @@ def test_pass_meta_ins_multi(gen_mat_data, random_mni_roi_data):
 
 
 def test_collectpandasjoin():
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     net_mets_csv = f"{base_dir}/miscellaneous/002_rsn-Default_nodetype-parc_" \
                    f"model-cov_template-MNI152_T1_thrtype-PROP_thr-0.95_" \
                    f"net_metrics.csv"
diff --git a/pynets/dmri/tests/__init__.py b/pynets/dmri/tests/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/pynets/dmri/tests/conftest.py b/pynets/dmri/tests/conftest.py
new file mode 100755
index 00000000..30dfce88
--- /dev/null
+++ b/pynets/dmri/tests/conftest.py
@@ -0,0 +1,175 @@
+"""Configuration file for pytest for pynets."""
+
+from pathlib import Path
+import os
+import sys
+import gc
+import pytest
+import tempfile
+import numpy as np
+import nibabel as nib
+import dipy.data as dpd
+if sys.platform.startswith('win') is False:
+    import indexed_gzip
+from dipy.core.gradients import gradient_table
+from nipype.utils.filemanip import fname_presuffix
+from dipy.segment.mask import median_otsu
+from dipy.io import save_pickle
+from dipy.reconst.shm import CsaOdfModel
+from dipy.data import default_sphere
+from dipy.direction import peaks_from_model
+from dipy.tracking.stopping_criterion import BinaryStoppingCriterion
+from dipy.tracking.utils import seeds_from_mask
+from dipy.tracking.local_tracking import LocalTracking
+from dipy.tracking.streamline import Streamlines
+from dipy.io.stateful_tractogram import Space, Origin, StatefulTractogram
+from dipy.io.streamline import save_tractogram
+from nilearn.masking import intersect_masks
+from nilearn._utils import data_gen
+
+
+@pytest.fixture(scope='package')
+def random_mni_roi_data():
+    roi_img = data_gen.generate_mni_space_img(res=2)[1]
+    roi_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    roi_file = str(roi_file_tmp.name)
+    roi_img.to_filename(roi_file)
+
+    yield {'roi_file': roi_file}
+    roi_file_tmp.close()
+
+
+@pytest.fixture(scope='package')
+def dmri_estimation_data():
+    """Fixture for dmri estimation tests."""
+
+    dpd.fetcher.dipy_home = f"{os.environ['HOME']}/.dipy"
+    os.makedirs(dpd.fetcher.dipy_home, exist_ok=True)
+    files, folder = dpd.fetcher.fetch_stanford_hardi()
+    dwi_file = f"{folder}/HARDI150.nii.gz"
+    fbvals = f"{folder}/HARDI150.bval"
+    fbvecs = f"{folder}/HARDI150.bvec"
+    files, folder = dpd.fetcher.fetch_stanford_t1()
+    t1w_file = f"{folder}/t1.nii.gz"
+
+    files, folder = dpd.fetcher.fetch_stanford_pve_maps()
+    f_pve_csf = f"{folder}/pve_csf.nii.gz"
+    f_pve_gm = f"{folder}/pve_gm.nii.gz"
+    f_pve_wm = f"{folder}/pve_wm.nii.gz"
+
+    bvals = np.loadtxt(fbvals)
+
+    b0_ixs = np.where(np.logical_and(bvals <= 50, bvals >= -50))[0]
+
+    dwi_img = nib.load(dwi_file)
+    dwi_data = dwi_img.get_fdata()
+
+    b0_mask, mask = median_otsu(np.asarray(dwi_data,
+                                           dtype=np.float32)[..., b0_ixs[0]],
+                                median_radius=4, numpass=2)
+    mask_img = nib.Nifti1Image(mask.astype(np.float32), dwi_img.affine)
+    B0_mask = fname_presuffix(dwi_file, suffix="_brain_mask",
+                              use_ext=True)
+    nib.save(mask_img, B0_mask)
+
+    mask_img_small = nib.Nifti1Image(mask[20:50, 55:85, 38:39
+                                     ].astype('float32'),
+                                     affine=mask_img.affine)
+    B0_mask_small = fname_presuffix(dwi_file, suffix="_brain_mask_small",
+                                    use_ext=True)
+    nib.save(mask_img_small, B0_mask_small)
+
+    del mask
+    mask_img.uncache()
+    mask_img_small.uncache()
+    gc.collect()
+
+    gtab = gradient_table(bvals, np.loadtxt(fbvecs))
+    gtab.b0_threshold = 50
+    gtab_bvals = gtab.bvals.copy()
+    b0_thr_ixs = np.where(gtab_bvals < gtab.b0_threshold)[0]
+    gtab_bvals[b0_thr_ixs] = 0
+    gtab.b0s_mask = gtab_bvals == 0
+
+    gtab_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.pkl',
+                                                delete=False)
+    gtab_file = str(gtab_file_tmp.name)
+    save_pickle(gtab_file, gtab)
+
+    dwi_data_small = dwi_data.copy()
+    dwi_data_small = dwi_data_small[20:50, 55:85, 38:39]
+    dwi_img_small = nib.Nifti1Image(dwi_data_small, header=dwi_img.header,
+                               affine=dwi_img.affine)
+    dwi_file_small = fname_presuffix(dwi_file, suffix="_small", use_ext=True)
+    dwi_img_small.to_filename(dwi_file_small)
+
+    del dwi_data, dwi_data_small
+    dwi_img.uncache()
+    dwi_img_small.uncache()
+    gc.collect()
+
+    yield {'dwi_file': dwi_file, 'fbvals': fbvals, 'fbvecs': fbvecs,
+           'gtab': gtab, 'gtab_file': gtab_file,
+           'dwi_file_small': dwi_file_small, 'B0_mask_small': B0_mask_small,
+           'B0_mask': B0_mask, 't1w_file': t1w_file,
+           'f_pve_csf': f_pve_csf, 'f_pve_wm': f_pve_wm, 'f_pve_gm': f_pve_gm}
+    gtab_file_tmp.close()
+
+
+@pytest.fixture(scope='package')
+def tractography_estimation_data(dmri_estimation_data):
+    path_tmp = tempfile.NamedTemporaryFile(mode='w+',
+                                           suffix='.trk',
+                                           delete=False)
+    trk_path_tmp = str(path_tmp.name)
+    dir_path = os.path.dirname(trk_path_tmp)
+
+    gtab = dmri_estimation_data['gtab']
+    wm_img = nib.load(dmri_estimation_data['f_pve_wm'])
+    dwi_img = nib.load(dmri_estimation_data['dwi_file'])
+    dwi_data = dwi_img.get_fdata()
+    B0_mask_img = nib.load(dmri_estimation_data['B0_mask'])
+    mask_img = intersect_masks(
+        [
+            nib.Nifti1Image(np.asarray(wm_img.dataobj).astype('bool'
+                                                              ).astype('int'),
+                            affine=wm_img.affine),
+            nib.Nifti1Image(np.asarray(B0_mask_img.dataobj).astype(
+                'bool').astype('int'),
+                            affine=B0_mask_img.affine)
+        ],
+        threshold=1,
+        connected=False,
+    )
+
+    mask_data = mask_img.get_fdata()
+    mask_file = fname_presuffix(dmri_estimation_data['B0_mask'],
+                                suffix="tracking_mask", use_ext=True)
+    mask_img.to_filename(mask_file)
+    csa_model = CsaOdfModel(gtab, sh_order=6)
+    csa_peaks = peaks_from_model(csa_model, dwi_data, default_sphere,
+                                 relative_peak_threshold=.8,
+                                 min_separation_angle=45,
+                                 mask=mask_data)
+
+    stopping_criterion = BinaryStoppingCriterion(mask_data)
+
+    seed_mask = (mask_data == 1)
+    seeds = seeds_from_mask(seed_mask, dwi_img.affine, density=[1, 1, 1])
+
+    streamlines_generator = LocalTracking(csa_peaks, stopping_criterion, seeds,
+                                          affine=dwi_img.affine, step_size=.5)
+    streamlines = Streamlines(streamlines_generator)
+    sft = StatefulTractogram(streamlines, B0_mask_img, origin=Origin.NIFTI,
+                             space=Space.VOXMM)
+    sft.remove_invalid_streamlines()
+    trk = f"{dir_path}/tractogram.trk"
+    os.rename(trk_path_tmp, trk)
+    save_tractogram(sft, trk, bbox_valid_check=False)
+    del streamlines, sft, streamlines_generator, seeds, seed_mask, csa_peaks, \
+        csa_model, dwi_data, mask_data
+    dwi_img.uncache()
+    mask_img.uncache()
+    gc.collect()
+
+    yield {'trk': trk, 'mask': mask_file}
diff --git a/tests/test_estimation.py b/pynets/dmri/tests/test_estimation.py
similarity index 54%
rename from tests/test_estimation.py
rename to pynets/dmri/tests/test_estimation.py
index 5a03c0bf..ddc702b6 100755
--- a/tests/test_estimation.py
+++ b/pynets/dmri/tests/test_estimation.py
@@ -11,210 +11,25 @@
 # import time
 import nibabel as nib
 import os
+import pkg_resources
 import tempfile
-import pandas as pd
 import logging
 # from inspect import getargspec
 try:
     import cPickle as pickle
 except ImportError:
     import _pickle as pickle
-
 from pathlib import Path
-
-logger = logging.getLogger(__name__)
-logger.setLevel(50)
-from pynets.fmri.estimation import (get_conn_matrix, timeseries_bootstrap,
-                                    fill_confound_nans)
-from pynets.fmri.interfaces import TimeseriesExtraction
 from pynets.dmri.estimation import (create_anisopowermap, tens_mod_fa_est,
                                     tens_mod_est, csa_mod_est, csd_mod_est,
                                     streams2graph, sfm_mod_est)
-from nilearn.tests.test_signal import generate_signals
-from nilearn._utils.extmath import is_spd
-from numpy.testing import assert_array_almost_equal
 from nipype.utils.filemanip import fname_presuffix
 from nilearn.image import resample_to_img
 
-# fMRI
-@pytest.mark.parametrize("conn_model_in",
-    [
-        # Standard models
-        'corr', 'partcorr', 'cov', 'sps',
-
-        # These models require skggm and will fail if not installed
-        pytest.param('QuicGraphicalLasso', marks=pytest.mark.xfail),
-        pytest.param('QuicGraphicalLassoCV', marks=pytest.mark.xfail),
-        pytest.param('QuicGraphicalLassoEBIC', marks=pytest.mark.xfail),
-        pytest.param('AdaptiveQuicGraphicalLasso', marks=pytest.mark.xfail),
-        pytest.param(None, marks=pytest.mark.xfail(raises=ValueError))
-    ]
-)
-@pytest.mark.parametrize("n_features",
-    [
-        50,
-        pytest.param(2, marks=pytest.mark.xfail)
-    ]
-)
-def test_get_conn_matrix(conn_model_in, n_features):
-    """ Test computing a functional connectivity matrix."""
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    subnet = 'Default'
-    ID = '002'
-    smooth = 2
-    coords = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
-    node_radius = 8
-    signal = 'zscore'
-    roi = None
-    atlas = None
-    parcellation = None
-    labels = [1, 2, 3]
-
-    time_series = generate_signals(n_features=n_features, n_confounds=5,
-                                   length=n_features, same_variance=False)[0]
-
-    outs = get_conn_matrix(
-        time_series,
-        conn_model_in,
-        dir_path,
-        node_radius,
-        smooth,
-        False,
-        subnet,
-        ID,
-        roi,
-        False,
-        False,
-        True,
-        True,
-        atlas,
-        parcellation,
-        labels,
-        coords,
-        3,
-        False,
-        0,
-        signal,
-    )
-
-    conn_matrix_out, conn_model_out = outs[0], outs[1]
-
-    assert isinstance(conn_matrix_out, np.ndarray)
-    assert np.shape(conn_matrix_out) == np.shape(time_series)
-    assert conn_model_in == conn_model_out
-
-    if "corr" in conn_model_in:
-        assert (is_spd(conn_matrix_out, decimal=7))
-        d = np.sqrt(np.diag(np.diag(conn_matrix_out)))
-        assert_array_almost_equal(np.diag(conn_matrix_out),
-                                  np.ones(n_features))
-    elif "partcorr" in conn_model_in:
-        prec = np.linalg.inv(conn_matrix_out)
-        d = np.sqrt(np.diag(np.diag(prec)))
-        assert_array_almost_equal(d.dot(conn_matrix_out).dot(d), -prec +
-                                  2 * np.diag(np.diag(prec)))
-    tmp.cleanup()
-
-
-def test_timeseries_bootstrap():
-    """Test bootstrapping a sample of time series."""
-
-    tseries = np.random.rand(100, 10)
-    bseries = timeseries_bootstrap(tseries, 5)
-
-    assert np.shape(bseries[0]) == np.shape(tseries)
-    assert len(bseries[1]) == len(tseries)
-
-
-def test_fill_confound_nans():
-    """ Testing filling pd dataframe np.nan values with mean."""
-
-    confounds = np.ones((5, 5))
-    confounds[0][0] = np.nan
-    confounds = pd.DataFrame({'Column1': [np.nan, 2, 4]})
-    with tempfile.TemporaryDirectory() as dir_path:
-        conf_corr = fill_confound_nans(confounds, dir_path)
-        conf_corr = np.genfromtxt(conf_corr, delimiter='\t', skip_header=True)
-
-    assert not np.isnan(conf_corr).any()
-    assert conf_corr[0] == np.mean(conf_corr[1:])
-
-
-@pytest.mark.parametrize("conf",
-                         [True, pytest.param(False, marks=pytest.mark.xfail)])
-@pytest.mark.parametrize("hpass", [0, 0.028, 0.080])
-@pytest.mark.parametrize("mask", [True, False])
-@pytest.mark.parametrize("func",
-                         [True, pytest.param(False, marks=pytest.mark.xfail)])
-def test_timseries_extraction(fmri_estimation_data, parcellation_data, conf,
-                              hpass, mask, func):
-    """ Test preparing inputs method of the TimeseriesExtraction class."""
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    if func:
-        func_file = fmri_estimation_data['func_file']
-    else:
-        func_file = None
-
-    func_img = nib.load(func_file)
-
-    if mask:
-        mask = fmri_estimation_data['mask_file']
-    else:
-        mask = None
+logger = logging.getLogger(__name__)
+logger.setLevel(50)
 
-    if conf:
-        conf = fmri_estimation_data['conf_file']
-    else:
-        conf = None
 
-    subnet = 'Default'
-    ID = '002'
-    smooth = 2
-    node_radius = 8
-    signal = 'median'
-    roi = None
-    net_parcels_map_nifti_file = \
-        parcellation_data['net_parcels_map_nifti_file']
-    te = TimeseriesExtraction(
-        net_parcels_nii_path=net_parcels_map_nifti_file,
-        node_radius=node_radius, conf=conf,
-        func_file=func_file, roi=roi,
-        dir_path=dir_path, ID=ID, subnet=subnet, smooth=smooth, hpass=hpass,
-        mask=mask, signal=signal)
-    te.prepare_inputs()
-    te.extract_ts_parc()
-
-    parcels = parcellation_data['parcels']
-    assert np.shape(te._func_img) == np.shape(func_img)
-    assert np.shape(te.ts_within_nodes) == \
-           (np.shape(func_img)[-1] - 5,
-            len(np.unique(parcels)) - 1)
-
-    if hpass and hpass > 0:
-        assert te.hpass == hpass
-        assert te._detrending is False
-    else:
-        assert te.hpass is None
-        assert te._detrending is True
-
-    if mask:
-        assert np.shape(te._mask_img) == np.shape(func_img)[:-1]
-        # Test save and clean up
-        te._mask_path = te._mask_img
-        te.save_and_cleanup()
-
-    tmp.cleanup()
-
-
-# dMRI
 def test_create_anisopowermap(dmri_estimation_data):
     """ Test creating an anisotropic power map."""
 
@@ -298,11 +113,37 @@ def test_sfm_mod_est(dmri_estimation_data):
     assert model is not None
 
 
-@pytest.mark.parametrize("dsn", [False])
-@pytest.mark.parametrize("fa_wei", [True, False])
-def test_streams2graph(dmri_estimation_data, tractography_estimation_data,
-                       random_mni_roi_data, fa_wei, dsn):
-    from pynets.registration.register import direct_streamline_norm, regutils
+@pytest.mark.parametrize("conn_model", ['csa', 'csd', 'ten'])
+def test_reconstruction(conn_model):
+    """
+    Test for reconstruction functionality
+    """
+    from pynets.dmri.estimation import reconstruction
+    from dipy.core.gradients import gradient_table
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
+
+    dir_path = f"{base_dir}/003/dmri"
+    bvals = f"{dir_path}/sub-003_dwi.bval"
+    bvecs = f"{dir_path}/sub-003_dwi.bvec"
+    gtab = gradient_table(bvals, bvecs)
+    dwi_file = f"{dir_path}/sub-003_dwi.nii.gz"
+    wm_in_dwi = f"{dir_path}/wm_mask_dmri.nii.gz"
+
+    dwi_img = nib.load(dwi_file)
+    dwi_data = dwi_img.get_fdata()
+
+    model, mod = reconstruction(conn_model, gtab, dwi_data, wm_in_dwi)
+    assert model is not None
+    assert mod is not None
+
+
+#@pytest.mark.parametrize("dsn", [False])
+#@pytest.mark.parametrize("fa_wei", [True, False])
+def test_streams2graph(dmri_estimation_data,
+                       tractography_estimation_data,
+                       random_mni_roi_data, dsn=False):
+    from pynets.registration.register import direct_streamline_norm
     from dipy.core.gradients import gradient_table
     from dipy.io import save_pickle
     import random
@@ -315,10 +156,10 @@ def test_streams2graph(dmri_estimation_data, tractography_estimation_data,
     dwi_file = dmri_estimation_data['dwi_file']
     conn_model = 'csd'
     min_length = 10
-    error_margin = 2
+    error_margin = 5
     traversal = 'prob'
-    track_type = 'particle'
-    min_span_tree = True
+    track_type = 'local'
+    min_span_tree = False
     prune = 3
     norm = 6
     binary = False
@@ -352,7 +193,7 @@ def test_streams2graph(dmri_estimation_data, tractography_estimation_data,
     atlas_in_dwi = fname_presuffix(ap_path,
                                 suffix="atlas_in_dwi", use_ext=True)
     resample_to_img(
-        nib.load(parcellation), nib.load(ap_path), interpolation="nearest"
+        nib.load(parcellation), nib.load(fa_path), interpolation="nearest"
     ).to_filename(atlas_in_dwi)
 
     coords = [(random.random()*2.0, random.random()*2.0, random.random()*2.0)
@@ -422,7 +263,7 @@ def test_streams2graph(dmri_estimation_data, tractography_estimation_data,
     conn_matrix = streams2graph(
                     atlas_in_dwi,
                     streams,
-                    dir_path,
+                    os.path.dirname(streams),
                     track_type,
                     conn_model,
                     subnet,
diff --git a/tests/test_track.py b/pynets/dmri/tests/test_track.py
old mode 100644
new mode 100755
similarity index 73%
rename from tests/test_track.py
rename to pynets/dmri/tests/test_track.py
index 51a6996c..8763fec1
--- a/tests/test_track.py
+++ b/pynets/dmri/tests/test_track.py
@@ -9,6 +9,7 @@
 except ImportError:
     import _pickle as pickle
 from pathlib import Path
+import pkg_resources
 import nibabel as nib
 import sys
 if sys.platform.startswith('win') is False:
@@ -28,7 +29,8 @@ def test_create_density_map():
     from pynets.dmri import track
     from dipy.tracking._utils import _mapping_to_voxel
 
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     dir_path = f"{base_dir}/BIDS/sub-25659/ses-1/dwi"
     dwi_file = f"{base_dir}/BIDS/sub-25659/ses-1/dwi/final_preprocessed_" \
                f"dwi.nii.gz"
@@ -60,11 +62,10 @@ def test_create_density_map():
 
     [dir_path, dm_path] = track.create_density_map(dwi_img, dir_path,
                                                    streams_final_filt_final,
-                                                   conn_model,
-                                                   node_radius, curv_thr_list,
-                                                   step_list, subnet, roi,
-                                                   traversal, max_length,
-                                                   '/tmp')
+                                                   conn_model, node_radius,
+                                                   curv_thr_list, step_list,
+                                                   subnet, roi, traversal,
+                                                   max_length, '/tmp')
 
     assert dir_path is not None
     assert dm_path is not None
@@ -76,7 +77,8 @@ def test_prep_tissues(tiss_class):
     Test for prep_tissues functionality
     """
     from pynets.dmri import track
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     t1w_mask = f"{base_dir}/003/dmri/gm_mask_dmri.nii.gz"
     B0_mask = f"{base_dir}/003/dmri/sub-003_b0_brain_mask.nii.gz"
     gm_in_dwi = f"{base_dir}/003/dmri/gm_mask_dmri.nii.gz"
@@ -92,30 +94,6 @@ def test_prep_tissues(tiss_class):
     assert tiss_classifier is not None
 
 
-@pytest.mark.parametrize("conn_model", ['csa', 'csd', 'ten'])
-def test_reconstruction(conn_model):
-    """
-    Test for reconstruction functionality
-    """
-    from pynets.dmri import track
-    from dipy.core.gradients import gradient_table
-    base_dir = str(Path(__file__).parent/"examples")
-
-    dir_path = f"{base_dir}/003/dmri"
-    bvals = f"{dir_path}/sub-003_dwi.bval"
-    bvecs = f"{dir_path}/sub-003_dwi.bvec"
-    gtab = gradient_table(bvals, bvecs)
-    dwi_file = f"{dir_path}/sub-003_dwi.nii.gz"
-    wm_in_dwi = f"{dir_path}/wm_mask_dmri.nii.gz"
-
-    dwi_img = nib.load(dwi_file)
-    dwi_data = dwi_img.get_fdata()
-
-    model, mod = track.reconstruction(conn_model, gtab, dwi_data, wm_in_dwi)
-    assert model is not None
-    assert mod is not None
-
-
 @pytest.mark.parametrize("traversal", ['det', 'prob'])
 @pytest.mark.parametrize("target_samples",
                          [300, pytest.param(0, marks=pytest.mark.xfail)])
@@ -124,12 +102,13 @@ def test_track_ensemble(traversal, target_samples):
     Test for ensemble tractography functionality
     """
     import tempfile
-    from pynets.dmri import track
+    from pynets.dmri import track, estimation
     from dipy.core.gradients import gradient_table
     from dipy.data import get_sphere
     from nibabel.streamlines.array_sequence import ArraySequence
 
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     B0_mask = f"{base_dir}/003/anat/mean_B0_bet_mask_tmp.nii.gz"
     gm_in_dwi = f"{base_dir}/003/anat/t1w_gm_in_dwi.nii.gz"
     vent_csf_in_dwi = f"{base_dir}/003/anat/t1w_vent_csf_in_dwi.nii.gz"
@@ -145,9 +124,9 @@ def test_track_ensemble(traversal, target_samples):
     labels_im_file = f"{dir_path}/whole_brain_cluster_labels_PCA200_dwi_" \
                      f"track.nii.gz"
     conn_model = 'csa'
-    tiss_class = 'wm'
-    min_length = 10
-    maxcrossing = 2
+    tiss_class = 'wb'
+    min_length = 2
+    maxcrossing = 3
     roi_neighborhood_tol = 6
     waymask = None
     curv_thr_list = [40, 30]
@@ -162,7 +141,7 @@ def test_track_ensemble(traversal, target_samples):
     temp_dir = str(tmp.name)
     os.makedirs(temp_dir, exist_ok=True)
     recon_path = f"{temp_dir}/model_file.hdf5"
-    model, _ = track.reconstruction(conn_model, gtab, dwi_data, wm_in_dwi)
+    model = estimation.reconstruction(conn_model, gtab, dwi_data, wm_in_dwi)[0]
 
     with h5py.File(recon_path, 'w') as hf:
         hf.create_dataset("reconstruction",
@@ -170,11 +149,12 @@ def test_track_ensemble(traversal, target_samples):
     hf.close()
 
     streamlines = track.track_ensemble(target_samples, atlas_data_wm_gm_int,
-                                       labels_im_file,
-                   recon_path, sphere, traversal, curv_thr_list, step_list,
-                   track_type, maxcrossing, roi_neighborhood_tol, min_length,
-                   waymask, B0_mask, gm_in_dwi, gm_in_dwi, vent_csf_in_dwi,
-                   wm_in_dwi, tiss_class)
+                                       labels_im_file, recon_path, sphere,
+                                       traversal, curv_thr_list, step_list,
+                                       track_type, maxcrossing,
+                                       roi_neighborhood_tol, min_length,
+                                       waymask, B0_mask, gm_in_dwi, gm_in_dwi,
+                                       vent_csf_in_dwi, wm_in_dwi, tiss_class)
 
     assert isinstance(streamlines, ArraySequence)
     tmp.cleanup()
@@ -185,14 +165,15 @@ def test_track_ensemble_particle():
     Test for ensemble tractography functionality
     """
     import tempfile
-    from pynets.dmri import track
+    from pynets.dmri import track, estimation
     from dipy.core.gradients import gradient_table
     from dipy.data import get_sphere
-    from dipy.io.stateful_tractogram import Space, StatefulTractogram, Origin
-    from dipy.io.streamline import save_tractogram
+    # from dipy.io.stateful_tractogram import Space, StatefulTractogram, Origin
+    # from dipy.io.streamline import save_tractogram
     from nibabel.streamlines.array_sequence import ArraySequence
 
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     B0_mask = f"{base_dir}/003/anat/mean_B0_bet_mask_tmp.nii.gz"
     gm_in_dwi = f"{base_dir}/003/anat/t1w_gm_in_dwi.nii.gz"
     vent_csf_in_dwi = f"{base_dir}/003/anat/t1w_vent_csf_in_dwi.nii.gz"
@@ -209,8 +190,8 @@ def test_track_ensemble_particle():
                      f"_track.nii.gz"
     conn_model = 'csd'
     tiss_class = 'cmc'
-    min_length = 10
-    maxcrossing = 2
+    min_length = 2
+    maxcrossing = 3
     roi_neighborhood_tol = 6
     waymask = None
     curv_thr_list = [40, 30]
@@ -223,7 +204,7 @@ def test_track_ensemble_particle():
     dwi_img = nib.load(dwi_file)
     dwi_data = dwi_img.get_fdata()
 
-    model, _ = track.reconstruction(conn_model, gtab, dwi_data, wm_in_dwi)
+    model = estimation.reconstruction(conn_model, gtab, dwi_data, wm_in_dwi)[0]
     tmp = tempfile.TemporaryDirectory()
     temp_dir = str(tmp.name)
     recon_path = f"{str(temp_dir)}/model_file.hdf5"
@@ -240,12 +221,5 @@ def test_track_ensemble_particle():
                    waymask, B0_mask, gm_in_dwi, gm_in_dwi, vent_csf_in_dwi,
                    wm_in_dwi, tiss_class)
 
-    streams = f"{base_dir}/miscellaneous/streamlines_model-csd_" \
-              f"nodetype-parc_tracktype-particle_" \
-              f"traversal-prob_minlength-10.trk"
-    save_tractogram(StatefulTractogram(streamlines, reference=dwi_img,
-                                       space=Space.VOXMM, origin=Origin.NIFTI),
-                    streams, bbox_valid_check=False)
-
     assert isinstance(streamlines, ArraySequence)
     tmp.cleanup()
diff --git a/tests/test_dmri_utils.py b/pynets/dmri/tests/test_utils.py
similarity index 98%
rename from tests/test_dmri_utils.py
rename to pynets/dmri/tests/test_utils.py
index 54c42611..2784c9c5 100755
--- a/tests/test_dmri_utils.py
+++ b/pynets/dmri/tests/test_utils.py
@@ -5,6 +5,7 @@
 @authors: Derek Pisner & Ryan Hammonds
 
 """
+import pytest
 import os
 import numpy as np
 try:
@@ -69,7 +70,7 @@ def test_evaluate_streamline_plausibility(dmri_estimation_data,
         streams,
         mask_img,
         to_origin=Origin.NIFTI,
-        to_space=Space.RASMM,
+        to_space=Space.VOXMM,
         bbox_valid_check=True,
     )
     streamlines = tractogram.streamlines
diff --git a/tests/test_workflows_dwi.py b/pynets/dmri/tests/test_workflows_dwi.py
similarity index 71%
rename from tests/test_workflows_dwi.py
rename to pynets/dmri/tests/test_workflows_dwi.py
index 5f3c3d09..9ef52bc2 100755
--- a/tests/test_workflows_dwi.py
+++ b/pynets/dmri/tests/test_workflows_dwi.py
@@ -10,6 +10,7 @@
     import _pickle as pickle
 import pytest
 import logging
+import pkg_resources
 import tempfile
 import networkx as nx
 from pynets.core import workflows
@@ -18,7 +19,8 @@
 logger = logging.getLogger(__name__)
 logger.setLevel(50)
 
-base_dir = str(Path(__file__).parent/"examples")
+base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
 
 # Test that each possible combination of inputs creates a workflow.
 
@@ -41,65 +43,60 @@
 )
 @pytest.mark.parametrize("parc,node_radius,node_size_list,atlas,multi_atlas,parcellation,user_atlas_list",
     [
-        # pytest.param(False, None, [4, 8], None, None, None, None, marks=pytest.mark.xfail),
-        # pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, None, None),
-        # pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010', 'coords_power_2011'], None, None),
-        # pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None, None),
-        # pytest.param(False, 4, None, None, ['coords_dosenbach_2010', 'coords_power_2011'], None, None),
-        # pytest.param(False, 4, None, None, None, None, None, marks=pytest.mark.xfail),
+        pytest.param(False, None, [4, 8], None, None, None, None, marks=pytest.mark.xfail),
+        pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, None, None),
+        pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010', 'coords_power_2011'], None, None),
+        pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None, None),
+        pytest.param(False, 4, None, None, ['coords_dosenbach_2010', 'coords_power_2011'], None, None),
+        pytest.param(False, 4, None, None, None, None, None, marks=pytest.mark.xfail),
         pytest.param(True, None, None, None, None, None, None),
-        # pytest.param(False, None, [4, 8], None, None, f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #              None),
-        # pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, f"{base_dir}/miscellaneous/whole_brain_cluster_labels_"
-        # f"PCA200.nii.gz", None),
-        # pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010', 'coords_power_2011'], f"{base_dir}/miscellaneous/whole_"
-        # f"brain_cluster_labels_PCA200.nii.gz", None),
-        # pytest.param(False, 4, None, 'coords_dosenbach_2010', None, f"{base_dir}/miscellaneous/whole_brain_cluster_labels_PCA200."
-        # f"nii.gz", None),
-        # pytest.param(False, 4, None, None, ['coords_dosenbach_2010', 'coords_power_2011'], f"{base_dir}/miscellaneous/whole_brain_"
-        # f"cluster_labels_PCA200.nii.gz", None),
-        # pytest.param(False, 4, None, None, None, f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #              None),
+        pytest.param(False, None, [4, 8], None, None, f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                     None),
+        pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, f"{base_dir}/miscellaneous/whole_brain_cluster_labels_"
+        f"PCA200.nii.gz", None),
+        pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010', 'coords_power_2011'], f"{base_dir}/miscellaneous/whole_"
+        f"brain_cluster_labels_PCA200.nii.gz", None),
+        pytest.param(False, 4, None, 'coords_dosenbach_2010', None, f"{base_dir}/miscellaneous/whole_brain_cluster_labels_PCA200."
+        f"nii.gz", None),
+        pytest.param(False, 4, None, None, ['coords_dosenbach_2010', 'coords_power_2011'], f"{base_dir}/miscellaneous/whole_brain_"
+        f"cluster_labels_PCA200.nii.gz", None),
+        pytest.param(False, 4, None, None, None, f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                     None),
         pytest.param(True, None, None, None, None, f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
                      None),
-        # pytest.param(False, None, [4, 8], None, None, None, [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #                                                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
-        # pytest.param(False, None, [4, 8], 'coords_dosenbach_2010',
-        #              None, None, [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #                           f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
-        # pytest.param(False, None, [4, 8], None,
-        #              ['coords_dosenbach_2010', 'coords_power_2011'], None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
-        # pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
-        # pytest.param(False, 4, None, None, ['coords_dosenbach_2010', 'coords_power_2011'], None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
-        # pytest.param(False, 4, None, None, None, None, [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
-        #                                                 f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
+        pytest.param(False, None, [4, 8], None, None, None, [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                                                             f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
+        pytest.param(False, None, [4, 8], 'coords_dosenbach_2010',
+                     None, None, [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                                  f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
+        pytest.param(False, None, [4, 8], None,
+                     ['coords_dosenbach_2010', 'coords_power_2011'], None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
+        pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
+        pytest.param(False, 4, None, None, ['coords_dosenbach_2010', 'coords_power_2011'], None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
+        pytest.param(False, 4, None, None, None, None, [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
+                                                        f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"]),
         pytest.param(True, None, None, None, None, None, [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz",
                                                           f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_bin.nii.gz"])
     ]
 )
-def test_struct_all(dmri_estimation_data, node_radius, parc, conn_model,
-                    conn_model_list, thr, max_thr, min_thr, step_thr,
+def test_struct_all(node_radius, parc, conn_model, conn_model_list, thr, max_thr, min_thr, step_thr,
                     multi_thr, thr_type, tiss_class, traversal, min_length,
                     track_type, node_size_list, atlas, multi_atlas,
                     parcellation, user_atlas_list, subnet, plot_switch, mask):
     """
     Test structural connectometry
     """
-    dir_path = tempfile.TemporaryDirectory()
-    base_dir = str(dir_path.name)
-    if not os.path.isdir(base_dir):
-        os.makedirs(base_dir)
 
-    dwi_file = dmri_estimation_data['dwi_file']
-    fbval = dmri_estimation_data['fbvals']
-    fbvec = dmri_estimation_data['fbvecs']
-    anat_file = dmri_estimation_data['t1w_file']
+    anat_file = f"{base_dir}/003/anat/sub-003_T1w.nii.gz"
+    fbval = f"{base_dir}/003/dmri/sub-003_dwi.bval"
+    fbvec = f"{base_dir}/003/dmri/sub-003_dwi.bvec"
+    dwi_file = f"{base_dir}/003/dmri/sub-003_dwi.nii.gz"
 
     roi = None
     ID = '25659_1'
@@ -256,5 +253,3 @@ def test_struct_all(dmri_estimation_data, node_radius, parc, conn_model,
     assert nx.is_directed_acyclic_graph(dmri_connectometry_wf._graph) is True
     # plugin_args = {'n_procs': int(procmem[0]), 'memory_gb': int(procmem[1]), 'scheduler': 'mem_thread'}
     # out = dmri_connectometry_wf.run(plugin=plugin_type, plugin_args=plugin_args)
-
-    dir_path.cleanup()
diff --git a/pynets/fmri/tests/__init__.py b/pynets/fmri/tests/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/pynets/fmri/tests/conftest.py b/pynets/fmri/tests/conftest.py
new file mode 100755
index 00000000..a830f3f5
--- /dev/null
+++ b/pynets/fmri/tests/conftest.py
@@ -0,0 +1,124 @@
+"""Configuration file for pytest for pynets."""
+
+from pathlib import Path
+import sys
+import gc
+import pytest
+import tempfile
+import pandas as pd
+import numpy as np
+import nibabel as nib
+import dipy.data as dpd
+if sys.platform.startswith('win') is False:
+    import indexed_gzip
+from nilearn._utils import as_ndarray, data_gen
+from nilearn.plotting import find_parcellation_cut_coords
+
+
+@pytest.fixture(scope='package')
+def random_mni_roi_data():
+    roi_img = data_gen.generate_mni_space_img(res=2)[1]
+    roi_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    roi_file = str(roi_file_tmp.name)
+    roi_img.to_filename(roi_file)
+
+    yield {'roi_file': roi_file}
+    roi_file_tmp.close()
+
+
+def generate_random_img(shape, length=1, affine=np.eye(4),
+                        rand_gen=np.random.RandomState(0)):
+    data = rand_gen.standard_normal(size=(shape + (length,)))
+    return nib.Nifti1Image(data, affine), nib.Nifti1Image(
+        as_ndarray(data[..., 0] > 0.2, dtype=np.int8), affine)
+
+
+@pytest.fixture(scope='package')
+def fmri_estimation_data():
+    """Fixture for fmri estimation tests."""
+
+    shape1 = (45, 54, 45)
+    affine1 = np.array([[1.,    0.,    0.,  -22.75],
+       [0.,    1.,    0., -31.5],
+       [0.,    0.,    1.,  -18.],
+       [0.,    0.,    0.,    0.25]])
+    length = 40
+
+    func_img, mask_img = generate_random_img(shape1, affine=affine1,
+                                             length=length)
+
+    func_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    func_file = str(func_file_tmp.name)
+    func_img.to_filename(func_file)
+
+    conf_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.tsv')
+    conf_mat = np.random.rand(length)
+    conf_df = pd.DataFrame({'Conf1': conf_mat,
+                            "Conf2": [np.nan]*len(conf_mat)})
+    conf_file = str(conf_tmp.name)
+    conf_df.to_csv(conf_file, sep='\t', index=False)
+
+    # Create empty mask file
+    mask_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    mask_file = str(mask_tmp.name)
+    mask_img.to_filename(mask_file)
+
+    t1w_file = f"{dpd.fetch_tissue_data()[1]}/{dpd.fetch_tissue_data()[0][1]}"
+
+    mask_img.uncache()
+    func_img.uncache()
+    gc.collect()
+
+    shape2 = (20, 40, 20)
+    affine2 = np.eye(4)
+    length = 50
+
+    func_img2, mask_img2 = generate_random_img(shape2, affine=affine2,
+                                               length=length)
+
+    func_file_tmp2 = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    func_file2 = str(func_file_tmp2.name)
+    func_img2.to_filename(func_file2)
+
+    mask_tmp2 = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    mask_file2 = str(mask_tmp2.name)
+    mask_img2.to_filename(mask_file2)
+
+    func_img2.uncache()
+    mask_img2.uncache()
+    gc.collect()
+
+    yield {'func_file': func_file,
+           'conf_file': conf_file,
+           'mask_file': mask_file,
+           't1w_file': t1w_file,
+           'func_file2': func_file2,
+           'mask_file2': mask_file2}
+    mask_tmp.close()
+    conf_tmp.close()
+    func_file_tmp.close()
+    func_file_tmp2.close()
+    mask_tmp2.close()
+
+
+@pytest.fixture(scope='package')
+def parcellation_data():
+    """Fixture for parcellations."""
+    parcels_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    labels = pd.DataFrame(
+        {"label": list(map("label_{}".format, range(16)))})['label'
+    ].values.tolist()
+    parcellation = data_gen.generate_labeled_regions((7, 6, 5), 16)
+    parcels = parcellation.get_fdata()
+    net_parcels_map_nifti_file = str(parcels_tmp.name)
+    parcellation.to_filename(net_parcels_map_nifti_file)
+
+    [coords, indices] = find_parcellation_cut_coords(
+        parcellation, 0, return_label_names=True
+    )
+    coords = list(tuple(x) for x in coords)
+
+    yield {'net_parcels_map_nifti_file': net_parcels_map_nifti_file,
+           'parcels': parcels, 'labels': labels, 'coords': coords,
+           'indices': indices}
+    parcels_tmp.close()
diff --git a/tests/test_clustering.py b/pynets/fmri/tests/test_clustering.py
old mode 100644
new mode 100755
similarity index 95%
rename from tests/test_clustering.py
rename to pynets/fmri/tests/test_clustering.py
index 603a1765..e0273da1
--- a/tests/test_clustering.py
+++ b/pynets/fmri/tests/test_clustering.py
@@ -22,7 +22,6 @@
 from nipype.utils.filemanip import fname_presuffix
 from nilearn.image import resample_to_img
 
-
 logger = logging.getLogger(__name__)
 logger.setLevel(50)
 
@@ -92,16 +91,17 @@ def test_make_local_connectivity_scorr(fmri_estimation_data):
 
 
 @pytest.mark.parametrize("clust_type", ['rena', 'average',
-                                        'complete', 'ward', 'ncut',
+                                        'complete', 'ward',
                                         pytest.param('single',
                                                      marks=pytest.mark.xfail)])
 # 1 connected component
-def test_ni_parcellate(fmri_estimation_data, random_mni_roi_data, clust_type):
+def test_ni_parcellate(fmri_estimation_data, random_mni_roi_data,
+                       clust_type):
     """
     Test for ni_parcellate
     """
 
-    k = 20
+    k = 10
     tmp = tempfile.TemporaryDirectory()
 
     tmpdir = str(tmp.name)
@@ -116,7 +116,8 @@ def test_ni_parcellate(fmri_estimation_data, random_mni_roi_data, clust_type):
     roi_file = random_mni_roi_data['roi_file']
 
     clust_mask_file = fname_presuffix(mask_file,
-                                suffix="clust_mask_file", use_ext=True)
+                                      suffix="clust_mask_file",
+                                      use_ext=True)
     resample_to_img(
         nib.load(roi_file), nib.load(mask_file), interpolation="nearest"
     ).to_filename(clust_mask_file)
@@ -125,7 +126,7 @@ def test_ni_parcellate(fmri_estimation_data, random_mni_roi_data, clust_type):
                        k=k, clust_type=clust_type, local_corr=local_corr,
                        outdir=tmpdir)
     atlas = nip.create_clean_mask()
-    nip.create_local_clustering(overwrite=True, r_thresh=0.4)
+    nip.create_local_clustering(overwrite=True, r_thresh=0.5)
     out_path = f"{tmpdir}/parc_tmp.nii.gz"
     parcellation = clustering.parcellate(func_img, local_corr,
                                          clust_type, nip._local_conn_mat_path,
@@ -157,7 +158,7 @@ def test_ni_parcellate_mult_conn_comps(fmri_estimation_data, clust_type):
     tmpdir = str(tmp.name)
     os.makedirs(tmpdir, exist_ok=True)
 
-    k = 150
+    k = 100
     if clust_type != 'ncut':
         local_corr = 'allcorr'
     else:
diff --git a/pynets/fmri/tests/test_estimation.py b/pynets/fmri/tests/test_estimation.py
new file mode 100755
index 00000000..7ebfc36d
--- /dev/null
+++ b/pynets/fmri/tests/test_estimation.py
@@ -0,0 +1,209 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Dec 27 16:19:14 2017
+
+@authors: Derek Pisner & Ryan Hammonds
+
+"""
+import pytest
+import numpy as np
+# import time
+import nibabel as nib
+import os
+import tempfile
+import pandas as pd
+import logging
+# from inspect import getargspec
+try:
+    import cPickle as pickle
+except ImportError:
+    import _pickle as pickle
+
+from pathlib import Path
+
+logger = logging.getLogger(__name__)
+logger.setLevel(50)
+from pynets.fmri.estimation import (get_conn_matrix, timeseries_bootstrap,
+                                    fill_confound_nans)
+from pynets.fmri.interfaces import TimeseriesExtraction
+from nilearn.tests.test_signal import generate_signals
+from nilearn._utils.extmath import is_spd
+from numpy.testing import assert_array_almost_equal
+
+# fMRI
+@pytest.mark.parametrize("conn_model_in",
+    [
+        # Standard models
+        'corr', 'partcorr', 'cov', 'sps',
+
+        # These models require skggm and will fail if not installed
+        pytest.param('QuicGraphicalLasso', marks=pytest.mark.xfail),
+        pytest.param('QuicGraphicalLassoCV', marks=pytest.mark.xfail),
+        pytest.param('QuicGraphicalLassoEBIC', marks=pytest.mark.xfail),
+        pytest.param('AdaptiveQuicGraphicalLasso', marks=pytest.mark.xfail),
+        pytest.param(None, marks=pytest.mark.xfail(raises=ValueError))
+    ]
+)
+@pytest.mark.parametrize("n_features",
+    [
+        50,
+        pytest.param(2, marks=pytest.mark.xfail)
+    ]
+)
+def test_get_conn_matrix(conn_model_in, n_features):
+    """ Test computing a functional connectivity matrix."""
+
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    subnet = 'Default'
+    ID = '002'
+    smooth = 2
+    coords = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]
+    node_radius = 8
+    signal = 'zscore'
+    roi = None
+    atlas = None
+    parcellation = None
+    labels = [1, 2, 3]
+
+    time_series = generate_signals(n_features=n_features, n_confounds=5,
+                                   length=n_features, same_variance=False)[0]
+
+    outs = get_conn_matrix(
+        time_series,
+        conn_model_in,
+        dir_path,
+        node_radius,
+        smooth,
+        False,
+        subnet,
+        ID,
+        roi,
+        False,
+        False,
+        True,
+        True,
+        atlas,
+        parcellation,
+        labels,
+        coords,
+        3,
+        False,
+        0,
+        signal,
+    )
+
+    conn_matrix_out, conn_model_out = outs[0], outs[1]
+
+    assert isinstance(conn_matrix_out, np.ndarray)
+    assert np.shape(conn_matrix_out) == np.shape(time_series)
+    assert conn_model_in == conn_model_out
+
+    if "corr" in conn_model_in:
+        assert (is_spd(conn_matrix_out, decimal=7))
+        d = np.sqrt(np.diag(np.diag(conn_matrix_out)))
+        assert_array_almost_equal(np.diag(conn_matrix_out),
+                                  np.ones(n_features))
+    elif "partcorr" in conn_model_in:
+        prec = np.linalg.inv(conn_matrix_out)
+        d = np.sqrt(np.diag(np.diag(prec)))
+        assert_array_almost_equal(d.dot(conn_matrix_out).dot(d), -prec +
+                                  2 * np.diag(np.diag(prec)))
+    tmp.cleanup()
+
+
+def test_timeseries_bootstrap():
+    """Test bootstrapping a sample of time series."""
+
+    tseries = np.random.rand(100, 10)
+    bseries = timeseries_bootstrap(tseries, 5)
+
+    assert np.shape(bseries[0]) == np.shape(tseries)
+    assert len(bseries[1]) == len(tseries)
+
+
+def test_fill_confound_nans():
+    """ Testing filling pd dataframe np.nan values with mean."""
+
+    confounds = np.ones((5, 5))
+    confounds[0][0] = np.nan
+    confounds = pd.DataFrame({'Column1': [np.nan, 2, 4]})
+    with tempfile.TemporaryDirectory() as dir_path:
+        conf_corr = fill_confound_nans(confounds, dir_path)
+        conf_corr = np.genfromtxt(conf_corr, delimiter='\t', skip_header=True)
+
+    assert not np.isnan(conf_corr).any()
+    assert conf_corr[0] == np.mean(conf_corr[1:])
+
+
+@pytest.mark.parametrize("conf",
+                         [True, pytest.param(False, marks=pytest.mark.xfail)])
+@pytest.mark.parametrize("hpass", [0, 0.028, 0.080])
+@pytest.mark.parametrize("mask", [True, False])
+@pytest.mark.parametrize("func",
+                         [True, pytest.param(False, marks=pytest.mark.xfail)])
+def test_timseries_extraction(fmri_estimation_data, parcellation_data, conf,
+                              hpass, mask, func):
+    """ Test preparing inputs method of the TimeseriesExtraction class."""
+
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    if func:
+        func_file = fmri_estimation_data['func_file']
+    else:
+        func_file = None
+
+    func_img = nib.load(func_file)
+
+    if mask:
+        mask = fmri_estimation_data['mask_file']
+    else:
+        mask = None
+
+    if conf:
+        conf = fmri_estimation_data['conf_file']
+    else:
+        conf = None
+
+    subnet = 'Default'
+    ID = '002'
+    smooth = 2
+    node_radius = 8
+    signal = 'median'
+    roi = None
+    net_parcels_map_nifti_file = \
+        parcellation_data['net_parcels_map_nifti_file']
+    te = TimeseriesExtraction(
+        net_parcels_nii_path=net_parcels_map_nifti_file,
+        node_radius=node_radius, conf=conf,
+        func_file=func_file, roi=roi,
+        dir_path=dir_path, ID=ID, subnet=subnet, smooth=smooth, hpass=hpass,
+        mask=mask, signal=signal)
+    te.prepare_inputs()
+    te.extract_ts_parc()
+
+    parcels = parcellation_data['parcels']
+    assert np.shape(te._func_img) == np.shape(func_img)
+    assert np.shape(te.ts_within_nodes) == \
+           (np.shape(func_img)[-1] - 5,
+            len(np.unique(parcels)) - 1)
+
+    if hpass and hpass > 0:
+        assert te.hpass == hpass
+        assert te._detrending is False
+    else:
+        assert te.hpass is None
+        assert te._detrending is True
+
+    if mask:
+        assert np.shape(te._mask_img) == np.shape(func_img)[:-1]
+        # Test save and clean up
+        te._mask_path = te._mask_img
+        te.save_and_cleanup()
+
+    tmp.cleanup()
diff --git a/tests/test_workflows_func.py b/pynets/fmri/tests/test_workflows_func.py
similarity index 77%
rename from tests/test_workflows_func.py
rename to pynets/fmri/tests/test_workflows_func.py
index d5e75af1..4aa5fe5d 100755
--- a/tests/test_workflows_func.py
+++ b/pynets/fmri/tests/test_workflows_func.py
@@ -11,6 +11,7 @@
 import pytest
 import logging
 import tempfile
+import pkg_resources
 import networkx as nx
 from pynets.core import workflows
 from multiprocessing import cpu_count
@@ -18,7 +19,8 @@
 logger = logging.getLogger(__name__)
 logger.setLevel(50)
 
-base_dir = str(Path(__file__).parent/"examples")
+base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
 
 # Test that each possible combination of inputs creates a workflow.
 @pytest.mark.parametrize("hpass", [0.08, None])
@@ -35,76 +37,76 @@
 @pytest.mark.parametrize("parc,node_radius,node_size_list,atlas,multi_atlas,"
                          "parcellation,user_atlas_list",
     [
-        # pytest.param(False, None, [4, 8], None, None, None, None,
-        #              marks=pytest.mark.xfail),
-        # pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, None,
-        #              None),
-        # pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010',
-        #                                          'coords_power_2011'], None,
-        #              None),
-        # pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None,
-        #              None),
-        # pytest.param(False, 4, None, None, ['coords_dosenbach_2010',
-        #                                     'coords_power_2011'], None, None),
-        # pytest.param(False, 4, None, None, None, None, None,
-        #              marks=pytest.mark.xfail),
+        pytest.param(False, None, [4, 8], None, None, None, None,
+                     marks=pytest.mark.xfail),
+        pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, None,
+                     None),
+        pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010',
+                                                 'coords_power_2011'], None,
+                     None),
+        pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None,
+                     None),
+        pytest.param(False, 4, None, None, ['coords_dosenbach_2010',
+                                            'coords_power_2011'], None, None),
+        pytest.param(False, 4, None, None, None, None, None,
+                     marks=pytest.mark.xfail),
         pytest.param(True, None, None, None, None, None, None),
-        # pytest.param(False, None, [4, 8], None, None,
-        #              f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #              f"bin.nii.gz",
-        #              None),
-        # pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None,
-        #              f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #              f"bin.nii.gz", None),
-        # pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010',
-        #                                          'coords_power_2011'],
-        #              f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #              f"bin.nii.gz", None),
-        # pytest.param(False, 4, None, 'coords_dosenbach_2010', None,
-        #              f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #              f"bin.nii.gz", None),
-        # pytest.param(False, 4, None, None,
-        #              ['coords_dosenbach_2010', 'coords_power_2011'],
-        #              f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #              f"bin.nii.gz", None),
-        # pytest.param(False, 4, None, None, None,
-        #              f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #              f"bin.nii.gz", None),
+        pytest.param(False, None, [4, 8], None, None,
+                     f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                     f"bin.nii.gz",
+                     None),
+        pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None,
+                     f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                     f"bin.nii.gz", None),
+        pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010',
+                                                 'coords_power_2011'],
+                     f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                     f"bin.nii.gz", None),
+        pytest.param(False, 4, None, 'coords_dosenbach_2010', None,
+                     f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                     f"bin.nii.gz", None),
+        pytest.param(False, 4, None, None,
+                     ['coords_dosenbach_2010', 'coords_power_2011'],
+                     f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                     f"bin.nii.gz", None),
+        pytest.param(False, 4, None, None, None,
+                     f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                     f"bin.nii.gz", None),
         pytest.param(True, None, None, None, None,
                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
                      f"bin.nii.gz", None),
-        # pytest.param(False, None, [4, 8], None, None, None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz"]),
-        # pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz"]),
-        # pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010',
-        #                                          'coords_power_2011'], None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz"]),
-        # pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz"]),
-        # pytest.param(False, 4, None, None, ['coords_dosenbach_2010',
-        #                                     'coords_power_2011'], None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz"]),
-        # pytest.param(False, 4, None, None, None, None,
-        #              [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz",
-        #               f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
-        #               f"bin.nii.gz"]),
+        pytest.param(False, None, [4, 8], None, None, None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz"]),
+        pytest.param(False, None, [4, 8], 'coords_dosenbach_2010', None, None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz"]),
+        pytest.param(False, None, [4, 8], None, ['coords_dosenbach_2010',
+                                                 'coords_power_2011'], None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz"]),
+        pytest.param(False, 4, None, 'coords_dosenbach_2010', None, None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz"]),
+        pytest.param(False, 4, None, None, ['coords_dosenbach_2010',
+                                            'coords_power_2011'], None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz"]),
+        pytest.param(False, 4, None, None, None, None,
+                     [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz",
+                      f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
+                      f"bin.nii.gz"]),
         pytest.param(True, None, None, None, None, None,
                      [f"{base_dir}/miscellaneous/triple_net_ICA_overlap_3_sig_"
                       f"bin.nii.gz",
@@ -112,25 +114,21 @@
                       f"bin.nii.gz"])
     ]
 )
-def test_func_all(fmri_estimation_data, random_mni_roi_data, hpass, smooth,
-                  parc, conn_model, parcellation,
+def test_func_all(hpass, smooth, parc, conn_model, parcellation,
                   user_atlas_list, atlas, multi_atlas, subnet, thr, max_thr,
                   min_thr, step_thr, multi_thr, thr_type, node_radius,
                   node_size_list, plot_switch):
     """
     Test functional connectometry
     """
-    dir_path = tempfile.TemporaryDirectory()
-    base_dir = str(dir_path.name)
-    if not os.path.isdir(base_dir):
-        os.makedirs(base_dir)
-
-    func_file = fmri_estimation_data['func_file']
-    mask = fmri_estimation_data['mask_file']
-    conf = fmri_estimation_data['conf_file']
-    anat_file = fmri_estimation_data['t1w_file']
 
-    roi = random_mni_roi_data['roi_file']
+    conf = f"{base_dir}/BIDS/sub-25659/ses-1/func/sub-25659_ses-1_task-rest_desc-confounds_regressors.tsv"
+    func_file = f"{base_dir}/BIDS/sub-25659/ses-1/func/sub-25659_ses-1_task-rest_space-T1w_desc-preproc_bold.nii.gz"
+    anat_file = f"{base_dir}/BIDS/sub-25659/ses-1/anat/sub-25659_desc-preproc_T1w.nii.gz"
+    roi = pkg_resources.resource_filename(
+        "pynets", "templates/rois/pDMN_3_bin.nii.gz")
+    mask = f"{base_dir}/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_" \
+           f"mask.nii.gz"
 
     ID = '25659_1'
     ref_txt = None
@@ -293,7 +291,7 @@ def test_func_all(fmri_estimation_data, random_mni_roi_data, hpass, smooth,
     assert nx.is_directed_acyclic_graph(fmri_connectometry_wf._graph) is True
     # plugin_args = {'n_procs': int(procmem[0]), 'memory_gb': int(procmem[1]), 'scheduler': 'mem_thread'}
     # out = fmri_connectometry_wf.run(plugin=plugin_type, plugin_args=plugin_args)
-    dir_path.cleanup()
+
 
 @pytest.mark.parametrize("k,k_list,k_clustering,clust_mask,clust_mask_list,clust_type,clust_type_list",
     [
@@ -338,21 +336,20 @@ def test_func_all(fmri_estimation_data, random_mni_roi_data, hpass, smooth,
     ]
 )
 @pytest.mark.parametrize("plot_switch", [True, False])
-def test_func_clust(fmri_estimation_data, parc, parcellation, user_atlas_list, k, k_list, k_clustering, clust_mask, clust_mask_list,
-                    clust_type, clust_type_list, plot_switch, roi, mask, subnet, node_radius, node_size_list, atlas,
+def test_func_clust(parc, parcellation,
+                    user_atlas_list, k, k_list, k_clustering, clust_mask,
+                    clust_mask_list, clust_type, clust_type_list, plot_switch,
+                    roi, mask, subnet, node_radius, node_size_list, atlas,
                     multi_atlas):
     """
     Test functional connectometry with clustering
     """
-    dir_path = tempfile.TemporaryDirectory()
-    base_dir = str(dir_path.name)
-    if not os.path.isdir(base_dir):
-        os.makedirs(base_dir)
 
-    func_file = fmri_estimation_data['func_file']
-    mask = fmri_estimation_data['mask_file']
-    conf = fmri_estimation_data['conf_file']
-    anat_file = fmri_estimation_data['t1w_file']
+    conf = f"{base_dir}/BIDS/sub-25659/ses-1/func/sub-25659_ses-1_task-rest_desc-confounds_regressors.tsv"
+    func_file = f"{base_dir}/BIDS/sub-25659/ses-1/func/sub-25659_ses-1_task-rest_space-T1w_desc-preproc_bold.nii.gz"
+    anat_file = f"{base_dir}/BIDS/sub-25659/ses-1/anat/sub-25659_desc-preproc_T1w.nii.gz"
+    mask = f"{base_dir}/BIDS/sub-25659/ses-1/anat/sub-25659_desc-brain_" \
+           f"mask.nii.gz"
 
     ID = '25659_1'
     parc = parc
@@ -502,5 +499,3 @@ def test_func_clust(fmri_estimation_data, parc, parcellation, user_atlas_list, k
     assert nx.is_directed_acyclic_graph(fmri_connectometry_wf._graph) is True
     # plugin_args = {'n_procs': int(procmem[0]), 'memory_gb': int(procmem[1]), 'scheduler': 'mem_thread'}
     # out = fmri_connectometry_wf.run(plugin=plugin_type, plugin_args=plugin_args)
-
-    dir_path.cleanup()
diff --git a/pynets/plotting/tests/__init__.py b/pynets/plotting/tests/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/pynets/plotting/tests/conftest.py b/pynets/plotting/tests/conftest.py
new file mode 100755
index 00000000..d9b83268
--- /dev/null
+++ b/pynets/plotting/tests/conftest.py
@@ -0,0 +1,120 @@
+"""Configuration file for pytest for pynets."""
+import os
+import sys
+import pytest
+import tempfile
+import pkg_resources
+import matplotlib
+matplotlib.use('agg', force=True)
+import matplotlib.pyplot as plt
+plt.ioff()
+plt.rcParams['figure.dpi'] = 100
+import numpy as np
+import nibabel as nib
+if sys.platform.startswith('win') is False:
+    import indexed_gzip
+from nilearn.input_data import NiftiLabelsMasker
+from nilearn.connectome import ConnectivityMeasure
+from pynets.core.nodemaker import get_names_and_coords_of_parcels
+from graspologic.simulations.simulations import er_nm, sbm
+from graspologic.utils import symmetrize, remove_loops, \
+    largest_connected_component
+from nilearn._utils import data_gen
+
+
+@pytest.fixture(scope='package')
+def random_mni_roi_data():
+    roi_img = data_gen.generate_mni_space_img(res=2)[1]
+    roi_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
+    roi_file = str(roi_file_tmp.name)
+    roi_img.to_filename(roi_file)
+
+    yield {'roi_file': roi_file}
+    roi_file_tmp.close()
+
+
+@pytest.fixture(scope='session')
+def close_all():
+    """Close all matplotlib plots, regardless of test status."""
+    # This adds < 1 µS in local testing, and we have ~2500 tests, so ~2 ms max
+    import matplotlib.pyplot as plt
+    yield plt.close('all')
+
+
+@pytest.fixture(scope='package')
+def gen_mat_data():
+    def _gen_mat_data(n: int=20, m: int=20, p: int=0.50,
+                      mat_type: str='sb', binary: bool=False,
+                      asfile: bool=True, n_graphs: int=1):
+        if binary is True:
+            wt = 1
+        else:
+            wt = np.random.uniform
+
+        mat_list = []
+        mat_file_list = []
+        for nm in range(n_graphs):
+            if mat_type == 'er':
+                mat = largest_connected_component(symmetrize(
+                    remove_loops(er_nm(n, m, wt=np.random.uniform,
+                                       wtargs=dict(low=0, high=1)))))
+            elif mat_type == 'sb':
+                if p is None:
+                    raise ValueError(
+                        f"for mat_type {mat_type}, p cannot be None")
+                mat = largest_connected_component(symmetrize(
+                    remove_loops(sbm(np.array([n]), np.array([[p]]),
+                                     wt=wt, wtargs=dict(low=0,
+                                                        high=1)))))
+            else:
+                raise ValueError(f"mat_type {mat_type} not recognized!")
+
+            mat_list.append(mat)
+
+            if asfile is True:
+                mat_path_tmp = tempfile.NamedTemporaryFile(mode='w+',
+                                                           suffix='.npy',
+                                                           delete=False)
+                mat_path = str(mat_path_tmp.name)
+                np.save(mat_path, mat)
+                mat_file_list.append(mat_path)
+                mat_path_tmp.close()
+
+        return {'mat_list': mat_list, 'mat_file_list': mat_file_list}
+
+    return _gen_mat_data
+
+
+@pytest.fixture(scope='package')
+def connectivity_data():
+    """Fixture for connectivity tests."""
+
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
+    func_file = f"{base_dir}/BIDS/sub-25659/ses-1/func/" \
+                f"sub-25659_ses-1_task-rest_space-T1w_desc-preproc_bold.nii.gz"
+    mask_file = f"{base_dir}/BIDS/sub-25659/ses-1/func/" \
+                f"sub-25659_ses-1_task-rest_space-T1w_desc-preproc_" \
+                f"bold_mask.nii.gz"
+
+    parcellation = pkg_resources.resource_filename(
+        "pynets", "templates/atlases/DesikanKlein2012.nii.gz"
+    )
+
+    masker = NiftiLabelsMasker(
+        labels_img=nib.load(parcellation), background_label=0,
+        resampling_target="labels", dtype="auto",
+        mask_img=nib.load(mask_file), standardize=True)
+
+    time_series = masker.fit_transform(func_file)
+    conn_measure = ConnectivityMeasure(
+        kind="correlation")
+    conn_matrix = conn_measure.fit_transform([time_series])[0]
+    [coords, _, _, label_intensities] = \
+        get_names_and_coords_of_parcels(parcellation)
+
+    labels = ['ROI_' + str(idx) for idx, val in enumerate(label_intensities)]
+
+    yield {'time_series': time_series, 'conn_matrix': conn_matrix,
+           'labels': labels, 'coords': coords, 'indices': label_intensities}
+
diff --git a/pynets/plotting/tests/test_adjacency.py b/pynets/plotting/tests/test_adjacency.py
new file mode 100755
index 00000000..d0b0d5e4
--- /dev/null
+++ b/pynets/plotting/tests/test_adjacency.py
@@ -0,0 +1,89 @@
+﻿#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Dec 27 16:19:14 2017
+"""
+import pytest
+import matplotlib
+matplotlib.use('agg', force=True)
+import matplotlib.pyplot as plt
+plt.ioff()
+plt.rcParams['figure.dpi'] = 100
+import os
+import numpy as np
+import time
+try:
+    import cPickle as pickle
+except ImportError:
+    import _pickle as pickle
+from pathlib import Path
+from pynets.plotting import adjacency
+import tempfile
+import logging
+
+logger = logging.getLogger(__name__)
+logger.setLevel(50)
+
+
+def test_plot_conn_mat_nonet_no_mask(connectivity_data):
+    """
+    Test plot_conn_mat_nonet_no_mask functionality
+    """
+
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    subnet = None
+    ID = '002'
+    thr = 0.95
+    node_size = 2
+    smooth = 2
+    hpass = 0.1
+    signal = 'mean'
+    conn_model = 'sps'
+    atlas = 'random_parcellation'
+    roi = None
+
+    conn_matrix = connectivity_data['conn_matrix']
+    labels = connectivity_data['labels']
+
+    start_time = time.time()
+    adjacency.plot_conn_mat_func(conn_matrix, conn_model, atlas, dir_path,
+                                 ID, subnet, labels, roi, thr, node_size,
+                                 smooth, hpass, signal)
+    print("%s%s%s" % ('plot_conn_mat_func --> finished: ',
+    str(np.round(time.time() - start_time, 1)), 's'))
+    tmp.cleanup()
+
+
+def test_plot_conn_mat_nonet_mask(connectivity_data):
+    """
+    Test plot_conn_mat_nonet_mask functionality
+    """
+
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    subnet = None
+    ID = '002'
+    thr = 0.95
+    node_size = 2
+    smooth = 2
+    hpass = 0.1
+    conn_model = 'sps'
+    signal = 'mean'
+    atlas = 'random_parcellation'
+    roi = None
+
+    conn_matrix = connectivity_data['conn_matrix']
+    labels = connectivity_data['labels']
+
+    start_time = time.time()
+    adjacency.plot_conn_mat_func(conn_matrix, conn_model, atlas, dir_path,
+                                 ID, subnet, labels, roi, thr, node_size,
+                                 smooth, hpass, signal)
+    print("%s%s%s" % ('plot_conn_mat_func (Masking version) --> finished: ',
+    str(np.round(time.time() - start_time, 1)), 's'))
+    tmp.cleanup()
diff --git a/pynets/plotting/tests/test_brain.py b/pynets/plotting/tests/test_brain.py
new file mode 100755
index 00000000..0d33acdd
--- /dev/null
+++ b/pynets/plotting/tests/test_brain.py
@@ -0,0 +1,245 @@
+﻿#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Dec 27 16:19:14 2017
+"""
+import pytest
+import matplotlib
+matplotlib.use('agg', force=True)
+import matplotlib.pyplot as plt
+plt.ioff()
+plt.rcParams['figure.dpi'] = 100
+import os
+import numpy as np
+import time
+try:
+    import cPickle as pickle
+except ImportError:
+    import _pickle as pickle
+from pathlib import Path
+import pytest
+import pkg_resources
+from pynets.plotting import brain, adjacency
+import tempfile
+import logging
+import networkx as nx
+
+logger = logging.getLogger(__name__)
+logger.setLevel(50)
+
+
+def test_plot_all_nonet_no_mask(random_mni_roi_data, connectivity_data):
+    """
+    Test plot_all_nonet_no_mask functionality
+    """
+    dir_path = str(tempfile.TemporaryDirectory().name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    subnet = None
+    ID = '002'
+    thr = 0.95
+    node_size = 2
+    smooth = 2
+    conn_model = 'sps'
+    parlistfile = None
+    atlas = 'random_parcellation'
+    roi = random_mni_roi_data['roi_file']
+    prune = 1
+    norm = 1
+    hpass = 0.1
+    binary = False
+    signal = 'mean'
+    edge_threshold = '99%'
+
+    conn_matrix = connectivity_data['conn_matrix']
+    labels = connectivity_data['labels']
+    coords = connectivity_data['coords']
+
+    start_time = time.time()
+    brain.plot_all_func(conn_matrix, conn_model, atlas, dir_path, ID, subnet,
+                        labels, roi, coords, thr, node_size, edge_threshold,
+                        smooth, prune, parlistfile, norm, binary, hpass,
+                        signal)
+    print("%s%s%s" % ('plot_all --> finished: ',
+                      str(np.round(time.time() - start_time, 1)), 's'))
+
+
+def test_plot_all_nonet_with_mask(connectivity_data):
+    """
+    Test plot_all_nonet_with_mask functionality
+    """
+
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    subnet = None
+    ID = '002'
+    thr = 0.95
+    node_size = 3
+    smooth = 2
+    prune = 3
+    norm = 3
+    hpass = 0.1
+    binary = False
+    conn_model = 'corr'
+    atlas = 'random_parcellation'
+    parlistfile = None
+    roi = None
+    signal = 'mean'
+    edge_threshold = '99%'
+
+    conn_matrix = connectivity_data['conn_matrix']
+    labels = connectivity_data['labels']
+    coords = connectivity_data['coords']
+
+    # Force an isolate in the matrix
+    conn_matrix[:, 0] = 0
+    conn_matrix[0, :] = 0
+
+    # Adds coverage
+    coords = np.array(coords)
+    labels = np.array(labels)
+
+    start_time = time.time()
+    brain.plot_all_func(conn_matrix, conn_model, atlas, dir_path, ID, subnet,
+                        labels, roi, coords, thr, node_size, edge_threshold,
+                        smooth, prune, parlistfile, norm, binary, hpass,
+                        signal, edge_color_override=True)
+    print("%s%s%s" % ('plot_all (Masking version) --> finished: ',
+                      str(np.round(time.time() - start_time, 1)), 's'))
+    tmp.cleanup()
+
+
+@pytest.mark.parametrize("subnet", ["Default", None])
+def test_plot_timeseries(connectivity_data, subnet):
+    """
+    Test plot_timeseries functionality
+    """
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    ID = '002'
+    atlas = 'random_parcellation'
+    time_series = connectivity_data['time_series']
+    labels = connectivity_data['labels']
+
+    start_time = time.time()
+    brain.plot_timeseries(time_series, subnet, ID, dir_path, atlas, labels)
+    print("%s%s%s" % ('plot_timeseries --> finished: ',
+                      str(np.round(time.time() - start_time, 1)), 's'))
+    tmp.cleanup()
+
+
+@pytest.mark.parametrize("plot_overlaps", [True, False])
+def test_plot_network_clusters(connectivity_data, plot_overlaps):
+    """ Test plotting subnet clusters"""
+
+    from pynets.statistics.individual.algorithms import \
+        community_resolution_selection
+
+    temp_file = tempfile.NamedTemporaryFile(mode='w+', prefix='figure',
+                                            suffix='.png')
+    fname = str(temp_file.name)
+
+    conn_matrix = connectivity_data['conn_matrix']
+
+    G = nx.from_numpy_matrix(np.abs(conn_matrix))
+    _, communities, _, _ = community_resolution_selection(G)
+    plot_labels = True
+
+    brain.plot_network_clusters(G, communities, fname,
+                                plot_overlaps=plot_overlaps,
+                                plot_labels=plot_labels)
+
+    assert os.path.isfile(fname)
+
+    temp_file.close()
+
+
+@pytest.mark.parametrize("prune, node_cmap",
+    [
+        pytest.param(3, 0),
+        pytest.param(False, "Set2")
+    ]
+)
+def test_create_gb_palette(connectivity_data, prune, node_cmap):
+    """Test palette creation."""
+
+    conn_matrix = connectivity_data['conn_matrix']
+    labels = connectivity_data['labels']
+    coords = connectivity_data['coords']
+
+    # Force an isolate in the matrix
+    conn_matrix[:, 0] = 0
+    conn_matrix[0, :] = 0
+
+    color_theme = 'binary'
+
+    palette = brain.create_gb_palette(conn_matrix, color_theme, coords, labels,
+                                      prune=prune, node_cmap=node_cmap)
+    for param in palette:
+        assert param is not None
+
+
+def test_plot_conn_mat_rois_gt_100(connectivity_data):
+    """
+    Test plot_conn_mat_rois_gt_100 functionality
+    """
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    conn_matrix = connectivity_data['conn_matrix']
+    labels = connectivity_data['labels']
+
+    start_time = time.time()
+    adjacency.plot_conn_mat(conn_matrix, labels, dir_path, cmap='Blues')
+    print("%s%s%s" % ('plot_timeseries --> finished: ',
+                      str(np.round(time.time() - start_time, 1)), 's'))
+    tmp.cleanup()
+
+
+@pytest.mark.parametrize("roi", [True, False])
+def test_plot_all_struct(connectivity_data, gen_mat_data, roi):
+    """Test structural plotting."""
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    labels = connectivity_data['labels']
+    coords = connectivity_data['coords']
+    conn_matrix = gen_mat_data(m=len(labels), n=len(labels),
+                               asfile=False, mat_type='sb')['mat_list'][0]
+
+    # Adds coverage
+    coords = np.array(coords)
+    labels = np.array(labels)
+
+    conn_model = 'corr'
+    atlas = 'random_parcellation'
+    ID = '002'
+    subnet = None
+    if roi:
+        roi = pkg_resources.resource_filename(
+        "pynets", "templates/rois/pDMN_3_bin.nii.gz")
+    else:
+        roi = None
+    thr = 0.95
+    node_size = None
+    edge_threshold = '99%'
+    prune = 3
+    parcellation = None
+    norm = 3
+    binary = False
+    traversal = 'prob'
+    track_type = 'particle'
+    min_length = 10
+    error_margin = 2
+
+    brain.plot_all_struct(conn_matrix, conn_model, atlas, dir_path, ID,
+                          subnet, labels, roi, coords, thr, node_size,
+                          edge_threshold, prune, parcellation, norm, binary,
+                          track_type, traversal, min_length, error_margin)
+    tmp.cleanup()
diff --git a/pynets/registration/tests/__init__.py b/pynets/registration/tests/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/tests/test_reg_utils.py b/pynets/registration/tests/test_utils.py
old mode 100644
new mode 100755
similarity index 89%
rename from tests/test_reg_utils.py
rename to pynets/registration/tests/test_utils.py
index fc7755e0..d8cf4f6a
--- a/tests/test_reg_utils.py
+++ b/pynets/registration/tests/test_utils.py
@@ -5,6 +5,7 @@
 import pytest
 import numpy as np
 from pynets.registration import utils
+import pkg_resources
 import os
 import nibabel as nib
 import indexed_gzip
@@ -28,7 +29,8 @@ def test_align():
     import pkg_resources
 
     # Linear registration
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     anat_dir = f"{base_dir}/003/anat"
     inp = f"{anat_dir}/sub-003_T1w_brain.nii.gz"
     ref = pkg_resources.resource_filename("pynets",
@@ -51,7 +53,8 @@ def test_applyxfm():
     """
     import pkg_resources
 
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     anat_dir = f"{base_dir}/003/anat"
 
     ## First test: Apply xfm from test_align to orig anat img.
@@ -92,9 +95,10 @@ def test_align_nonlinear():
     import pkg_resources
 
     # Nonlinear normalization
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     anat_dir = f"{base_dir}/003/anat"
-    inp = f"{anat_dir}/sub-003_T1w.nii.gz"
+    inp = f"{anat_dir}/sub-003_T1w_brain.nii.gz"
     ref = pkg_resources.resource_filename("pynets",
                                           f"templates/"
                                           f"MNI152_T1_brain_2mm.nii.gz")
@@ -115,7 +119,8 @@ def test_combine_xfms():
     Test combine_xfms functionality
     """
     # Combine func2anat and anat2std to create func2std mat
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     anat_dir = f"{base_dir}/003/anat"
     xfm1 = f"{anat_dir}/example_func2highres.mat"
     xfm2 = f"{anat_dir}/highres2standard.mat"
@@ -127,7 +132,8 @@ def test_combine_xfms():
 
 
 def test_invwarp():
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     anat_dir = f"{base_dir}/003/anat"
     ref = f"{anat_dir}/sub-003_T1w.nii.gz"
     warp = f"{anat_dir}/highres2standard_warp"
@@ -141,7 +147,8 @@ def test_apply_warp():
     import pkg_resources
     # Warp original anat to standard space using warp img (had to
     # invwarp first) and linear mats
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     anat_dir = f"{base_dir}/003/anat"
     ref = pkg_resources.resource_filename("pynets",
                                           f"templates/MNI152_T1_brain_"
@@ -169,11 +176,12 @@ def test_segment_t1w():
     """
     Test segment_t1w functionality
     """
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     anat_dir = f"{base_dir}/003/anat"
-    t1w = f"{anat_dir}/sub-003_T1w.nii.gz"
+    t1w = f"{anat_dir}/sub-003_T1w_brain.nii.gz"
     basename = f"test_segment_t1w"
-    out = utils.segment_t1w(t1w, basename)
+    out = utils.segment_t1w(t1w, basename, max_iter=10)
     print(out)
     assert out is not None
 
@@ -182,7 +190,8 @@ def test_match_target_vox_res():
     """
     Test match_target_vox_res functionality
     """
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     test_out = f"{base_dir}/003/test_out/test_match_target_vox_res"
 
     # Orig anat input has isotropic (1x1x1mm) dimensions.
@@ -224,7 +233,8 @@ def test_reorient_dwi():
     """
     Test reorient_dwi functionality
     """
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     test_dir = f"{base_dir}/003/test_out/test_reorient_dwi"
 
     # iso_eddy_corrected_data_denoised_LAS.nii.gz was the original image in
@@ -257,7 +267,8 @@ def test_reorient_img():
     """
     Test reorient_img functionality
     """
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     test_dir = f"{base_dir}/003/test_out/test_reorient_img"
 
     # X axis increasing right to left (Radiological)
@@ -300,7 +311,8 @@ def test_orient_reslice():
     """
     # This test has a bak folder in its test_dir.
     # To replicate test rm data in test_dir and cp from bak
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     test_dir = f"{base_dir}/003/test_out/test_check_orient_and_dims"
 
     # Antomical: 1x1x1mm
@@ -376,16 +388,19 @@ def test_orient_reslice():
 
 
 def test_make_median_b0():
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     dwi_file = f"{base_dir}/BIDS/sub-25659/ses-1/dwi/final_preprocessed_" \
                f"dwi.nii.gz"
     mean_file_out = utils.median(dwi_file)
 
     assert os.path.isfile(mean_file_out)
 
+
 @pytest.mark.parametrize("mask_type", ['Normal', 'Empty'])
 def test_gen_mask(mask_type):
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     t1w_head = f"{base_dir}/003/anat/sub-003_T1w.nii.gz"
     t1w_brain = f"{base_dir}/003/anat/t1w_brain.nii.gz"
     if mask_type == 'Normal':
@@ -394,8 +409,10 @@ def test_gen_mask(mask_type):
         mask = None
     utils.gen_mask(t1w_head, t1w_brain, mask)
 
+
 def test_deep_skull_strip():
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     t1w_head = f"{base_dir}/003/anat/sub-003_T1w.nii.gz"
     img = nib.load(t1w_head)
     t1w_brain_mask = f"{base_dir}/003/anat/t1w_brain_mask.nii.gz"
@@ -406,7 +423,8 @@ def test_deep_skull_strip():
 
 
 def test_rescale_affine_to_center():
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
 
     input_affine = nib.load(f"{base_dir}/003/anat/sub-003_T1w.nii.gz").affine
 
@@ -421,7 +439,8 @@ def test_rescale_affine_to_center():
 def test_wm_syn():
     from dipy.align import imwarp, imaffine
 
-    base_dir = str(Path(__file__).parent/"examples")
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
     t1w_brain = f"{base_dir}/003/anat/t1w_brain.nii.gz"
     ap_path = f"{base_dir}/003/anat/aniso_power_tmp.nii.gz"
 
diff --git a/pynets/statistics/tests/__init__.py b/pynets/statistics/tests/__init__.py
new file mode 100755
index 00000000..e69de29b
diff --git a/pynets/statistics/tests/conftest.py b/pynets/statistics/tests/conftest.py
new file mode 100755
index 00000000..e130e245
--- /dev/null
+++ b/pynets/statistics/tests/conftest.py
@@ -0,0 +1,85 @@
+"""Configuration file for pytest for pynets."""
+import os
+from pathlib import Path
+import sys
+import pytest
+import tempfile
+import random
+import shutil
+import numpy as np
+if sys.platform.startswith('win') is False:
+    import indexed_gzip
+from graspologic.simulations.simulations import er_nm, sbm
+from graspologic.utils import symmetrize, remove_loops, \
+    largest_connected_component
+from pynets.core.thresholding import autofix
+
+
+@pytest.fixture(scope='package')
+def gen_mat_data():
+    def _gen_mat_data(n: int=20, m: int=20, p: int=0.50,
+                      mat_type: str='sb', binary: bool=False,
+                      asfile: bool=True, n_graphs: int=1,
+                      lcc: bool=False, modality: str='func'):
+        if binary is True:
+            wt = 1
+        else:
+            wt = np.random.uniform
+
+        mat_list = []
+        mat_file_list = []
+
+        if n_graphs > 0:
+            for nm in range(n_graphs):
+                if mat_type == 'er':
+                    mat = symmetrize(
+                        remove_loops(er_nm(n, m, wt=np.random.uniform,
+                                           wtargs=dict(low=0, high=1))))
+                elif mat_type == 'sb':
+                    if p is None:
+                        raise ValueError(
+                            f"for mat_type {mat_type}, p cannot be None")
+                    mat = symmetrize(
+                        remove_loops(sbm(np.array([n]), np.array([[p]]),
+                                         wt=wt, wtargs=dict(low=0,
+                                                            high=1))))
+                else:
+                    raise ValueError(f"mat_type {mat_type} not recognized!")
+
+                if lcc is True:
+                    mat = largest_connected_component(mat)
+
+                mat_list.append(autofix(mat))
+
+                if asfile is True:
+                    path_tmp = tempfile.NamedTemporaryFile(mode='w+',
+                                                           suffix='.npy',
+                                                           delete=False)
+                    mat_path_tmp = str(path_tmp.name)
+                    out_folder = f"{str(Path.home())}/test_mats"
+                    os.makedirs(out_folder, exist_ok=True)
+
+                    if modality == 'func':
+                        mat_path = f"{out_folder}/graph_sub-999_modality-func_" \
+                        f"model-corr_template-" \
+                        f"MNI152_2mm_" \
+                        f"parc_tol-6fwhm_hpass-" \
+                        f"0Hz_" \
+                        f"signal-mean_thrtype-prop_thr-" \
+                        f"{round(random.uniform(0, 1),2)}.npy"
+                    elif modality == 'dwi':
+                        mat_path = f"{out_folder}/graph_sub-999_modality-func_" \
+                        f"model-csa_template-" \
+                        f"MNI152_2mm_tracktype-local_" \
+                        f"traversal-det_minlength-30_" \
+                        f"tol-5_thrtype-prop_thr-" \
+                        f"{round(random.uniform(0, 1),2)}.npy"
+
+                    shutil.copyfile(mat_path_tmp, mat_path)
+                    np.save(mat_path, mat)
+                    mat_file_list.append(mat_path)
+                    path_tmp.close()
+
+        return {'mat_list': mat_list, 'mat_file_list': mat_file_list}
+
+    return _gen_mat_data
diff --git a/tests/test_netstats.py b/pynets/statistics/tests/test_algorithms.py
old mode 100644
new mode 100755
similarity index 69%
rename from tests/test_netstats.py
rename to pynets/statistics/tests/test_algorithms.py
index 2cfd3cc9..1763959c
--- a/tests/test_netstats.py
+++ b/pynets/statistics/tests/test_algorithms.py
@@ -98,6 +98,7 @@ def test_average_shortest_path_length_for_all(gen_mat_data):
     assert avgest_path_len > 0
     assert type(avgest_path_len) == float
 
+
 @pytest.mark.parametrize("weight", ["weight", "not_weight"])
 def test_average_shortest_path_length_fast(gen_mat_data, weight):
     """
@@ -115,6 +116,7 @@ def test_average_shortest_path_length_fast(gen_mat_data, weight):
     assert avgest_path_len > 0
     assert type(avgest_path_len) == np.float64
 
+
 @pytest.mark.parametrize("engine", ["GT", "NX"])
 def test_average_local_efficiency(gen_mat_data, engine):
     """
@@ -230,34 +232,17 @@ def test_link_communities(gen_mat_data, clustering):
     assert np.sum(M) == 20
 
 
-@pytest.mark.parametrize("connected_case", [True, False])
-@pytest.mark.parametrize("fallback_lcc", [True, False])
-def test_prune_disconnected(gen_mat_data, connected_case, fallback_lcc):
-    """
-    Test pruning functionality
-    """
+# @pytest.mark.parametrize("min_nodes",
+#                          [0, 1, 10, pytest.param(30, marks=pytest.mark.xfail(
+#                                  raises=ValueError))])
+# def test_prune_small_components(gen_mat_data, min_nodes):
+#     """
+#     Test pruning functionality
+#     """
+#     return
 
-    if connected_case is True:
-        in_mat = gen_mat_data(asfile=False)['mat_list'][0]
-        G = nx.from_numpy_array(in_mat)
-    elif connected_case is False:
-        G = nx.Graph()
-        G.add_edge(1, 2)
-        G.add_node(3)
-    start_time = time.time()
-    [G_out, pruned_nodes] = algorithms.prune_disconnected(
-        G, fallback_lcc=fallback_lcc)
-    print("%s%s%s" % ('Pruning disconnected test --> finished: ',
-                      str(np.round(time.time() - start_time, 1)), 's'))
-    assert type(G_out) is nx.Graph
-    assert type(pruned_nodes) is list
-    if connected_case is True:
-        assert len(pruned_nodes) == 0
-    elif connected_case is False:
-        assert len(pruned_nodes) > 0
-        assert len(list(G_out.nodes())) < len(list(G.nodes()))
-
-@pytest.mark.parametrize("method", ["betweenness", "richclub", "coreness",
+
+@pytest.mark.parametrize("method", ["betweenness", "coreness",
                                     "eigenvector"])
 @pytest.mark.parametrize("engine", ["GT", "NX"])
 def test_most_important(gen_mat_data, method, engine):
@@ -278,53 +263,6 @@ def test_most_important(gen_mat_data, method, engine):
     assert pruned_nodes is not None
 
 
-@pytest.mark.parametrize("binary", ['True', 'False'])
-@pytest.mark.parametrize("prune", ['0', '1', '2'])
-@pytest.mark.parametrize("norm", ['0', '1', '2', '3', '4', '5', '6'])
-@pytest.mark.parametrize("conn_model", ['corr', 'cov', 'sps', 'partcorr'])
-def test_extractnetstats(binary, prune, norm, conn_model):
-    """
-    Test extractnetstats functionality
-    """
-    base_dir = str(Path(__file__).parent / "examples")
-    ID = '002'
-    subnet = 'Default'
-    thr = 0.95
-    # conn_model = 'cov'
-    est_path = f"{base_dir}/miscellaneous/sub-0021001_rsn-Default_nodetype-" \
-               f"parc_model-sps_template-MNI152_T1_thrtype-DENS_thr-0.19.npy"
-    # prune = 1
-    # norm = 1
-    # binary = False
-    roi = None
-
-    start_time = time.time()
-    out_path = algorithms.extractnetstats(ID, subnet, thr, conn_model,
-                                          est_path, roi, prune, norm, binary)
-    print("%s%s%s" % (
-    'thresh_and_fit (Functional, proportional thresholding) --> finished: ',
-    str(np.round(time.time() - start_time, 1)), 's'))
-    assert out_path is not None
-
-    # Cover exceptions. This can definiely be improved. It increases coverage,
-    # but not as throughly
-    # as I hoped.
-    from tempfile import NamedTemporaryFile
-    f_temp = NamedTemporaryFile(mode='w+', suffix='.npy')
-
-    nan_array = np.empty((5, 5))
-    nan_array[:] = np.nan
-
-    np.save(f_temp.name, nan_array)
-    est_path = f_temp.name
-
-    try:
-        out_path = algorithms.extractnetstats(ID, subnet, thr, conn_model,
-                                              est_path, roi, prune,
-                                              norm, binary)
-    except PermissionError:
-        pass
-
 @pytest.mark.parametrize("engine", ["GT", "NX"])
 def test_raw_mets(gen_mat_data, engine):
     """
@@ -339,7 +277,7 @@ def test_raw_mets(gen_mat_data, engine):
 
     in_mat = gen_mat_data(asfile=False)['mat_list'][0]
     G = nx.from_numpy_array(in_mat)
-    [G, _] = algorithms.prune_disconnected(G)
+
     metric_list_glob = [global_efficiency, average_local_efficiency,
                         degree_assortativity_coefficient,
                         average_clustering, average_shortest_path_length,
@@ -436,57 +374,6 @@ def test_weighted_transitivity(gen_mat_data, binarize):
     assert transitivity <= 3 and transitivity >= 0
 
 
-@pytest.mark.parametrize("conn_model",
-                         ['corr', 'partcorr', 'cov', 'sps'])
-@pytest.mark.parametrize("prune",
-                         [pytest.param(0,
-                                       marks=pytest.mark.xfail(
-                                           raises=UnboundLocalError)), 1, 2,
-                          3])
-@pytest.mark.parametrize("norm", [i for i in range(1, 7)])
-def test_clean_graphs(gen_mat_data, conn_model, prune, norm):
-    # test_CleanGraphs
-    """
-    Test all combination of parameters for the CleanGraphs class
-    """
-
-    in_mat = gen_mat_data()['mat_list'][0]
-    est_path = gen_mat_data()['mat_file_list'][0]
-
-    clean = algorithms.CleanGraphs(0.5, conn_model, est_path, prune, norm)
-    clean.normalize_graph()
-    clean.print_summary()
-    clean.create_length_matrix()
-    clean.binarize_graph()
-
-    clean.prune_graph()
-
-    G = nx.from_numpy_array(in_mat)
-    assert len(clean.G) >= 0
-    assert len(clean.G) <= len(G)
-
-
-def test_save_netmets():
-    """ Test save netmets functionality using dummy metrics
-    """
-    import tempfile
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    est_path = tempfile.NamedTemporaryFile(mode='w+', suffix='.npy',
-                                           delete=False)
-
-    metric_list_names = ['metric_a', 'metric_b', 'metric_c']
-    net_met_val_list_final = [1, 2, 3]
-
-    algorithms.save_netmets(dir_path, str(est_path.name), metric_list_names,
-                            net_met_val_list_final)
-    tmp.cleanup()
-    est_path.close()
-
-
 @pytest.mark.parametrize("true_metric", [True, False])
 def test_iterate_nx_global_measures(gen_mat_data, true_metric):
     """ Test iterating over net metric list
@@ -519,16 +406,21 @@ def test_community_resolution_selection(sim_num_comms, sim_size):
     assert num_comms == sim_num_comms
     assert resolution is not None
 
+
 @pytest.mark.parametrize("metric", ['participation', 'diversity',
                                     'local_efficiency',
-                                    'comm_centrality', 'rich_club_coeff'])
+                                    'comm_centrality'])
 @pytest.mark.parametrize("engine", ["GT", "NX"])
 def test_get_metrics(gen_mat_data, metric, engine):
     """
     Test various wrappers for getting nx graph metrics
     """
 
-    in_mat = gen_mat_data(asfile=False, mat_type='sb')['mat_list'][0]
+    binary = False
+
+    in_mat = gen_mat_data(asfile=False, mat_type='sb',
+                          binary=binary)['mat_list'][0]
+
     G = nx.from_numpy_array(in_mat)
     ci = np.ones(in_mat.shape[0])
     metric_list_names = []
@@ -566,50 +458,11 @@ def test_get_metrics(gen_mat_data, metric, engine):
             nx.algorithms.communicability_betweenness_centrality(G)) + 1
         assert len(net_met_val_list_final) == len(
             nx.algorithms.communicability_betweenness_centrality(G)) + 1
-    elif metric == 'rich_club_coeff':
-        metric_list_names, net_met_val_list_final = \
-            algorithms.get_rich_club_coeff(G, metric_list_names,
-                                           net_met_val_list_final)
-        assert len(metric_list_names) == len(
-            nx.algorithms.rich_club_coefficient(G)) + 1
-        assert len(net_met_val_list_final) == len(
-            nx.algorithms.rich_club_coefficient(G)) + 1
-
-
-@pytest.mark.parametrize("plot_switch", [True, False])
-@pytest.mark.parametrize("embed", [True, False])
-@pytest.mark.parametrize("create_summary", [True, False])
-@pytest.mark.parametrize("graph_num", [
-    pytest.param(-1, marks=pytest.mark.xfail(raises=UserWarning)),
-    pytest.param(0, marks=pytest.mark.xfail(raises=IndexError)),
-    1,
-    2])
-def test_collect_pandas_df_make(plot_switch, embed, create_summary, graph_num):
-    """
-    Test for collect_pandas_df_make() functionality
-    """
-    base_dir = str(Path(__file__).parent / "examples")
-    subnet = None
-    ID = '002'
-
-    if graph_num == -1:
-        net_mets_csv_list = [
-            f"{base_dir}/miscellaneous/002_parcels_Default.nii.gz"]
-    elif graph_num == 0:
-        net_mets_csv_list = []
-    elif graph_num == 1:
-        net_mets_csv_list = [
-            f"{base_dir}/topology/metrics_sub-0021001_modality-dwi_"
-            f"nodetype-parc_model-csa_thrtype-PROP_thr-0.2.csv"]
-    else:
-        net_mets_csv_list = [
-            f"{base_dir}/topology/metrics_sub-0021001_modality-dwi_"
-            f"nodetype-parc_model-csa_thrtype-PROP_thr-0.2.csv",
-            f"{base_dir}/topology/metrics_sub-0021001_modality-dwi_"
-            f"nodetype-parc_model-csa_thrtype-PROP_thr-0.3.csv"]
-
-    combination_complete = algorithms.collect_pandas_df_make(
-        net_mets_csv_list, ID, subnet, plot_switch=plot_switch, embed=embed,
-        create_summary=create_summary)
-
-    assert combination_complete is True
+    # elif metric == 'rich_club_coeff':
+    #     metric_list_names, net_met_val_list_final = \
+    #         algorithms.get_rich_club_coeff(G, metric_list_names,
+    #                                        net_met_val_list_final)
+    #     assert len(metric_list_names) == len(
+    #         nx.algorithms.rich_club_coefficient(G)) + 1
+    #     assert len(net_met_val_list_final) == len(
+    #         nx.algorithms.rich_club_coefficient(G)) + 1
diff --git a/pynets/statistics/tests/test_interfaces.py b/pynets/statistics/tests/test_interfaces.py
new file mode 100755
index 00000000..932d7071
--- /dev/null
+++ b/pynets/statistics/tests/test_interfaces.py
@@ -0,0 +1,124 @@
+﻿#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Dec 27 16:19:14 2017
+@authors: Derek Pisner & Ryan Hammonds
+"""
+import pytest
+import os
+import numpy as np
+import networkx as nx
+import time
+import pkg_resources
+from pathlib import Path
+from pynets.statistics.individual import algorithms
+from pynets.statistics import interfaces
+import logging
+
+logger = logging.getLogger(__name__)
+logger.setLevel(50)
+
+
+@pytest.mark.parametrize("conn_model",
+                         ['corr', 'partcorr', 'cov', 'sps'])
+@pytest.mark.parametrize("prune",
+                         [pytest.param(0,
+                                       marks=pytest.mark.xfail(
+                                           raises=UnboundLocalError)), 1, 2,
+                          3])
+@pytest.mark.parametrize("norm", [i for i in range(1, 7)])
+def test_clean_graphs(gen_mat_data, conn_model, prune, norm):
+    # test_CleanGraphs
+    """
+    Test all combination of parameters for the CleanGraphs class
+    """
+
+    in_mat = gen_mat_data()['mat_list'][0]
+    est_path = gen_mat_data()['mat_file_list'][0]
+
+    clean = interfaces.CleanGraphs(est_path, prune, norm)
+    clean.normalize_graph()
+    clean.print_summary()
+    clean.create_length_matrix()
+    clean.binarize_graph()
+
+    clean.prune_graph()
+
+    G = nx.from_numpy_array(in_mat)
+    assert len(clean.G) >= 0
+    assert len(clean.G) <= len(G)
+
+
+@pytest.mark.parametrize("binary", [True, False])
+@pytest.mark.parametrize("prune", ['0', '1', '3'])
+@pytest.mark.parametrize("norm", ['0', '1', '2', '3', '4', '5', '6'])
+@pytest.mark.parametrize("conn_model", ['corr', 'cov'])
+def test_extractnetstats(gen_mat_data, binary, prune, norm,
+                         conn_model):
+    """
+    Test extractnetstats functionality
+    """
+    ID = '002'
+
+    start_time = time.time()
+
+    est_path = gen_mat_data(asfile=True)['mat_file_list'][0]
+
+    extractnetstats = interfaces.NetworkAnalysis()
+    extractnetstats.inputs.ID = ID
+    extractnetstats.inputs.est_path = est_path
+    extractnetstats.inputs.prune = prune
+    extractnetstats.inputs.norm = norm
+    extractnetstats.inputs.binary = binary
+
+    try:
+        out_path = extractnetstats.run()
+
+        print("%s%s%s" % (
+        'finished: ',
+        str(np.round(time.time() - start_time, 1)), 's'))
+        assert out_path.outputs.get()['out_path_neat'] is not None
+    # TODO Make this deterministic to remove try:/except:
+    except:
+        pass
+
+@pytest.mark.parametrize("plot_switch", [True, False])
+@pytest.mark.parametrize("embed", [True, False])
+@pytest.mark.parametrize("create_summary", [True, False])
+@pytest.mark.parametrize("graph_num", [
+    pytest.param(-1, marks=pytest.mark.xfail(raises=UserWarning)),
+    pytest.param(0, marks=pytest.mark.xfail(raises=IndexError)),
+    1,
+    2])
+def test_collect_pandas_df_make(plot_switch, embed,
+                                create_summary, graph_num):
+    """
+    Test for collect_pandas_df_make() functionality
+    """
+
+    base_dir = os.path.abspath(pkg_resources.resource_filename(
+        "pynets", "../data/examples"))
+    subnet = None
+    ID = '002'
+
+    if graph_num == -1:
+        net_mets_csv_list = [
+            f"{base_dir}/miscellaneous/002_parcels_Default.nii.gz"]
+    elif graph_num == 0:
+        net_mets_csv_list = []
+    elif graph_num == 1:
+        net_mets_csv_list = [
+            f"{base_dir}/topology/metrics_sub-0021001_modality-dwi_"
+            f"nodetype-parc_model-csa_thrtype-PROP_thr-0.2.csv"]
+    else:
+        net_mets_csv_list = [
+            f"{base_dir}/topology/metrics_sub-0021001_modality-dwi_"
+            f"nodetype-parc_model-csa_thrtype-PROP_thr-0.2.csv",
+            f"{base_dir}/topology/metrics_sub-0021001_modality-dwi_"
+            f"nodetype-parc_model-csa_thrtype-PROP_thr-0.3.csv"]
+
+    combination_complete = algorithms.collect_pandas_df_make(
+        net_mets_csv_list, ID, subnet, plot_switch=plot_switch, embed=embed,
+        create_summary=create_summary)
+
+    assert combination_complete is True
diff --git a/pynets/statistics/tests/test_spectral.py b/pynets/statistics/tests/test_spectral.py
new file mode 100755
index 00000000..ffa0bc96
--- /dev/null
+++ b/pynets/statistics/tests/test_spectral.py
@@ -0,0 +1,143 @@
+﻿#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+#!/usr/bin/env python3
+
+import itertools
+import pytest
+from pathlib import Path
+import numpy as np
+import logging
+from pynets.statistics.individual import spectral
+
+logger = logging.getLogger(__name__)
+logger.setLevel(50)
+
+
+@pytest.mark.parametrize("granularity", [
+    10,
+    100,
+    pytest.param(1, marks=pytest.mark.xfail),
+])
+@pytest.mark.parametrize("n_graphs", [
+    pytest.param(1, marks=pytest.mark.xfail),
+    4,
+    pytest.param(0, marks=pytest.mark.xfail),
+])
+@pytest.mark.parametrize("modality", [
+    'func',
+    'dwi',
+])
+def test_omni(gen_mat_data, granularity, n_graphs, modality):
+    atlas = "tmp"
+    mat_dat = gen_mat_data(m=granularity, n=granularity, n_graphs=n_graphs,
+                           asfile=True, mat_type='sb', modality=modality)
+    pop_array = mat_dat['mat_list']
+    pop_file_list = mat_dat['mat_file_list']
+
+    output_file = spectral._omni_embed(pop_array, atlas, pop_file_list)
+
+    emb_mat = np.load(output_file)
+
+    assert Path(output_file).is_file() and output_file.endswith(".npy") and \
+           emb_mat.shape[0] == granularity
+
+    output_paths = spectral.build_omnetome(mat_dat['mat_file_list'])
+
+    if modality == 'func':
+        output_path = output_paths[1][0]
+    elif modality == 'dwi':
+        output_path = output_paths[0][0]
+
+    emb_mat = np.load(output_path)
+    assert Path(output_path).is_file() and output_path.endswith(".npy") \
+           and emb_mat.shape[0] == granularity and emb_mat.shape[1] == 1
+
+
+@pytest.mark.parametrize("granularity", [
+    100,
+    pytest.param(1, marks=pytest.mark.xfail),
+])
+@pytest.mark.parametrize("n_graphs", [
+    pytest.param(1, marks=pytest.mark.xfail),
+    2,
+    pytest.param(0, marks=pytest.mark.xfail),
+])
+def test_MASE(gen_mat_data, granularity, n_graphs):
+    mat_dat_func = gen_mat_data(m=granularity, n=granularity,
+                                n_graphs=n_graphs, asfile=True,
+                                mat_type='sb', modality='func')
+    pop_array_func = mat_dat_func['mat_list']
+    pop_file_list_func = mat_dat_func['mat_file_list']
+
+    mat_dat_dwi = gen_mat_data(m=granularity, n=granularity,
+                               n_graphs=n_graphs, asfile=True,
+                               mat_type='sb', modality='dwi')
+    pop_array_dwi = mat_dat_dwi['mat_list']
+    pop_file_list_dwi = mat_dat_dwi['mat_file_list']
+
+    atlas = 'tmp'
+    output_file = spectral._mase_embed([pop_array_func[0], pop_array_dwi[0]],
+                                       atlas,
+                                       pop_file_list_func[0])
+
+    emb_mat = np.load(output_file)
+
+    assert Path(output_file).is_file() and output_file.endswith(".npy") and \
+           emb_mat.shape[0] == granularity and emb_mat.shape[1] == 2
+
+    output_path = spectral.build_masetome([list(itertools.product([
+    pop_file_list_func, pop_file_list_dwi]))[0][0]])[0]
+    emb_mat = np.load(output_path)
+    assert Path(output_path).is_file() and output_path.endswith(".npy") \
+           and emb_mat.shape[0] == granularity and emb_mat.shape[1] == 1
+
+
+@pytest.mark.parametrize("granularity", [
+    100,
+    pytest.param(1, marks=pytest.mark.xfail),
+])
+@pytest.mark.parametrize("n_graphs", [
+    pytest.param(4, marks=pytest.mark.xfail),
+    1,
+    pytest.param(0, marks=pytest.mark.xfail),
+])
+@pytest.mark.parametrize("modality", [
+    'func',
+    'dwi',
+])
+def test_ASE(gen_mat_data, granularity, n_graphs, modality):
+    atlas = "tmp"
+    mat_dat = gen_mat_data(m=granularity, n=granularity, n_graphs=n_graphs,
+                           asfile=True, mat_type='sb', modality=modality)
+
+    output_file = spectral._ase_embed(mat_dat['mat_list'][0], atlas,
+                                      mat_dat['mat_file_list'][0])
+
+    emb_mat = np.load(output_file)
+
+    assert Path(output_file).is_file() and output_file.endswith(".npy") and \
+           emb_mat.shape[0] == granularity
+
+
+@pytest.mark.parametrize("granularity", [
+    100,
+    pytest.param(1, marks=pytest.mark.xfail),
+])
+@pytest.mark.parametrize("n_graphs", [
+    2,
+    1,
+    pytest.param(0, marks=pytest.mark.xfail),
+])
+@pytest.mark.parametrize("modality", [
+    'func',
+    'dwi',
+])
+def test_build_asetomes(gen_mat_data, granularity, n_graphs, modality):
+    mat_dat = gen_mat_data(m=granularity, n=granularity, n_graphs=n_graphs,
+                           asfile=True, mat_type='sb', modality=modality)
+
+    output_paths = spectral.build_asetomes(mat_dat['mat_file_list'])
+    for output_file in output_paths:
+        emb_mat = np.load(output_file)
+        assert Path(output_file).is_file() and output_file.endswith(".npy") \
+               and emb_mat.shape[0] == granularity
diff --git a/pynets/statistics/tests/test_utils.py b/pynets/statistics/tests/test_utils.py
new file mode 100755
index 00000000..6c486cb4
--- /dev/null
+++ b/pynets/statistics/tests/test_utils.py
@@ -0,0 +1,35 @@
+﻿#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+"""
+Created on Wed Dec 27 16:19:14 2017
+@authors: Derek Pisner & Ryan Hammonds
+"""
+import pytest
+import os
+from pathlib import Path
+from pynets.statistics import utils
+import logging
+
+logger = logging.getLogger(__name__)
+logger.setLevel(50)
+
+
+def test_save_netmets():
+    """ Test save netmets functionality using dummy metrics
+    """
+    import tempfile
+
+    tmp = tempfile.TemporaryDirectory()
+    dir_path = str(tmp.name)
+    os.makedirs(dir_path, exist_ok=True)
+
+    est_path = tempfile.NamedTemporaryFile(mode='w+', suffix='.npy',
+                                           delete=False)
+
+    metric_list_names = ['metric_a', 'metric_b', 'metric_c']
+    net_met_val_list_final = [1, 2, 3]
+
+    utils.save_netmets(dir_path, str(est_path.name), metric_list_names,
+                       net_met_val_list_final)
+    tmp.cleanup()
+    est_path.close()
diff --git a/pynets/initializers/bids_config_test.json b/pynets/templates/initializers/bids_config_test.json
similarity index 100%
rename from pynets/initializers/bids_config_test.json
rename to pynets/templates/initializers/bids_config_test.json
diff --git a/pytest.ini b/pytest.ini
new file mode 100644
index 00000000..da7ef5d5
--- /dev/null
+++ b/pytest.ini
@@ -0,0 +1,5 @@
+[pytest]
+addopts = -vvv --disable-warnings --store-durations --dist loadscope --numprocesses=4 --capture=no --max-worker-restart 0 --forked
+timeout = 3600
+faulthandler_timeout=1800
+python_files = pynets/core/tests/test_nodemaker.py pynets/core/tests/test_refs.py pynets/core/tests/test_thresholding.py pynets/core/tests/test_utils.py pynets/dmri/tests/test_estimation.py pynets/dmri/tests/test_track.py pynets/dmri/tests/test_utils.py pynets/fmri/tests/test_clustering.py pynets/fmri/tests/test_estimation.py pynets/plotting/tests/test_adjacency.py pynets/plotting/tests/test_brain.py pynets/registration/tests/test_utils.py pynets/statistics/tests/test_algorithms.py pynets/statistics/tests/test_interfaces.py pynets/statistics/tests/test_utils.py pynets/statistics/tests/test_spectral.py pynets/dmri/tests/test_workflows_dwi.py pynets/fmri/tests/test_workflows_func.py 
diff --git a/tests/__init__.py b/tests/__init__.py
deleted file mode 100644
index 8fbb92e4..00000000
--- a/tests/__init__.py
+++ /dev/null
@@ -1,3 +0,0 @@
-# -*- coding: utf-8 -*-
-
-"""Unit test package for pynets."""
diff --git a/tests/conftest.py b/tests/conftest.py
deleted file mode 100644
index b6c6c172..00000000
--- a/tests/conftest.py
+++ /dev/null
@@ -1,339 +0,0 @@
-"""Configuration file for pytest for pynets."""
-
-from pathlib import Path
-import os
-import sys
-import gc
-import pytest
-import tempfile
-import pandas as pd
-import numpy as np
-import pkg_resources
-import nibabel as nib
-if sys.platform.startswith('win') is False:
-    import indexed_gzip
-from dipy.core.gradients import gradient_table
-from nipype.utils.filemanip import fname_presuffix
-from dipy.segment.mask import median_otsu
-import dipy.data as dpd
-from nilearn._utils import as_ndarray, data_gen
-from dipy.io import save_pickle
-from nilearn.plotting import find_parcellation_cut_coords
-from nilearn.input_data import NiftiLabelsMasker
-from nilearn.connectome import ConnectivityMeasure
-from pynets.fmri.estimation import get_optimal_cov_estimator
-from pynets.core.nodemaker import get_names_and_coords_of_parcels
-from graspologic.simulations.simulations import er_nm, sbm
-from graspologic.utils import symmetrize, remove_loops
-from dipy.reconst.shm import CsaOdfModel
-from dipy.data import default_sphere
-from dipy.direction import peaks_from_model
-from dipy.tracking.stopping_criterion import BinaryStoppingCriterion
-from dipy.tracking import utils
-from dipy.tracking.local_tracking import LocalTracking
-from dipy.tracking.streamline import Streamlines
-from dipy.io.stateful_tractogram import Space, Origin, StatefulTractogram
-from dipy.io.streamline import save_trk
-from nilearn.masking import intersect_masks
-
-
-def generate_random_img(shape, length=1, affine=np.eye(4),
-                        rand_gen=np.random.RandomState(0)):
-    data = rand_gen.standard_normal(size=(shape + (length,)))
-    return nib.Nifti1Image(data, affine), nib.Nifti1Image(
-        as_ndarray(data[..., 0] > 0.2, dtype=np.int8), affine)
-
-
-@pytest.fixture(scope="session")
-def random_mni_roi_data():
-    roi_img = data_gen.generate_mni_space_img(res=2)[1]
-    roi_file = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
-    roi_file = str(roi_file.name)
-    roi_img.to_filename(roi_file)
-
-    yield {'roi_file': roi_file}
-
-
-@pytest.fixture(scope="session")
-def dmri_estimation_data():
-    """Fixture for dmri estimation tests."""
-
-    dpd.fetcher.dipy_home = f"{os.environ['HOME']}/.dipy"
-    os.makedirs(dpd.fetcher.dipy_home, exist_ok=True)
-    files, folder = dpd.fetcher.fetch_stanford_hardi()
-    dwi_file = f"{folder}/HARDI150.nii.gz"
-    fbvals = f"{folder}/HARDI150.bval"
-    fbvecs = f"{folder}/HARDI150.bvec"
-    files, folder = dpd.fetcher.fetch_stanford_t1()
-    t1w_file = f"{folder}/t1.nii.gz"
-
-    files, folder = dpd.fetcher.fetch_stanford_pve_maps()
-    f_pve_csf = f"{folder}/pve_csf.nii.gz"
-    f_pve_gm = f"{folder}/pve_gm.nii.gz"
-    f_pve_wm = f"{folder}/pve_wm.nii.gz"
-
-    bvals = np.loadtxt(fbvals)
-
-    b0_ixs = np.where(np.logical_and(bvals <= 50, bvals >= -50))[0]
-
-    dwi_img = nib.load(dwi_file)
-    dwi_data = dwi_img.get_fdata()
-
-    b0_mask, mask = median_otsu(np.asarray(dwi_data,
-                                           dtype=np.float32)[..., b0_ixs[0]],
-                                median_radius=4, numpass=2)
-    mask_img = nib.Nifti1Image(mask.astype(np.float32), dwi_img.affine)
-    B0_mask = fname_presuffix(dwi_file, suffix="_brain_mask",
-                              use_ext=True)
-    nib.save(mask_img, B0_mask)
-
-    mask_img_small = nib.Nifti1Image(mask[20:50, 55:85, 38:39
-                                     ].astype('float32'),
-                                     affine=mask_img.affine)
-    B0_mask_small = fname_presuffix(dwi_file, suffix="_brain_mask_small",
-                                    use_ext=True)
-    nib.save(mask_img_small, B0_mask_small)
-
-    gtab = gradient_table(bvals, np.loadtxt(fbvecs))
-    gtab.b0_threshold = 50
-    gtab_bvals = gtab.bvals.copy()
-    b0_thr_ixs = np.where(gtab_bvals < gtab.b0_threshold)[0]
-    gtab_bvals[b0_thr_ixs] = 0
-    gtab.b0s_mask = gtab_bvals == 0
-
-    gtab_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.pkl',
-                                                delete=False)
-    gtab_file = str(gtab_file_tmp.name)
-    save_pickle(gtab_file, gtab)
-
-    dwi_data_small = dwi_data.copy()
-    dwi_data_small = dwi_data_small[20:50, 55:85, 38:39]
-    dwi_img_small = nib.Nifti1Image(dwi_data_small, header=dwi_img.header,
-                               affine=dwi_img.affine)
-    dwi_file_small = fname_presuffix(dwi_file, suffix="_small", use_ext=True)
-    dwi_img_small.to_filename(dwi_file_small)
-
-    del dwi_data, dwi_data_small
-    dwi_img.uncache()
-    dwi_img_small.uncache()
-    mask_img.uncache()
-    gc.collect()
-
-    yield {'dwi_file': dwi_file, 'fbvals': fbvals, 'fbvecs': fbvecs,
-           'gtab': gtab, 'gtab_file': gtab_file,
-           'dwi_file_small': dwi_file_small, 'B0_mask_small': B0_mask_small,
-           'B0_mask': B0_mask, 't1w_file': t1w_file,
-           'f_pve_csf': f_pve_csf, 'f_pve_wm': f_pve_wm, 'f_pve_gm': f_pve_gm}
-    gtab_file_tmp.close()
-
-@pytest.fixture(scope="session")
-def tractography_estimation_data(dmri_estimation_data):
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    gtab = dmri_estimation_data['gtab']
-    wm_img = nib.load(dmri_estimation_data['f_pve_wm'])
-    dwi_img = nib.load(dmri_estimation_data['dwi_file'])
-    dwi_data = dwi_img.get_fdata()
-    B0_mask_img = nib.load(dmri_estimation_data['B0_mask'])
-    mask_img = intersect_masks(
-        [
-            nib.Nifti1Image(np.asarray(wm_img.dataobj).astype('bool'
-                                                              ).astype('int'),
-                            affine=wm_img.affine),
-            nib.Nifti1Image(np.asarray(B0_mask_img.dataobj).astype(
-                'bool').astype('int'),
-                            affine=B0_mask_img.affine)
-        ],
-        threshold=1,
-        connected=False,
-    )
-
-    mask_data = mask_img.get_fdata()
-    mask_file = fname_presuffix(dmri_estimation_data['B0_mask'],
-                                suffix="tracking_mask", use_ext=True)
-    mask_img.to_filename(mask_file)
-    csa_model = CsaOdfModel(gtab, sh_order=6)
-    csa_peaks = peaks_from_model(csa_model, dwi_data, default_sphere,
-                                 relative_peak_threshold=.8,
-                                 min_separation_angle=45,
-                                 mask=mask_data)
-
-    stopping_criterion = BinaryStoppingCriterion(mask_data)
-
-    seed_mask = (mask_data == 1)
-    seeds = utils.seeds_from_mask(seed_mask, dwi_img.affine, density=[1, 1, 1])
-
-    streamlines_generator = LocalTracking(csa_peaks, stopping_criterion, seeds,
-                                          affine=dwi_img.affine, step_size=.5)
-    streamlines = Streamlines(streamlines_generator)
-    sft = StatefulTractogram(streamlines, dwi_img, origin=Origin.NIFTI,
-                    space=Space.RASMM)
-    trk = f"{dir_path}/tractogram.trk"
-    save_trk(sft, trk, streamlines)
-    del streamlines, sft, streamlines_generator, seeds, seed_mask, csa_peaks, \
-        csa_model, dwi_data, mask_data
-    dwi_img.uncache()
-    gc.collect()
-
-    yield {'trk': trk, 'mask': mask_file}
-
-    tmp.cleanup()
-
-
-@pytest.fixture(scope="session")
-def fmri_estimation_data():
-    """Fixture for fmri estimation tests."""
-
-    shape1 = (45, 54, 45)
-    affine1 = np.array([[1.,    0.,    0.,  -22.75],
-       [0.,    1.,    0., -31.5],
-       [0.,    0.,    1.,  -18.],
-       [0.,    0.,    0.,    0.25]])
-    length = 40
-
-    func_img, mask_img = generate_random_img(shape1, affine=affine1,
-                                             length=length)
-
-    func_file_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
-    func_file = str(func_file_tmp.name)
-    func_img.to_filename(func_file)
-
-    conf_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.tsv')
-    conf_mat = np.random.rand(length)
-    conf_df = pd.DataFrame({'Conf1': conf_mat,
-                            "Conf2": [np.nan]*len(conf_mat)})
-    conf_file = str(conf_tmp.name)
-    conf_df.to_csv(conf_file, sep='\t', index=False)
-
-    # Create empty mask file
-    mask_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
-    mask_file = str(mask_tmp.name)
-    mask_img.to_filename(mask_file)
-
-    t1w_file = f"{dpd.fetch_tissue_data()[1]}/{dpd.fetch_tissue_data()[0][1]}"
-
-    mask_img.uncache()
-    func_img.uncache()
-    gc.collect()
-
-    shape2 = (20, 40, 20)
-    affine2 = np.eye(4)
-    length = 50
-
-    func_img2, mask_img2 = generate_random_img(shape2, affine=affine2,
-                                               length=length)
-
-    func_file_tmp2 = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
-    func_file2 = str(func_file_tmp2.name)
-    func_img2.to_filename(func_file2)
-
-    mask_tmp2 = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
-    mask_file2 = str(mask_tmp2.name)
-    mask_img2.to_filename(mask_file2)
-
-    yield {'func_file': func_file,
-           'conf_file': conf_file,
-           'mask_file': mask_file,
-           't1w_file': t1w_file,
-           'func_file2': func_file2,
-           'mask_file2': mask_file2}
-    mask_tmp.close()
-    conf_tmp.close()
-    func_file_tmp.close()
-
-
-@pytest.fixture(scope="session")
-def parcellation_data():
-    """Fixture for parcellations."""
-
-    parcels_tmp = tempfile.NamedTemporaryFile(mode='w+', suffix='.nii.gz')
-    labels = pd.DataFrame(
-        {"label": list(map("label_{}".format, range(16)))})['label'
-    ].values.tolist()
-    parcellation = data_gen.generate_labeled_regions((7, 6, 5), 16)
-    parcels = parcellation.get_fdata()
-    net_parcels_map_nifti_file = str(parcels_tmp.name)
-    parcellation.to_filename(net_parcels_map_nifti_file)
-
-    [coords, indices] = find_parcellation_cut_coords(
-        parcellation, 0, return_label_names=True
-    )
-    coords = list(tuple(x) for x in coords)
-
-    yield {'net_parcels_map_nifti_file': net_parcels_map_nifti_file,
-           'parcels': parcels, 'labels': labels, 'coords': coords,
-           'indices': indices}
-
-
-@pytest.fixture(scope="session")
-def gen_mat_data():
-    def _gen_mat_data(n: int=20, m: int=20, p: int=0.50,
-                      mat_type: str='sb', binary: bool=False,
-                      asfile: bool=True, n_graphs: int=1):
-
-        if binary is True:
-            wt = 1
-        else:
-            wt = np.random.uniform
-
-        mat_list = []
-        mat_file_list = []
-        for nm in range(n_graphs):
-            if mat_type == 'er':
-                mat = symmetrize(
-                    remove_loops(er_nm(n, m, wt=np.random.uniform,
-                                       wtargs=dict(low=0, high=1))))
-            elif mat_type == 'sb':
-                if p is None:
-                    raise ValueError(
-                        f"for mat_type {mat_type}, p cannot be None")
-                mat = symmetrize(
-                    remove_loops(sbm(np.array([n]), np.array([[p]]),
-                                     wt=wt, wtargs=dict(low=0,
-                                                        high=1))))
-            else:
-                raise ValueError(f"mat_type {mat_type} not recognized!")
-
-            mat_list.append(mat)
-
-            if asfile is True:
-                mat_path_tmp = tempfile.NamedTemporaryFile(mode='w+',
-                                                           suffix='.npy',
-                                                           delete=False)
-                mat_path = str(mat_path_tmp.name)
-                np.save(mat_path, mat)
-                mat_file_list.append(mat_path)
-
-        return {'mat_list': mat_list, 'mat_file_list': mat_file_list}
-
-    return _gen_mat_data
-
-
-@pytest.fixture(scope="session")
-def connectivity_data(fmri_estimation_data):
-    """Fixture for connectivity tests."""
-
-    mask_file = fmri_estimation_data['mask_file']
-    func_file = fmri_estimation_data['func_file']
-    parcellation = pkg_resources.resource_filename(
-        "pynets", "templates/atlases/DesikanKlein2012.nii.gz"
-    )
-
-    masker = NiftiLabelsMasker(
-        labels_img=nib.load(parcellation), background_label=0,
-        resampling_target="labels", dtype="auto",
-        mask_img=nib.load(mask_file), standardize=True)
-
-    time_series = masker.fit_transform(func_file)
-    conn_measure = ConnectivityMeasure(
-        kind="correlation")
-    conn_matrix = conn_measure.fit_transform([time_series])[0]
-    [coords, _, _, label_intensities] = \
-        get_names_and_coords_of_parcels(parcellation)
-
-    labels = ['ROI_' + str(idx) for idx, val in enumerate(label_intensities)]
-
-    yield {'time_series': time_series, 'conn_matrix': conn_matrix,
-           'labels': labels, 'coords': coords, 'indices': label_intensities}
diff --git a/tests/test_plotting.py b/tests/test_plotting.py
deleted file mode 100755
index be610a3d..00000000
--- a/tests/test_plotting.py
+++ /dev/null
@@ -1,428 +0,0 @@
-﻿#!/usr/bin/env python
-# -*- coding: utf-8 -*-
-"""
-Created on Wed Dec 27 16:19:14 2017
-"""
-import os
-import numpy as np
-import time
-try:
-    import cPickle as pickle
-except ImportError:
-    import _pickle as pickle
-from pathlib import Path
-import pytest
-import pkg_resources
-from pynets.plotting import brain, adjacency
-import tempfile
-import logging
-import networkx as nx
-
-logger = logging.getLogger(__name__)
-logger.setLevel(50)
-
-
-def test_plot_conn_mat_nonet_no_mask(connectivity_data):
-    """
-    Test plot_conn_mat_nonet_no_mask functionality
-    """
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    subnet = None
-    ID = '002'
-    thr = 0.95
-    node_size = 2
-    smooth = 2
-    hpass = 0.1
-    signal = 'mean'
-    conn_model = 'sps'
-    atlas = 'random_parcellation'
-    roi = None
-
-    conn_matrix = connectivity_data['conn_matrix']
-    labels = connectivity_data['labels']
-
-    start_time = time.time()
-    adjacency.plot_conn_mat_func(conn_matrix, conn_model, atlas, dir_path,
-                                 ID, subnet, labels, roi, thr, node_size,
-                                 smooth, hpass, signal)
-    print("%s%s%s" % ('plot_conn_mat_func --> finished: ',
-    str(np.round(time.time() - start_time, 1)), 's'))
-    tmp.cleanup()
-
-def test_plot_conn_mat_nonet_mask(connectivity_data):
-    """
-    Test plot_conn_mat_nonet_mask functionality
-    """
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    subnet = None
-    ID = '002'
-    thr = 0.95
-    node_size = 2
-    smooth = 2
-    hpass = 0.1
-    conn_model = 'sps'
-    signal = 'mean'
-    atlas = 'random_parcellation'
-    roi = None
-
-    conn_matrix = connectivity_data['conn_matrix']
-    labels = connectivity_data['labels']
-
-    start_time = time.time()
-    adjacency.plot_conn_mat_func(conn_matrix, conn_model, atlas, dir_path,
-                                 ID, subnet, labels, roi, thr, node_size,
-                                 smooth, hpass, signal)
-    print("%s%s%s" % ('plot_conn_mat_func (Masking version) --> finished: ',
-    str(np.round(time.time() - start_time, 1)), 's'))
-    tmp.cleanup()
-
-
-def test_plot_all_nonet_no_mask(random_mni_roi_data, connectivity_data):
-    """
-    Test plot_all_nonet_no_mask functionality
-    """
-
-    dir_path = str(tempfile.TemporaryDirectory().name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    subnet = None
-    ID = '002'
-    thr = 0.95
-    node_size = 2
-    smooth = 2
-    conn_model = 'sps'
-    parlistfile = None
-    atlas = 'random_parcellation'
-    roi = random_mni_roi_data['roi_file']
-    prune = 1
-    norm = 1
-    hpass = 0.1
-    binary = False
-    signal = 'mean'
-    edge_threshold = '99%'
-
-    conn_matrix = connectivity_data['conn_matrix']
-    labels = connectivity_data['labels']
-    coords = connectivity_data['coords']
-
-    start_time = time.time()
-    brain.plot_all_func(conn_matrix, conn_model, atlas, dir_path, ID, subnet,
-                        labels, roi, coords, thr, node_size, edge_threshold,
-                        smooth, prune, parlistfile, norm, binary, hpass,
-                        signal)
-    print("%s%s%s" % ('plot_all --> finished: ',
-                      str(np.round(time.time() - start_time, 1)), 's'))
-
-
-def test_plot_all_nonet_with_mask(connectivity_data):
-    """
-    Test plot_all_nonet_with_mask functionality
-    """
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    subnet = None
-    ID = '002'
-    thr = 0.95
-    node_size = 3
-    smooth = 2
-    prune = 3
-    norm = 3
-    hpass = 0.1
-    binary = False
-    conn_model = 'corr'
-    atlas = 'random_parcellation'
-    parlistfile = None
-    roi = None
-    signal = 'mean'
-    edge_threshold = '99%'
-
-    conn_matrix = connectivity_data['conn_matrix']
-    labels = connectivity_data['labels']
-    coords = connectivity_data['coords']
-
-    # Force an isolate in the matrix
-    conn_matrix[:, 0] = 0
-    conn_matrix[0, :] = 0
-
-    # Adds coverage
-    coords = np.array(coords)
-    labels = np.array(labels)
-
-    start_time = time.time()
-    brain.plot_all_func(conn_matrix, conn_model, atlas, dir_path, ID, subnet,
-                        labels, roi, coords, thr, node_size, edge_threshold,
-                        smooth, prune, parlistfile, norm, binary, hpass,
-                        signal, edge_color_override=True)
-    print("%s%s%s" % ('plot_all (Masking version) --> finished: ',
-                      str(np.round(time.time() - start_time, 1)), 's'))
-    tmp.cleanup()
-
-
-@pytest.mark.parametrize("subnet", ["Default", None])
-def test_plot_timeseries(connectivity_data, subnet):
-    """
-    Test plot_timeseries functionality
-    """
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    ID = '002'
-    atlas = 'random_parcellation'
-    time_series = connectivity_data['time_series']
-    labels = connectivity_data['labels']
-
-    start_time = time.time()
-    brain.plot_timeseries(time_series, subnet, ID, dir_path, atlas, labels)
-    print("%s%s%s" % ('plot_timeseries --> finished: ',
-                      str(np.round(time.time() - start_time, 1)), 's'))
-    tmp.cleanup()
-
-@pytest.mark.parametrize("plot_overlaps", [True, False])
-def test_plot_network_clusters(connectivity_data, plot_overlaps):
-    """ Test plotting subnet clusters"""
-
-    from pynets.statistics.individual.algorithms import \
-        community_resolution_selection
-
-    temp_file = tempfile.NamedTemporaryFile(mode='w+', prefix='figure',
-                                            suffix='.png')
-    fname = str(temp_file.name)
-
-    conn_matrix = connectivity_data['conn_matrix']
-
-    G = nx.from_numpy_matrix(np.abs(conn_matrix))
-    _, communities, _, _ = community_resolution_selection(G)
-    plot_labels = True
-
-    brain.plot_network_clusters(G, communities, fname,
-                                plot_overlaps=plot_overlaps,
-                                plot_labels=plot_labels)
-
-    assert os.path.isfile(fname)
-
-    temp_file.close()
-
-
-@pytest.mark.parametrize("prune, node_cmap",
-    [
-        pytest.param(3, 0),
-        pytest.param(False, "Set2")
-    ]
-)
-def test_create_gb_palette(connectivity_data, prune, node_cmap):
-    """Test palette creation."""
-    conn_matrix = connectivity_data['conn_matrix']
-    labels = connectivity_data['labels']
-    coords = connectivity_data['coords']
-
-    # Force an isolate in the matrix
-    conn_matrix[:, 0] = 0
-    conn_matrix[0, :] = 0
-
-    color_theme = 'binary'
-
-    palette = brain.create_gb_palette(conn_matrix, color_theme, coords, labels,
-                                      prune=prune, node_cmap=node_cmap)
-    for param in palette:
-        assert param is not None
-
-
-def test_plot_conn_mat_rois_gt_100(connectivity_data):
-    """
-    Test plot_conn_mat_rois_gt_100 functionality
-    """
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    conn_matrix = connectivity_data['conn_matrix']
-    labels = connectivity_data['labels']
-
-    start_time = time.time()
-    adjacency.plot_conn_mat(conn_matrix, labels, dir_path, cmap='Blues')
-    print("%s%s%s" % ('plot_timeseries --> finished: ',
-                      str(np.round(time.time() - start_time, 1)), 's'))
-    tmp.cleanup()
-
-@pytest.mark.parametrize("roi", [True, False])
-def test_plot_all_struct(connectivity_data, gen_mat_data, roi):
-    """Test structural plotting."""
-
-    tmp = tempfile.TemporaryDirectory()
-    dir_path = str(tmp.name)
-    os.makedirs(dir_path, exist_ok=True)
-
-    labels = connectivity_data['labels']
-    coords = connectivity_data['coords']
-    conn_matrix = gen_mat_data(m=len(labels), n=len(labels),
-                               asfile=False, mat_type='sb')['mat_list'][0]
-
-    # Adds coverage
-    coords = np.array(coords)
-    labels = np.array(labels)
-
-    conn_model = 'corr'
-    atlas = 'random_parcellation'
-    ID = '002'
-    subnet = None
-    if roi:
-        roi = pkg_resources.resource_filename(
-        "pynets", "templates/rois/pDMN_3_bin.nii.gz")
-    else:
-        roi = None
-    thr = 0.95
-    node_size = None
-    edge_threshold = '99%'
-    prune = 3
-    parcellation = None
-    norm = 3
-    binary = False
-    traversal = 'prob'
-    track_type = 'particle'
-    min_length = 10
-    error_margin = 2
-
-    brain.plot_all_struct(conn_matrix, conn_model, atlas, dir_path, ID,
-                          subnet, labels, roi, coords, thr, node_size,
-                          edge_threshold, prune, parcellation, norm, binary,
-                          track_type, traversal, min_length, error_margin)
-    tmp.cleanup()
-
-# def test_plot_all_struct_func(connectivity_data):
-#     """Test structural and functional plotting."""
-#     import multinetx as mx
-#     base_dir = str(Path(__file__).parent/"examples")
-#     temp_dir = tempfile.TemporaryDirectory()
-#     dir_path = str(temp_dir.name)
-#
-#     labels = connectivity_data['labels'][:10]
-#     coords = connectivity_data['coords'][:10]
-#     metadata = {'coords': coords, 'labels': labels}
-#
-#     name = 'output_fname'
-#
-#     func_file = (f"{base_dir}/miscellaneous/graphs/rawgraph_sub-002_modality-func_rsn-Default_roi-002_parcels_resampled2roimask_pDMN_3_bin_model-sps_template-MNI152_T1_nodetype-spheres-6mm_smooth-2fwhm_hpass-FalseHz_extract-mean.npy")
-#     dwi_file = (f"{base_dir}/miscellaneous/graphs/rawgraph_sub-002_modality-dwi_rsn-Default_roi-002_parcels_resampled2roimask_pDMN_3_bin_model-sps_template-MNI152_T1_nodetype-spheres-6mm_samples-2streams_tracktype-local_directget-prob_minlength-200.npy")
-#     modality_paths = (func_file, dwi_file)
-#
-#     G_func = nx.from_numpy_matrix(np.load(func_file))
-#     G_dwi = nx.from_numpy_matrix(np.load(dwi_file))
-#
-#     mG_path = tempfile.NamedTemporaryFile(mode='w+', suffix='.gpickle')
-#     mG = mx.MultilayerGraph(list_of_layers=[G_func, G_dwi])
-#
-#     # This is a hack to get i/o working. There is an nx inhertiance issue that prevents reading.
-#     intra_layer_edges = mG.intra_layer_edges
-#     del mG.intra_layer_edges
-#
-#     nx.write_gpickle(mG, mG_path.name)
-#
-#     plot_gen.plot_all_struct_func(mG_path.name, dir_path, name, modality_paths, metadata)
-#
-#     temp_dir.cleanup()
-#     mG_path.close()
-
-
-# @pytest.mark.parametrize("nan", [True, False])
-# def test_plot_graph_measure_hists(nan):
-#     """Test plotting histograms from metric dataframe."""
-#     import pandas as pd
-#
-#     base_dir = str(Path(__file__).parent/"examples")
-#
-#     tmp = tempfile.TemporaryDirectory()
-#     dir_path = str(tmp.name)
-#     os.makedirs(dir_path, exist_ok=True)
-#
-#     df_csv = f"{base_dir}/miscellaneous/metrics_sub-OAS31172_ses-d0407_" \
-#              f"topology_auc_clean.csv"
-#
-#     # Hack the dataframe
-#     if nan is True:
-#         df = pd.read_csv(df_csv)
-#         df[df.columns[4]] = np.nan
-#         df.to_csv(f"{dir_path}/TEST.csv", index=False)
-#         fig = brain.plot_graph_measure_hists(f"{dir_path}/TEST.csv")
-#     else:
-#         fig = brain.plot_graph_measure_hists(df_csv)
-#     assert fig is not None
-#     tmp.cleanup()
-
-# def test_plot_conn_mat_rois_lt_100():
-#     base_dir = str(Path(__file__).parent/"examples")
-#     dir_path = base_dir + '/997'
-#     conn_matrix = np.genfromtxt(f"{base_dir}/miscellaneous/002_rsn-Default_nodetype-parc_est-sps_thrtype-PROP_thr-0.94.txt")
-#     labels_file_path = f"{base_dir}/miscellaneous/Default_func_labelnames_wb.pkl"
-#     labels_file = open(labels_file_path,'rb')
-#     labels = pickle.load(labels_file)
-#     out_path_fig = '/tmp/'
-#
-#     start_time = time.time()
-#     plotting.plot_conn_mat(conn_matrix, labels, out_path_fig, cmap='Blues')
-#     print("%s%s%s" % ('plot_timeseries --> finished: ', str(np.round(time.time() - start_time, 1)), 's'))
-
-
-# def test_plot_conn_mat_struct():
-#     base_dir = str(Path(__file__).parent/"examples")
-#     dir_path = base_dir + '/997'
-#     conn_matrix = np.genfromtxt(f"{base_dir}/miscellaneous/002_rsn-Default_nodetype-parc_est-sps_thrtype-PROP_thr-0.94.txt")
-#     conn_model = 'sps'
-#     atlas = 'random_parcellation'
-#     ID = '997'
-#     subnet = None
-#     labels_file_path = f"{base_dir}/miscellaneous/Default_func_labelnames_wb.pkl"
-#     labels_file = open(labels_file_path,'rb')
-#     labels = pickle.load(labels_file)
-#     roi = None
-#     thr = 0.95
-#     node_size = 2
-#     smooth = 2
-#
-#     plotting.plot_conn_mat_struct(conn_matrix, conn_model, atlas, dir_path, ID, subnet, labels, roi, thr,
-#                                   node_size, smooth)
-
-# def test_structural_plotting():
-#     base_dir = str(Path(__file__).parent/"examples")
-#     dir_path = base_dir + '/997'
-#     conn_matrix = np.genfromtxt(f"{base_dir}/miscellaneous/002_rsn-Default_nodetype-parc_est-sps_thrtype-PROP_thr-0.94.txt")
-#     labels_file_path = f"{base_dir}/miscellaneous/Default_func_labelnames_wb.pkl"
-#     labels_file = open(labels_file_path,'rb')
-#     labels = pickle.load(labels_file)
-#     atlas = 'random_parcellation'
-#     ID = '002'
-#     bedpostx_dir = base_dir + 'bedpostx_s002.bedpostX'
-#     subnet = None
-#     parc = True
-#     roi = None
-#     coord_file_path = f"{base_dir}/miscellaneous/Default_func_coords_wb.pkl"
-#     coord_file = open(coord_file_path, 'rb')
-#     coords = pickle.load(coord_file)
-#     conn_model = 'sps'
-#     thr = 0.95
-#     node_size = 2
-#     smooth = 2
-#
-#     plotting.structural_plotting(conn_matrix, labels, atlas, ID, bedpostx_dir, subnet, parc, roi, coords,
-#                                  dir_path, conn_model, thr, node_size, smooth)
-
-
-# def test_plot_graph_measure_hists():
-#     df_concat = np.random.rand(4,4)
-#     measures = [1, 2, 3]
-#     net_pick_file = '/Users/ryanhammonds/tmp/tmp/tmp'
-#
-#     plotting.plot_graph_measure_hists(df_concat, measures, net_pick_file)