pycortex 1.2.7__tar.gz → 1.2.9__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {pycortex-1.2.7 → pycortex-1.2.9}/PKG-INFO +8 -6
- {pycortex-1.2.7 → pycortex-1.2.9}/README.md +4 -5
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/align.py +202 -85
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/blender/__init__.py +1 -1
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/database.py +19 -12
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/dataset/braindata.py +6 -3
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/dataset/viewRGB.py +1 -1
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/dataset/views.py +20 -9
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/formats.c +415 -223
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/freesurfer.py +201 -58
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mapper/__init__.py +1 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mapper/samplers.py +1 -1
- pycortex-1.2.9/cortex/mapper/utils.py +131 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mapper/volume.py +1 -1
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/openctm.c +412 -223
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/polyutils/subsurface.py +2 -2
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/polyutils/surface.py +1 -1
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/quickflat/composite.py +6 -4
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/quickflat/view.py +7 -5
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/segment.py +10 -5
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/svgoverlay.py +1 -1
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/tests/test_dataset.py +2 -2
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/tests/test_utils.py +2 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/utils.py +266 -78
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/version.py +2 -2
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/data.py +3 -5
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/datamodel.js +91 -35
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/facepick.js +2 -2
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/mriview.js +72 -21
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/svgoverlay.js +6 -3
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/view.py +185 -89
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/xfm.py +3 -3
- {pycortex-1.2.7 → pycortex-1.2.9}/pycortex.egg-info/PKG-INFO +8 -6
- {pycortex-1.2.7 → pycortex-1.2.9}/pycortex.egg-info/SOURCES.txt +1 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/pycortex.egg-info/requires.txt +1 -1
- pycortex-1.2.9/pyproject.toml +11 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/requirements.txt +1 -1
- pycortex-1.2.7/pyproject.toml +0 -4
- {pycortex-1.2.7 → pycortex-1.2.9}/LICENSE +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/MANIFEST.in +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/COMPILING.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/LICENSE.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/Makefile.linux +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/Makefile.macosx +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/Makefile.mingw +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/Makefile.msvc +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/README.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/Makefile.linux +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/Makefile.macosx +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/Makefile.mingw +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/Makefile.msvc +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/compressMG1.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/compressMG2.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/compressRAW.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/internal.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/Alloc.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/Alloc.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzFind.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzFind.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzHash.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzmaDec.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzmaDec.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzmaEnc.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzmaEnc.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzmaLib.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/LzmaLib.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/NameMangle.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/Types.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/liblzma/readme.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/libopenctm.a +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/openctm-mingw1.def +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/openctm-mingw2.def +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/openctm-msvc.def +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/openctm.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/openctm.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/openctm.rc +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/openctmpp.h +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/OpenCTM-1.0.3/lib/stream.c +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/__init__.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/anat.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/appdirs.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/bbr.sch +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/blender/blendlib.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/brainctm.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/dataset/__init__.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/dataset/dataset.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/dataset/view2D.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/defaults.cfg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/export/__init__.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/export/_default_params.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/export/panels.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/export/save_views.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/fmriprep.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/formats.pyx +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/formats_old.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mapper/line.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mapper/mapper.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mapper/patch.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mapper/point.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mayavi_aligner.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mni.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/mp.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/openctm.pxd +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/openctm.pyx +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/options.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/polyutils/__init__.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/polyutils/distortion.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/polyutils/exact_geodesic.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/polyutils/misc.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/quickflat/__init__.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/quickflat/utils.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/rois.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/surfinfo.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/svgbase.xml +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/testing_utils.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/tests/__init__.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/tests/test_formats.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/tests/test_freesurfer.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/tests/test_polyutils.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/tests/test_quickflat.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/volume.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/FallbackLoader.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/__init__.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/demo.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/explo_demo.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/favicon.ico +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/htmlembed.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/mixer.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/public.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/demo.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/colors.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/control-pause.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/control-play.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/loading.gif +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/magnifying_glass.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/trigger.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_flat_10_000000_40x100.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-icons_222222_256x240.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-icons_228ef1_256x240.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-icons_ef8c08_256x240.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-icons_ffd27a_256x240.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/images/ui-icons_ffffff_256x240.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/jquery-ui.min.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/jquery.miniColors.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/jsplot.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/mriview.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/select2-4.0.3.min.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/w2ui-1.2.min.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/w2ui-1.4.2.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/css/w2ui-1.4.2.min.css +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/cursor.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/demo.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/flatten_1.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/flatten_2.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/intro.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/intro.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/rotate_1.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/rotate_2.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/swipe_left.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/swipe_right.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/zoom_1.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/explo_demo/zoom_2.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/LandscapeControls.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/OculusRiftEffect.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/axes3d.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/canvg.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/ctm/CTMLoader.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/ctm/CTMWorker.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/ctm/ctm.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/ctm/license/OpenCTM.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/ctm/license/js-lzma.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/ctm/license/js-openctm.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/ctm/lzma.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/dat.gui.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/dataset.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/facepick_worker.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/figure.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/graphview.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/hoverintent.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jgestures.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jquery-2.1.1.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jquery-ui.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jquery.ddslick.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jquery.miniColors.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jquery.svg.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jquery.svganim.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/jquery.ui.touch-punch.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/kdTree-min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/leap-0.6.4.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/leap.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/menu.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/movement.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/mriview_surface.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/mriview_utils.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/python_interface.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/rgbcolor.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/select2-4.0.3.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/shaderlib.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/shadowtex.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/sliceplane.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/surfgeometry.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/surfload.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/svg_todataurl.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/three.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/w2ui-1.2.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/w2ui-1.4.2.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/js/w2ui-1.4.2.min.js +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/json/wngraph-definitions.json +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/json/wngraph-nodenames.json +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/json/wngraph-rgbcolors.json +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/resources/json/wngraph-testvoxwts.json +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/serve.py +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/simple.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/static.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/template.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/wngraph-labeled.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/wngraph-minimal.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/wngraph.html +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/cortex/webgl/wngraph.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Accent.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Accent_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BPROG.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BROYG.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BROYG_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Blues.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Blues_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BrBG.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BrBG_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuBkRd.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuBkRd_alpha_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuGn.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuGn_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuOr_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuPu.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuPu_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuWtRd.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuWtRd_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/BuWtRd_black_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/CyanBlueGrayRedPink.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Dark2.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Dark2_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/GnBu.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/GnBu_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/GreenWhiteBlue.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/GreenWhiteBlue_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/GreenWhiteRed.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/GreenWhiteRed_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Greens.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Greens_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Greys.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Greys_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/J4.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/J4R.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/J4s.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/J5.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/J5R.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/J6.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/J6R.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/OrRd.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/OrRd_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Oranges.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Oranges_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PRGn.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PRGn_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PU_BuOr_covar.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PU_BuOr_covar_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PU_PinkBlue_covar.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PU_RdBu_covar.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PU_RdBu_covar_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PU_RdGn_covar.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Paired.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Paired_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Pastel1.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Pastel1_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Pastel2.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Pastel2_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PiYG.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PiYG_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuBu.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuBuGn.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuBuGn_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuBu_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuOr.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuOr_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuRd.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/PuRd_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Purples.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Purples_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RGrB_tsi.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu_2D_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu_covar.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu_covar2.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu_covar_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdBu_r_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdGn_covar.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdGy.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdGy_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdPu.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdPu_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdYlBu.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdYlBu_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdYlGn.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/RdYlGn_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Reds.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Reds_cov.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Reds_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Retinotopy_RYBCR.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Retinotopy_RYBCR_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Retinotopy_RYBCR_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Set1.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Set1_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Set2.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Set2_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Set3.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Set3_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Spectral.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/Spectral_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlGn.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlGnBu.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlGnBu_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlGn_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlOrBr.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlOrBr_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlOrRd.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/YlOrRd_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/afmhot.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/afmhot_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/autumn.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/autumn_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/autumn_blkmin.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/autumn_blkmin_alpha_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/autumn_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/autumnblack.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/autumnblack_alpha_2D.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/binary.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/binary_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/bone.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/bone_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/brg.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/brg_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/bwr.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/bwr_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/cool.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/cool_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/coolwarm.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/coolwarm_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/copper.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/copper_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/cubehelix.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/cubehelix_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/fire.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/fire_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/flag.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/flag_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/freesurfer_aseg_256.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_earth.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_earth_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_gray.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_gray_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_heat.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_heat_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_ncar.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_ncar_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_rainbow.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_rainbow_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_stern.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_stern_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_yarg.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gist_yarg_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gnuplot.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gnuplot2.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gnuplot2_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gnuplot_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gray.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/gray_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/hot.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/hot_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/hot_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/hsv.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/hsv_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/inferno.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/inferno_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/jet.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/jet_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/magma.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/magma_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/nipy_spectral.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/nipy_spectral_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/ocean.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/ocean_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/pink.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/pink_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/plasma.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/plasma_alpha.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/plasma_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/prism.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/prism_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/rainbow.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/rainbow_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/seismic.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/seismic_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/spectral.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/spectral_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/spring.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/spring_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/summer.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/summer_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/terrain.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/terrain_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/viridis.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/viridis_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/winter.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/colormaps/winter_r.png +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/anatomicals/raw.nii.gz +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/overlays.svg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/flat_lh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/flat_rh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/inflated_lh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/inflated_rh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/pia_lh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/pia_rh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/wm_lh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/surfaces/wm_rh.gii +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/transforms/fullhead/matrices.xfm +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/transforms/fullhead/reference.nii.gz +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/transforms/retinotopy/matrices.xfm +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/filestore/db/S1/transforms/retinotopy/reference.nii.gz +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/pycortex.egg-info/dependency_links.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/pycortex.egg-info/top_level.txt +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/setup.cfg +0 -0
- {pycortex-1.2.7 → pycortex-1.2.9}/setup.py +0 -0
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: pycortex
|
|
3
|
-
Version: 1.2.
|
|
3
|
+
Version: 1.2.9
|
|
4
4
|
Summary: Python Cortical mapping software for fMRI data
|
|
5
5
|
Home-page: http://gallantlab.github.io/pycortex
|
|
6
|
-
Download-URL: http://gallantlab.github.io/pycortex
|
|
7
6
|
Author: James Gao
|
|
8
7
|
Author-email: james@jamesgao.com
|
|
9
8
|
License: 2-clause BSD license
|
|
9
|
+
Download-URL: http://gallantlab.github.io/pycortex
|
|
10
|
+
Platform: UNKNOWN
|
|
10
11
|
Classifier: Development Status :: 6 - Mature
|
|
11
12
|
Classifier: Intended Audience :: Science/Research
|
|
12
13
|
Classifier: License :: OSI Approved :: BSD License
|
|
@@ -30,6 +31,10 @@ Pycortex is a software library that allows you to visualize fMRI or other volume
|
|
|
30
31
|
|
|
31
32
|
Installation
|
|
32
33
|
------------
|
|
34
|
+
|
|
35
|
+
> [!NOTE]
|
|
36
|
+
> Pycortex cannot be currently installed in Windows, only Linux and macOS are supported.
|
|
37
|
+
|
|
33
38
|
To install the stable release version of pycortex, do the following:
|
|
34
39
|
|
|
35
40
|
```bash
|
|
@@ -88,7 +93,4 @@ If you use pycortex in published work, please cite the [pycortex paper](http://d
|
|
|
88
93
|
|
|
89
94
|
_Gao JS, Huth AG, Lescroart MD and Gallant JL (2015) Pycortex: an interactive surface visualizer for fMRI. Front. Neuroinform. 9:23. doi: 10.3389/fninf.2015.00023_
|
|
90
95
|
|
|
91
|
-
|
|
92
|
-
------------
|
|
93
|
-
Please post on [NeuroStars](https://neurostars.org/) with the tag `pycortex` to
|
|
94
|
-
ask questions about how to use Pycortex.
|
|
96
|
+
|
|
@@ -11,6 +11,10 @@ Pycortex is a software library that allows you to visualize fMRI or other volume
|
|
|
11
11
|
|
|
12
12
|
Installation
|
|
13
13
|
------------
|
|
14
|
+
|
|
15
|
+
> [!NOTE]
|
|
16
|
+
> Pycortex cannot be currently installed in Windows, only Linux and macOS are supported.
|
|
17
|
+
|
|
14
18
|
To install the stable release version of pycortex, do the following:
|
|
15
19
|
|
|
16
20
|
```bash
|
|
@@ -68,8 +72,3 @@ Citation
|
|
|
68
72
|
If you use pycortex in published work, please cite the [pycortex paper](http://dx.doi.org/10.3389/fninf.2015.00023):
|
|
69
73
|
|
|
70
74
|
_Gao JS, Huth AG, Lescroart MD and Gallant JL (2015) Pycortex: an interactive surface visualizer for fMRI. Front. Neuroinform. 9:23. doi: 10.3389/fninf.2015.00023_
|
|
71
|
-
|
|
72
|
-
Getting help
|
|
73
|
-
------------
|
|
74
|
-
Please post on [NeuroStars](https://neurostars.org/) with the tag `pycortex` to
|
|
75
|
-
ask questions about how to use Pycortex.
|
|
@@ -1,9 +1,18 @@
|
|
|
1
1
|
"""Contains functions for making alignments between functional data and the surface, or, finding where the brain is.
|
|
2
2
|
"""
|
|
3
3
|
import os
|
|
4
|
-
import
|
|
5
|
-
|
|
4
|
+
import shutil
|
|
5
|
+
import subprocess as sp
|
|
6
|
+
import tempfile
|
|
6
7
|
import warnings
|
|
8
|
+
from builtins import input
|
|
9
|
+
|
|
10
|
+
import numpy as np
|
|
11
|
+
|
|
12
|
+
from .database import db
|
|
13
|
+
from .options import config
|
|
14
|
+
from .xfm import Transform
|
|
15
|
+
|
|
7
16
|
|
|
8
17
|
def mayavi_manual(subject, xfmname, reference=None, **kwargs):
|
|
9
18
|
"""Open GUI for manually aligning a functional volume to the cortical surface for `subject`. This
|
|
@@ -155,11 +164,12 @@ def manual(subject, xfmname, output_name="register.lta", wm_color="yellow",
|
|
|
155
164
|
Nothing unless noclean is true.
|
|
156
165
|
"""
|
|
157
166
|
|
|
167
|
+
import shutil
|
|
158
168
|
import subprocess as sp
|
|
159
169
|
import tempfile
|
|
160
|
-
|
|
161
|
-
from .xfm import Transform
|
|
170
|
+
|
|
162
171
|
from .database import db
|
|
172
|
+
from .xfm import Transform
|
|
163
173
|
|
|
164
174
|
retval = None
|
|
165
175
|
|
|
@@ -235,120 +245,227 @@ def manual(subject, xfmname, output_name="register.lta", wm_color="yellow",
|
|
|
235
245
|
return retval
|
|
236
246
|
|
|
237
247
|
|
|
238
|
-
def
|
|
239
|
-
|
|
240
|
-
|
|
248
|
+
def automatic_fsl(
|
|
249
|
+
subject, xfmname, reference, noclean=False, bbrtype="signed", pre_flirt_args=""
|
|
250
|
+
):
|
|
251
|
+
"""Perform automatic alignment using the FLIRT boundary-based alignment (BBR) from
|
|
252
|
+
FSL. The `reference` image and resulting transform called `xfmname` will be
|
|
253
|
+
automatically stored in the database.
|
|
241
254
|
|
|
242
|
-
If `noclean
|
|
243
|
-
transform called `xfmname` will be automatically stored in the database.
|
|
255
|
+
If `noclean` is set to True, intermediate files will not be removed from /tmp.
|
|
244
256
|
|
|
245
|
-
It's good practice to open up this transform afterward in the manual aligner and
|
|
246
|
-
Do that using the following (
|
|
247
|
-
|
|
257
|
+
It's good practice to open up this transform afterward in the manual aligner and
|
|
258
|
+
check how it worked. Do that using the following code (passing the same `subject`
|
|
259
|
+
and `xfmname` used here, no need for `reference`):
|
|
248
260
|
|
|
249
|
-
|
|
250
|
-
|
|
261
|
+
> cortex.align.manual(subject, xfmname)
|
|
262
|
+
|
|
263
|
+
If automatic alignment with FSL fails, you can try giving the pre-BBR FLIRT
|
|
264
|
+
some hints by passing '-usesqform' in as `pre_flirt_args`. Alternatively, you can
|
|
265
|
+
use `cortex.align.automatic` to use Freesurfer's bbregister, which tends to work
|
|
266
|
+
better than FSL.
|
|
251
267
|
|
|
252
268
|
Parameters
|
|
253
269
|
----------
|
|
254
270
|
subject : str
|
|
255
271
|
Subject identifier.
|
|
256
272
|
xfmname : str
|
|
257
|
-
|
|
273
|
+
Name of the transform to be created and stored in the database.
|
|
258
274
|
reference : str
|
|
259
|
-
Path to a nibabel-readable image that will be used as the reference for
|
|
260
|
-
Usually, this is a single (3D) functional data volume.
|
|
275
|
+
Path to a nibabel-readable image that will be used as the reference for
|
|
276
|
+
this transform. Usually, this is a single (3D) functional data volume.
|
|
261
277
|
noclean : bool, optional
|
|
262
|
-
If True intermediate files will not be removed from /tmp (this is useful
|
|
263
|
-
and the returned value will be the name of the
|
|
278
|
+
If True, intermediate files will not be removed from /tmp (this is useful
|
|
279
|
+
for debugging things), and the returned value will be the name of the
|
|
280
|
+
temp directory. Default False.
|
|
264
281
|
bbrtype : str, optional
|
|
265
282
|
The 'bbrtype' argument that is passed to FLIRT.
|
|
266
283
|
pre_flirt_args : str, optional
|
|
267
284
|
Additional arguments that are passed to the FLIRT pre-alignment step (not BBR).
|
|
268
|
-
use_fs_bbr : bool, optional
|
|
269
|
-
If True will use freesurfer bbregister instead of FSL BBR. (default, True)
|
|
270
|
-
epi_mask : bool, optional
|
|
271
|
-
If True, and use_fs_bbr is True, then the flag --epi-mask is passed to bbregister
|
|
272
|
-
to mask out areas with spatial distortions. This setting is to be used whenever
|
|
273
|
-
the reference was not distortion corrected.
|
|
274
|
-
intermediate : str
|
|
275
|
-
Path to a nibabel-readable image that will be used as intermediate for the alignment.
|
|
276
|
-
Usually, this is a single (3D) functional data volume.
|
|
277
285
|
|
|
278
286
|
Returns
|
|
279
287
|
-------
|
|
280
|
-
|
|
288
|
+
None or path to temp directory if `noclean` is True.
|
|
281
289
|
"""
|
|
282
|
-
warnings.warn("Defaults changed in pycortex 1.3. Now automatic alignment "
|
|
283
|
-
"uses Freesurfer's bbregister and mri_coreg for "
|
|
284
|
-
"initialization.")
|
|
285
|
-
import shlex
|
|
286
|
-
import shutil
|
|
287
|
-
import tempfile
|
|
288
|
-
import subprocess as sp
|
|
289
|
-
|
|
290
|
-
from .database import db
|
|
291
|
-
from .xfm import Transform
|
|
292
|
-
from .options import config
|
|
293
|
-
|
|
294
|
-
fsl_prefix = config.get("basic", "fsl_prefix")
|
|
295
|
-
schfile = os.path.join(os.path.split(os.path.abspath(__file__))[0], "bbr.sch")
|
|
296
|
-
|
|
297
290
|
retval = None
|
|
298
291
|
try:
|
|
299
292
|
cache = tempfile.mkdtemp()
|
|
300
293
|
absreference = os.path.abspath(reference)
|
|
294
|
+
fsl_prefix = config.get("basic", "fsl_prefix")
|
|
295
|
+
schfile = os.path.join(os.path.split(os.path.abspath(__file__))[0], "bbr.sch")
|
|
296
|
+
raw = db.get_anat(subject, type="raw").get_filename()
|
|
297
|
+
bet = db.get_anat(subject, type="brainmask").get_filename()
|
|
298
|
+
wmseg = db.get_anat(subject, type="whitematter").get_filename()
|
|
299
|
+
# Compute anatomical-to-epi transform
|
|
300
|
+
print("FLIRT pre-alignment")
|
|
301
|
+
cmd = (
|
|
302
|
+
"{fslpre}flirt -in {epi} -ref {bet} -dof 6 {pre_flirt_args} "
|
|
303
|
+
"-omat {cache}/init.mat"
|
|
304
|
+
)
|
|
305
|
+
cmd = cmd.format(
|
|
306
|
+
fslpre=fsl_prefix,
|
|
307
|
+
cache=cache,
|
|
308
|
+
epi=absreference,
|
|
309
|
+
bet=bet,
|
|
310
|
+
pre_flirt_args=pre_flirt_args,
|
|
311
|
+
)
|
|
312
|
+
if sp.call(cmd, shell=True) != 0:
|
|
313
|
+
raise IOError("Error calling initial FLIRT")
|
|
314
|
+
|
|
315
|
+
print("Running BBR")
|
|
316
|
+
# Run epi-to-anat transform (this is more stable than anat-to-epi in FSL!)
|
|
317
|
+
cmd = (
|
|
318
|
+
"{fslpre}flirt -in {epi} -ref {raw} -dof 6 -cost bbr -wmseg {wmseg} "
|
|
319
|
+
"-init {cache}/init.mat -omat {cache}/out.mat -schedule {schfile} "
|
|
320
|
+
"-bbrtype {bbrtype}"
|
|
321
|
+
)
|
|
322
|
+
cmd = cmd.format(
|
|
323
|
+
fslpre=fsl_prefix,
|
|
324
|
+
cache=cache,
|
|
325
|
+
raw=bet,
|
|
326
|
+
wmseg=wmseg,
|
|
327
|
+
epi=absreference,
|
|
328
|
+
schfile=schfile,
|
|
329
|
+
bbrtype=bbrtype,
|
|
330
|
+
)
|
|
331
|
+
if sp.call(cmd, shell=True) != 0:
|
|
332
|
+
raise IOError("Error calling BBR flirt")
|
|
301
333
|
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
cmd = cmd.format(sub=subject, absref=absreference, cache=cache)
|
|
310
|
-
|
|
311
|
-
if sp.call(cmd, shell=True) != 0:
|
|
312
|
-
raise IOError('Error calling freesurfer BBR!')
|
|
334
|
+
x = np.loadtxt(os.path.join(cache, "out.mat"))
|
|
335
|
+
# Pass transform as FROM epi TO anat; transform will be inverted
|
|
336
|
+
# back to anat-to-epi, standard direction for pycortex internal
|
|
337
|
+
# storage by from_fsl
|
|
338
|
+
xfm = Transform.from_fsl(x, absreference, raw)
|
|
339
|
+
xfm.save(subject, xfmname, "coord")
|
|
340
|
+
print("Success")
|
|
313
341
|
|
|
314
|
-
|
|
342
|
+
finally:
|
|
343
|
+
if not noclean:
|
|
344
|
+
shutil.rmtree(cache)
|
|
315
345
|
else:
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
wmseg = db.get_anat(subject, type='whitematter').get_filename()
|
|
319
|
-
#Compute anatomical-to-epi transform
|
|
320
|
-
print('FLIRT pre-alignment')
|
|
321
|
-
cmd = '{fslpre}flirt -in {epi} -ref {bet} -dof 6 {pre_flirt_args} -omat {cache}/init.mat'.format(
|
|
322
|
-
fslpre=fsl_prefix, cache=cache, epi=absreference, bet=bet, pre_flirt_args=pre_flirt_args)
|
|
323
|
-
if sp.call(cmd, shell=True) != 0:
|
|
324
|
-
raise IOError('Error calling initial FLIRT')
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
print('Running BBR')
|
|
328
|
-
# Run epi-to-anat transform (this is more stable than anat-to-epi in FSL!)
|
|
329
|
-
cmd = '{fslpre}flirt -in {epi} -ref {raw} -dof 6 -cost bbr -wmseg {wmseg} -init {cache}/init.mat -omat {cache}/out.mat -schedule {schfile} -bbrtype {bbrtype}'
|
|
330
|
-
cmd = cmd.format(fslpre=fsl_prefix, cache=cache, raw=bet, wmseg=wmseg, epi=absreference, schfile=schfile, bbrtype=bbrtype)
|
|
331
|
-
if sp.call(cmd, shell=True) != 0:
|
|
332
|
-
raise IOError('Error calling BBR flirt')
|
|
333
|
-
|
|
334
|
-
x = np.loadtxt(os.path.join(cache, "out.mat"))
|
|
335
|
-
# Pass transform as FROM epi TO anat; transform will be inverted
|
|
336
|
-
# back to anat-to-epi, standard direction for pycortex internal
|
|
337
|
-
# storage by from_fsl
|
|
338
|
-
xfm = Transform.from_fsl(x,absreference,raw)
|
|
346
|
+
retval = cache
|
|
347
|
+
return retval
|
|
339
348
|
|
|
340
|
-
# Save as pycortex 'coord' transform
|
|
341
|
-
xfm.save(subject,xfmname,'coord')
|
|
342
|
-
print('Success')
|
|
343
349
|
|
|
350
|
+
def automatic(
|
|
351
|
+
subject,
|
|
352
|
+
xfmname,
|
|
353
|
+
reference,
|
|
354
|
+
init="coreg",
|
|
355
|
+
epi_mask=False,
|
|
356
|
+
intermediate=None,
|
|
357
|
+
reference_contrast="t2",
|
|
358
|
+
noclean=False,
|
|
359
|
+
):
|
|
360
|
+
"""Perform automatic alignment using Freesurfer's boundary-based registration.
|
|
361
|
+
The `reference` image and resulting transform called `xfmname` will be automatically
|
|
362
|
+
stored in the database.
|
|
363
|
+
|
|
364
|
+
If `noclean` is set to True, intermediate files will not be removed from /tmp.
|
|
365
|
+
|
|
366
|
+
It's good practice to open up this transform afterward in the manual aligner and
|
|
367
|
+
check how it worked. Do that using the following code (passing the same `subject`
|
|
368
|
+
and `xfmname` used here, no need for `reference`):
|
|
369
|
+
|
|
370
|
+
> cortex.align.manual(subject, xfmname)
|
|
371
|
+
|
|
372
|
+
Parameters
|
|
373
|
+
----------
|
|
374
|
+
subject : str
|
|
375
|
+
Subject identifier.
|
|
376
|
+
xfmname : str
|
|
377
|
+
Name of the transform to be created and stored in the database.
|
|
378
|
+
reference : str
|
|
379
|
+
Path to a nibabel-readable image that will be used as the reference for
|
|
380
|
+
this transform. Usually, this is a single (3D) functional data volume.
|
|
381
|
+
init : str, optional
|
|
382
|
+
One of "coreg", "fsl", "header", or a path to a transform from the reference
|
|
383
|
+
volume to the anatomical volume.
|
|
384
|
+
Specifies the initialization method to obtain a first alignment that will be
|
|
385
|
+
refined with bbregister. Default is "coreg", which uses Freesurfer's `mri_coreg`
|
|
386
|
+
and it generally performs best. Other options include "fsl" to use FSL's FLIRT
|
|
387
|
+
or "header" to assume that the reference and the anatomical are already close
|
|
388
|
+
enough (this option can be used when the reference and the anatomical are
|
|
389
|
+
acquired in the same session). Finally, you can also specify a path to a
|
|
390
|
+
transform file (in DAT or LTA format) that will be used as initialization.
|
|
391
|
+
epi_mask : bool, optional
|
|
392
|
+
If True, then the flag --epi-mask is passed to bbregister to mask out areas
|
|
393
|
+
with spatial distortions. This setting recommended whenever the reference was
|
|
394
|
+
not distortion corrected.
|
|
395
|
+
intermediate : str
|
|
396
|
+
Path to a nibabel-readable image that will be used as intermediate volume
|
|
397
|
+
for alignment. This is useful if the reference image has a small field-of-view
|
|
398
|
+
and a whole-brain image was acquired in the same session.
|
|
399
|
+
reference_contrast : str
|
|
400
|
+
Contrast of the reference image. This is used to determine the appropriate
|
|
401
|
+
contrast for the reference image in the bbregister command. Default is "t2"
|
|
402
|
+
(for BOLD): gray matter is brighter than white matter.
|
|
403
|
+
The alternative option is "t1": white matter is brighter than gray matter.
|
|
404
|
+
noclean : bool, optional
|
|
405
|
+
If True, intermediate files will not be removed from /tmp (this is useful
|
|
406
|
+
for debugging things), and the returned value will be the name of the
|
|
407
|
+
temp directory. Default False.
|
|
408
|
+
|
|
409
|
+
Returns
|
|
410
|
+
-------
|
|
411
|
+
None or path to temp directory if `noclean` is True.
|
|
412
|
+
"""
|
|
413
|
+
warnings.warn(
|
|
414
|
+
"Defaults changed in pycortex 1.2.8. Now automatic alignment uses Freesurfer's "
|
|
415
|
+
"bbregister and mri_coreg for initialization. If you want to use FSL's BBR, "
|
|
416
|
+
"use the function `cortex.align.automatic_fsl` instead."
|
|
417
|
+
)
|
|
418
|
+
|
|
419
|
+
retval = None
|
|
420
|
+
try:
|
|
421
|
+
cache = tempfile.mkdtemp()
|
|
422
|
+
reference = os.path.abspath(reference)
|
|
423
|
+
print("Running freesurfer BBR")
|
|
424
|
+
# Start building the command
|
|
425
|
+
cmd = f"bbregister --s {subject} --mov {reference} --reg {cache}/register.dat "
|
|
426
|
+
cmd += f"--{reference_contrast}"
|
|
427
|
+
if init in ["coreg", "fsl", "header"]:
|
|
428
|
+
cmd += f" --init-{init}"
|
|
429
|
+
else:
|
|
430
|
+
init = os.path.abspath(init)
|
|
431
|
+
cmd += f" --init-reg {init}"
|
|
432
|
+
if epi_mask:
|
|
433
|
+
cmd += " --epi-mask"
|
|
434
|
+
if intermediate is not None:
|
|
435
|
+
intermediate = os.path.abspath(intermediate)
|
|
436
|
+
cmd += f" --int {intermediate}"
|
|
437
|
+
cmd = cmd.format(sub=subject, absref=reference, cache=cache)
|
|
438
|
+
|
|
439
|
+
if sp.call(cmd.split()) != 0:
|
|
440
|
+
raise IOError("Error calling freesurfer BBR!")
|
|
441
|
+
|
|
442
|
+
xfm = Transform.from_freesurfer(
|
|
443
|
+
os.path.join(cache, "register.dat"), reference, subject
|
|
444
|
+
)
|
|
445
|
+
# Save as pycortex 'coord' transform
|
|
446
|
+
xfm.save(subject, xfmname, "coord")
|
|
447
|
+
# Load mincost to provide some information
|
|
448
|
+
# The four values stored in .mincost are
|
|
449
|
+
# 1. quality of the registration (0 to 1, with 0 is perfect)
|
|
450
|
+
# 2. mean of WM just below the surface
|
|
451
|
+
# 3. mean of GM just above the surface
|
|
452
|
+
# 4. percent contrast
|
|
453
|
+
# https://surfer.nmr.mgh.harvard.edu/fswiki/MultiModalTutorialV6.0/MultiModalRegistration
|
|
454
|
+
# Let's return only the quality of the registration
|
|
455
|
+
mincost = np.loadtxt(os.path.join(cache, "register.dat.mincost"))
|
|
456
|
+
print(
|
|
457
|
+
f"bbregister finished with a mincost of {mincost[0]:.2f}\n"
|
|
458
|
+
"Values between 0 and 0.5 indicate a good registration.\n"
|
|
459
|
+
"But you should manually inspect the alignment anyway."
|
|
460
|
+
)
|
|
344
461
|
finally:
|
|
345
462
|
if not noclean:
|
|
346
463
|
shutil.rmtree(cache)
|
|
347
464
|
else:
|
|
348
465
|
retval = cache
|
|
349
|
-
|
|
350
466
|
return retval
|
|
351
467
|
|
|
468
|
+
|
|
352
469
|
def autotweak(subject, xfmname):
|
|
353
470
|
"""Tweak an alignment using the FLIRT boundary-based alignment (BBR) from FSL.
|
|
354
471
|
Ideally this function should actually use a limited search range, but it doesn't.
|
|
@@ -363,12 +480,12 @@ def autotweak(subject, xfmname):
|
|
|
363
480
|
"""
|
|
364
481
|
import shlex
|
|
365
482
|
import shutil
|
|
366
|
-
import tempfile
|
|
367
483
|
import subprocess as sp
|
|
484
|
+
import tempfile
|
|
368
485
|
|
|
369
486
|
from .database import db
|
|
370
|
-
from .xfm import Transform
|
|
371
487
|
from .options import config
|
|
488
|
+
from .xfm import Transform
|
|
372
489
|
|
|
373
490
|
fsl_prefix = config.get("basic", "fsl_prefix")
|
|
374
491
|
schfile = os.path.join(os.path.split(os.path.abspath(__file__))[0], "bbr.sch")
|
|
@@ -60,7 +60,7 @@ def _check_file_blender_version(fpath):
|
|
|
60
60
|
import struct
|
|
61
61
|
with open(fpath, mode='rb') as fid:
|
|
62
62
|
fid.seek(7)
|
|
63
|
-
bitness,
|
|
63
|
+
bitness, endianness, major, minor = struct.unpack("sss2s", fid.read(5))
|
|
64
64
|
return (int(major), int(minor))
|
|
65
65
|
|
|
66
66
|
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
"""
|
|
2
2
|
Contains a singleton object `db` of type `Database` which allows easy access to surface files, anatomical images, and transforms that are stored in the pycortex filestore.
|
|
3
3
|
"""
|
|
4
|
-
import os
|
|
5
|
-
import re
|
|
6
4
|
import copy
|
|
5
|
+
import functools
|
|
7
6
|
import glob
|
|
8
7
|
import json
|
|
8
|
+
import os
|
|
9
|
+
import re
|
|
9
10
|
import shutil
|
|
10
|
-
import warnings
|
|
11
11
|
import tempfile
|
|
12
|
-
import
|
|
13
|
-
import numpy as np
|
|
14
|
-
from hashlib import sha1
|
|
12
|
+
import warnings
|
|
15
13
|
from builtins import input
|
|
14
|
+
from hashlib import sha1
|
|
15
|
+
|
|
16
|
+
import numpy as np
|
|
16
17
|
|
|
17
18
|
from . import options
|
|
18
19
|
|
|
@@ -104,7 +105,8 @@ class XfmDB(object):
|
|
|
104
105
|
raise AttributeError
|
|
105
106
|
|
|
106
107
|
def __repr__(self):
|
|
107
|
-
|
|
108
|
+
xfms = "\n".join(sorted(self.xfms))
|
|
109
|
+
return f"Available transforms for {self.subject}:\n{xfms}"
|
|
108
110
|
|
|
109
111
|
class XfmSet(object):
|
|
110
112
|
def __init__(self, subj, name, filestore=default_filestore):
|
|
@@ -177,6 +179,7 @@ class Database(object):
|
|
|
177
179
|
return self._subjects
|
|
178
180
|
subjs = os.listdir(os.path.join(self.filestore))
|
|
179
181
|
subjs = [s for s in subjs if os.path.isdir(os.path.join(self.filestore, s))]
|
|
182
|
+
subjs = sorted(subjs)
|
|
180
183
|
self._subjects = dict([(sname, SubjectDB(sname, filestore=self.filestore)) for sname in subjs])
|
|
181
184
|
return self._subjects
|
|
182
185
|
|
|
@@ -225,7 +228,7 @@ class Database(object):
|
|
|
225
228
|
return volume.anat2epispace(anatnib.get_fdata().T.astype(float), subject, xfmname, order=order)
|
|
226
229
|
|
|
227
230
|
def get_surfinfo(self, subject, type="curvature", recache=False, **kwargs):
|
|
228
|
-
"""Return
|
|
231
|
+
"""Return auxiliary surface information from the filestore. Surface info is defined as
|
|
229
232
|
anatomical information specific to a subject in surface space. A Vertex class will be returned
|
|
230
233
|
as necessary. Info not found in the filestore will be automatically generated.
|
|
231
234
|
|
|
@@ -318,8 +321,12 @@ class Database(object):
|
|
|
318
321
|
from .utils import load_sparse_array, save_sparse_array
|
|
319
322
|
if fs_subj is None:
|
|
320
323
|
fs_subj = subject
|
|
321
|
-
fpath = self.get_paths(subject)['surf2surf'].format(
|
|
322
|
-
|
|
324
|
+
fpath = self.get_paths(subject)['surf2surf'].format(
|
|
325
|
+
source=fs_subj,
|
|
326
|
+
target=target_subj,
|
|
327
|
+
surface_type=surface_type
|
|
328
|
+
)
|
|
329
|
+
# Backward compatibility
|
|
323
330
|
fdir, _ = os.path.split(fpath)
|
|
324
331
|
if not os.path.exists(fdir):
|
|
325
332
|
print("Creating surf2surf directory for subject %s"%(subject))
|
|
@@ -344,7 +351,7 @@ class Database(object):
|
|
|
344
351
|
pts, polys = self.get_surf(subject, "flat", merge=True, nudge=True)
|
|
345
352
|
|
|
346
353
|
paths = self.get_paths(subject)
|
|
347
|
-
# NOTE: This try loop is broken, in that it does nothing for the
|
|
354
|
+
# NOTE: This try loop is broken, in that it does nothing for the intended
|
|
348
355
|
# use case (loading an overlay from a packed subject) - needs fixing.
|
|
349
356
|
# This hasn't come up yet due to very rare use of packed subjects.
|
|
350
357
|
if self.auxfile is not None:
|
|
@@ -686,7 +693,7 @@ class Database(object):
|
|
|
686
693
|
rois=os.path.join(self.filestore, subject, "rois.svg").format(subj=subject),
|
|
687
694
|
overlays=os.path.join(self.filestore, subject, "overlays.svg").format(subj=subject),
|
|
688
695
|
views=sorted([os.path.splitext(f)[0] for f in views]),
|
|
689
|
-
surf2surf=os.path.join(self.filestore, subject, "surf2surf", "{source}_to_{target}", "
|
|
696
|
+
surf2surf=os.path.join(self.filestore, subject, "surf2surf", "{source}_to_{target}", "matrices_{surface_type}.hdf"),
|
|
690
697
|
)
|
|
691
698
|
|
|
692
699
|
return filenames
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import hashlib
|
|
2
2
|
from copy import deepcopy
|
|
3
|
-
|
|
3
|
+
|
|
4
4
|
import h5py
|
|
5
|
+
import numpy as np
|
|
5
6
|
|
|
6
7
|
from ..database import db
|
|
7
8
|
|
|
9
|
+
|
|
8
10
|
class BrainData(object):
|
|
9
11
|
"""
|
|
10
12
|
Abstract base class for brain data.
|
|
@@ -592,9 +594,10 @@ class VertexData(BrainData):
|
|
|
592
594
|
|
|
593
595
|
|
|
594
596
|
def _find_mask(nvox, subject, xfmname):
|
|
597
|
+
import glob
|
|
595
598
|
import os
|
|
596
599
|
import re
|
|
597
|
-
|
|
600
|
+
|
|
598
601
|
import nibabel
|
|
599
602
|
files = db.get_paths(subject)['masks'].format(xfmname=xfmname, type="*")
|
|
600
603
|
for fname in glob.glob(files):
|
|
@@ -602,7 +605,7 @@ def _find_mask(nvox, subject, xfmname):
|
|
|
602
605
|
mask = nib.get_fdata().T != 0
|
|
603
606
|
if nvox == np.sum(mask):
|
|
604
607
|
fname = os.path.split(fname)[1]
|
|
605
|
-
name = re.compile(r'mask_(
|
|
608
|
+
name = re.compile(r'mask_(.+).nii.gz').search(fname)
|
|
606
609
|
return name.group(1), mask
|
|
607
610
|
|
|
608
611
|
raise ValueError('Cannot find a valid mask')
|
|
@@ -179,7 +179,7 @@ class VolumeRGB(DataviewRGB):
|
|
|
179
179
|
Use the same vmin and vmax for all three color channels?
|
|
180
180
|
shared_vmin : float, optional
|
|
181
181
|
Predetermined shared vmin. Does nothing if shared_range == False. If not given,
|
|
182
|
-
will be the 1st
|
|
182
|
+
will be the 1st percentile of all values across all three channels.
|
|
183
183
|
shared_vmax : float, optional
|
|
184
184
|
Predetermined shared vmax. Does nothing if shared_range == False. If not given,
|
|
185
185
|
will be the 99th percentile of all values across all three channels
|
|
@@ -1,14 +1,23 @@
|
|
|
1
|
-
import os
|
|
2
1
|
import glob
|
|
3
2
|
import json
|
|
3
|
+
import os
|
|
4
|
+
|
|
4
5
|
import h5py
|
|
5
6
|
import numpy as np
|
|
6
7
|
|
|
7
8
|
from .. import options
|
|
8
|
-
from .braindata import BrainData,
|
|
9
|
+
from .braindata import BrainData, VertexData, VolumeData
|
|
9
10
|
|
|
10
11
|
default_cmap = options.config.get("basic", "default_cmap")
|
|
11
12
|
|
|
13
|
+
# register_cmap is deprecated in matplotlib > 3.7.0 and replaced by colormaps.register
|
|
14
|
+
try:
|
|
15
|
+
from matplotlib import colormaps as cm
|
|
16
|
+
def register_cmap(cmap):
|
|
17
|
+
return cm.register(cmap)
|
|
18
|
+
except ImportError:
|
|
19
|
+
from matplotlib.cm import register_cmap
|
|
20
|
+
|
|
12
21
|
|
|
13
22
|
def normalize(data):
|
|
14
23
|
if isinstance(data, tuple):
|
|
@@ -193,7 +202,8 @@ class Dataview(object):
|
|
|
193
202
|
def get_cmapdict(self):
|
|
194
203
|
"""Returns a dictionary with cmap information."""
|
|
195
204
|
|
|
196
|
-
from matplotlib import colors
|
|
205
|
+
from matplotlib import colors
|
|
206
|
+
from matplotlib import pyplot as plt
|
|
197
207
|
|
|
198
208
|
try:
|
|
199
209
|
# plt.get_cmap accepts:
|
|
@@ -206,18 +216,19 @@ class Dataview(object):
|
|
|
206
216
|
cmapdir = options.config.get('webgl', 'colormaps')
|
|
207
217
|
colormaps = glob.glob(os.path.join(cmapdir, "*.png"))
|
|
208
218
|
colormaps = dict(((os.path.split(c)[1][:-4], c) for c in colormaps))
|
|
209
|
-
if
|
|
219
|
+
if self.cmap not in colormaps:
|
|
210
220
|
raise ValueError('Unkown color map %s' % self.cmap)
|
|
211
221
|
I = plt.imread(colormaps[self.cmap])
|
|
212
|
-
|
|
222
|
+
name = self.cmap if isinstance(self.cmap, str) else self.cmap.name
|
|
223
|
+
cmap = colors.ListedColormap(np.squeeze(I), name=name)
|
|
213
224
|
# Register colormap to matplotlib to avoid loading it again
|
|
214
|
-
|
|
225
|
+
register_cmap(cmap)
|
|
215
226
|
|
|
216
227
|
return dict(cmap=cmap, vmin=self.vmin, vmax=self.vmax)
|
|
217
228
|
|
|
218
229
|
@property
|
|
219
230
|
def raw(self):
|
|
220
|
-
from matplotlib import
|
|
231
|
+
from matplotlib import cm, colors
|
|
221
232
|
|
|
222
233
|
cmap = self.get_cmapdict()['cmap']
|
|
223
234
|
# Normalize colors according to vmin, vmax
|
|
@@ -398,5 +409,5 @@ def u(s, encoding='utf8'):
|
|
|
398
409
|
return s
|
|
399
410
|
|
|
400
411
|
|
|
401
|
-
from .viewRGB import
|
|
402
|
-
from .view2D import
|
|
412
|
+
from .viewRGB import Colors, VertexRGB, VolumeRGB
|
|
413
|
+
from .view2D import Vertex2D, Volume2D
|