diff --git a/.buildinfo b/.buildinfo index dfc8a79db..888e5c3fa 100644 --- a/.buildinfo +++ b/.buildinfo @@ -1,4 +1,4 @@ # Sphinx build info version 1 # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. -config: 13b17c5c373045c1725623acad9b96b1 +config: 0e5232a893a37e47ccfdc6e2362e71ce tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/_downloads/0171ca85d45eca4cef1870c2e499de10/plot_make_gif.ipynb b/_downloads/0171ca85d45eca4cef1870c2e499de10/plot_make_gif.ipynb index 99d239e2e..dffa0d196 100644 --- a/_downloads/0171ca85d45eca4cef1870c2e499de10/plot_make_gif.ipynb +++ b/_downloads/0171ca85d45eca4cef1870c2e499de10/plot_make_gif.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -125,7 +114,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/03727e1a4b42addea2598e45140498aa/static_with_custom_template.ipynb b/_downloads/03727e1a4b42addea2598e45140498aa/static_with_custom_template.ipynb index 88cc5ca81..280219022 100644 --- a/_downloads/03727e1a4b42addea2598e45140498aa/static_with_custom_template.ipynb +++ b/_downloads/03727e1a4b42addea2598e45140498aa/static_with_custom_template.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip b/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip index 4a86a80ba..0c756d864 100644 Binary files a/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip and b/_downloads/07fcc19ba03226cd3d83d4e40ec44385/auto_examples_python.zip differ diff --git a/_downloads/09288dd002fd14fba94fc085d758d914/plot_roi_voxel_index_volume.ipynb b/_downloads/09288dd002fd14fba94fc085d758d914/plot_roi_voxel_index_volume.ipynb index 02d74e73f..091daf5b5 100644 --- a/_downloads/09288dd002fd14fba94fc085d758d914/plot_roi_voxel_index_volume.ipynb +++ b/_downloads/09288dd002fd14fba94fc085d758d914/plot_roi_voxel_index_volume.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/0f8be1e4c7dbdc2b5c70b92872c6b4bf/multiple_datasets.ipynb b/_downloads/0f8be1e4c7dbdc2b5c70b92872c6b4bf/multiple_datasets.ipynb index 7bd3b0136..dc5ce6dc0 100644 --- a/_downloads/0f8be1e4c7dbdc2b5c70b92872c6b4bf/multiple_datasets.ipynb +++ b/_downloads/0f8be1e4c7dbdc2b5c70b92872c6b4bf/multiple_datasets.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/123c014fb1951d73e7b1f19570a43c66/plot_get_roi_vertices.ipynb b/_downloads/123c014fb1951d73e7b1f19570a43c66/plot_get_roi_vertices.ipynb index 7ceab5003..c5635fb44 100644 --- a/_downloads/123c014fb1951d73e7b1f19570a43c66/plot_get_roi_vertices.ipynb +++ b/_downloads/123c014fb1951d73e7b1f19570a43c66/plot_get_roi_vertices.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/1bc319bfa2fe17d7880c31c36c39b670/plot_thickness_nanmean.ipynb b/_downloads/1bc319bfa2fe17d7880c31c36c39b670/plot_thickness_nanmean.ipynb index e2f0f021a..53082745f 100644 --- a/_downloads/1bc319bfa2fe17d7880c31c36c39b670/plot_thickness_nanmean.ipynb +++ b/_downloads/1bc319bfa2fe17d7880c31c36c39b670/plot_thickness_nanmean.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/2adc80653ddc362ff5e8f800f300132f/subject_to_mni.py b/_downloads/2adc80653ddc362ff5e8f800f300132f/subject_to_mni.py index c35f02a7a..73c93b735 100644 --- a/_downloads/2adc80653ddc362ff5e8f800f300132f/subject_to_mni.py +++ b/_downloads/2adc80653ddc362ff5e8f800f300132f/subject_to_mni.py @@ -32,7 +32,7 @@ mni_data = mni.transform_to_mni(data, s1_to_mni) # mni_data is a nibabel Nifti1Image -mni_data_vol = mni_data.get_data() # the actual array, shape=(182,218,182) +mni_data_vol = mni_data.get_fdata() # the actual array, shape=(182,218,182) # That was the manual method. pycortex can also cache these transforms for you # if you get them using the pycortex database diff --git a/_downloads/2b386e6cf21fd3a3a1c01882f5073cd7/mni_to_subject.py b/_downloads/2b386e6cf21fd3a3a1c01882f5073cd7/mni_to_subject.py index 10fd20133..1650920ba 100644 --- a/_downloads/2b386e6cf21fd3a3a1c01882f5073cd7/mni_to_subject.py +++ b/_downloads/2b386e6cf21fd3a3a1c01882f5073cd7/mni_to_subject.py @@ -37,7 +37,7 @@ data.data, s1_to_mni) # subject_data is a nibabel Nifti1Image -subject_data_vol = mni_data.get_data() # the actual array, shape=(100,100,31) +subject_data_vol = mni_data.get_fdata() # the actual array, shape=(100,100,31) # That was the manual method. pycortex can also cache these transforms for you # if you get them using the pycortex database diff --git a/_downloads/2c1d4ccc800c14e88c119609426fa416/plot_geodesic_path.py b/_downloads/2c1d4ccc800c14e88c119609426fa416/plot_geodesic_path.py index 2bea6ff50..e70c60775 100644 --- a/_downloads/2c1d4ccc800c14e88c119609426fa416/plot_geodesic_path.py +++ b/_downloads/2c1d4ccc800c14e88c119609426fa416/plot_geodesic_path.py @@ -24,6 +24,8 @@ surfs = [cortex.polyutils.Surface(*d) for d in cortex.db.get_surf(subject, "fiducial")] numl = surfs[0].pts.shape[0] +numr = surfs[1].pts.shape[0] +num_vertices = numl + numr # Now we need to pick the start and end points of the line we will draw pt_a = 100 @@ -33,12 +35,12 @@ path = surfs[0].geodesic_path(pt_a, pt_b) # In order to plot this on the cortical surface, we need an array that is the -# same size as the number of vertices in the left hemisphere -path_data = np.zeros(numl) +# same size as the number of vertices +path_data = np.zeros(num_vertices) * np.nan for v in path: path_data[v] = 1 # And now plot these distances onto the cortical surface -path_verts = cortex.Vertex(path_data, subject, cmap="Blues_r") -cortex.quickshow(path_verts, with_colorbar=False) +path_verts = cortex.Vertex(path_data, subject, cmap="Reds", vmin=0, vmax=1) +cortex.quickshow(path_verts, with_colorbar=False, with_curvature=True) plt.show() diff --git a/_downloads/344a9c20fa2e5b85144a3143c290594a/static.ipynb b/_downloads/344a9c20fa2e5b85144a3143c290594a/static.ipynb index 783b1a889..bd3c91e49 100644 --- a/_downloads/344a9c20fa2e5b85144a3143c290594a/static.ipynb +++ b/_downloads/344a9c20fa2e5b85144a3143c290594a/static.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/34bc427b5d07c6d8727ed358794c8cc9/plot_voxel_distance_from_surface.ipynb b/_downloads/34bc427b5d07c6d8727ed358794c8cc9/plot_voxel_distance_from_surface.ipynb index b5cc89c1d..bf3b4dd06 100644 --- a/_downloads/34bc427b5d07c6d8727ed358794c8cc9/plot_voxel_distance_from_surface.ipynb +++ b/_downloads/34bc427b5d07c6d8727ed358794c8cc9/plot_voxel_distance_from_surface.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/387ca9e74b721456c024802f5fb1210c/plot_subsurfaces.ipynb b/_downloads/387ca9e74b721456c024802f5fb1210c/plot_subsurfaces.ipynb index 362e2214f..4201e184b 100644 --- a/_downloads/387ca9e74b721456c024802f5fb1210c/plot_subsurfaces.ipynb +++ b/_downloads/387ca9e74b721456c024802f5fb1210c/plot_subsurfaces.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -143,7 +132,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/38bd34ef15da8508933ae951daa9dfc6/plot_dropout.ipynb b/_downloads/38bd34ef15da8508933ae951daa9dfc6/plot_dropout.ipynb index beadbe64f..32d688b3e 100644 --- a/_downloads/38bd34ef15da8508933ae951daa9dfc6/plot_dropout.ipynb +++ b/_downloads/38bd34ef15da8508933ae951daa9dfc6/plot_dropout.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/3a293f5fef99cd1b3cbd8e7036b48449/plot_roi_voxel_mask.ipynb b/_downloads/3a293f5fef99cd1b3cbd8e7036b48449/plot_roi_voxel_mask.ipynb index 20d52bfa3..0de064e2d 100644 --- a/_downloads/3a293f5fef99cd1b3cbd8e7036b48449/plot_roi_voxel_mask.ipynb +++ b/_downloads/3a293f5fef99cd1b3cbd8e7036b48449/plot_roi_voxel_mask.ipynb @@ -1,21 +1,10 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Get ROI Voxel Mask\n\nGet proportion of each voxel that exists within a named ROI (this \nconstitutes a probability map for the ROI, with values ranging from\n0-1). Plot this probablistic roi mask onto a flatmap. \n\nIn order for this to work, the specified ROI must exist in the\noverlays.svg file in the pycortex filestore for this subject.\n" + "\n# Get ROI Voxel Mask\n\nGet proportion of each voxel that exists within a named ROI (this \nconstitutes a probability map for the ROI, with values ranging from\n0-1). Plot this probabilistic roi mask onto a flatmap. \n\nIn order for this to work, the specified ROI must exist in the\noverlays.svg file in the pycortex filestore for this subject.\n" ] }, { @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "import cortex\nimport matplotlib.pyplot as plt\n\nsubject = \"S1\"\nxfm = \"fullhead\"\nroi = \"EBA\"\n\n# Get the map of which voxels are inside of our ROI\nroi_masks = cortex.utils.get_roi_masks(subject, xfm, \n roi_list=[roi],\n gm_sampler='cortical-conservative', # Select only voxels mostly within cortex\n split_lr=False, # No separate left/right ROIs\n threshold=None, # Leave roi mask values as probabilites / fractions\n return_dict=True\n )\n\n# Plot the mask for one ROI onto a flatmap\nroi_data = cortex.Volume(roi_masks[roi], subject, xfm, \n vmin=0, # This is a probability mask, so only\n vmax=1, # so scale btw zero and one\n cmap=\"inferno\", # For pretty\n )\n\ncortex.quickflat.make_figure(roi_data,\n thick=1, # select a single depth (btw white matter & pia)\n sampler='nearest', # no interpolation\n with_curvature=True,\n with_colorbar=True,\n )\n\nplt.show()" + "import cortex\nimport matplotlib.pyplot as plt\n\nsubject = \"S1\"\nxfm = \"fullhead\"\nroi = \"EBA\"\n\n# Get the map of which voxels are inside of our ROI\nroi_masks = cortex.utils.get_roi_masks(subject, xfm, \n roi_list=[roi],\n gm_sampler='cortical-conservative', # Select only voxels mostly within cortex\n split_lr=False, # No separate left/right ROIs\n threshold=None, # Leave roi mask values as probabilities / fractions\n return_dict=True\n )\n\n# Plot the mask for one ROI onto a flatmap\nroi_data = cortex.Volume(roi_masks[roi], subject, xfm, \n vmin=0, # This is a probability mask, so only\n vmax=1, # so scale btw zero and one\n cmap=\"inferno\", # For pretty\n )\n\ncortex.quickflat.make_figure(roi_data,\n thick=1, # select a single depth (btw white matter & pia)\n sampler='nearest', # no interpolation\n with_curvature=True,\n with_colorbar=True,\n )\n\nplt.show()" ] } ], @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/3dca224e23400dbb33007465a7b359a6/plot_connected_vertices.ipynb b/_downloads/3dca224e23400dbb33007465a7b359a6/plot_connected_vertices.ipynb index 14b5f117b..3f936201d 100644 --- a/_downloads/3dca224e23400dbb33007465a7b359a6/plot_connected_vertices.ipynb +++ b/_downloads/3dca224e23400dbb33007465a7b359a6/plot_connected_vertices.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/42acd7dd246f3d3b2522140c0edb86ef/retinotopy_webgl.ipynb b/_downloads/42acd7dd246f3d3b2522140c0edb86ef/retinotopy_webgl.ipynb index 850be8134..0f081b769 100644 --- a/_downloads/42acd7dd246f3d3b2522140c0edb86ef/retinotopy_webgl.ipynb +++ b/_downloads/42acd7dd246f3d3b2522140c0edb86ef/retinotopy_webgl.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "import cortex\ntry: # python 2\n from urllib import urlretrieve\nexcept ImportError: # python 3\n from urllib.request import urlretrieve\n\n\n# Download and load in retinotopy data\n_ = urlretrieve(\"http://gallantlab.org/pycortex/S1_retinotopy.hdf\",\n \"S1_retinotopy.hdf\")\nret_data = cortex.load(\"S1_retinotopy.hdf\")\n\n# Open the webviewer\ncortex.webshow(ret_data)" + "import cortex\nfrom urllib.request import urlretrieve\n\n\n# Download and load in retinotopy data\n_ = urlretrieve(\n \"https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf\", \n \"S1_retinotopy.hdf\"\n)\nret_data = cortex.load(\"S1_retinotopy.hdf\")\n\n# Open the webviewer\ncortex.webshow(ret_data)" ] } ], @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/52e9abd80b9e9d8a38724eb135ea1ab6/multi_panels_plots.ipynb b/_downloads/52e9abd80b9e9d8a38724eb135ea1ab6/multi_panels_plots.ipynb index 1b2e138fe..62aa4c878 100644 --- a/_downloads/52e9abd80b9e9d8a38724eb135ea1ab6/multi_panels_plots.ipynb +++ b/_downloads/52e9abd80b9e9d8a38724eb135ea1ab6/multi_panels_plots.ipynb @@ -1,21 +1,10 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Multi-panels figures\n\nThe function `cortex.export.plot_panels` plots a number of 3d views of a given\nvolume, in the same matplotlib figure. It does that by saving a temporary image\nfor each view, and then aggregating them in the same figure.\n\nThe function needs to be run on a system with a display, since it will launch\na webgl viewer. The best way to get the expected results is to keep the webgl\nviewer visible during the process.\n\nThe selection of views and the aggregation is controled by a list of \"panels\".\nExamples of panels can be imported with:\n\n from cortex.export import params_flatmap_lateral_medial\n from cortex.export import params_occipital_triple_view\n" + "\n# Multi-panels figures\n\nThe function `cortex.export.plot_panels` plots a number of 3d views of a given\nvolume, in the same matplotlib figure. It does that by saving a temporary image\nfor each view, and then aggregating them in the same figure.\n\nThe function needs to be run on a system with a display, since it will launch\na webgl viewer. The best way to get the expected results is to keep the webgl\nviewer visible during the process.\n\nThe selection of views and the aggregation is controlled by a list of \"panels\".\nExamples of panels can be imported with:\n\n from cortex.export import params_flatmap_lateral_medial\n from cortex.export import params_occipital_triple_view\n" ] }, { @@ -118,7 +107,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/55ff50ca9850387e3d30490b06ab18eb/multi_panels_plots.py b/_downloads/55ff50ca9850387e3d30490b06ab18eb/multi_panels_plots.py index 037de9f7c..87a544b90 100644 --- a/_downloads/55ff50ca9850387e3d30490b06ab18eb/multi_panels_plots.py +++ b/_downloads/55ff50ca9850387e3d30490b06ab18eb/multi_panels_plots.py @@ -11,7 +11,7 @@ a webgl viewer. The best way to get the expected results is to keep the webgl viewer visible during the process. -The selection of views and the aggregation is controled by a list of "panels". +The selection of views and the aggregation is controlled by a list of "panels". Examples of panels can be imported with: from cortex.export import params_flatmap_lateral_medial diff --git a/_downloads/56b9122102ee96a8240f7eef88bfd884/plot_roi_voxel_mask.py b/_downloads/56b9122102ee96a8240f7eef88bfd884/plot_roi_voxel_mask.py index 32cf50904..b0747167b 100644 --- a/_downloads/56b9122102ee96a8240f7eef88bfd884/plot_roi_voxel_mask.py +++ b/_downloads/56b9122102ee96a8240f7eef88bfd884/plot_roi_voxel_mask.py @@ -5,7 +5,7 @@ Get proportion of each voxel that exists within a named ROI (this constitutes a probability map for the ROI, with values ranging from -0-1). Plot this probablistic roi mask onto a flatmap. +0-1). Plot this probabilistic roi mask onto a flatmap. In order for this to work, the specified ROI must exist in the overlays.svg file in the pycortex filestore for this subject. @@ -23,7 +23,7 @@ roi_list=[roi], gm_sampler='cortical-conservative', # Select only voxels mostly within cortex split_lr=False, # No separate left/right ROIs - threshold=None, # Leave roi mask values as probabilites / fractions + threshold=None, # Leave roi mask values as probabilities / fractions return_dict=True ) diff --git a/_downloads/598490201234cf5d8e4a3f5a8dc8c372/plot_retinotopy_flatmap.ipynb b/_downloads/598490201234cf5d8e4a3f5a8dc8c372/plot_retinotopy_flatmap.ipynb index 519c5d89f..ee5ff2d3d 100644 --- a/_downloads/598490201234cf5d8e4a3f5a8dc8c372/plot_retinotopy_flatmap.ipynb +++ b/_downloads/598490201234cf5d8e4a3f5a8dc8c372/plot_retinotopy_flatmap.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "import six\nimport cortex\nimport matplotlib.pyplot as plt\nif six.PY2:\n from urllib import urlretrieve\nelif six.PY3:\n from urllib.request import urlretrieve\n\n\n# Download the dataset and load it\n_ = urlretrieve(\"http://gallantlab.org/pycortex/S1_retinotopy.hdf\",\n \"S1_retinotopy.hdf\")\nret_data = cortex.load(\"S1_retinotopy.hdf\")\n\n# The retinotopy data has to be divided into left and right hemispheres\nleft_data = ret_data.angle_left\ncortex.quickshow(left_data, with_curvature=True, \n\t\t\t\t\t\t\tcurvature_contrast=0.5, \n\t\t\t\t\t\t\tcurvature_brightness=0.5, \n\t\t\t\t\t\t\tcurvature_threshold=True)\nplt.show()\n\nright_data = ret_data.angle_right\ncortex.quickshow(right_data, with_curvature=True, \n\t\t\t\t\t\t\t curvature_contrast=0.5, \n\t\t\t\t\t\t\t curvature_brightness=0.5, \n\t\t\t\t\t\t\t curvature_threshold=True)\nplt.show()" + "import cortex\nimport matplotlib.pyplot as plt\nfrom urllib.request import urlretrieve\n\n\n# Download the dataset and load it\n_ = urlretrieve(\n \"https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf\", \n \"S1_retinotopy.hdf\"\n)\nret_data = cortex.load(\"S1_retinotopy.hdf\")\n\n# The retinotopy data has to be divided into left and right hemispheres\nleft_data = ret_data.angle_left\ncortex.quickshow(left_data, with_curvature=True, \n\t\t\t\t\t\t\tcurvature_contrast=0.5, \n\t\t\t\t\t\t\tcurvature_brightness=0.5, \n\t\t\t\t\t\t\tcurvature_threshold=True)\nplt.show()\n\nright_data = ret_data.angle_right\ncortex.quickshow(right_data, with_curvature=True, \n\t\t\t\t\t\t\t curvature_contrast=0.5, \n\t\t\t\t\t\t\t curvature_brightness=0.5, \n\t\t\t\t\t\t\t curvature_threshold=True)\nplt.show()" ] } ], @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/5bd5d1eeadaf8c455dfa68ed54b8beaf/plot_make_figure.ipynb b/_downloads/5bd5d1eeadaf8c455dfa68ed54b8beaf/plot_make_figure.ipynb index ef2270e44..490bd83a6 100644 --- a/_downloads/5bd5d1eeadaf8c455dfa68ed54b8beaf/plot_make_figure.ipynb +++ b/_downloads/5bd5d1eeadaf8c455dfa68ed54b8beaf/plot_make_figure.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/5df5411f55d86f3318a24a2deffe16fe/plot_retinotopy_flatmap.py b/_downloads/5df5411f55d86f3318a24a2deffe16fe/plot_retinotopy_flatmap.py index 66145685f..332b642e7 100644 --- a/_downloads/5df5411f55d86f3318a24a2deffe16fe/plot_retinotopy_flatmap.py +++ b/_downloads/5df5411f55d86f3318a24a2deffe16fe/plot_retinotopy_flatmap.py @@ -9,24 +9,22 @@ command that is included. -.. _dataset: http://gallantlab.org/pycortex/S1_retinotopy.hdf +.. _dataset: https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf S1 is the example subject that comes with pycortex, but if you want to plot data onto a different subject, you will need to have them in your filestore, and you will also need a flatmap for them. """ -import six import cortex import matplotlib.pyplot as plt -if six.PY2: - from urllib import urlretrieve -elif six.PY3: - from urllib.request import urlretrieve +from urllib.request import urlretrieve # Download the dataset and load it -_ = urlretrieve("http://gallantlab.org/pycortex/S1_retinotopy.hdf", - "S1_retinotopy.hdf") +_ = urlretrieve( + "https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf", + "S1_retinotopy.hdf" +) ret_data = cortex.load("S1_retinotopy.hdf") # The retinotopy data has to be divided into left and right hemispheres diff --git a/_downloads/5ec582772cb6c68c66aedc35da2aec38/show_config.ipynb b/_downloads/5ec582772cb6c68c66aedc35da2aec38/show_config.ipynb index 6c8e30a76..ace4a5462 100644 --- a/_downloads/5ec582772cb6c68c66aedc35da2aec38/show_config.ipynb +++ b/_downloads/5ec582772cb6c68c66aedc35da2aec38/show_config.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -118,7 +107,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/5eeaabd38fb75e278bcc70a86663c196/subject_to_mni.ipynb b/_downloads/5eeaabd38fb75e278bcc70a86663c196/subject_to_mni.ipynb index 8dc3ba81f..d94c4c1a7 100644 --- a/_downloads/5eeaabd38fb75e278bcc70a86663c196/subject_to_mni.ipynb +++ b/_downloads/5eeaabd38fb75e278bcc70a86663c196/subject_to_mni.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "import cortex\n\n# First let's do this \"manually\", using cortex.mni\nfrom cortex import mni\n\nimport numpy as np\nnp.random.seed(1234)\n\n# This transform is gonna be from one specific functional space for a subject\n# which is defined by the transform (xfm)\ns1_to_mni = mni.compute_mni_transform(subject='S1', xfm='fullhead')\n# s1_to_mni is a 4x4 array describing the transformation in homogeneous corods\n\n# Transform data from subject to MNI space\n# first we will create a dataset to transform\ndata = cortex.Volume.random('S1', 'fullhead')\n\n# then transform it!\nmni_data = mni.transform_to_mni(data, s1_to_mni)\n# mni_data is a nibabel Nifti1Image\n\nmni_data_vol = mni_data.get_data() # the actual array, shape=(182,218,182)\n\n# That was the manual method. pycortex can also cache these transforms for you\n# if you get them using the pycortex database\ns1_to_mni_db = cortex.db.get_mnixfm('S1', 'fullhead')\n# this is the same as s1_to_mni, but will return instantly on subsequent calls" + "import cortex\n\n# First let's do this \"manually\", using cortex.mni\nfrom cortex import mni\n\nimport numpy as np\nnp.random.seed(1234)\n\n# This transform is gonna be from one specific functional space for a subject\n# which is defined by the transform (xfm)\ns1_to_mni = mni.compute_mni_transform(subject='S1', xfm='fullhead')\n# s1_to_mni is a 4x4 array describing the transformation in homogeneous corods\n\n# Transform data from subject to MNI space\n# first we will create a dataset to transform\ndata = cortex.Volume.random('S1', 'fullhead')\n\n# then transform it!\nmni_data = mni.transform_to_mni(data, s1_to_mni)\n# mni_data is a nibabel Nifti1Image\n\nmni_data_vol = mni_data.get_fdata() # the actual array, shape=(182,218,182)\n\n# That was the manual method. pycortex can also cache these transforms for you\n# if you get them using the pycortex database\ns1_to_mni_db = cortex.db.get_mnixfm('S1', 'fullhead')\n# this is the same as s1_to_mni, but will return instantly on subsequent calls" ] } ], @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/5f330fb3660509634926cd0332d7cbc6/plot_vertex.ipynb b/_downloads/5f330fb3660509634926cd0332d7cbc6/plot_vertex.ipynb index d3b932661..32817d081 100644 --- a/_downloads/5f330fb3660509634926cd0332d7cbc6/plot_vertex.ipynb +++ b/_downloads/5f330fb3660509634926cd0332d7cbc6/plot_vertex.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/6346ec4b05719b3c67f1d74a7c94ee9d/plot_rois.ipynb b/_downloads/6346ec4b05719b3c67f1d74a7c94ee9d/plot_rois.ipynb index 3b16fd994..bc5823014 100644 --- a/_downloads/6346ec4b05719b3c67f1d74a7c94ee9d/plot_rois.ipynb +++ b/_downloads/6346ec4b05719b3c67f1d74a7c94ee9d/plot_rois.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/638db29a2498956b03e341d19f7c71df/plot_interpolate_data.ipynb b/_downloads/638db29a2498956b03e341d19f7c71df/plot_interpolate_data.ipynb index 78a9403fd..ebe594139 100644 --- a/_downloads/638db29a2498956b03e341d19f7c71df/plot_interpolate_data.ipynb +++ b/_downloads/638db29a2498956b03e341d19f7c71df/plot_interpolate_data.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/6c38c4cf54bcaedfa877a93db30d0119/plot_volume.ipynb b/_downloads/6c38c4cf54bcaedfa877a93db30d0119/plot_volume.ipynb index 510ebcdb4..61a749afe 100644 --- a/_downloads/6c38c4cf54bcaedfa877a93db30d0119/plot_volume.ipynb +++ b/_downloads/6c38c4cf54bcaedfa877a93db30d0119/plot_volume.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip b/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip index 014a5c405..f481ab9a6 100644 Binary files a/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip and b/_downloads/6f1e7a639e0699d6164445b55e6c116d/auto_examples_jupyter.zip differ diff --git a/_downloads/712cc7a3913a50341baae9f6b000d797/plot_mosaic.ipynb b/_downloads/712cc7a3913a50341baae9f6b000d797/plot_mosaic.ipynb index 0fccb125d..fe0b197ad 100644 --- a/_downloads/712cc7a3913a50341baae9f6b000d797/plot_mosaic.ipynb +++ b/_downloads/712cc7a3913a50341baae9f6b000d797/plot_mosaic.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "# sphinx_gallery_thumbnail_number = 3\n\nimport cortex\nimport matplotlib.pyplot as plt\n\n# load reference functional image for test purposes\nvolume_arr = cortex.db.get_xfm('S1', 'fullhead').reference.get_data().T\n# volume_arr is a (31,100,100) ndarray\n\n\n# with no args mosaic slices this volume in the first dimension\nplt.figure()\ncortex.mosaic(volume_arr)\n\n# slices along a different dimension can be plotted using the dim param\n# here coronal\nplt.figure()\ncortex.mosaic(volume_arr, dim=1)\n\n# kwargs are passed through to imshow\nplt.figure()\ncortex.mosaic(volume_arr, cmap=plt.cm.gray, vmin=0, vmax=1500)\n\n# mosaic always returns the mosaic image along with info about its shape\n# here show=False so we don't generate another plot\nmosaic_arr, (nwide, ntall) = cortex.mosaic(volume_arr, show=False)\n# mosaic_arr is 607 x 607, with nwide = 6, ntall = 6" + "# sphinx_gallery_thumbnail_number = 3\n\nimport cortex\nimport matplotlib.pyplot as plt\n\n# load reference functional image for test purposes\nvolume_arr = cortex.db.get_xfm('S1', 'fullhead').reference.get_fdata().T\n# volume_arr is a (31,100,100) ndarray\n\n\n# with no args mosaic slices this volume in the first dimension\nplt.figure()\ncortex.mosaic(volume_arr)\n\n# slices along a different dimension can be plotted using the dim param\n# here coronal\nplt.figure()\ncortex.mosaic(volume_arr, dim=1)\n\n# kwargs are passed through to imshow\nplt.figure()\ncortex.mosaic(volume_arr, cmap=plt.cm.gray, vmin=0, vmax=1500)\n\n# mosaic always returns the mosaic image along with info about its shape\n# here show=False so we don't generate another plot\nmosaic_arr, (nwide, ntall) = cortex.mosaic(volume_arr, show=False)\n# mosaic_arr is 607 x 607, with nwide = 6, ntall = 6" ] } ], @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/71eedfa1e15eeae1d50e837a5d00378d/plot_tissots_indicatrix.ipynb b/_downloads/71eedfa1e15eeae1d50e837a5d00378d/plot_tissots_indicatrix.ipynb index ecff2a48f..2a9fdf8e4 100644 --- a/_downloads/71eedfa1e15eeae1d50e837a5d00378d/plot_tissots_indicatrix.ipynb +++ b/_downloads/71eedfa1e15eeae1d50e837a5d00378d/plot_tissots_indicatrix.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/754fde0603a864be35c06d16e10d60fc/plot_vertex2D.py b/_downloads/754fde0603a864be35c06d16e10d60fc/plot_vertex2D.py index f5f75ca99..5eb602bab 100644 --- a/_downloads/754fde0603a864be35c06d16e10d60fc/plot_vertex2D.py +++ b/_downloads/754fde0603a864be35c06d16e10d60fc/plot_vertex2D.py @@ -9,7 +9,7 @@ The cortex.Vertex2D object is instantiated with two numpy arrays of the same size as the total number of vertices in that subject's flatmap. Each pixel is -colored according to both vlaues given for the nearest vertex in the flatmap. +colored according to both values given for the nearest vertex in the flatmap. Instead of random test data, you can replace these with any arrays that are the length of the all the vertices in the subject. diff --git a/_downloads/774806b543a93da25908653d426c15c1/plot_cutouts.ipynb b/_downloads/774806b543a93da25908653d426c15c1/plot_cutouts.ipynb index 0a760c45c..0b588c145 100644 --- a/_downloads/774806b543a93da25908653d426c15c1/plot_cutouts.ipynb +++ b/_downloads/774806b543a93da25908653d426c15c1/plot_cutouts.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/7e89eee46d99514db8efb119976e80f8/upsample_to_fsaverage.ipynb b/_downloads/7e89eee46d99514db8efb119976e80f8/upsample_to_fsaverage.ipynb new file mode 100644 index 000000000..c232a5237 --- /dev/null +++ b/_downloads/7e89eee46d99514db8efb119976e80f8/upsample_to_fsaverage.ipynb @@ -0,0 +1,43 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n# Upsample data from a lower resolution fsaverage template to fsaverage for visualization\n\nThis example shows how data in a lower resolution fsaverage template \n(e.g., fsaverage5 or fsaverage6) can be upsampled to the high resolution fsaverage \ntemplate for visualization.\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "collapsed": false + }, + "outputs": [], + "source": [ + "import matplotlib.pyplot as plt\nimport numpy as np\n\nimport cortex\n\nsubject = \"fsaverage\"\n\n# First we check if the fsaverage template is already in the pycortex filestore. If not,\n# we download the template from the web and add it to the filestore.\nif subject not in cortex.db.subjects:\n cortex.download_subject(subject)\n\n# Next we create some data on fsaverage5. Each hemisphere has 10242 vertices.\nn_vertices_fsaverage5 = 10242\ndata_fs5 = np.arange(1, n_vertices_fsaverage5 + 1)\n# We concatenate the data to itself to create a vector of length 20484, corresponding to\n# the two hemispheres together.\ndata_fs5 = np.concatenate((data_fs5, data_fs5))\n# Finally, we upsample the data to fsaverage.\ndata_fs7 = cortex.freesurfer.upsample_to_fsaverage(data_fs5, \"fsaverage5\")\n\n# Now that the data is in the fsaverage template, we can visualize it in PyCortex as any\n# other vertex dataset.\nvtx = cortex.Vertex(data_fs7, subject, vmin=0, vmax=n_vertices_fsaverage5, cmap=\"turbo\")\ncortex.quickshow(vtx, with_curvature=False, with_colorbar=False)\nplt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.19" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} \ No newline at end of file diff --git a/_downloads/813e10fd805fb08e209798753ce45729/plot_volume_to_vertex.ipynb b/_downloads/813e10fd805fb08e209798753ce45729/plot_volume_to_vertex.ipynb index 7b862fdeb..50c06113f 100644 --- a/_downloads/813e10fd805fb08e209798753ce45729/plot_volume_to_vertex.ipynb +++ b/_downloads/813e10fd805fb08e209798753ce45729/plot_volume_to_vertex.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/85a1ab66519fd897a9f08ef615f4ac6b/plot_sulci.ipynb b/_downloads/85a1ab66519fd897a9f08ef615f4ac6b/plot_sulci.ipynb index c427e69f8..89e2bdb42 100644 --- a/_downloads/85a1ab66519fd897a9f08ef615f4ac6b/plot_sulci.ipynb +++ b/_downloads/85a1ab66519fd897a9f08ef615f4ac6b/plot_sulci.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/88045a5ca44795160381b3e40115ed85/plot_vertexRGB.ipynb b/_downloads/88045a5ca44795160381b3e40115ed85/plot_vertexRGB.ipynb index 15959159f..14a9de97f 100644 --- a/_downloads/88045a5ca44795160381b3e40115ed85/plot_vertexRGB.ipynb +++ b/_downloads/88045a5ca44795160381b3e40115ed85/plot_vertexRGB.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/8cf11f78d8c4186f5276b30e9ad94586/plot_vertex2D.ipynb b/_downloads/8cf11f78d8c4186f5276b30e9ad94586/plot_vertex2D.ipynb index 9676ad756..24c0652cd 100644 --- a/_downloads/8cf11f78d8c4186f5276b30e9ad94586/plot_vertex2D.ipynb +++ b/_downloads/8cf11f78d8c4186f5276b30e9ad94586/plot_vertex2D.ipynb @@ -1,21 +1,10 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, "source": [ - "\n# Plot 2D Vertex Data\n\nThis plots example 2D vertex data onto an example subject, S1, onto a flatmap\nusing quickflat. In order for this to run, you have to have a flatmap for this\nsubject in the pycortex filestore.\n\nThe cortex.Vertex2D object is instantiated with two numpy arrays of the same\nsize as the total number of vertices in that subject's flatmap. Each pixel is\ncolored according to both vlaues given for the nearest vertex in the flatmap.\n\nInstead of random test data, you can replace these with any arrays that are\nthe length of the all the vertices in the subject.\n" + "\n# Plot 2D Vertex Data\n\nThis plots example 2D vertex data onto an example subject, S1, onto a flatmap\nusing quickflat. In order for this to run, you have to have a flatmap for this\nsubject in the pycortex filestore.\n\nThe cortex.Vertex2D object is instantiated with two numpy arrays of the same\nsize as the total number of vertices in that subject's flatmap. Each pixel is\ncolored according to both values given for the nearest vertex in the flatmap.\n\nInstead of random test data, you can replace these with any arrays that are\nthe length of the all the vertices in the subject.\n" ] }, { @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/93df78f3116af947a5f503a4a33c9ddd/plot_make_svg.ipynb b/_downloads/93df78f3116af947a5f503a4a33c9ddd/plot_make_svg.ipynb index c540a6ab5..3729bb7db 100644 --- a/_downloads/93df78f3116af947a5f503a4a33c9ddd/plot_make_svg.ipynb +++ b/_downloads/93df78f3116af947a5f503a4a33c9ddd/plot_make_svg.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/967bde64d496491cb07a443c9ede7fc9/plot_advanced_compositing.ipynb b/_downloads/967bde64d496491cb07a443c9ede7fc9/plot_advanced_compositing.ipynb index 21006a193..ef0c9efd6 100644 --- a/_downloads/967bde64d496491cb07a443c9ede7fc9/plot_advanced_compositing.ipynb +++ b/_downloads/967bde64d496491cb07a443c9ede7fc9/plot_advanced_compositing.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/a075cfaa8cd8b107253dda362b33178e/plot_flatmap_distortion.ipynb b/_downloads/a075cfaa8cd8b107253dda362b33178e/plot_flatmap_distortion.ipynb index afb5e4cec..c18536e36 100644 --- a/_downloads/a075cfaa8cd8b107253dda362b33178e/plot_flatmap_distortion.ipynb +++ b/_downloads/a075cfaa8cd8b107253dda362b33178e/plot_flatmap_distortion.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/adbb113238e9e6eed6db37c575b87085/upsample_to_fsaverage.py b/_downloads/adbb113238e9e6eed6db37c575b87085/upsample_to_fsaverage.py new file mode 100644 index 000000000..36593725e --- /dev/null +++ b/_downloads/adbb113238e9e6eed6db37c575b87085/upsample_to_fsaverage.py @@ -0,0 +1,36 @@ +""" +=================== +Upsample data from a lower resolution fsaverage template to fsaverage for visualization +=================== + +This example shows how data in a lower resolution fsaverage template +(e.g., fsaverage5 or fsaverage6) can be upsampled to the high resolution fsaverage +template for visualization. +""" + +import matplotlib.pyplot as plt +import numpy as np + +import cortex + +subject = "fsaverage" + +# First we check if the fsaverage template is already in the pycortex filestore. If not, +# we download the template from the web and add it to the filestore. +if subject not in cortex.db.subjects: + cortex.download_subject(subject) + +# Next we create some data on fsaverage5. Each hemisphere has 10242 vertices. +n_vertices_fsaverage5 = 10242 +data_fs5 = np.arange(1, n_vertices_fsaverage5 + 1) +# We concatenate the data to itself to create a vector of length 20484, corresponding to +# the two hemispheres together. +data_fs5 = np.concatenate((data_fs5, data_fs5)) +# Finally, we upsample the data to fsaverage. +data_fs7 = cortex.freesurfer.upsample_to_fsaverage(data_fs5, "fsaverage5") + +# Now that the data is in the fsaverage template, we can visualize it in PyCortex as any +# other vertex dataset. +vtx = cortex.Vertex(data_fs7, subject, vmin=0, vmax=n_vertices_fsaverage5, cmap="turbo") +cortex.quickshow(vtx, with_curvature=False, with_colorbar=False) +plt.show() diff --git a/_downloads/b2aa18c33412ed6283b23512eb23c3b9/retinotopy_webgl.py b/_downloads/b2aa18c33412ed6283b23512eb23c3b9/retinotopy_webgl.py index 6cbe32fa6..167a07c5f 100644 --- a/_downloads/b2aa18c33412ed6283b23512eb23c3b9/retinotopy_webgl.py +++ b/_downloads/b2aa18c33412ed6283b23512eb23c3b9/retinotopy_webgl.py @@ -8,7 +8,7 @@ dataset_, but that can also be done automatically through the `urllib` command that is included. -.. _dataset: http://gallantlab.org/pycortex/S1_retinotopy.hdf +.. _dataset: https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf S1 is the example subject that comes with pycortex, but if you want to plot data onto a different subject, you will need to have them in your filestore. @@ -21,15 +21,14 @@ """ import cortex -try: # python 2 - from urllib import urlretrieve -except ImportError: # python 3 - from urllib.request import urlretrieve +from urllib.request import urlretrieve # Download and load in retinotopy data -_ = urlretrieve("http://gallantlab.org/pycortex/S1_retinotopy.hdf", - "S1_retinotopy.hdf") +_ = urlretrieve( + "https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf", + "S1_retinotopy.hdf" +) ret_data = cortex.load("S1_retinotopy.hdf") # Open the webviewer diff --git a/_downloads/bcb26d7471e165be66ecc1ea4a79a747/import_fmriprep.ipynb b/_downloads/bcb26d7471e165be66ecc1ea4a79a747/import_fmriprep.ipynb index 43cdc1819..d6d00c547 100644 --- a/_downloads/bcb26d7471e165be66ecc1ea4a79a747/import_fmriprep.ipynb +++ b/_downloads/bcb26d7471e165be66ecc1ea4a79a747/import_fmriprep.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/c47834bb21df7cc049ba6afc8a9f9184/plot_dataset_arithmetic.ipynb b/_downloads/c47834bb21df7cc049ba6afc8a9f9184/plot_dataset_arithmetic.ipynb index 8164e92e2..864d9df1c 100644 --- a/_downloads/c47834bb21df7cc049ba6afc8a9f9184/plot_dataset_arithmetic.ipynb +++ b/_downloads/c47834bb21df7cc049ba6afc8a9f9184/plot_dataset_arithmetic.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/c4a1569322d832cb845e73fb64382cd3/plot_volume2D.ipynb b/_downloads/c4a1569322d832cb845e73fb64382cd3/plot_volume2D.ipynb index e8c76002a..6f72544b2 100644 --- a/_downloads/c4a1569322d832cb845e73fb64382cd3/plot_volume2D.ipynb +++ b/_downloads/c4a1569322d832cb845e73fb64382cd3/plot_volume2D.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/c74b122a2f122b3931ba518c8dce3b97/mni_to_subject.ipynb b/_downloads/c74b122a2f122b3931ba518c8dce3b97/mni_to_subject.ipynb index 4a8443b5e..024a7a01b 100644 --- a/_downloads/c74b122a2f122b3931ba518c8dce3b97/mni_to_subject.ipynb +++ b/_downloads/c74b122a2f122b3931ba518c8dce3b97/mni_to_subject.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "import cortex\n\n# First let's do this \"manually\", using cortex.mni\nfrom cortex import mni\n\nimport numpy as np\nnp.random.seed(1234)\n\n\n# This transform is gonna be from one specific functional space for a subject\n# which is defined by the transform (xfm)\ns1_to_mni = mni.compute_mni_transform(subject='S1', xfm='fullhead')\n# s1_to_mni is a 4x4 array describing the transformation in homogeneous corods\n\n# Transform data from MNI to subject space\n# first we will create a dataset to transform\n# this uses the implicitly created \"identity\" transform, which is used for data\n# in the native anatomical space (i.e. same dims as the base anatomical image,\n# and in the same space as the surface)\ndata = cortex.Volume.random('MNI', 'identity')\n\n# then transform it into the space defined by the 'fullhead' transform for 'S1'\nsubject_data = mni.transform_mni_to_subject('S1', 'fullhead', \n data.data, s1_to_mni)\n# subject_data is a nibabel Nifti1Image\n\nsubject_data_vol = mni_data.get_data() # the actual array, shape=(100,100,31)\n\n# That was the manual method. pycortex can also cache these transforms for you\n# if you get them using the pycortex database\ns1_to_mni_db = cortex.db.get_mnixfm('S1', 'fullhead')\n# this is the same as s1_to_mni, but will return instantly on subsequent calls" + "import cortex\n\n# First let's do this \"manually\", using cortex.mni\nfrom cortex import mni\n\nimport numpy as np\nnp.random.seed(1234)\n\n\n# This transform is gonna be from one specific functional space for a subject\n# which is defined by the transform (xfm)\ns1_to_mni = mni.compute_mni_transform(subject='S1', xfm='fullhead')\n# s1_to_mni is a 4x4 array describing the transformation in homogeneous corods\n\n# Transform data from MNI to subject space\n# first we will create a dataset to transform\n# this uses the implicitly created \"identity\" transform, which is used for data\n# in the native anatomical space (i.e. same dims as the base anatomical image,\n# and in the same space as the surface)\ndata = cortex.Volume.random('MNI', 'identity')\n\n# then transform it into the space defined by the 'fullhead' transform for 'S1'\nsubject_data = mni.transform_mni_to_subject('S1', 'fullhead', \n data.data, s1_to_mni)\n# subject_data is a nibabel Nifti1Image\n\nsubject_data_vol = mni_data.get_fdata() # the actual array, shape=(100,100,31)\n\n# That was the manual method. pycortex can also cache these transforms for you\n# if you get them using the pycortex database\ns1_to_mni_db = cortex.db.get_mnixfm('S1', 'fullhead')\n# this is the same as s1_to_mni, but will return instantly on subsequent calls" ] } ], @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/c83c63a97afe485326cd1fdab357fff8/plot_mosaic.py b/_downloads/c83c63a97afe485326cd1fdab357fff8/plot_mosaic.py index 23c1e4ac2..2e8d363c6 100644 --- a/_downloads/c83c63a97afe485326cd1fdab357fff8/plot_mosaic.py +++ b/_downloads/c83c63a97afe485326cd1fdab357fff8/plot_mosaic.py @@ -14,7 +14,7 @@ import matplotlib.pyplot as plt # load reference functional image for test purposes -volume_arr = cortex.db.get_xfm('S1', 'fullhead').reference.get_data().T +volume_arr = cortex.db.get_xfm('S1', 'fullhead').reference.get_fdata().T # volume_arr is a (31,100,100) ndarray diff --git a/_downloads/cc502342f659cf0c536754003ffae538/dynamic_with_custom_template.ipynb b/_downloads/cc502342f659cf0c536754003ffae538/dynamic_with_custom_template.ipynb index b1d29b54e..034cbd9ab 100644 --- a/_downloads/cc502342f659cf0c536754003ffae538/dynamic_with_custom_template.ipynb +++ b/_downloads/cc502342f659cf0c536754003ffae538/dynamic_with_custom_template.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/d9b4e151ce75aace67a450abc15967b6/plot_make_png.ipynb b/_downloads/d9b4e151ce75aace67a450abc15967b6/plot_make_png.ipynb index 3b6b75134..f035b87d4 100644 --- a/_downloads/d9b4e151ce75aace67a450abc15967b6/plot_make_png.ipynb +++ b/_downloads/d9b4e151ce75aace67a450abc15967b6/plot_make_png.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/dafaff1c5c813c5150e44a7314911857/plot_volumeRGB.ipynb b/_downloads/dafaff1c5c813c5150e44a7314911857/plot_volumeRGB.ipynb index 86f856fb9..981179517 100644 --- a/_downloads/dafaff1c5c813c5150e44a7314911857/plot_volumeRGB.ipynb +++ b/_downloads/dafaff1c5c813c5150e44a7314911857/plot_volumeRGB.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/e01e45ad3d31a19a9f9f8dff3847cf51/plot_zoom_to_roi.ipynb b/_downloads/e01e45ad3d31a19a9f9f8dff3847cf51/plot_zoom_to_roi.ipynb index e61efbe07..a287cb7b7 100644 --- a/_downloads/e01e45ad3d31a19a9f9f8dff3847cf51/plot_zoom_to_roi.ipynb +++ b/_downloads/e01e45ad3d31a19a9f9f8dff3847cf51/plot_zoom_to_roi.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/efc62904d6eba92714248fce62fca073/single_dataset.ipynb b/_downloads/efc62904d6eba92714248fce62fca073/single_dataset.ipynb index 97df1aafe..28303a57b 100644 --- a/_downloads/efc62904d6eba92714248fce62fca073/single_dataset.ipynb +++ b/_downloads/efc62904d6eba92714248fce62fca073/single_dataset.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/f23fbcea3c616b715df90ee0cbac9bdf/plot_geodesic_path.ipynb b/_downloads/f23fbcea3c616b715df90ee0cbac9bdf/plot_geodesic_path.ipynb index c929d6152..e2991776f 100644 --- a/_downloads/f23fbcea3c616b715df90ee0cbac9bdf/plot_geodesic_path.ipynb +++ b/_downloads/f23fbcea3c616b715df90ee0cbac9bdf/plot_geodesic_path.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -26,7 +15,7 @@ }, "outputs": [], "source": [ - "import cortex\nimport cortex.polyutils\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nsubject = \"S1\"\n\n# First we need to import the surfaces for this subject\nsurfs = [cortex.polyutils.Surface(*d)\n for d in cortex.db.get_surf(subject, \"fiducial\")]\nnuml = surfs[0].pts.shape[0]\n\n# Now we need to pick the start and end points of the line we will draw\npt_a = 100\npt_b = 50000\n\n# Then we find the geodesic path between these points\npath = surfs[0].geodesic_path(pt_a, pt_b)\n\n# In order to plot this on the cortical surface, we need an array that is the\n# same size as the number of vertices in the left hemisphere\npath_data = np.zeros(numl)\nfor v in path:\n path_data[v] = 1\n\n# And now plot these distances onto the cortical surface\npath_verts = cortex.Vertex(path_data, subject, cmap=\"Blues_r\")\ncortex.quickshow(path_verts, with_colorbar=False)\nplt.show()" + "import cortex\nimport cortex.polyutils\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nsubject = \"S1\"\n\n# First we need to import the surfaces for this subject\nsurfs = [cortex.polyutils.Surface(*d)\n for d in cortex.db.get_surf(subject, \"fiducial\")]\nnuml = surfs[0].pts.shape[0]\nnumr = surfs[1].pts.shape[0]\nnum_vertices = numl + numr\n\n# Now we need to pick the start and end points of the line we will draw\npt_a = 100\npt_b = 50000\n\n# Then we find the geodesic path between these points\npath = surfs[0].geodesic_path(pt_a, pt_b)\n\n# In order to plot this on the cortical surface, we need an array that is the\n# same size as the number of vertices\npath_data = np.zeros(num_vertices) * np.nan\nfor v in path:\n path_data[v] = 1\n\n# And now plot these distances onto the cortical surface\npath_verts = cortex.Vertex(path_data, subject, cmap=\"Reds\", vmin=0, vmax=1)\ncortex.quickshow(path_verts, with_colorbar=False, with_curvature=True)\nplt.show()" ] } ], @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_downloads/fc8b05be95bda3f3431b5b5752f2c0fd/plot_geodesic_distance.ipynb b/_downloads/fc8b05be95bda3f3431b5b5752f2c0fd/plot_geodesic_distance.ipynb index 5ff5df1de..44843378e 100644 --- a/_downloads/fc8b05be95bda3f3431b5b5752f2c0fd/plot_geodesic_distance.ipynb +++ b/_downloads/fc8b05be95bda3f3431b5b5752f2c0fd/plot_geodesic_distance.ipynb @@ -1,16 +1,5 @@ { "cells": [ - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "collapsed": false - }, - "outputs": [], - "source": [ - "%matplotlib inline" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -46,7 +35,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.9.12" + "version": "3.9.19" } }, "nbformat": 4, diff --git a/_images/sphx_glr_plot_advanced_compositing_001.png b/_images/sphx_glr_plot_advanced_compositing_001.png index 535254666..12d7ac026 100644 Binary files a/_images/sphx_glr_plot_advanced_compositing_001.png and b/_images/sphx_glr_plot_advanced_compositing_001.png differ diff --git a/_images/sphx_glr_plot_advanced_compositing_thumb.png b/_images/sphx_glr_plot_advanced_compositing_thumb.png index 4c5c957df..8ec11c64e 100644 Binary files a/_images/sphx_glr_plot_advanced_compositing_thumb.png and b/_images/sphx_glr_plot_advanced_compositing_thumb.png differ diff --git a/_images/sphx_glr_plot_connected_vertices_001.png b/_images/sphx_glr_plot_connected_vertices_001.png index 6c8331860..51cd68b53 100644 Binary files a/_images/sphx_glr_plot_connected_vertices_001.png and b/_images/sphx_glr_plot_connected_vertices_001.png differ diff --git a/_images/sphx_glr_plot_connected_vertices_thumb.png b/_images/sphx_glr_plot_connected_vertices_thumb.png index c7c69171c..ab20ba10f 100644 Binary files a/_images/sphx_glr_plot_connected_vertices_thumb.png and b/_images/sphx_glr_plot_connected_vertices_thumb.png differ diff --git a/_images/sphx_glr_plot_cutouts_001.png b/_images/sphx_glr_plot_cutouts_001.png index 864afa261..40a9b8e06 100644 Binary files a/_images/sphx_glr_plot_cutouts_001.png and b/_images/sphx_glr_plot_cutouts_001.png differ diff --git a/_images/sphx_glr_plot_cutouts_thumb.png b/_images/sphx_glr_plot_cutouts_thumb.png index fd1eb39b6..c46dfec24 100644 Binary files a/_images/sphx_glr_plot_cutouts_thumb.png and b/_images/sphx_glr_plot_cutouts_thumb.png differ diff --git a/_images/sphx_glr_plot_dataset_arithmetic_001.png b/_images/sphx_glr_plot_dataset_arithmetic_001.png index 2da2d7ce3..9b621f6a9 100644 Binary files a/_images/sphx_glr_plot_dataset_arithmetic_001.png and b/_images/sphx_glr_plot_dataset_arithmetic_001.png differ diff --git a/_images/sphx_glr_plot_dataset_arithmetic_002.png b/_images/sphx_glr_plot_dataset_arithmetic_002.png index 27e9a971e..03c884d31 100644 Binary files a/_images/sphx_glr_plot_dataset_arithmetic_002.png and b/_images/sphx_glr_plot_dataset_arithmetic_002.png differ diff --git a/_images/sphx_glr_plot_dataset_arithmetic_003.png b/_images/sphx_glr_plot_dataset_arithmetic_003.png index 36135c076..d25867c37 100644 Binary files a/_images/sphx_glr_plot_dataset_arithmetic_003.png and b/_images/sphx_glr_plot_dataset_arithmetic_003.png differ diff --git a/_images/sphx_glr_plot_dataset_arithmetic_thumb.png b/_images/sphx_glr_plot_dataset_arithmetic_thumb.png index 5e9b2c845..f6b7e2d40 100644 Binary files a/_images/sphx_glr_plot_dataset_arithmetic_thumb.png and b/_images/sphx_glr_plot_dataset_arithmetic_thumb.png differ diff --git a/_images/sphx_glr_plot_dropout_001.png b/_images/sphx_glr_plot_dropout_001.png index 7d6e8e706..26ea0bd52 100644 Binary files a/_images/sphx_glr_plot_dropout_001.png and b/_images/sphx_glr_plot_dropout_001.png differ diff --git a/_images/sphx_glr_plot_dropout_thumb.png b/_images/sphx_glr_plot_dropout_thumb.png index f88e8a923..e0fdf75b5 100644 Binary files a/_images/sphx_glr_plot_dropout_thumb.png and b/_images/sphx_glr_plot_dropout_thumb.png differ diff --git a/_images/sphx_glr_plot_flatmap_distortion_001.png b/_images/sphx_glr_plot_flatmap_distortion_001.png index 1425542e0..2e52f1f8e 100644 Binary files a/_images/sphx_glr_plot_flatmap_distortion_001.png and b/_images/sphx_glr_plot_flatmap_distortion_001.png differ diff --git a/_images/sphx_glr_plot_flatmap_distortion_002.png b/_images/sphx_glr_plot_flatmap_distortion_002.png index fc3304945..7479c5cd4 100644 Binary files a/_images/sphx_glr_plot_flatmap_distortion_002.png and b/_images/sphx_glr_plot_flatmap_distortion_002.png differ diff --git a/_images/sphx_glr_plot_geodesic_distance_001.png b/_images/sphx_glr_plot_geodesic_distance_001.png index b2283dda2..d527fd4ef 100644 Binary files a/_images/sphx_glr_plot_geodesic_distance_001.png and b/_images/sphx_glr_plot_geodesic_distance_001.png differ diff --git a/_images/sphx_glr_plot_geodesic_distance_002.png b/_images/sphx_glr_plot_geodesic_distance_002.png index 58e6d3488..786aa245c 100644 Binary files a/_images/sphx_glr_plot_geodesic_distance_002.png and b/_images/sphx_glr_plot_geodesic_distance_002.png differ diff --git a/_images/sphx_glr_plot_geodesic_distance_thumb.png b/_images/sphx_glr_plot_geodesic_distance_thumb.png index 285bb9615..1cfbb9f08 100644 Binary files a/_images/sphx_glr_plot_geodesic_distance_thumb.png and b/_images/sphx_glr_plot_geodesic_distance_thumb.png differ diff --git a/_images/sphx_glr_plot_geodesic_path_001.png b/_images/sphx_glr_plot_geodesic_path_001.png index c963e8c73..89c8e8a77 100644 Binary files a/_images/sphx_glr_plot_geodesic_path_001.png and b/_images/sphx_glr_plot_geodesic_path_001.png differ diff --git a/_images/sphx_glr_plot_geodesic_path_thumb.png b/_images/sphx_glr_plot_geodesic_path_thumb.png index 8564e05ce..42767fc08 100644 Binary files a/_images/sphx_glr_plot_geodesic_path_thumb.png and b/_images/sphx_glr_plot_geodesic_path_thumb.png differ diff --git a/_images/sphx_glr_plot_get_roi_vertices_001.png b/_images/sphx_glr_plot_get_roi_vertices_001.png index 1d2ebe2f1..7cc44d362 100644 Binary files a/_images/sphx_glr_plot_get_roi_vertices_001.png and b/_images/sphx_glr_plot_get_roi_vertices_001.png differ diff --git a/_images/sphx_glr_plot_get_roi_vertices_thumb.png b/_images/sphx_glr_plot_get_roi_vertices_thumb.png index b3181de3e..ac1b8f49c 100644 Binary files a/_images/sphx_glr_plot_get_roi_vertices_thumb.png and b/_images/sphx_glr_plot_get_roi_vertices_thumb.png differ diff --git a/_images/sphx_glr_plot_interpolate_data_001.png b/_images/sphx_glr_plot_interpolate_data_001.png index bff8ac833..18e7de869 100644 Binary files a/_images/sphx_glr_plot_interpolate_data_001.png and b/_images/sphx_glr_plot_interpolate_data_001.png differ diff --git a/_images/sphx_glr_plot_make_figure_001.png b/_images/sphx_glr_plot_make_figure_001.png index 401f1a5a8..b2efaecfd 100644 Binary files a/_images/sphx_glr_plot_make_figure_001.png and b/_images/sphx_glr_plot_make_figure_001.png differ diff --git a/_images/sphx_glr_plot_make_figure_002.png b/_images/sphx_glr_plot_make_figure_002.png index 401f1a5a8..b2efaecfd 100644 Binary files a/_images/sphx_glr_plot_make_figure_002.png and b/_images/sphx_glr_plot_make_figure_002.png differ diff --git a/_images/sphx_glr_plot_make_figure_003.png b/_images/sphx_glr_plot_make_figure_003.png index b36766c37..7917d77d6 100644 Binary files a/_images/sphx_glr_plot_make_figure_003.png and b/_images/sphx_glr_plot_make_figure_003.png differ diff --git a/_images/sphx_glr_plot_make_figure_004.png b/_images/sphx_glr_plot_make_figure_004.png index 27fe9f986..2eaee3d1c 100644 Binary files a/_images/sphx_glr_plot_make_figure_004.png and b/_images/sphx_glr_plot_make_figure_004.png differ diff --git a/_images/sphx_glr_plot_make_figure_005.png b/_images/sphx_glr_plot_make_figure_005.png index 04129ab37..dffd8854b 100644 Binary files a/_images/sphx_glr_plot_make_figure_005.png and b/_images/sphx_glr_plot_make_figure_005.png differ diff --git a/_images/sphx_glr_plot_make_figure_006.png b/_images/sphx_glr_plot_make_figure_006.png index 7ac2b4e56..bd16805d1 100644 Binary files a/_images/sphx_glr_plot_make_figure_006.png and b/_images/sphx_glr_plot_make_figure_006.png differ diff --git a/_images/sphx_glr_plot_make_figure_thumb.png b/_images/sphx_glr_plot_make_figure_thumb.png index 69b0da65d..e1f079c47 100644 Binary files a/_images/sphx_glr_plot_make_figure_thumb.png and b/_images/sphx_glr_plot_make_figure_thumb.png differ diff --git a/_images/sphx_glr_plot_make_gif_001.png b/_images/sphx_glr_plot_make_gif_001.png index d34fa5f67..c857f2db8 100644 Binary files a/_images/sphx_glr_plot_make_gif_001.png and b/_images/sphx_glr_plot_make_gif_001.png differ diff --git a/_images/sphx_glr_plot_make_gif_002.png b/_images/sphx_glr_plot_make_gif_002.png index 72411f3a7..638330182 100644 Binary files a/_images/sphx_glr_plot_make_gif_002.png and b/_images/sphx_glr_plot_make_gif_002.png differ diff --git a/_images/sphx_glr_plot_make_gif_thumb.png b/_images/sphx_glr_plot_make_gif_thumb.png index cc159adbe..448bf90f8 100644 Binary files a/_images/sphx_glr_plot_make_gif_thumb.png and b/_images/sphx_glr_plot_make_gif_thumb.png differ diff --git a/_images/sphx_glr_plot_make_png_001.png b/_images/sphx_glr_plot_make_png_001.png index 19e192568..bcad42457 100644 Binary files a/_images/sphx_glr_plot_make_png_001.png and b/_images/sphx_glr_plot_make_png_001.png differ diff --git a/_images/sphx_glr_plot_make_png_thumb.png b/_images/sphx_glr_plot_make_png_thumb.png index f34e10a2c..9e3647222 100644 Binary files a/_images/sphx_glr_plot_make_png_thumb.png and b/_images/sphx_glr_plot_make_png_thumb.png differ diff --git a/_images/sphx_glr_plot_make_svg_001.png b/_images/sphx_glr_plot_make_svg_001.png index 19e192568..bcad42457 100644 Binary files a/_images/sphx_glr_plot_make_svg_001.png and b/_images/sphx_glr_plot_make_svg_001.png differ diff --git a/_images/sphx_glr_plot_make_svg_thumb.png b/_images/sphx_glr_plot_make_svg_thumb.png index f34e10a2c..9e3647222 100644 Binary files a/_images/sphx_glr_plot_make_svg_thumb.png and b/_images/sphx_glr_plot_make_svg_thumb.png differ diff --git a/_images/sphx_glr_plot_mosaic_001.png b/_images/sphx_glr_plot_mosaic_001.png index 0fd3b7f14..a7d29bb19 100644 Binary files a/_images/sphx_glr_plot_mosaic_001.png and b/_images/sphx_glr_plot_mosaic_001.png differ diff --git a/_images/sphx_glr_plot_mosaic_002.png b/_images/sphx_glr_plot_mosaic_002.png index 0851388bb..c07e01048 100644 Binary files a/_images/sphx_glr_plot_mosaic_002.png and b/_images/sphx_glr_plot_mosaic_002.png differ diff --git a/_images/sphx_glr_plot_mosaic_003.png b/_images/sphx_glr_plot_mosaic_003.png index 47cae3486..d2c03272e 100644 Binary files a/_images/sphx_glr_plot_mosaic_003.png and b/_images/sphx_glr_plot_mosaic_003.png differ diff --git a/_images/sphx_glr_plot_retinotopy_flatmap_001.png b/_images/sphx_glr_plot_retinotopy_flatmap_001.png index b0daaae2d..c74d38a1f 100644 Binary files a/_images/sphx_glr_plot_retinotopy_flatmap_001.png and b/_images/sphx_glr_plot_retinotopy_flatmap_001.png differ diff --git a/_images/sphx_glr_plot_retinotopy_flatmap_002.png b/_images/sphx_glr_plot_retinotopy_flatmap_002.png index 495a9666b..06af899cd 100644 Binary files a/_images/sphx_glr_plot_retinotopy_flatmap_002.png and b/_images/sphx_glr_plot_retinotopy_flatmap_002.png differ diff --git a/_images/sphx_glr_plot_retinotopy_flatmap_thumb.png b/_images/sphx_glr_plot_retinotopy_flatmap_thumb.png index 3b4a2cc82..e3c0fa18f 100644 Binary files a/_images/sphx_glr_plot_retinotopy_flatmap_thumb.png and b/_images/sphx_glr_plot_retinotopy_flatmap_thumb.png differ diff --git a/_images/sphx_glr_plot_roi_voxel_index_volume_001.png b/_images/sphx_glr_plot_roi_voxel_index_volume_001.png index 83c4ca699..761d12b37 100644 Binary files a/_images/sphx_glr_plot_roi_voxel_index_volume_001.png and b/_images/sphx_glr_plot_roi_voxel_index_volume_001.png differ diff --git a/_images/sphx_glr_plot_roi_voxel_index_volume_thumb.png b/_images/sphx_glr_plot_roi_voxel_index_volume_thumb.png index 84a8eb32f..e500e0072 100644 Binary files a/_images/sphx_glr_plot_roi_voxel_index_volume_thumb.png and b/_images/sphx_glr_plot_roi_voxel_index_volume_thumb.png differ diff --git a/_images/sphx_glr_plot_roi_voxel_mask_001.png b/_images/sphx_glr_plot_roi_voxel_mask_001.png index 183bc1432..f99abfa87 100644 Binary files a/_images/sphx_glr_plot_roi_voxel_mask_001.png and b/_images/sphx_glr_plot_roi_voxel_mask_001.png differ diff --git a/_images/sphx_glr_plot_roi_voxel_mask_thumb.png b/_images/sphx_glr_plot_roi_voxel_mask_thumb.png index ada211879..9d99e7ded 100644 Binary files a/_images/sphx_glr_plot_roi_voxel_mask_thumb.png and b/_images/sphx_glr_plot_roi_voxel_mask_thumb.png differ diff --git a/_images/sphx_glr_plot_rois_001.png b/_images/sphx_glr_plot_rois_001.png index 19e192568..bcad42457 100644 Binary files a/_images/sphx_glr_plot_rois_001.png and b/_images/sphx_glr_plot_rois_001.png differ diff --git a/_images/sphx_glr_plot_rois_002.png b/_images/sphx_glr_plot_rois_002.png index f266c64c4..193289382 100644 Binary files a/_images/sphx_glr_plot_rois_002.png and b/_images/sphx_glr_plot_rois_002.png differ diff --git a/_images/sphx_glr_plot_rois_003.png b/_images/sphx_glr_plot_rois_003.png index cfd2f3a0f..9f95285f7 100644 Binary files a/_images/sphx_glr_plot_rois_003.png and b/_images/sphx_glr_plot_rois_003.png differ diff --git a/_images/sphx_glr_plot_rois_thumb.png b/_images/sphx_glr_plot_rois_thumb.png index f34e10a2c..9e3647222 100644 Binary files a/_images/sphx_glr_plot_rois_thumb.png and b/_images/sphx_glr_plot_rois_thumb.png differ diff --git a/_images/sphx_glr_plot_subsurfaces_001.png b/_images/sphx_glr_plot_subsurfaces_001.png index 223e71f63..9f770d6ef 100644 Binary files a/_images/sphx_glr_plot_subsurfaces_001.png and b/_images/sphx_glr_plot_subsurfaces_001.png differ diff --git a/_images/sphx_glr_plot_subsurfaces_002.png b/_images/sphx_glr_plot_subsurfaces_002.png index 9dfbd7cab..bd0accd4c 100644 Binary files a/_images/sphx_glr_plot_subsurfaces_002.png and b/_images/sphx_glr_plot_subsurfaces_002.png differ diff --git a/_images/sphx_glr_plot_subsurfaces_003.png b/_images/sphx_glr_plot_subsurfaces_003.png index 09fe20fdd..a84d1936b 100644 Binary files a/_images/sphx_glr_plot_subsurfaces_003.png and b/_images/sphx_glr_plot_subsurfaces_003.png differ diff --git a/_images/sphx_glr_plot_subsurfaces_004.png b/_images/sphx_glr_plot_subsurfaces_004.png index a3c7d637b..22908c02c 100644 Binary files a/_images/sphx_glr_plot_subsurfaces_004.png and b/_images/sphx_glr_plot_subsurfaces_004.png differ diff --git a/_images/sphx_glr_plot_subsurfaces_005.png b/_images/sphx_glr_plot_subsurfaces_005.png index 824753cb6..8944afd75 100644 Binary files a/_images/sphx_glr_plot_subsurfaces_005.png and b/_images/sphx_glr_plot_subsurfaces_005.png differ diff --git a/_images/sphx_glr_plot_subsurfaces_thumb.png b/_images/sphx_glr_plot_subsurfaces_thumb.png index 86ba92c8c..9a45ea642 100644 Binary files a/_images/sphx_glr_plot_subsurfaces_thumb.png and b/_images/sphx_glr_plot_subsurfaces_thumb.png differ diff --git a/_images/sphx_glr_plot_sulci_001.png b/_images/sphx_glr_plot_sulci_001.png index 255d11c87..aee55d08d 100644 Binary files a/_images/sphx_glr_plot_sulci_001.png and b/_images/sphx_glr_plot_sulci_001.png differ diff --git a/_images/sphx_glr_plot_sulci_thumb.png b/_images/sphx_glr_plot_sulci_thumb.png index e6ca4ed8a..4873564ab 100644 Binary files a/_images/sphx_glr_plot_sulci_thumb.png and b/_images/sphx_glr_plot_sulci_thumb.png differ diff --git a/_images/sphx_glr_plot_thickness_nanmean_001.png b/_images/sphx_glr_plot_thickness_nanmean_001.png index c33b24408..3219b6569 100644 Binary files a/_images/sphx_glr_plot_thickness_nanmean_001.png and b/_images/sphx_glr_plot_thickness_nanmean_001.png differ diff --git a/_images/sphx_glr_plot_thickness_nanmean_002.png b/_images/sphx_glr_plot_thickness_nanmean_002.png index 2e7029878..3ad94817d 100644 Binary files a/_images/sphx_glr_plot_thickness_nanmean_002.png and b/_images/sphx_glr_plot_thickness_nanmean_002.png differ diff --git a/_images/sphx_glr_plot_thickness_nanmean_thumb.png b/_images/sphx_glr_plot_thickness_nanmean_thumb.png index 68db30609..131def965 100644 Binary files a/_images/sphx_glr_plot_thickness_nanmean_thumb.png and b/_images/sphx_glr_plot_thickness_nanmean_thumb.png differ diff --git a/_images/sphx_glr_plot_tissots_indicatrix_001.png b/_images/sphx_glr_plot_tissots_indicatrix_001.png index b29c17369..823ba152d 100644 Binary files a/_images/sphx_glr_plot_tissots_indicatrix_001.png and b/_images/sphx_glr_plot_tissots_indicatrix_001.png differ diff --git a/_images/sphx_glr_plot_vertex2D_001.png b/_images/sphx_glr_plot_vertex2D_001.png index 9553170f3..1cc3ba436 100644 Binary files a/_images/sphx_glr_plot_vertex2D_001.png and b/_images/sphx_glr_plot_vertex2D_001.png differ diff --git a/_images/sphx_glr_plot_vertex2D_thumb.png b/_images/sphx_glr_plot_vertex2D_thumb.png index 3530c2b98..eb3efa5e4 100644 Binary files a/_images/sphx_glr_plot_vertex2D_thumb.png and b/_images/sphx_glr_plot_vertex2D_thumb.png differ diff --git a/_images/sphx_glr_plot_vertexRGB_001.png b/_images/sphx_glr_plot_vertexRGB_001.png index 9435e4e59..aa7a143dd 100644 Binary files a/_images/sphx_glr_plot_vertexRGB_001.png and b/_images/sphx_glr_plot_vertexRGB_001.png differ diff --git a/_images/sphx_glr_plot_vertexRGB_thumb.png b/_images/sphx_glr_plot_vertexRGB_thumb.png index def70e131..9448e7bdd 100644 Binary files a/_images/sphx_glr_plot_vertexRGB_thumb.png and b/_images/sphx_glr_plot_vertexRGB_thumb.png differ diff --git a/_images/sphx_glr_plot_vertex_001.png b/_images/sphx_glr_plot_vertex_001.png index 82a6587c8..adf3efbc9 100644 Binary files a/_images/sphx_glr_plot_vertex_001.png and b/_images/sphx_glr_plot_vertex_001.png differ diff --git a/_images/sphx_glr_plot_vertex_002.png b/_images/sphx_glr_plot_vertex_002.png index 7844c8651..6afebcca5 100644 Binary files a/_images/sphx_glr_plot_vertex_002.png and b/_images/sphx_glr_plot_vertex_002.png differ diff --git a/_images/sphx_glr_plot_vertex_thumb.png b/_images/sphx_glr_plot_vertex_thumb.png index b9820f54a..3d0e7482a 100644 Binary files a/_images/sphx_glr_plot_vertex_thumb.png and b/_images/sphx_glr_plot_vertex_thumb.png differ diff --git a/_images/sphx_glr_plot_volume2D_001.png b/_images/sphx_glr_plot_volume2D_001.png index ad00989d8..52fa029c4 100644 Binary files a/_images/sphx_glr_plot_volume2D_001.png and b/_images/sphx_glr_plot_volume2D_001.png differ diff --git a/_images/sphx_glr_plot_volume2D_002.png b/_images/sphx_glr_plot_volume2D_002.png index 2f49fb659..064c647e9 100644 Binary files a/_images/sphx_glr_plot_volume2D_002.png and b/_images/sphx_glr_plot_volume2D_002.png differ diff --git a/_images/sphx_glr_plot_volume2D_003.png b/_images/sphx_glr_plot_volume2D_003.png index c33fbb3ca..c37e393fe 100644 Binary files a/_images/sphx_glr_plot_volume2D_003.png and b/_images/sphx_glr_plot_volume2D_003.png differ diff --git a/_images/sphx_glr_plot_volume2D_thumb.png b/_images/sphx_glr_plot_volume2D_thumb.png index 32e5c5c06..e59f71142 100644 Binary files a/_images/sphx_glr_plot_volume2D_thumb.png and b/_images/sphx_glr_plot_volume2D_thumb.png differ diff --git a/_images/sphx_glr_plot_volumeRGB_001.png b/_images/sphx_glr_plot_volumeRGB_001.png index 2ebca3b3e..fb53a9517 100644 Binary files a/_images/sphx_glr_plot_volumeRGB_001.png and b/_images/sphx_glr_plot_volumeRGB_001.png differ diff --git a/_images/sphx_glr_plot_volumeRGB_002.png b/_images/sphx_glr_plot_volumeRGB_002.png index 3fa707ee6..c0bf0311d 100644 Binary files a/_images/sphx_glr_plot_volumeRGB_002.png and b/_images/sphx_glr_plot_volumeRGB_002.png differ diff --git a/_images/sphx_glr_plot_volumeRGB_003.png b/_images/sphx_glr_plot_volumeRGB_003.png index 5dea7da79..37f02fce1 100644 Binary files a/_images/sphx_glr_plot_volumeRGB_003.png and b/_images/sphx_glr_plot_volumeRGB_003.png differ diff --git a/_images/sphx_glr_plot_volumeRGB_thumb.png b/_images/sphx_glr_plot_volumeRGB_thumb.png index cdf5b0bde..e35b6cba4 100644 Binary files a/_images/sphx_glr_plot_volumeRGB_thumb.png and b/_images/sphx_glr_plot_volumeRGB_thumb.png differ diff --git a/_images/sphx_glr_plot_volume_001.png b/_images/sphx_glr_plot_volume_001.png index 19e192568..bcad42457 100644 Binary files a/_images/sphx_glr_plot_volume_001.png and b/_images/sphx_glr_plot_volume_001.png differ diff --git a/_images/sphx_glr_plot_volume_002.png b/_images/sphx_glr_plot_volume_002.png index 4258e736f..f1cefa9e9 100644 Binary files a/_images/sphx_glr_plot_volume_002.png and b/_images/sphx_glr_plot_volume_002.png differ diff --git a/_images/sphx_glr_plot_volume_003.png b/_images/sphx_glr_plot_volume_003.png index 7a5be9d73..ef5fe2091 100644 Binary files a/_images/sphx_glr_plot_volume_003.png and b/_images/sphx_glr_plot_volume_003.png differ diff --git a/_images/sphx_glr_plot_volume_thumb.png b/_images/sphx_glr_plot_volume_thumb.png index f34e10a2c..9e3647222 100644 Binary files a/_images/sphx_glr_plot_volume_thumb.png and b/_images/sphx_glr_plot_volume_thumb.png differ diff --git a/_images/sphx_glr_plot_volume_to_vertex_001.png b/_images/sphx_glr_plot_volume_to_vertex_001.png index 19e192568..bcad42457 100644 Binary files a/_images/sphx_glr_plot_volume_to_vertex_001.png and b/_images/sphx_glr_plot_volume_to_vertex_001.png differ diff --git a/_images/sphx_glr_plot_volume_to_vertex_002.png b/_images/sphx_glr_plot_volume_to_vertex_002.png index e74641183..7ef04d094 100644 Binary files a/_images/sphx_glr_plot_volume_to_vertex_002.png and b/_images/sphx_glr_plot_volume_to_vertex_002.png differ diff --git a/_images/sphx_glr_plot_volume_to_vertex_thumb.png b/_images/sphx_glr_plot_volume_to_vertex_thumb.png index f34e10a2c..9e3647222 100644 Binary files a/_images/sphx_glr_plot_volume_to_vertex_thumb.png and b/_images/sphx_glr_plot_volume_to_vertex_thumb.png differ diff --git a/_images/sphx_glr_plot_voxel_distance_from_surface_001.png b/_images/sphx_glr_plot_voxel_distance_from_surface_001.png index ef06e6bd3..1cceb73d1 100644 Binary files a/_images/sphx_glr_plot_voxel_distance_from_surface_001.png and b/_images/sphx_glr_plot_voxel_distance_from_surface_001.png differ diff --git a/_images/sphx_glr_plot_zoom_to_roi_001.png b/_images/sphx_glr_plot_zoom_to_roi_001.png index d9d680ef2..0f38a1449 100644 Binary files a/_images/sphx_glr_plot_zoom_to_roi_001.png and b/_images/sphx_glr_plot_zoom_to_roi_001.png differ diff --git a/_images/sphx_glr_plot_zoom_to_roi_002.png b/_images/sphx_glr_plot_zoom_to_roi_002.png index 6315e071b..1b9749d6a 100644 Binary files a/_images/sphx_glr_plot_zoom_to_roi_002.png and b/_images/sphx_glr_plot_zoom_to_roi_002.png differ diff --git a/_images/sphx_glr_plot_zoom_to_roi_thumb.png b/_images/sphx_glr_plot_zoom_to_roi_thumb.png index 463b37f81..13e54ed86 100644 Binary files a/_images/sphx_glr_plot_zoom_to_roi_thumb.png and b/_images/sphx_glr_plot_zoom_to_roi_thumb.png differ diff --git a/_images/sphx_glr_upsample_to_fsaverage_thumb.png b/_images/sphx_glr_upsample_to_fsaverage_thumb.png new file mode 100644 index 000000000..8a5fed589 Binary files /dev/null and b/_images/sphx_glr_upsample_to_fsaverage_thumb.png differ diff --git a/_modules/cortex/align.html b/_modules/cortex/align.html index feef1b67d..cb2c49c30 100644 --- a/_modules/cortex/align.html +++ b/_modules/cortex/align.html @@ -1,28 +1,27 @@ - - + - cortex.align — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.align — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -38,12 +37,21 @@

Source code for cortex.align

 """Contains functions for making alignments between functional data and the surface, or, finding where the brain is.
 """
 import os
-import numpy as np
-from builtins import input
+import shutil
+import subprocess as sp
+import tempfile
 import warnings
+from builtins import input
+
+import numpy as np
+
+from .database import db
+from .options import config
+from .xfm import Transform
+
 
 def mayavi_manual(subject, xfmname, reference=None, **kwargs):
-    """Open GUI for manually aligning a functional volume to the cortical surface for `subject`. This
+    """Open GUI for manually aligning a functional volume to the cortical surface for `subject`. This
     creates a new transform called `xfm`. The name of a nibabel-readable file (e.g. nii) should be
     supplied as `reference`. This image will be copied into the database.
 
@@ -129,16 +137,18 @@ 

Source code for cortex.align

 
 
 def fs_manual(subject, xfmname, **kwargs):
-    """Legacy name for cortex.align.manual. Please use that function, and see the help there."""
+    """Legacy name for cortex.align.manual. Please use that function, and see the help there."""
     warnings.warn(("Deprecated name - function has been renamed cortex.align.manual"
                    "This function name will be removed in a future release."
         ), DeprecationWarning)
     return manual(subject, xfmname, **kwargs)
 
 
-
[docs]def manual(subject, xfmname, output_name="register.lta", wm_color="yellow", +
+[docs] +def manual(subject, xfmname, output_name="register.lta", wm_color="yellow", pial_color="blue", wm_surface='white', noclean=False, reference=None, inspect_only=False): - """Open Freesurfer FreeView GUI for manually aligning/adjusting a functional + """Open Freesurfer FreeView GUI for manually aligning/adjusting a functional volume to the cortical surface for `subject`. This creates a new transform called `xfmname`. The name of a nibabel-readable file (e.g. NIfTI) should be supplied as `reference`. This image will be copied into the database. @@ -192,11 +202,12 @@

Source code for cortex.align

     Nothing unless noclean is true.
     """
 
+    import shutil
     import subprocess as sp
     import tempfile
-    import shutil
-    from .xfm import Transform
+
     from .database import db
+    from .xfm import Transform
 
     retval = None
 
@@ -272,122 +283,235 @@ 

Source code for cortex.align

     return retval
-
[docs]def automatic(subject, xfmname, reference, noclean=False, bbrtype="signed", - pre_flirt_args='', use_fs_bbr=True, epi_mask=False, intermediate=None): - """Create an automatic alignment using the FLIRT boundary-based alignment (BBR) from FSL. - If `noclean`, intermediate files will not be removed from /tmp. The `reference` image and resulting - transform called `xfmname` will be automatically stored in the database. +def automatic_fsl( + subject, xfmname, reference, noclean=False, bbrtype="signed", pre_flirt_args="" +): + """Perform automatic alignment using the FLIRT boundary-based alignment (BBR) from + FSL. The `reference` image and resulting transform called `xfmname` will be + automatically stored in the database. - It's good practice to open up this transform afterward in the manual aligner and check how it worked. - Do that using the following (with the same `subject` and `xfmname` used here, no need for `reference`): - > align.manual(subject, xfmname) + If `noclean` is set to True, intermediate files will not be removed from /tmp. - If automatic alignment gives you a very bad answer, you can try giving the pre-BBR FLIRT - some hints by passing '-usesqform' in as `pre_flirt_args`. + It's good practice to open up this transform afterward in the manual aligner and + check how it worked. Do that using the following code (passing the same `subject` + and `xfmname` used here, no need for `reference`): + + > cortex.align.manual(subject, xfmname) + + If automatic alignment with FSL fails, you can try giving the pre-BBR FLIRT + some hints by passing '-usesqform' in as `pre_flirt_args`. Alternatively, you can + use `cortex.align.automatic` to use Freesurfer's bbregister, which tends to work + better than FSL. Parameters ---------- subject : str Subject identifier. xfmname : str - String identifying the transform to be created. + Name of the transform to be created and stored in the database. reference : str - Path to a nibabel-readable image that will be used as the reference for this transform. - Usually, this is a single (3D) functional data volume. + Path to a nibabel-readable image that will be used as the reference for + this transform. Usually, this is a single (3D) functional data volume. noclean : bool, optional - If True intermediate files will not be removed from /tmp (this is useful for debugging things), - and the returned value will be the name of the temp directory. Default False. + If True, intermediate files will not be removed from /tmp (this is useful + for debugging things), and the returned value will be the name of the + temp directory. Default False. bbrtype : str, optional The 'bbrtype' argument that is passed to FLIRT. pre_flirt_args : str, optional Additional arguments that are passed to the FLIRT pre-alignment step (not BBR). - use_fs_bbr : bool, optional - If True will use freesurfer bbregister instead of FSL BBR. (default, True) - epi_mask : bool, optional - If True, and use_fs_bbr is True, then the flag --epi-mask is passed to bbregister - to mask out areas with spatial distortions. This setting is to be used whenever - the reference was not distortion corrected. - intermediate : str - Path to a nibabel-readable image that will be used as intermediate for the alignment. - Usually, this is a single (3D) functional data volume. Returns ------- - Nothing unless `noclean` is True. + None or path to temp directory if `noclean` is True. """ - warnings.warn("Defaults changed in pycortex 1.3. Now automatic alignment " - "uses Freesurfer's bbregister and mri_coreg for " - "initialization.") - import shlex - import shutil - import tempfile - import subprocess as sp - - from .database import db - from .xfm import Transform - from .options import config - - fsl_prefix = config.get("basic", "fsl_prefix") - schfile = os.path.join(os.path.split(os.path.abspath(__file__))[0], "bbr.sch") - retval = None try: cache = tempfile.mkdtemp() absreference = os.path.abspath(reference) + fsl_prefix = config.get("basic", "fsl_prefix") + schfile = os.path.join(os.path.split(os.path.abspath(__file__))[0], "bbr.sch") + raw = db.get_anat(subject, type="raw").get_filename() + bet = db.get_anat(subject, type="brainmask").get_filename() + wmseg = db.get_anat(subject, type="whitematter").get_filename() + # Compute anatomical-to-epi transform + print("FLIRT pre-alignment") + cmd = ( + "{fslpre}flirt -in {epi} -ref {bet} -dof 6 {pre_flirt_args} " + "-omat {cache}/init.mat" + ) + cmd = cmd.format( + fslpre=fsl_prefix, + cache=cache, + epi=absreference, + bet=bet, + pre_flirt_args=pre_flirt_args, + ) + if sp.call(cmd, shell=True) != 0: + raise IOError("Error calling initial FLIRT") + + print("Running BBR") + # Run epi-to-anat transform (this is more stable than anat-to-epi in FSL!) + 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}" + ) + cmd = cmd.format( + fslpre=fsl_prefix, + cache=cache, + raw=bet, + wmseg=wmseg, + epi=absreference, + schfile=schfile, + bbrtype=bbrtype, + ) + if sp.call(cmd, shell=True) != 0: + raise IOError("Error calling BBR flirt") - if use_fs_bbr: - print('Running freesurfer BBR') - cmd = 'bbregister --s {sub} --mov {absref} --init-coreg --reg {cache}/register.dat --t2' - if epi_mask: - cmd += ' --epi-mask' - if intermediate is not None: - cmd += f' --int {intermediate}' - cmd = cmd.format(sub=subject, absref=absreference, cache=cache) - - if sp.call(cmd, shell=True) != 0: - raise IOError('Error calling freesurfer BBR!') + x = np.loadtxt(os.path.join(cache, "out.mat")) + # Pass transform as FROM epi TO anat; transform will be inverted + # back to anat-to-epi, standard direction for pycortex internal + # storage by from_fsl + xfm = Transform.from_fsl(x, absreference, raw) + xfm.save(subject, xfmname, "coord") + print("Success") - xfm = Transform.from_freesurfer(os.path.join(cache, "register.dat"), absreference, subject) + finally: + if not noclean: + shutil.rmtree(cache) else: - raw = db.get_anat(subject, type='raw').get_filename() - bet = db.get_anat(subject, type='brainmask').get_filename() - wmseg = db.get_anat(subject, type='whitematter').get_filename() - #Compute anatomical-to-epi transform - print('FLIRT pre-alignment') - cmd = '{fslpre}flirt -in {epi} -ref {bet} -dof 6 {pre_flirt_args} -omat {cache}/init.mat'.format( - fslpre=fsl_prefix, cache=cache, epi=absreference, bet=bet, pre_flirt_args=pre_flirt_args) - if sp.call(cmd, shell=True) != 0: - raise IOError('Error calling initial FLIRT') - - - print('Running BBR') - # Run epi-to-anat transform (this is more stable than anat-to-epi in FSL!) - 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}' - cmd = cmd.format(fslpre=fsl_prefix, cache=cache, raw=bet, wmseg=wmseg, epi=absreference, schfile=schfile, bbrtype=bbrtype) - if sp.call(cmd, shell=True) != 0: - raise IOError('Error calling BBR flirt') - - x = np.loadtxt(os.path.join(cache, "out.mat")) - # Pass transform as FROM epi TO anat; transform will be inverted - # back to anat-to-epi, standard direction for pycortex internal - # storage by from_fsl - xfm = Transform.from_fsl(x,absreference,raw) + retval = cache + return retval - # Save as pycortex 'coord' transform - xfm.save(subject,xfmname,'coord') - print('Success') +
+[docs] +def automatic( + subject, + xfmname, + reference, + init="coreg", + epi_mask=False, + intermediate=None, + reference_contrast="t2", + noclean=False, +): + """Perform automatic alignment using Freesurfer's boundary-based registration. + The `reference` image and resulting transform called `xfmname` will be automatically + stored in the database. + + If `noclean` is set to True, intermediate files will not be removed from /tmp. + + It's good practice to open up this transform afterward in the manual aligner and + check how it worked. Do that using the following code (passing the same `subject` + and `xfmname` used here, no need for `reference`): + + > cortex.align.manual(subject, xfmname) + + Parameters + ---------- + subject : str + Subject identifier. + xfmname : str + Name of the transform to be created and stored in the database. + reference : str + Path to a nibabel-readable image that will be used as the reference for + this transform. Usually, this is a single (3D) functional data volume. + init : str, optional + One of "coreg", "fsl", "header", or a path to a transform from the reference + volume to the anatomical volume. + Specifies the initialization method to obtain a first alignment that will be + refined with bbregister. Default is "coreg", which uses Freesurfer's `mri_coreg` + and it generally performs best. Other options include "fsl" to use FSL's FLIRT + or "header" to assume that the reference and the anatomical are already close + enough (this option can be used when the reference and the anatomical are + acquired in the same session). Finally, you can also specify a path to a + transform file (in DAT or LTA format) that will be used as initialization. + epi_mask : bool, optional + If True, then the flag --epi-mask is passed to bbregister to mask out areas + with spatial distortions. This setting recommended whenever the reference was + not distortion corrected. + intermediate : str + Path to a nibabel-readable image that will be used as intermediate volume + for alignment. This is useful if the reference image has a small field-of-view + and a whole-brain image was acquired in the same session. + reference_contrast : str + Contrast of the reference image. This is used to determine the appropriate + contrast for the reference image in the bbregister command. Default is "t2" + (for BOLD): gray matter is brighter than white matter. + The alternative option is "t1": white matter is brighter than gray matter. + noclean : bool, optional + If True, intermediate files will not be removed from /tmp (this is useful + for debugging things), and the returned value will be the name of the + temp directory. Default False. + + Returns + ------- + None or path to temp directory if `noclean` is True. + """ + warnings.warn( + "Defaults changed in pycortex 1.2.8. Now automatic alignment uses Freesurfer's " + "bbregister and mri_coreg for initialization. If you want to use FSL's BBR, " + "use the function `cortex.align.automatic_fsl` instead." + ) + + retval = None + try: + cache = tempfile.mkdtemp() + reference = os.path.abspath(reference) + print("Running freesurfer BBR") + # Start building the command + cmd = f"bbregister --s {subject} --mov {reference} --reg {cache}/register.dat " + cmd += f"--{reference_contrast}" + if init in ["coreg", "fsl", "header"]: + cmd += f" --init-{init}" + else: + init = os.path.abspath(init) + cmd += f" --init-reg {init}" + if epi_mask: + cmd += " --epi-mask" + if intermediate is not None: + intermediate = os.path.abspath(intermediate) + cmd += f" --int {intermediate}" + cmd = cmd.format(sub=subject, absref=reference, cache=cache) + + if sp.call(cmd.split()) != 0: + raise IOError("Error calling freesurfer BBR!") + + xfm = Transform.from_freesurfer( + os.path.join(cache, "register.dat"), reference, subject + ) + # Save as pycortex 'coord' transform + xfm.save(subject, xfmname, "coord") + # Load mincost to provide some information + # The four values stored in .mincost are + # 1. quality of the registration (0 to 1, with 0 is perfect) + # 2. mean of WM just below the surface + # 3. mean of GM just above the surface + # 4. percent contrast + # https://surfer.nmr.mgh.harvard.edu/fswiki/MultiModalTutorialV6.0/MultiModalRegistration + # Let's return only the quality of the registration + mincost = np.loadtxt(os.path.join(cache, "register.dat.mincost")) + print( + f"bbregister finished with a mincost of {mincost[0]:.2f}\n" + "Values between 0 and 0.5 indicate a good registration.\n" + "But you should manually inspect the alignment anyway." + ) finally: if not noclean: shutil.rmtree(cache) else: retval = cache - return retval
-
[docs]def autotweak(subject, xfmname): - """Tweak an alignment using the FLIRT boundary-based alignment (BBR) from FSL. + + +
+[docs] +def autotweak(subject, xfmname): + """Tweak an alignment using the FLIRT boundary-based alignment (BBR) from FSL. Ideally this function should actually use a limited search range, but it doesn't. It's probably not very useful. @@ -400,12 +524,12 @@

Source code for cortex.align

     """
     import shlex
     import shutil
-    import tempfile
     import subprocess as sp
+    import tempfile
 
     from .database import db
-    from .xfm import Transform
     from .options import config
+    from .xfm import Transform
 
     fsl_prefix = config.get("basic", "fsl_prefix")
     schfile = os.path.join(os.path.split(os.path.abspath(__file__))[0], "bbr.sch")
@@ -434,6 +558,7 @@ 

Source code for cortex.align

         print('Saved transform as (%s, %s)'%(subject, xfmname+'_auto'))
     finally:
         shutil.rmtree(cache)
+
@@ -484,7 +609,7 @@

Related Topics

- - + + @@ -507,11 +632,11 @@

Quick search

diff --git a/_modules/cortex/anat.html b/_modules/cortex/anat.html index d3e060eb3..3b74539ef 100644 --- a/_modules/cortex/anat.html +++ b/_modules/cortex/anat.html @@ -1,28 +1,27 @@ - - + - cortex.anat — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.anat — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -51,14 +50,19 @@

Source code for cortex.anat

 fsl_prefix = config.get('basic', 'fsl_prefix')
 
 
-
[docs]def brainmask(outfile, subject): +
+[docs] +def brainmask(outfile, subject): raw = db.get_anat(subject, type='raw').get_filename() print('Brain masking anatomical...') cmd = '{fsl_prefix}bet {raw} {bet} -B -v'.format(fsl_prefix=fsl_prefix, raw=raw, bet=outfile) print("Calling: %s"%cmd) assert sp.call(cmd, shell=True) == 0, "Error calling fsl-bet"
-
[docs]def whitematter(outfile, subject, do_voxelize=False): + +
+[docs] +def whitematter(outfile, subject, do_voxelize=False): try: if not do_voxelize: raise IOError @@ -72,7 +76,7 @@

Source code for cortex.anat

             print ("Attempting to segment the brain with freesurfer...")
             bet2 = db.get_anat(subject, type='raw_wm').get_filename()
             vol = nibabel.load('{bet2}'.format(bet2=bet2))
-            vol_data = vol.get_data()
+            vol_data = vol.get_fdata()
             print(vol_data.shape)
             new_data = vol_data.copy()
             new_data[new_data==250] = 0
@@ -87,7 +91,7 @@ 

Source code for cortex.anat

             assert sp.call(cmd, shell=True) == 0, "Error calling fsl-fast"
 
             wmfl = 'fast_pve_2'
-            arr = np.asarray(nibabel.load('{cache}/{wmseg}.nii.gz'.format(cache=cache,wmseg=wmfl)).get_data())
+            arr = np.asarray(nibabel.load('{cache}/{wmseg}.nii.gz'.format(cache=cache,wmseg=wmfl)).get_fdata())
             if arr.sum() == 0:
                 from warnings import warn
                 warn('"fsl-fast" with default settings failed. Trying no pve, no bias correction...')
@@ -99,27 +103,31 @@ 

Source code for cortex.anat

             assert sp.call(cmd, shell=True) == 0, 'Error calling fsl-maths'
 
             # check generated mask succeeded
-            arr = np.asarray(nibabel.load('{outfl}'.format(outfl=outfile)).get_data())
+            arr = np.asarray(nibabel.load('{outfl}'.format(outfl=outfile)).get_fdata())
             assert arr.sum() >= 0, 'Error with generated whitematter mask.'
 
         finally:
             shutil.rmtree(cache)
-
[docs]def voxelize(outfile, subject, surf='wm', mp=True): - '''Voxelize the whitematter surface to generate the white matter mask''' + +
+[docs] +def voxelize(outfile, subject, surf='wm', mp=True): + '''Voxelize the whitematter surface to generate the white matter mask''' import nibabel from . import polyutils nib = db.get_anat(subject, "raw") shape = nib.get_shape() vox = np.zeros(shape, dtype=bool) for pts, polys in db.get_surf(subject, surf, nudge=False): - xfm = Transform(np.linalg.inv(nib.get_affine()), nib) + xfm = Transform(np.linalg.inv(nib.affine), nib) vox += polyutils.voxelize(xfm(pts), polys, shape=shape, center=(0,0,0), mp=mp).astype('bool') - nib = nibabel.Nifti1Image(vox, nib.get_affine(), header=nib.get_header()) + nib = nibabel.Nifti1Image(vox, nib.affine, header=nib.header) nib.to_filename(outfile) return vox.T
+
@@ -170,7 +178,7 @@

Related Topics

- - + + @@ -193,11 +201,11 @@

Quick search

diff --git a/_modules/cortex/database.html b/_modules/cortex/database.html index d49fe06f7..48a884c58 100644 --- a/_modules/cortex/database.html +++ b/_modules/cortex/database.html @@ -1,28 +1,27 @@ - - + - cortex.database — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.database — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -38,18 +37,19 @@

Source code for cortex.database

 """
 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.
 """
-import os
-import re
 import copy
+import functools
 import glob
 import json
+import os
+import re
 import shutil
-import warnings
 import tempfile
-import functools
-import numpy as np
-from hashlib import sha1
+import warnings
 from builtins import input
+from hashlib import sha1
+
+import numpy as np
 
 from . import options
 
@@ -141,7 +141,8 @@ 

Source code for cortex.database

         raise AttributeError
     
     def __repr__(self):
-        return "Transforms: [{xfms}]".format(xfms=",".join(self.xfms))
+        xfms = "\n".join(sorted(self.xfms))
+        return f"Available transforms for {self.subject}:\n{xfms}"
 
 class XfmSet(object):
     def __init__(self, subj, name, filestore=default_filestore):
@@ -171,13 +172,15 @@ 

Source code for cortex.database

 
     def __getitem__(self, item):
         import nibabel
-        return nibabel.load(self._masks[item]).get_data().T
+        return nibabel.load(self._masks[item]).get_fdata().T
 
     def __repr__(self):
         return "Masks: [{types}]".format(types=', '.join(self._masks.keys()))
 
-
[docs]class Database(object): - """ +
+[docs] +class Database(object): + """ Database() Surface database @@ -186,10 +189,13 @@

Source code for cortex.database

     ----------
     This database object dynamically generates handles to all subjects within the filestore.
     """
-
[docs] def __init__(self, filestore=default_filestore): +
+[docs] + def __init__(self, filestore=default_filestore): self.filestore = filestore self._subjects = None self.auxfile = None
+ def __repr__(self): subjs = "\n ".join(sorted(self.subjects.keys())) @@ -214,16 +220,22 @@

Source code for cortex.database

             return self._subjects
         subjs = os.listdir(os.path.join(self.filestore))
         subjs = [s for s in subjs if os.path.isdir(os.path.join(self.filestore, s))]
+        subjs = sorted(subjs)
         self._subjects = dict([(sname, SubjectDB(sname, filestore=self.filestore)) for sname in subjs])
         return self._subjects
 
-
[docs] def reload_subjects(self): - """Force the reload of the subject dictionary.""" +
+[docs] + def reload_subjects(self): + """Force the reload of the subject dictionary.""" self._subjects = None self.subjects
-
[docs] def get_anat(self, subject, type='raw', xfmname=None, recache=False, order=1, **kwargs): - """Return anatomical information from the filestore. Anatomical information is defined as + +
+[docs] + def get_anat(self, subject, type='raw', xfmname=None, recache=False, order=1, **kwargs): + """Return anatomical information from the filestore. Anatomical information is defined as any volume-space anatomical information pertaining to the subject, such as T1 image, white matter masks, etc. Volumes not found in the database will be automatically generated. @@ -259,10 +271,13 @@

Source code for cortex.database

             return anatnib
 
         from . import volume
-        return volume.anat2epispace(anatnib.get_data().T.astype(np.float), subject, xfmname, order=order)
+ return volume.anat2epispace(anatnib.get_fdata().T.astype(float), subject, xfmname, order=order)
-
[docs] def get_surfinfo(self, subject, type="curvature", recache=False, **kwargs): - """Return auxillary surface information from the filestore. Surface info is defined as + +
+[docs] + def get_surfinfo(self, subject, type="curvature", recache=False, **kwargs): + """Return auxiliary surface information from the filestore. Surface info is defined as anatomical information specific to a subject in surface space. A Vertex class will be returned as necessary. Info not found in the filestore will be automatically generated. @@ -312,11 +327,14 @@

Source code for cortex.database

             npz.close()
             return Vertex(verts, subject)
         return npz
+ -
[docs] def get_mri_surf2surf_matrix(self, subject, surface_type, hemi='both', +
+[docs] + def get_mri_surf2surf_matrix(self, subject, surface_type, hemi='both', fs_subj=None, target_subj='fsaverage', **kwargs): - """Get matrix generated by surf2surf to map one subject's surface to another's + """Get matrix generated by surf2surf to map one subject's surface to another's Parameters ---------- @@ -355,8 +373,12 @@

Source code for cortex.database

         from .utils import load_sparse_array, save_sparse_array
         if fs_subj is None:
             fs_subj = subject
-        fpath = self.get_paths(subject)['surf2surf'].format(source=fs_subj, target=target_subj)
-        # Backward compatiblity
+        fpath = self.get_paths(subject)['surf2surf'].format(
+            source=fs_subj,
+            target=target_subj,
+            surface_type=surface_type
+        )
+        # Backward compatibility
         fdir, _ = os.path.split(fpath)
         if not os.path.exists(fdir):
             print("Creating surf2surf directory for subject %s"%(subject))
@@ -376,12 +398,15 @@ 

Source code for cortex.database

                 save_sparse_array(fpath, tmp, h, mode='a')
         return mats
-
[docs] def get_overlay(self, subject, overlay_file=None, **kwargs): + +
+[docs] + def get_overlay(self, subject, overlay_file=None, **kwargs): from . import svgoverlay pts, polys = self.get_surf(subject, "flat", merge=True, nudge=True) paths = self.get_paths(subject) - # NOTE: This try loop is broken, in that it does nothing for the inteded + # NOTE: This try loop is broken, in that it does nothing for the intended # use case (loading an overlay from a packed subject) - needs fixing. # This hasn't come up yet due to very rare use of packed subjects. if self.auxfile is not None: @@ -403,9 +428,12 @@

Source code for cortex.database

         if overlay_file is None:
             overlay_file = paths['overlays']
         return svgoverlay.get_overlay(subject, overlay_file, pts, polys, **kwargs)
+ -
[docs] def save_xfm(self, subject, name, xfm, xfmtype="magnet", reference=None): - """ +
+[docs] + def save_xfm(self, subject, name, xfm, xfmtype="magnet", reference=None): + """ Load a transform into the surface database. If the transform exists already, update it If it does not exist, copy the reference epi into the filestore and insert. @@ -440,12 +468,12 @@

Source code for cortex.database

                 raise ValueError("Please specify a reference")
             fpath = os.path.join(path, "reference.nii.gz")
             nib = nibabel.load(reference)
-            data = nib.get_data()
+            data = nib.get_fdata()
             if len(data.shape) > 3:
                 import warnings
                 warnings.warn('You are importing a 4D dataset, automatically selecting the first volume as reference')
                 data = data[...,0]
-            out = nibabel.Nifti1Image(data, nib.get_affine(), header=nib.get_header())
+            out = nibabel.Nifti1Image(data, nib.affine, header=nib.header)
             nibabel.save(out, fpath)
 
             jsdict = dict()
@@ -453,10 +481,10 @@ 

Source code for cortex.database

         nib = nibabel.load(os.path.join(path, "reference.nii.gz"))
         if xfmtype == "magnet":
             jsdict['magnet'] = np.array(xfm).tolist()
-            jsdict['coord'] = np.dot(np.linalg.inv(nib.get_affine()), xfm).tolist()
+            jsdict['coord'] = np.dot(np.linalg.inv(nib.affine), xfm).tolist()
         elif xfmtype == "coord":
             jsdict['coord'] = np.array(xfm).tolist()
-            jsdict['magnet'] = np.dot(nib.get_affine(), xfm).tolist()
+            jsdict['magnet'] = np.dot(nib.affine, xfm).tolist()
         
         files = self.get_paths(subject)
         if len(glob.glob(files['masks'].format(xfmname=name, type="*"))) > 0:
@@ -464,9 +492,12 @@ 

Source code for cortex.database

             
         with open(fname, "w") as fp:
             json.dump(jsdict, fp, sort_keys=True, indent=4)
+ -
[docs] def get_xfm(self, subject, name, xfmtype="coord"): - """Retrieves a transform from the filestore +
+[docs] + def get_xfm(self, subject, name, xfmtype="coord"): + """Retrieves a transform from the filestore Parameters ---------- @@ -486,7 +517,7 @@

Source code for cortex.database

 
         if name == "identity":
             nib = self.get_anat(subject, 'raw')
-            return Transform(np.linalg.inv(nib.get_affine()), nib)
+            return Transform(np.linalg.inv(nib.affine), nib)
 
         fname = os.path.join(self.filestore, subject, "transforms", name, "matrices.xfm")
         reference = os.path.join(self.filestore, subject, "transforms", name, "reference.nii.gz")
@@ -494,9 +525,12 @@ 

Source code for cortex.database

             xfmdict = json.load(f)
         return Transform(xfmdict[xfmtype], reference)
-
[docs] @_memo + +
+[docs] + @_memo def get_surf(self, subject, type, hemisphere="both", merge=False, nudge=False): - '''Return the surface pair for the given subject, surface type, and hemisphere. + '''Return the surface pair for the given subject, surface type, and hemisphere. Parameters ---------- @@ -558,7 +592,10 @@

Source code for cortex.database

         except KeyError:
             raise IOError
-
[docs] def save_mask(self, subject, xfmname, type, mask): + +
+[docs] + def save_mask(self, subject, xfmname, type, mask): fname = self.get_paths(subject)['masks'].format(xfmname=xfmname, type=type) if os.path.exists(fname): raise IOError('Refusing to overwrite existing mask') @@ -567,11 +604,14 @@

Source code for cortex.database

         xfm = self.get_xfm(subject, xfmname)
         if xfm.shape != mask.shape:
             raise ValueError("Invalid mask shape: must match shape of reference image")
-        affine = xfm.reference.get_affine()
+        affine = xfm.reference.affine
         nib = nibabel.Nifti1Image(mask.astype(np.uint8).T, affine)
         nib.to_filename(fname)
-
[docs] def get_mask(self, subject, xfmname, type='thick'): + +
+[docs] + def get_mask(self, subject, xfmname, type='thick'): if hasattr(type, 'decode'): type = type.decode('utf8') @@ -584,7 +624,7 @@

Source code for cortex.database

         try:
             import nibabel
             nib = nibabel.load(fname)
-            return nib.get_data().T != 0
+            return nib.get_fdata().T != 0
         except IOError:
             print('Mask not found, generating...')
             from .utils import get_cortical_mask
@@ -592,8 +632,11 @@ 

Source code for cortex.database

             self.save_mask(subject, xfmname, type, mask)
             return mask
-
[docs] def get_shared_voxels(self, subject, xfmname, hemi="both", merge=True, use_astar=True, recache=False): - """Get an array indicating which vertices are inappropriately mapped to the same voxel. + +
+[docs] + def get_shared_voxels(self, subject, xfmname, hemi="both", merge=True, use_astar=True, recache=False): + """Get an array indicating which vertices are inappropriately mapped to the same voxel. For a given transform and surface, returns an array containing a list of vertices which are spatially distant on the cortical surface but that map to the same voxels (this occurs @@ -618,8 +661,11 @@

Source code for cortex.database

             voxels = np.load(shared_voxel_file)
             return voxels
-
[docs] def get_coords(self, subject, xfmname, hemisphere="both", magnet=None): - """Calculate the coordinates of each vertex in the epi space by transforming the fiducial to the coordinate space + +
+[docs] + def get_coords(self, subject, xfmname, hemisphere="both", magnet=None): + """Calculate the coordinates of each vertex in the epi space by transforming the fiducial to the coordinate space Parameters ---------- @@ -649,7 +695,10 @@

Source code for cortex.database

 
         return coords
-
[docs] def get_cache(self, subject): + +
+[docs] + def get_cache(self, subject): try: self.auxfile.get_surf(subject, "fiducial") #generate the hashed name of the filename and subject as the directory name @@ -669,8 +718,11 @@

Source code for cortex.database

             os.makedirs(cachedir)
         return cachedir
-
[docs] def clear_cache(self, subject, clear_all_caches=True): - """Clears config-specified and default file caches for a subject. + +
+[docs] + def clear_cache(self, subject, clear_all_caches=True): + """Clears config-specified and default file caches for a subject. """ local_cachedir = self.get_cache(subject) @@ -690,8 +742,11 @@

Source code for cortex.database

                 shutil.rmtree(default_cachedir)
                 os.makedirs(default_cachedir)
-
[docs] def get_paths(self, subject): - """Get a dictionary with a list of all candidate filenames for associated data, such as roi overlays, flatmap caches, and ctm caches. + +
+[docs] + def get_paths(self, subject): + """Get a dictionary with a list of all candidate filenames for associated data, such as roi overlays, flatmap caches, and ctm caches. """ surfpath = os.path.join(self.filestore, subject, "surfaces") @@ -723,12 +778,15 @@

Source code for cortex.database

             rois=os.path.join(self.filestore, subject, "rois.svg").format(subj=subject),
             overlays=os.path.join(self.filestore, subject, "overlays.svg").format(subj=subject),
             views=sorted([os.path.splitext(f)[0] for f in views]),
-            surf2surf=os.path.join(self.filestore, subject, "surf2surf", "{source}_to_{target}", "matrices.hdf"),
+            surf2surf=os.path.join(self.filestore, subject, "surf2surf", "{source}_to_{target}", "matrices_{surface_type}.hdf"),
         )
 
         return filenames
-
[docs] def make_subj(self, subject): + +
+[docs] + def make_subj(self, subject): if os.path.exists(os.path.join(self.filestore, subject)): if input("Are you sure you want to overwrite this existing subject?\n" "This will delete all files for this subject in the filestore, " @@ -743,9 +801,12 @@

Source code for cortex.database

                 os.makedirs(path)
             except OSError:
                 print("Error making directory %s"%path)
+ -
[docs] def save_view(self,vw,subject,name,is_overwrite=False): - """Set the view for an open webshow instance from a saved view +
+[docs] + def save_view(self,vw,subject,name,is_overwrite=False): + """Set the view for an open webshow instance from a saved view Sets the view in a currently-open cortex.webshow instance (with handle `vw`) to the saved view named `name` @@ -772,8 +833,11 @@

Source code for cortex.database

         with open(sName,'w') as fp:
             json.dump(view, fp)
-
[docs] def get_view(self,vw,subject,name): - """Set the view for an open webshow instance from a saved view + +
+[docs] + def get_view(self,vw,subject,name): + """Set the view for an open webshow instance from a saved view Sets the view in a currently-open cortex.webshow instance (with handle `vw`) to the saved view named `name` @@ -796,8 +860,11 @@

Source code for cortex.database

             view = json.load(fp)
         vw._set_view(**view)
-
[docs] def get_mnixfm(self, subject, xfm, template=None): - """Get transform from the space specified by `xfm` to MNI space. + +
+[docs] + def get_mnixfm(self, subject, xfm, template=None): + """Get transform from the space specified by `xfm` to MNI space. Parameters ---------- @@ -845,7 +912,9 @@

Source code for cortex.database

             # Cache the result
             mni._save_fsl_xfm(mnixfmfile, mnixfm)
 
-        return mnixfm
+ return mnixfm
+
+ db = Database()
@@ -898,7 +967,7 @@

Related Topics

- - + + @@ -921,11 +990,11 @@

Quick search

diff --git a/_modules/cortex/dataset/dataset.html b/_modules/cortex/dataset/dataset.html index 66e816700..802fed45b 100644 --- a/_modules/cortex/dataset/dataset.html +++ b/_modules/cortex/dataset/dataset.html @@ -1,28 +1,27 @@ - - + - cortex.dataset.dataset — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.dataset.dataset — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -46,22 +45,29 @@

Source code for cortex.dataset.dataset

 from .views import normalize as _vnorm
 from .views import Dataview, Volume, _from_hdf_data
 
-
[docs]class Dataset(object): - """ +
+[docs] +class Dataset(object): + """ Wrapper for multiple data objects. This often does not need to be used explicitly--for example, if a dictionary of data objects is passed to `cortex.webshow`, it will automatically be converted into a `Dataset`. All kwargs should be `BrainData` or `Dataset` objects. """ -
[docs] def __init__(self, **kwargs): +
+[docs] + def __init__(self, **kwargs): self.h5 = None self.views = {} self.append(**kwargs)
-
[docs] def append(self, **kwargs): - """Add the `BrainData` or `Dataset` objects in `kwargs` into this + +
+[docs] + def append(self, **kwargs): + """Add the `BrainData` or `Dataset` objects in `kwargs` into this dataset. """ for name, data in kwargs.items(): @@ -76,6 +82,7 @@

Source code for cortex.dataset.dataset

 
         return self
+ def __getattr__(self, attr): if attr in self.__dict__: return self.__dict__[attr] @@ -101,8 +108,27 @@

Source code for cortex.dataset.dataset

     def __dir__(self):
         return list(self.__dict__.keys()) + list(self.views.keys())
 
-
[docs] @classmethod - def from_file(cls, filename): +
+[docs] + @classmethod + def from_file(cls, filename, subject=None): + """Load a pycortex Dataset (cortex.Dataset class) from a file + + Parameters + ---------- + filename : str + .hdf file from which to load + subject : str, optional + string ID for pycortex subject, if subject name has changed + since the Dataset was created. `None` input assumes subject + name in saved file is a subject in your current pycortex + filestore. By default None + + Returns + ------- + Dataset + pycortex Dataset + """ ds = cls() ds.h5 = h5py.File(filename, 'r') @@ -113,14 +139,17 @@

Source code for cortex.dataset.dataset

             if name in ("data", "subjects", "views"):
                 continue
             try:
-                ds.views[name] = _from_hdf_data(ds.h5, name)
+                ds.views[name] = _from_hdf_data(ds.h5, name, subject=subject)
             except KeyError:
                 print('No metadata found for "%s", skipping...'%name)
 
         #load up the views generated by pycortex
         for name, node in ds.h5['views'].items():
             try:
-                ds.views[name] = Dataview.from_hdf(node)
+                ds.views[name] = Dataview.from_hdf(node, subject=subject)
+            except FileNotFoundError:
+                print("Could not load file; old subject name? Try using `subject` kwarg to specify a current pycortex subject")
+                raise
             except Exception:
                 import traceback
                 traceback.print_exc()
@@ -128,9 +157,12 @@ 

Source code for cortex.dataset.dataset

         db.auxfile = None
 
         return ds
+ -
[docs] def uniques(self, collapse=False): - """Return the set of unique BrainData objects contained by this dataset""" +
+[docs] + def uniques(self, collapse=False): + """Return the set of unique BrainData objects contained by this dataset""" uniques = set() for name, view in self: for sv in view.uniques(collapse=collapse): @@ -138,7 +170,10 @@

Source code for cortex.dataset.dataset

 
         return uniques
-
[docs] def save(self, filename=None, pack=False): + +
+[docs] + def save(self, filename=None, pack=False): if filename is not None: self.h5 = h5py.File(filename, 'a') elif self.h5 is None: @@ -167,7 +202,10 @@

Source code for cortex.dataset.dataset

 
         self.h5.flush()
-
[docs] def get_surf(self, subject, type, hemi='both', merge=False, nudge=False): + +
+[docs] + def get_surf(self, subject, type, hemi='both', merge=False, nudge=False): if hemi == 'both': left = self.get_surf(subject, type, "lh", nudge=nudge) right = self.get_surf(subject, type, "rh", nudge=nudge) @@ -194,21 +232,30 @@

Source code for cortex.dataset.dataset

         except (KeyError, TypeError):
             raise IOError('Subject not found in package')
-
[docs] def get_xfm(self, subject, xfmname): + +
+[docs] + def get_xfm(self, subject, xfmname): try: group = self.h5['subjects'][subject]['transforms'][xfmname] return Transform(group['xfm'][:], tuple(group['xfm'].attrs['shape'])) except (KeyError, TypeError): raise IOError('Transform not found in package')
-
[docs] def get_mask(self, subject, xfmname, maskname): + +
+[docs] + def get_mask(self, subject, xfmname, maskname): try: group = self.h5['subjects'][subject]['transforms'][xfmname]['masks'] return group[maskname] except (KeyError, TypeError): raise IOError('Mask not found in package')
-
[docs] def get_overlay(self, subject, type='rois', **kwargs): + +
+[docs] + def get_overlay(self, subject, type='rois', **kwargs): try: group = self.h5['subjects'][subject] if type == "rois": @@ -221,15 +268,20 @@

Source code for cortex.dataset.dataset

 
         raise TypeError('Unknown overlay type')
-
[docs] def prepend(self, prefix): - """Adds the given `prefix` to the name of every data object and returns + +
+[docs] + def prepend(self, prefix): + """Adds the given `prefix` to the name of every data object and returns a new Dataset. """ ds = dict() for name, data in self: ds[prefix+name] = data - return Dataset(**ds)
+ return Dataset(**ds)
+
+ def normalize(data): if isinstance(data, (Dataset, Dataview)): @@ -320,7 +372,7 @@

Related Topics

- - + + @@ -343,11 +395,11 @@

Quick search

diff --git a/_modules/cortex/dataset/view2D.html b/_modules/cortex/dataset/view2D.html index 27f7cc4b0..a143d2696 100644 --- a/_modules/cortex/dataset/view2D.html +++ b/_modules/cortex/dataset/view2D.html @@ -1,28 +1,27 @@ - - + - cortex.dataset.view2D — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.dataset.view2D — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -37,6 +36,8 @@

Source code for cortex.dataset.view2D

 import os
 import json
+import warnings
+
 import numpy as np
 
 from .. import options
@@ -46,7 +47,7 @@ 

Source code for cortex.dataset.view2D

 default_cmap2D = options.config.get("basic", "default_cmap2D")
 
 class Dataview2D(Dataview):
-    """Abstract base class for 2-dimensional data views.
+    """Abstract base class for 2-dimensional data views.
     """
     def __init__(self, description="", cmap=None, vmin=None, vmax=None, vmin2=None, vmax2=None, state=None, **kwargs):
         self.cmap = cmap or default_cmap2D
@@ -99,6 +100,7 @@ 

Source code for cortex.dataset.view2D

         from matplotlib.colors import Normalize
         cmapdir = options.config.get("webgl", "colormaps")
         cmap = plt.imread(os.path.join(cmapdir, "%s.png"%self.cmap))
+        _warn_non_perceptually_uniform_colormap(self.cmap)
 
         norm1 = Normalize(self.vmin, self.vmax)
         norm2 = Normalize(self.vmin2, self.vmax2)
@@ -136,8 +138,10 @@ 

Source code for cortex.dataset.view2D

     def subject(self):
         return self.dim1.subject
 
-
[docs]class Volume2D(Dataview2D): - """ +
+[docs] +class Volume2D(Dataview2D): + """ Contains two 3D volumes for simultaneous visualization. Includes information on how the volumes should be jointly colormapped. @@ -174,7 +178,9 @@

Source code for cortex.dataset.view2D

     """
     _cls = VolumeData
 
-
[docs] def __init__(self, dim1, dim2, subject=None, xfmname=None, description="", cmap=None, +
+[docs] + def __init__(self, dim1, dim2, subject=None, xfmname=None, description="", cmap=None, vmin=None, vmax=None, vmin2=None, vmax2=None, **kwargs): if isinstance(dim1, self._cls): if subject is not None or xfmname is not None: @@ -195,6 +201,7 @@

Source code for cortex.dataset.view2D

         super(Volume2D, self).__init__(description=description, cmap=cmap, vmin=vmin,
                                        vmax=vmax, vmin2=vmin2, vmax2=vmax2, **kwargs)
+ def __repr__(self): return "<2D volumetric data for (%s, %s)>"%(self.dim1.subject, self.dim1.xfmname) @@ -205,7 +212,7 @@

Source code for cortex.dataset.view2D

 
     @property
     def raw(self):
-        """VolumeRGB object containing the colormapped data from this object.
+        """VolumeRGB object containing the colormapped data from this object.
         """
         if self.dim1.xfmname != self.dim2.xfmname:
             raise ValueError("Both Volumes must have same xfmname to generate single raw volume")
@@ -228,8 +235,11 @@ 

Source code for cortex.dataset.view2D

     def xfmname(self):
         return self.dim1.xfmname
-
[docs]class Vertex2D(Dataview2D): - """ + +
+[docs] +class Vertex2D(Dataview2D): + """ Contains two vertex maps for simultaneous visualization. Includes information on how the maps should be jointly colormapped. @@ -264,7 +274,9 @@

Source code for cortex.dataset.view2D

     _cls = VertexData
     blend_curvature = _cls.blend_curvature  # hacky inheritance
 
-
[docs] def __init__(self, dim1, dim2, subject=None, description="", cmap=None, +
+[docs] + def __init__(self, dim1, dim2, subject=None, description="", cmap=None, vmin=None, vmax=None, vmin2=None, vmax2=None, **kwargs): if isinstance(dim1, VertexData): if subject is not None: @@ -286,12 +298,13 @@

Source code for cortex.dataset.view2D

                                        vmin=vmin, vmax=vmax, vmin2=vmin2,
                                        vmax2=vmax2, **kwargs)
+ def __repr__(self): return "<2D vertex data for (%s)>"%self.dim1.subject @property def raw(self): - """VertexRGB object containing the colormapped data from this object. + """VertexRGB object containing the colormapped data from this object. """ r, g, b, a = self._to_raw(self.dim1.data, self.dim2.data) # Allow manual override of alpha channel @@ -303,6 +316,21 @@

Source code for cortex.dataset.view2D

     @property
     def vertices(self):
         return self.raw.vertices
+ + + +def _warn_non_perceptually_uniform_colormap(cmap): + mapping = { + "BuOr_2D": "PU_BuOr_covar", + "RdBu_covar": "PU_RdBu_covar", + "RdBu_covar2": "PU_BuOr_covar", + "RdBu_covar_alpha": "PU_RdBu_covar_alpha", + "RdGn_covar": "PU_RdGn_covar", + "hot_alpha": "fire_alpha", + } + if cmap in mapping: + warnings.warn("Colormap %r is not perceptually uniform. Consider using" + " %r instead." % (cmap, mapping[cmap]), UserWarning)
@@ -353,7 +381,7 @@

Related Topics

- - + + @@ -376,11 +404,11 @@

Quick search

diff --git a/_modules/cortex/dataset/viewRGB.html b/_modules/cortex/dataset/viewRGB.html index 827837f7f..a19a68ff5 100644 --- a/_modules/cortex/dataset/viewRGB.html +++ b/_modules/cortex/dataset/viewRGB.html @@ -1,28 +1,27 @@ - - + - cortex.dataset.viewRGB — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.dataset.viewRGB — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -37,6 +36,7 @@

Source code for cortex.dataset.viewRGB

 import numpy as np
 import colorsys
+import warnings
 
 from .views import Dataview, Volume, Vertex
 from .braindata import VolumeData, VertexData, _hash
@@ -47,7 +47,7 @@ 

Source code for cortex.dataset.viewRGB

 
 
 class Colors(object):
-    """
+    """
     Set of known colors
     """
     RoseRed = (237, 35, 96)
@@ -60,7 +60,7 @@ 

Source code for cortex.dataset.viewRGB

 
 
 def RGB2HSV(color):
-    """
+    """
     Converts RGB to HS
     Parameters
     ----------
@@ -79,7 +79,7 @@ 

Source code for cortex.dataset.viewRGB

 
 
 def HSV2RGB(color):
-    """
+    """
     Converts HSV to RGB
 
     Parameters
@@ -97,7 +97,7 @@ 

Source code for cortex.dataset.viewRGB

 
 
 class DataviewRGB(Dataview):
-    """Abstract base class for RGB data views.
+    """Abstract base class for RGB data views.
     """
     def __init__(self, subject=None, alpha=None, description="", state=None, **kwargs):
         self.alpha = alpha
@@ -155,8 +155,14 @@ 

Source code for cortex.dataset.viewRGB

             sdict['vmax'] = [255]
         return sdict
 
-
[docs]class VolumeRGB(DataviewRGB): - """ + def get_cmapdict(self): + return dict() + + +
+[docs] +class VolumeRGB(DataviewRGB): + """ Contains RGB (or RGBA) colors for each voxel in a volumetric dataset. Includes information about the subject and transform for the data. @@ -211,7 +217,7 @@

Source code for cortex.dataset.viewRGB

         Use the same vmin and vmax for all three color channels?
     shared_vmin : float, optional
         Predetermined shared vmin. Does nothing if shared_range == False. If not given,
-        will be the 1st percentil of all values across all three channels.
+        will be the 1st percentile of all values across all three channels.
     shared_vmax : float, optional
         Predetermined shared vmax. Does nothing if shared_range == False. If not given,
         will be the 99th percentile of all values across all three channels
@@ -222,7 +228,9 @@ 

Source code for cortex.dataset.viewRGB

     """
     _cls = VolumeData
 
-
[docs] def __init__(self, channel1, channel2, channel3, subject=None, xfmname=None, alpha=None, description="", +
+[docs] + def __init__(self, channel1, channel2, channel3, subject=None, xfmname=None, alpha=None, description="", state=None, channel1color=Colors.Red, channel2color=Colors.Green, channel3color=Colors.Blue, max_color_value=None, max_color_saturation=1.0, shared_range=False, shared_vmin=None, shared_vmax=None, **kwargs): @@ -244,13 +252,18 @@

Source code for cortex.dataset.viewRGB

                 self.red = channel1
                 self.green = channel2
                 self.blue = channel3
+                self.alpha = alpha
             else:  # need to remap colors
-                red, green, blue = VolumeRGB.color_voxels(channel1, channel2, channel3, channel1color, channel2color,
-                                                          channel3color, max_color_value, max_color_saturation,
-                                                          shared_range, shared_vmin, shared_vmax)
+                red, green, blue, alpha = VolumeRGB.color_voxels(
+                    channel1, channel2, channel3,
+                    channel1color, channel2color, channel3color,
+                    max_color_value, max_color_saturation,
+                    shared_range, shared_vmin, shared_vmax, alpha=alpha
+                )
                 self.red = Volume(red, channel1.subject, channel1.xfmname)
                 self.green = Volume(green, channel1.subject, channel1.xfmname)
                 self.blue = Volume(blue, channel1.subject, channel1.xfmname)
+                self.alpha = alpha
         else:
             if subject is None or xfmname is None:
                 raise TypeError("Subject and xfmname are required")
@@ -260,24 +273,18 @@ 

Source code for cortex.dataset.viewRGB

                 self.red = Volume(channel1, subject, xfmname)
                 self.green = Volume(channel2, subject, xfmname)
                 self.blue = Volume(channel3, subject, xfmname)
-            else:	# need to remap colors
-                red, green, blue = VolumeRGB.color_voxels(channel1, channel2, channel3, channel1color, channel2color,
-                                                          channel3color, max_color_value, max_color_saturation,
-                                                          shared_range, shared_vmin, shared_vmax)
+                self.alpha = alpha
+            else:  # need to remap colors
+                red, green, blue, alpha = VolumeRGB.color_voxels(
+                    channel1, channel2, channel3,
+                    channel1color, channel2color, channel3color,
+                    max_color_value, max_color_saturation,
+                    shared_range, shared_vmin, shared_vmax, alpha=alpha
+                )
                 self.red = Volume(red, subject, xfmname)
                 self.green = Volume(green, subject, xfmname)
                 self.blue = Volume(blue, subject, xfmname)
-
-
-        if alpha is None:
-            alpha = np.ones(self.red.volume.shape)
-            alpha = Volume(alpha, self.red.subject, self.red.xfmname,
-                           vmin=0, vmax=1)
-
-        if not isinstance(alpha, Volume):
-            alpha = Volume(alpha, self.red.subject, self.red.xfmname)
-
-        self.alpha = alpha
+                self.alpha = alpha
 
         if self.red.xfmname == self.green.xfmname == self.blue.xfmname == self.alpha.xfmname:
             self.xfmname = self.red.xfmname
@@ -286,7 +293,36 @@ 

Source code for cortex.dataset.viewRGB

 
         super(VolumeRGB, self).__init__(subject, alpha, description=description, state=state, **kwargs)
-
[docs] def to_json(self, simple=False): + + @property + def alpha(self): + """Compute alpha transparency""" + alpha = self._alpha + if alpha is None: + alpha = np.ones(self.red.volume.shape) + alpha = Volume(alpha, self.red.subject, self.red.xfmname, vmin=0, vmax=1) + if not isinstance(alpha, Volume): + if alpha.dtype != np.uint8 and (alpha.min() < 0 or alpha.max() > 1): + warnings.warn( + "Some alpha values are outside the range of [0, 1]. " + "Consider passing a Volume object as alpha with explicit vmin, vmax " + "keyword arguments.", + Warning + ) + alpha = Volume(alpha, self.red.subject, self.red.xfmname, vmin=0, vmax=1) + + rgb = np.array([self.red.volume, self.green.volume, self.blue.volume]) + mask = np.isnan(rgb).any(axis=0) + alpha.volume[mask] = alpha.vmin + return alpha + + @alpha.setter + def alpha(self, alpha): + self._alpha = alpha + +
+[docs] + def to_json(self, simple=False): sdict = super(VolumeRGB, self).to_json(simple=simple) if simple: sdict['shape'] = self.red.shape @@ -295,9 +331,10 @@

Source code for cortex.dataset.viewRGB

 
         return sdict
+ @property def volume(self): - """5-dimensional volume (t, z, y, x, rgba) with data that has been mapped + """5-dimensional volume (t, z, y, x, rgba) with data that has been mapped into 8-bit unsigned integers that correspond to colors. """ volume = [] @@ -340,11 +377,13 @@

Source code for cortex.dataset.viewRGB

     def raw(self):
         return self
 
-
[docs] @staticmethod +
+[docs] + @staticmethod def color_voxels(channel1, channel2, channel3, channel1color, channel2color, channel3Color, value_max, saturation_max, common_range, - common_min, common_max): - """ + common_min, common_max, alpha=None): + """ Colors voxels in 3 color dimensions but not necessarily canonical red, green, and blue Parameters ---------- @@ -373,25 +412,41 @@

Source code for cortex.dataset.viewRGB

         common_max : float, optional
             Predetermined shared vmax. Does nothing if shared_range == False. If not given,
             will be the 99th percentile of all values across all three channels
+        alpha : ndarray or Volume, optional
+            Alpha values for each voxel. If None, alpha is set to 1 for all voxels. 
 
         Returns
         -------
         red : ndarray of channel1.shape
             uint8 array of red values
-        green : ndarray of data2.shape
+        green : ndarray of channel1.shape
             uint8 array of green values
-        blue : ndarray of data3.shape
+        blue : ndarray of channel1.shape
             uint8 array of blue values
-
+        alpha : ndarray
+            If alpha=None, uint8 array of alpha values with alpha=1 for every voxel. 
+            Otherwise, the same alpha values that were passed in. Additionally, 
+            voxels with NaNs will have an alpha value of 0.
         """
         # normalize each channel to [0, 1]
-        data1 = np.nan_to_num(channel1.data if isinstance(channel1, VolumeData) else channel1).astype(np.float)
-        data2 = np.nan_to_num(channel2.data if isinstance(channel2, VolumeData) else channel2).astype(np.float)
-        data3 = np.nan_to_num(channel3.data if isinstance(channel3, VolumeData) else channel3).astype(np.float)
+        data1 = channel1.data if isinstance(channel1, VolumeData) else channel1
+        data1 = data1.astype(float)
+        data2 = channel2.data if isinstance(channel2, VolumeData) else channel2
+        data2 = data2.astype(float)
+        data3 = channel3.data if isinstance(channel3, VolumeData) else channel3
+        data3 = data3.astype(float)
 
         if (data1.shape != data2.shape) or (data2.shape != data3.shape):
             raise ValueError('Volumes are of different shapes')
 
+        # Create an alpha mask now, before casting nans to 0
+        # Voxels with at least one channel equal to NaN will be masked out.
+        mask = np.isnan(np.array([data1, data2, data3])).any(axis=0)
+        # Now convert to NaNs to num for all channels
+        data1 = np.nan_to_num(data1)
+        data2 = np.nan_to_num(data2)
+        data3 = np.nan_to_num(data3)
+
         if common_range:
             if common_min is None:
                 if common_max is None:
@@ -452,11 +507,20 @@ 

Source code for cortex.dataset.viewRGB

             green.flat[i] = this_color[1]
             blue.flat[i] = this_color[2]
 
-        return red, green, blue
+ # Now make an alpha volume + if alpha is None: + alpha = np.ones_like(red, np.uint8) * 255 + alpha[mask] = 0 + + return red, green, blue, alpha
+
+ -
[docs]class VertexRGB(DataviewRGB): - """ +
+[docs] +class VertexRGB(DataviewRGB): + """ Contains RGB (or RGBA) colors for each vertex in a surface dataset. Includes information about the subject. @@ -495,7 +559,9 @@

Source code for cortex.dataset.viewRGB

     _cls = VertexData
     blend_curvature = _cls.blend_curvature  # hacky inheritance
 
-
[docs] def __init__(self, red, green, blue, subject=None, alpha=None, description="", +
+[docs] + def __init__(self, red, green, blue, subject=None, alpha=None, description="", state=None, **kwargs): if isinstance(red, VertexData): @@ -513,19 +579,41 @@

Source code for cortex.dataset.viewRGB

             self.green = Vertex(green, subject)
             self.blue = Vertex(blue, subject)
 
-        if alpha is None:
-            alpha = np.ones(self.red.vertices.shape)
-            alpha = Vertex(alpha, self.red.subject, vmin=0, vmax=1)
-        if not isinstance(alpha, Vertex):
-            alpha = Vertex(alpha, self.red.subject)
         self.alpha = alpha
 
         super(VertexRGB, self).__init__(subject, alpha, description=description,
                                         state=state, **kwargs)
+ + @property + def alpha(self): + """Compute alpha transparency""" + alpha = self._alpha + if alpha is None: + alpha = np.ones(self.red.vertices.shape[1]) + alpha = Vertex(alpha, self.red.subject, vmin=0, vmax=1) + if not isinstance(alpha, Vertex): + if alpha.dtype != np.uint8 and (alpha.min() < 0 or alpha.max() > 1): + warnings.warn( + "Some alpha values are outside the range of [0, 1]. " + "Consider passing a Vertex object as alpha with explicit vmin, vmax " + "keyword arguments.", + Warning + ) + alpha = Vertex(alpha, self.red.subject, vmin=0, vmax=1) + + rgb = np.array([self.red.data, self.green.data, self.blue.data]) + mask = np.isnan(rgb).any(axis=0) + alpha.data[mask] = alpha.vmin + return alpha + + @alpha.setter + def alpha(self, alpha): + self._alpha = alpha + @property def vertices(self): - """3-dimensional volume (t, v, rgba) with data that has been mapped + """3-dimensional volume (t, v, rgba) with data that has been mapped into 8-bit unsigned integers that correspond to colors. """ verts = [] @@ -550,7 +638,9 @@

Source code for cortex.dataset.viewRGB

             verts.append(vert)
         return np.array(verts).transpose([1, 2, 0])
 
-
[docs] def to_json(self, simple=False): +
+[docs] + def to_json(self, simple=False): sdict = super(VertexRGB, self).to_json(simple=simple) if simple: @@ -558,6 +648,7 @@

Source code for cortex.dataset.viewRGB

 
         return sdict
+ @property def left(self): return self.vertices[:,:self.red.llen] @@ -579,6 +670,7 @@

Source code for cortex.dataset.viewRGB

     @property
     def raw(self):
         return self
+
@@ -629,7 +721,7 @@

Related Topics

- - + + @@ -652,11 +744,11 @@

Quick search

diff --git a/_modules/cortex/dataset/views.html b/_modules/cortex/dataset/views.html index fab6703f5..c66f1f85e 100644 --- a/_modules/cortex/dataset/views.html +++ b/_modules/cortex/dataset/views.html @@ -1,28 +1,27 @@ - - + - cortex.dataset.views — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.dataset.views — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -35,10 +34,11 @@

Source code for cortex.dataset.views

-import json
+import os
+import glob
+import json
 import h5py
 import numpy as np
-from six import string_types
 
 from .. import options
 from .braindata import BrainData, VolumeData, VertexData
@@ -61,22 +61,24 @@ 

Source code for cortex.dataset.views

     else:
         raise TypeError("Invalid input for Dataview")
 
-def _from_hdf_data(h5, name, xfmname=None, **kwargs):
-    """Decodes a __hash named node from an HDF file into the 
+def _from_hdf_data(h5, name, xfmname=None, subject=None, **kwargs):
+    """Decodes a __hash named node from an HDF file into the 
     constituent Vertex or Volume object"""
     dnode = h5.get("/data/%s"%name)
     if dnode is None:
         dnode = h5.get(name)
 
     attrs = {k: u(v) for (k, v) in dnode.attrs.items()}
-    subj = attrs['subject']
+    if subject is None:
+        subject = attrs['subject']
     #support old style xfmname saving as attribute
     if xfmname is None and 'xfmname' in attrs:
         xfmname = attrs['xfmname']
     mask = None
     if 'mask' in attrs:
         if attrs['mask'].startswith("__"):
-            mask = h5['/subjects/%s/transforms/%s/masks/%s'%(attrs['subject'], xfmname, attrs['mask'])].value
+            mask = h5['/subjects/%s/transforms/%s/masks/%s' %
+                      (attrs['subject'], xfmname, attrs['mask'])].value
         else:
             mask = attrs['mask']
 
@@ -87,37 +89,37 @@ 

Source code for cortex.dataset.views

             alpha = dnode[..., 3]
 
         if xfmname is None:
-            return VertexRGB(dnode[...,0], dnode[...,1], dnode[...,2], subj, 
+            return VertexRGB(dnode[...,0], dnode[...,1], dnode[...,2], subject, 
                              alpha=alpha, **kwargs)
 
-        return VolumeRGB(dnode[...,0], dnode[...,1], dnode[...,2], subj, xfmname, 
+        return VolumeRGB(dnode[...,0], dnode[...,1], dnode[...,2], subject, xfmname, 
                          alpha=alpha, mask=mask, **kwargs)
 
     if xfmname is None:
-        return Vertex(dnode, subj, **kwargs)
+        return Vertex(dnode, subject, **kwargs)
     
-    return Volume(dnode, subj, xfmname, mask=mask, **kwargs)
+    return Volume(dnode, subject, xfmname, mask=mask, **kwargs)
         
 
-def _from_hdf_view(h5, data, xfmname=None, vmin=None, vmax=None,  **kwargs):
+def _from_hdf_view(h5, data, xfmname=None, vmin=None, vmax=None,  subject=None, **kwargs):
 
-    if isinstance(data, string_types):
-        return _from_hdf_data(h5, data, xfmname=xfmname, vmin=vmin, vmax=vmax, **kwargs)
+    if isinstance(data, str):
+        return _from_hdf_data(h5, data, xfmname=xfmname, vmin=vmin, vmax=vmax, subject=subject, **kwargs)
         
     if len(data) == 2:
-        dim1 = _from_hdf_data(h5, data[0], xfmname=xfmname[0])
-        dim2 = _from_hdf_data(h5, data[1], xfmname=xfmname[1])
+        dim1 = _from_hdf_data(h5, data[0], xfmname=xfmname[0], subject=subject)
+        dim2 = _from_hdf_data(h5, data[1], xfmname=xfmname[1], subject=subject)
         cls = Vertex2D if isinstance(dim1, Vertex) else Volume2D
         return cls(dim1, dim2, vmin=vmin[0], vmin2=vmin[1], 
-                   vmax=vmax[0], vmax2=vmax[1], **kwargs)
+                   vmax=vmax[0], vmax2=vmax[1], subject=subject, **kwargs)
     elif len(data) == 4:
-        red, green, blue = [_from_hdf_data(h5, d, xfmname=xfmname) for d in data[:3]]
+        red, green, blue = [_from_hdf_data(h5, d, xfmname=xfmname, subject=subject) for d in data[:3]]
         alpha = None 
         if data[3] is not None:
-            alpha = _from_hdf_data(h5, data[3], xfmname=xfmname)
+            alpha = _from_hdf_data(h5, data[3], xfmname=xfmname, subject=subject)
 
         cls = VertexRGB if isinstance(red, Vertex) else VolumeRGB
-        return cls(red, green, blue, alpha=alpha, **kwargs)
+        return cls(red, green, blue, alpha=alpha, subject=subject, **kwargs)
     else:
         raise ValueError("Invalid Dataview specification")
 
@@ -175,7 +177,7 @@ 

Source code for cortex.dataset.views

         return sdict
 
     @staticmethod
-    def from_hdf(node):
+    def from_hdf(node, subject=None):
         data = json.loads(u(node[0]))
         desc = node[1]
         try:
@@ -201,9 +203,9 @@ 

Source code for cortex.dataset.views

         if len(data) == 1:
             xfm = None if xfmname is None else xfmname[0]
             return _from_hdf_view(node.file, data[0], xfmname=xfm, cmap=cmap[0], description=desc, 
-                                  vmin=vmin[0], vmax=vmax[0], state=state, **attrs)
+                                  vmin=vmin[0], vmax=vmax[0], state=state, subject=subject, **attrs)
         else:
-            views = [_from_hdf_view(node.file, d, xfmname=x) for d, x in zip(data, xfname)]
+            views = [_from_hdf_view(node.file, d, xfmname=x, subject=subject) for d, x in zip(data, xfmname)]
             raise NotImplementedError
 
     def _write_hdf(self, h5, name="data", data=None, xfmname=None):
@@ -224,28 +226,36 @@ 

Source code for cortex.dataset.views

         view[7] = json.dumps(xfmname)
         return view
 
+    def get_cmapdict(self):
+        """Returns a dictionary with cmap information."""
+
+        from matplotlib import colors, pyplot as plt
+
+        try:
+            # plt.get_cmap accepts:
+            # - matplotlib colormap names
+            # - pycortex colormap names previously registered in matplotlib
+            # - matplotlib.colors.Colormap instances
+            cmap = plt.get_cmap(self.cmap)
+        except ValueError:
+            # unknown colormap, test whether it's in pycortex colormaps
+            cmapdir = options.config.get('webgl', 'colormaps')
+            colormaps = glob.glob(os.path.join(cmapdir, "*.png"))
+            colormaps = dict(((os.path.split(c)[1][:-4], c) for c in colormaps))
+            if not self.cmap in colormaps:
+                raise ValueError('Unkown color map %s' % self.cmap)
+            I = plt.imread(colormaps[self.cmap])
+            cmap = colors.ListedColormap(np.squeeze(I))
+            # Register colormap to matplotlib to avoid loading it again
+            plt.register_cmap(self.cmap, cmap)
+
+        return dict(cmap=cmap, vmin=self.vmin, vmax=self.vmax)
+
     @property
     def raw(self):
-        from matplotlib import colors, cm, pyplot as plt
-        import glob, os
-        # Get colormap from matplotlib or pycortex colormaps
-        ## -- redundant code, here and in cortex/quicklflat.py -- ##
-        if isinstance(self.cmap, string_types):
-            if not self.cmap in cm.__dict__:
-                # unknown colormap, test whether it's in pycortex colormaps
-                cmapdir = options.config.get('webgl', 'colormaps')
-                colormaps = glob.glob(os.path.join(cmapdir, "*.png"))
-                colormaps = dict(((os.path.split(c)[1][:-4],c) for c in colormaps))
-                if not self.cmap in colormaps:
-                    raise Exception('Unkown color map!')
-                I = plt.imread(colormaps[self.cmap])
-                cmap = colors.ListedColormap(np.squeeze(I))
-                # Register colormap while we're at it
-                cm.register_cmap(self.cmap,cmap)
-            else:
-                cmap = cm.get_cmap(self.cmap)
-        elif isinstance(self.cmap, colors.Colormap):
-            cmap = self.cmap
+        from matplotlib import colors, cm
+
+        cmap = self.get_cmapdict()['cmap']
         # Normalize colors according to vmin, vmax
         norm = colors.Normalize(self.vmin, self.vmax) 
         cmapper = cm.ScalarMappable(norm=norm, cmap=cmap)
@@ -254,6 +264,7 @@ 

Source code for cortex.dataset.views

         color_data = (np.clip(color_data, 0, 1) * 255).astype(np.uint8)
         return np.rollaxis(color_data, -1)
 
+
 class Multiview(Dataview):
     def __init__(self, views, description=""):
         for view in views:
@@ -267,8 +278,10 @@ 

Source code for cortex.dataset.views

             for sv in view.uniques(collapse=collapse):
                 yield sv
 
-
[docs]class Volume(VolumeData, Dataview): - """ +
+[docs] +class Volume(VolumeData, Dataview): + """ Encapsulates a 3D volume or 4D volumetric movie. Includes information on how the volume should be colormapped for display purposes. @@ -303,7 +316,9 @@

Source code for cortex.dataset.views

         All additional arguments in kwargs are passed to the VolumeData and Dataview
 
     """
-
[docs] def __init__(self, data, subject, xfmname, mask=None, +
+[docs] + def __init__(self, data, subject, xfmname, mask=None, cmap=None, vmin=None, vmax=None, description="", **kwargs): super(Volume, self).__init__(data, subject, xfmname, mask=mask, cmap=cmap, vmin=vmin, vmax=vmax, @@ -314,6 +329,7 @@

Source code for cortex.dataset.views

         self.vmax = self.vmax if self.vmax is not None else \
             np.percentile(np.nan_to_num(self.data), 99)
+ def _write_hdf(self, h5, name="data"): datanode = VolumeData._write_hdf(self, h5) viewnode = Dataview._write_hdf(self, h5, name=name, @@ -328,8 +344,11 @@

Source code for cortex.dataset.views

                          description=self.description, state=self.state,
                          **self.attrs)
-
[docs]class Vertex(VertexData, Dataview): - """ + +
+[docs] +class Vertex(VertexData, Dataview): + """ Encapsulates a 1D vertex map or 2D vertex movie. Includes information on how the data should be colormapped for display purposes. @@ -357,7 +376,9 @@

Source code for cortex.dataset.views

         All additional arguments in kwargs are passed to the VolumeData and Dataview
 
     """
-
[docs] def __init__(self, data, subject, cmap=None, vmin=None, vmax=None, description="", **kwargs): +
+[docs] + def __init__(self, data, subject, cmap=None, vmin=None, vmax=None, description="", **kwargs): super(Vertex, self).__init__(data, subject, cmap=cmap, vmin=vmin, vmax=vmax, description=description, **kwargs) # set vmin and vmax @@ -366,6 +387,7 @@

Source code for cortex.dataset.views

         self.vmax = self.vmax if self.vmax is not None else \
             np.percentile(np.nan_to_num(self.data), 99)
+ def _write_hdf(self, h5, name="data"): datanode = VertexData._write_hdf(self, h5) viewnode = Dataview._write_hdf(self, h5, name=name, data=[self.name]) @@ -378,9 +400,11 @@

Source code for cortex.dataset.views

                          description=self.description, state=self.state,
                          **self.attrs)
 
-
[docs] def map(self, target_subj, surface_type='fiducial', +
+[docs] + def map(self, target_subj, surface_type='fiducial', hemi='both', fs_subj=None, **kwargs): - """Map this data from this surface to another surface + """Map this data from this surface to another surface Calls `cortex.freesurfer.vertex_to_vertex()` with this vertex object as the first argument. @@ -414,7 +438,9 @@

Source code for cortex.dataset.views

         elif hemi == 'rh':
             new_data = np.hstack([np.nan * np.zeros(new_data[0].shape), new_data[1]])
         vx = Vertex(new_data, target_subj, vmin=self.vmin, vmax=self.vmax, cmap=self.cmap)
-        return vx
+ return vx
+
+ def u(s, encoding='utf8'): try: @@ -475,7 +501,7 @@

Related Topics

- - + + @@ -498,11 +524,11 @@

Quick search

diff --git a/_modules/cortex/freesurfer.html b/_modules/cortex/freesurfer.html index 05771efe1..8abf05063 100644 --- a/_modules/cortex/freesurfer.html +++ b/_modules/cortex/freesurfer.html @@ -1,28 +1,27 @@ - - + - cortex.freesurfer — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.freesurfer — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -38,31 +37,32 @@

Source code for cortex.freesurfer

 """Contains functions for interfacing with freesurfer
 """
 from __future__ import print_function
-import os
+
 import copy
+import os
+import shlex
 import shutil
 import struct
+import subprocess as sp
 import tempfile
 import warnings
-import shlex
-import subprocess as sp
 from builtins import input
+from tempfile import NamedTemporaryFile
 
-import numpy as np
 import nibabel
+import numpy as np
 from nibabel import gifti
-from tempfile import NamedTemporaryFile
-from scipy.spatial.kdtree import KDTree
 from scipy.linalg import lstsq
 from scipy.sparse import coo_matrix
+from scipy.spatial import KDTree
 
+from . import anat, database
 
-from . import database
-from . import anat
 
-
-
[docs]def get_paths(fs_subject, hemi, type="patch", freesurfer_subject_dir=None): - """Retrive paths for all surfaces for a subject processed by freesurfer +
+[docs] +def get_paths(fs_subject, hemi, type="patch", freesurfer_subject_dir=None): + """Retrieve paths for all surfaces for a subject processed by freesurfer Parameters ---------- @@ -90,8 +90,11 @@

Source code for cortex.freesurfer

         return os.path.join(base, "surf", hemi+".{name}_slim.obj")
-
[docs]def autorecon(fs_subject, type="all", parallel=True, n_cores=None): - """Run Freesurfer's autorecon-all command for a given freesurfer subject + +
+[docs] +def autorecon(fs_subject, type="all", parallel=True, n_cores=None): + """Run Freesurfer's autorecon-all command for a given freesurfer subject Parameters ---------- @@ -132,8 +135,11 @@

Source code for cortex.freesurfer

     sp.check_call(shlex.split(cmd))
-
[docs]def flatten(fs_subject, hemi, patch, freesurfer_subject_dir=None, save_every=None): - """Perform flattening of a brain using freesurfer + +
+[docs] +def flatten(fs_subject, hemi, patch, freesurfer_subject_dir=None, save_every=None): + """Perform flattening of a brain using freesurfer Parameters ---------- @@ -180,8 +186,16 @@

Source code for cortex.freesurfer

         return False
-
[docs]def import_subj(fs_subject, cx_subject=None, freesurfer_subject_dir=None, whitematter_surf='smoothwm'): - """Imports a subject from freesurfer + +
+[docs] +def import_subj( + freesurfer_subject, + pycortex_subject=None, + freesurfer_subject_dir=None, + whitematter_surf="smoothwm", +): + """Imports a subject from freesurfer This will overwrite (after giving a warning and an option to continue) the pre-existing subject, including all blender cuts, masks, transforms, etc., and @@ -191,67 +205,119 @@

Source code for cortex.freesurfer

 
     Parameters
     ----------
-    fs_subject : string
+    freesurfer_subject : str
         Freesurfer subject name
-    cx_subject : string, optional
-        Pycortex subject name (These variable names should be changed). By default uses
-        the same name as the freesurfer subject. Best to stick to that convention, if 
-        possible (your life will go more smoothly.) This optional kwarg is for edge cases. 
-    freesurfer_subject_dir : string, optional
+    pycortex_subject : str, optional
+        Pycortex subject name. By default it uses the freesurfer subject name. 
+        It is advised to stick to that convention, if possible 
+        (your life will go more smoothly.)
+    freesurfer_subject_dir : str, optional
         Freesurfer subject directory to pull data from. By default uses the directory
         given by the environment variable $SUBJECTS_DIR.
-    whitematter_surf : string, optional
-        Which whitematter surface to import as 'wm'. By default uses 'smoothwm', but that
-        surface is smoothed and may not be appropriate. A good alternative is 'white'.
-    """
-    if cx_subject is None:
-        cx_subject = fs_subject
-    # Create and/or replace extant subject. Throws a warning that this will happen.
-    database.db.make_subj(cx_subject)
+    whitematter_surf : str, optional
+        Which whitematter surface to import as 'wm'. By default uses 'smoothwm', but 
+        that surface is smoothed and may not be appropriate. 
+        A good alternative is 'white'.
+    
+    Notes
+    -----
+    This function uses command line functions from freesurfer, so you should make sure
+    to have freesurfer sourced before running this function.
 
-    import nibabel
-    surfs = os.path.join(database.default_filestore, cx_subject, "surfaces", "{name}_{hemi}.gii")
-    anats = os.path.join(database.default_filestore, cx_subject, "anatomicals", "{name}.nii.gz")
-    surfinfo = os.path.join(database.default_filestore, cx_subject, "surface-info", "{name}.npz")
+    This function will also generate the fiducial surfaces for the subject, which are
+    halfway between the white matter and pial surfaces. The surfaces will be stored
+    in the freesurfer subject's directory. These fiducial surfaces are used for 
+    cutting and flattening.
+    """
+    # Check if freesurfer is sourced or if subjects dir is passed
     if freesurfer_subject_dir is None:
-        freesurfer_subject_dir = os.environ['SUBJECTS_DIR']
-    fspath = os.path.join(freesurfer_subject_dir, fs_subject, 'mri')
-    curvs = os.path.join(freesurfer_subject_dir, fs_subject, 'surf', '{hemi}.{name}')
-
-    #import anatomicals
-    for fsname, name in dict(T1="raw", aseg="aseg", wm="raw_wm").items():
-        path = os.path.join(fspath, "{fsname}.mgz").format(fsname=fsname)
-        out = anats.format(subj=cx_subject, name=name)
-        cmd = "mri_convert {path} {out}".format(path=path, out=out)
+        if "SUBJECTS_DIR" in os.environ:
+            freesurfer_subject_dir = os.environ["SUBJECTS_DIR"]
+        else:
+            raise ValueError(
+                "Please source freesurfer before running this function, "
+                "or pass a path to the freesurfer subjects directory in "
+                "`freesurfer_subject_dir`"
+            )
+    fs_mri_path = os.path.join(freesurfer_subject_dir, freesurfer_subject, "mri")
+    fs_surf_path = os.path.join(freesurfer_subject_dir, freesurfer_subject, "surf")
+    fs_anat_template = os.path.join(fs_mri_path, "{name}.mgz")
+    fs_surf_template = os.path.join(fs_surf_path, "{hemi}.{name}")
+
+    # Now deal with pycortex
+    if pycortex_subject is None:
+        pycortex_subject = freesurfer_subject
+    # Create and/or replace extant subject. Throws a warning that this will happen.
+    database.db.make_subj(pycortex_subject)
+
+    filestore = os.path.join(database.default_filestore, pycortex_subject)
+    anat_template = os.path.join(filestore, "anatomicals", "{name}.nii.gz")
+    surf_template = os.path.join(filestore, "surfaces", "{name}_{hemi}.gii")
+    surfinfo_template = os.path.join(filestore, "surface-info", "{name}.npz")
+
+    # Dictionary mapping for volumes to be imported over from freesurfer
+    volumes_fs2pycortex = {"T1": "raw", "aseg": "aseg", "wm": "raw_wm"}
+    # Import volumes
+    for fsname, name in volumes_fs2pycortex.items():
+        in_volume = fs_anat_template.format(name=fsname)
+        out_volume = anat_template.format(name=name)
+        cmd = "mri_convert {path} {out}".format(path=in_volume, out=out_volume)
         sp.check_output(shlex.split(cmd))
 
     # (Re-)Make the fiducial files
     # NOTE: these are IN THE FREESURFER $SUBJECTS_DIR !! which can cause confusion.
-    make_fiducial(fs_subject, freesurfer_subject_dir=freesurfer_subject_dir)
-
-    # Freesurfer uses FOV/2 for center, let's set the surfaces to use the
-    # magnet isocenter
-    trans = nibabel.load(out).get_affine()[:3, -1]
-    surfmove = trans - np.sign(trans) * [128, 128, 128]
-
-    from . import formats
-    for fsname, name in [(whitematter_surf, "wm"), ('pial', "pia"), ('inflated', "inflated")]:
+    make_fiducial(freesurfer_subject, freesurfer_subject_dir=freesurfer_subject_dir)
+
+    # Dictionary mapping for surfaces to be imported over from freesurfer
+    surfaces_fs2pycortex = {
+        whitematter_surf: "wm",
+        "pial": "pia",
+        "inflated": "inflated",
+    }
+    # Import surfaces
+    for fsname, name in surfaces_fs2pycortex.items():
         for hemi in ("lh", "rh"):
-            pts, polys, _ = get_surf(fs_subject, hemi, fsname, freesurfer_subject_dir=freesurfer_subject_dir)
-            fname = str(surfs.format(subj=cx_subject, name=name, hemi=hemi))
-            formats.write_gii(fname, pts=pts + surfmove, polys=polys)
-
-    for curv, info in dict(sulc="sulcaldepth", thickness="thickness", curv="curvature").items():
-        lh, rh = [parse_curv(curvs.format(hemi=hemi, name=curv)) for hemi in ['lh', 'rh']]
-        np.savez(surfinfo.format(subj=cx_subject, name=info), left=-lh, right=-rh)
-
+            in_surface = fs_surf_template.format(hemi=hemi, name=fsname)
+            out_surface = surf_template.format(name=name, hemi=hemi)
+            # Use the --to-scanner flag to store the surfaces with the same coordinate
+            # system as the volume data, rather than the TKR coordinate system, which
+            # has the center set to FOV/2.
+            # NOTE: the resulting gifti surfaces will look misaligned with respect to
+            # the anatomical volumes when visualized in freeview, because freeview 
+            # expects the surfaces to be in TKR coordinates (with center set to FOV/2).
+            # But the surfaces stored in the pycortex database are only to be used by
+            # pycortex, so that's fine.
+            cmd = f"mris_convert --to-scanner {in_surface} {out_surface}"
+            sp.check_output(shlex.split(cmd))
+
+    # Dictionary mapping for curvature and extra info to be imported 
+    info_fs2pycortex = {
+        "sulc": "sulcaldepth",
+        "thickness": "thickness",
+        "curv": "curvature",
+    }
+    # Import curvature and extra information
+    for fsname, name in info_fs2pycortex.items():
+        in_info_lhrh = [
+            fs_surf_template.format(hemi=hemi, name=fsname) for hemi in ["lh", "rh"]
+        ]
+        lh, rh = [parse_curv(in_info) for in_info in in_info_lhrh]
+        np.savez(
+            surfinfo_template.format(name=name), 
+            left=-lh, 
+            right=-rh
+        )
+    # Finally update the database by re-initializing it
     database.db = database.Database()
-
[docs]def import_flat(fs_subject, patch, hemis=['lh', 'rh'], cx_subject=None, + +
+[docs] +def import_flat(fs_subject, patch, hemis=['lh', 'rh'], cx_subject=None, flat_type='freesurfer', auto_overwrite=False, freesurfer_subject_dir=None, clean=True): - """Imports a flat brain from freesurfer + """Imports a flat brain from freesurfer NOTE: This will delete the overlays.svg file for this subject, since THE FLATMAPS WILL CHANGE, as well as all cached information (e.g. old flatmap @@ -268,7 +334,7 @@

Source code for cortex.freesurfer

     cx_subject : str
         Pycortex subject name
     freesurfer_subject_dir : str
-        directory for freesurfer subjects. None defaults to evironment variable
+        directory for freesurfer subjects. None defaults to environment variable
         $SUBJECTS_DIR
     clean : bool
         If True, the flat surface is cleaned to remove the disconnected polys.
@@ -318,11 +384,12 @@ 

Source code for cortex.freesurfer

     overlays_file = database.db.get_paths(cx_subject)['overlays']
     if os.path.exists(overlays_file):
         os.unlink(overlays_file)
+ # Regenerate it? def _remove_disconnected_polys(polys): - """Remove polygons that are not in the main connected component. + """Remove polygons that are not in the main connected component. This function creates a sparse graph based on edges in the input. Then it computes the connected components, and returns only the polygons @@ -361,7 +428,7 @@

Source code for cortex.freesurfer

 
 
 def _move_disconnect_points_to_zero(pts, polys):
-    """Change coordinates of points not in polygons to zero.
+    """Change coordinates of points not in polygons to zero.
     
     This cleaning step is useful after _remove_disconnected_polys, to
     avoid using this points in boundaries computations (through pts.max(axis=0)
@@ -373,8 +440,10 @@ 

Source code for cortex.freesurfer

     return pts
 
 
-
[docs]def make_fiducial(fs_subject, freesurfer_subject_dir=None): - """Make fiducial surface (halfway between white matter and pial surfaces) +
+[docs] +def make_fiducial(fs_subject, freesurfer_subject_dir=None): + """Make fiducial surface (halfway between white matter and pial surfaces) """ for hemi in ['lh', 'rh']: spts, polys, _ = get_surf(fs_subject, hemi, "smoothwm", freesurfer_subject_dir=freesurfer_subject_dir) @@ -383,8 +452,11 @@

Source code for cortex.freesurfer

         write_surf(fname, (spts + ppts) / 2, polys)
-
[docs]def parse_surf(filename): - """ + +
+[docs] +def parse_surf(filename): + """ """ with open(filename, 'rb') as fp: #skip magic @@ -399,8 +471,9 @@

Source code for cortex.freesurfer

         return pts.reshape(-1, 3), polys.reshape(-1, 3)
+ def write_surf(filename, pts, polys, comment=''): - """Write freesurfer surface file + """Write freesurfer surface file """ with open(filename, 'wb') as fp: fp.write(b'\xff\xff\xfe') @@ -412,7 +485,7 @@

Source code for cortex.freesurfer

 
 
 def write_patch(filename, pts, edges=None):
-    """Writes a patch file that is readable by freesurfer.
+    """Writes a patch file that is readable by freesurfer.
 
     Note this function is duplicated here and in blendlib. This function
     writes freesurfer format, so seems natural to place here, but it
@@ -442,16 +515,21 @@ 

Source code for cortex.freesurfer

                 fp.write(struct.pack('>i3f', i+1, *pt))
 
 
-
[docs]def parse_curv(filename): - """ +
+[docs] +def parse_curv(filename): + """ """ with open(filename, 'rb') as fp: fp.seek(15) return np.fromstring(fp.read(), dtype='>f4').byteswap().newbyteorder()
-
[docs]def parse_patch(filename): - """ + +
+[docs] +def parse_patch(filename): + """ """ with open(filename, 'rb') as fp: header, = struct.unpack('>i', fp.read(4)) @@ -462,8 +540,11 @@

Source code for cortex.freesurfer

         return data
-
[docs]def get_surf(subject, hemi, type, patch=None, flatten_step=None, freesurfer_subject_dir=None): - """Read freesurfer surface file + +
+[docs] +def get_surf(subject, hemi, type, patch=None, flatten_step=None, freesurfer_subject_dir=None): + """Read freesurfer surface file """ if type == "patch": assert patch is not None @@ -499,8 +580,9 @@

Source code for cortex.freesurfer

     return pts, polys, get_curv(subject, hemi, freesurfer_subject_dir=freesurfer_subject_dir)
+ def _move_labels(subject, label, hemisphere=('lh','rh'), fs_dir=None, src_subject='fsaverage'): - """subject is a freesurfer subject""" + """subject is a freesurfer subject""" if fs_dir is None: fs_dir = os.environ['SUBJECTS_DIR'] for hemi in hemisphere: @@ -532,7 +614,7 @@

Source code for cortex.freesurfer

 
 
 def _parse_labels(label_files, cx_subject):
-    """Extract values from freesurfer label file(s) and map to vertices
+    """Extract values from freesurfer label file(s) and map to vertices
 
     Parameters
     ----------
@@ -561,7 +643,7 @@ 

Source code for cortex.freesurfer

     return verts, values
 
 def get_label(cx_subject, label, fs_subject=None, fs_dir=None, src_subject='fsaverage', hemisphere=('lh', 'rh'), **kwargs):
-    """Get data from a label file for fsaverage subject
+    """Get data from a label file for fsaverage subject
 
     Parameters
     ----------
@@ -592,7 +674,7 @@ 

Source code for cortex.freesurfer

             print("Transforming label file to subject's freesurfer directory...")
             _move_labels(fs_subject, label, hemisphere=hemisphere, fs_dir=fs_dir, src_subject=src_subject)
     verts, values = _parse_labels(label_files, cx_subject)
-    idx = verts.astype(np.int)
+    idx = verts.astype(int)
     return idx, values
 
 
@@ -610,9 +692,18 @@ 

Source code for cortex.freesurfer

     return cmd
 
 
+def _check_datatype(data):
+    dtype = data.dtype
+    if dtype == np.int64:
+        return np.int32
+    elif dtype == np.float64:
+        return np.float32
+    else:
+        return dtype
+
 
 def mri_surf2surf(data, source_subj, target_subj, hemi, subjects_dir=None):
-    """Uses freesurfer mri_surf2surf to transfer vertex data between
+    """Uses freesurfer mri_surf2surf to transfer vertex data between
         two freesurfer subjects
     
     Parameters
@@ -633,7 +724,8 @@ 

Source code for cortex.freesurfer

     =====
     Requires path to mri_surf2surf or freesurfer environment to be active.
     """
-    data_arrays = [gifti.GiftiDataArray(d) for d in data]
+    datatype = _check_datatype(data)
+    data_arrays = [gifti.GiftiDataArray(d, datatype=datatype) for d in data]
     gifti_image = gifti.GiftiImage(darrays=data_arrays)
 
     tf_in = NamedTemporaryFile(suffix=".gii")
@@ -678,7 +770,7 @@ 

Source code for cortex.freesurfer

                             n_test_images=40, coef_threshold=None,
                             renormalize=True):
 
-    """Creates a matrix implementing freesurfer mri_surf2surf command.
+    """Creates a matrix implementing freesurfer mri_surf2surf command.
     
     A surface-to-surface transform is a linear transform between vertex spaces.
     Such a transform must be highly localized in the sense that a vertex in the
@@ -796,8 +888,10 @@ 

Source code for cortex.freesurfer

     return matrix
 
 
-
[docs]def get_curv(fs_subject, hemi, type='wm', freesurfer_subject_dir=None): - """Load freesurfer curv file for a freesurfer subject +
+[docs] +def get_curv(fs_subject, hemi, type='wm', freesurfer_subject_dir=None): + """Load freesurfer curv file for a freesurfer subject Parameters ---------- @@ -819,8 +913,11 @@

Source code for cortex.freesurfer

     return parse_curv(curv_file)
-
[docs]def show_surf(subject, hemi, type, patch=None, curv=True, freesurfer_subject_dir=None): - """Show a surface from a Freesurfer subject directory + +
+[docs] +def show_surf(subject, hemi, type, patch=None, curv=True, freesurfer_subject_dir=None): + """Show a surface from a Freesurfer subject directory Parameters ---------- @@ -877,8 +974,11 @@

Source code for cortex.freesurfer

     mlab.show()
     return fig, surf
-
[docs]def write_dot(fname, pts, polys, name="test"): - """ + +
+[docs] +def write_dot(fname, pts, polys, name="test"): + """ """ import networkx as nx def iter_surfedges(tris): @@ -900,8 +1000,11 @@

Source code for cortex.freesurfer

         fp.write("}")
-
[docs]def read_dot(fname, pts): - """ + +
+[docs] +def read_dot(fname, pts): + """ """ import re parse = re.compile(r'\s(\d+)\s\[label="", pos="([\d\.]+),([\d\.]+)".*];') @@ -919,10 +1022,13 @@

Source code for cortex.freesurfer

     return data
-
[docs]def write_decimated(path, pts, polys): - """ + +
+[docs] +def write_decimated(path, pts, polys): + """ """ - from .polyutils import decimate, boundary_edges + from .polyutils import boundary_edges, decimate dpts, dpolys = decimate(pts, polys) write_surf(path+'.smoothwm', dpts, dpolys) edges = boundary_edges(dpolys) @@ -938,10 +1044,15 @@

Source code for cortex.freesurfer

         fp.write(data.tostring())
-
[docs]class SpringLayout(object): - """ + +
+[docs] +class SpringLayout(object): + """ """ -
[docs] def __init__(self, pts, polys, dpts=None, pins=None, stepsize=1, neighborhood=0): +
+[docs] + def __init__(self, pts, polys, dpts=None, pins=None, stepsize=1, neighborhood=0): self.pts = pts self.polys = polys self.stepsize = stepsize @@ -992,6 +1103,7 @@

Source code for cortex.freesurfer

         self._neigh = np.hstack(self.neighbors).astype(np.uint)
         self.figure = None
+ def _spring(self): svec = self.pts[self._neigh] - self.pts[self._idx] slen = np.sqrt((svec**2).sum(-1)) @@ -1027,8 +1139,11 @@

Source code for cortex.freesurfer

         self.step()
         self.figure.mlab_source.set(x=self.pts[:,0], y=self.pts[:,1], z=self.pts[:,2])
-
[docs]def stretch_mwall(pts, polys, mwall): - """ + +
+[docs] +def stretch_mwall(pts, polys, mwall): + """ """ inflated = pts.copy() center = pts[mwall].mean(0) @@ -1039,6 +1154,87 @@

Source code for cortex.freesurfer

     pts[mwall, 2] = radius * np.sin(angles) + center[2]
     return SpringLayout(pts, polys, inflated, pins=mwall)
+ + +def upsample_to_fsaverage( + data, data_space="fsaverage6", freesurfer_subjects_dir=None +): + """Project data from fsaverage6 (or other fsaverage surface) to fsaverage to + visualize it in pycortex. + + Parameters + ---------- + data : array (n_samples, n_vertices) + Data in space `space`. The first n_vertices/2 vertices correspond to the left + hemisphere, and the last n_vertices/2 vertices correspond to the right + hemisphere. + data_space : str + One of fsaverage[1-6], corresponding to the source template space of `data`. + freesurfer_subjects_dir : str or None + Path to Freesurfer subjects directory. If None, defaults to the value of the + environment variable $SUBJECTS_DIR. + + Returns + ------- + projected_data : array (n_samples, 327684) + Data projected to fsaverage(7). + + Notes + ----- + Data in the lower resolution fsaverage template is upsampled to the full resolution + fsaverage template by nearest-neighbor interpolation. To project the data from a + lower resolution version of fsaverage, this code exploits the structure of fsaverage + surfaces. (That is, each hemisphere in fsaverage6 corresponds to the first + 40,962 vertices of fsaverage; fsaverage5 corresponds to the first 10,242 vertices of + fsaverage, etc.) + """ + + + def get_n_vertices_ico(icoorder): + return 4 ** icoorder * 10 + 2 + + ico_order = int(data_space[-1]) + n_ico_vertices = get_n_vertices_ico(ico_order) + ndim = data.ndim + data = np.atleast_2d(data) + _, n_vertices = data.shape + if n_vertices != 2 * n_ico_vertices: + raise ValueError( + f"data has {n_vertices} vertices, but {2 * n_ico_vertices} " + f"are expected for both hemispheres in {data_space}" + ) + + if freesurfer_subjects_dir is None: + freesurfer_subjects_dir = os.environ.get("SUBJECTS_DIR", None) + if freesurfer_subjects_dir is None: + raise ValueError( + "freesurfer_subjects_dir must be specified or $SUBJECTS_DIR must be set" + ) + + data_hemi = np.split(data, 2, axis=-1) + hemis = ["lh", "rh"] + projected_data = [] + for i, (hemi, dt) in enumerate(zip(hemis, data_hemi)): + # Load fsaverage sphere for this hemisphere + pts, faces = nibabel.freesurfer.read_geometry( + os.path.join( + freesurfer_subjects_dir, "fsaverage", "surf", f"{hemi}.sphere.reg" + ) + ) + # build kdtree using only vertices in reduced fsaverage surface + kdtree = KDTree(pts[:n_ico_vertices]) + # figure out neighbors in reduced version for all other vertices in fsaverage + _, neighbors = kdtree.query(pts[n_ico_vertices:], k=1) + # now simply fill remaining vertices with original values + projected_data.append( + np.concatenate([dt, dt[:, neighbors]], axis=-1) + ) + projected_data = np.hstack(projected_data) + if ndim == 1: + projected_data = projected_data[0] + return projected_data + + # aseg partition labels (up to 256 only) fs_aseg_dict = {'Unknown': 0, 'Left-Cerebral-Exterior': 1, @@ -1293,7 +1489,7 @@

Related Topics

- - + + @@ -1316,11 +1512,11 @@

Quick search

diff --git a/_modules/cortex/mapper.html b/_modules/cortex/mapper.html index 58fbc6207..c1aa48a18 100644 --- a/_modules/cortex/mapper.html +++ b/_modules/cortex/mapper.html @@ -1,28 +1,27 @@ - - + - cortex.mapper — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.mapper — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -43,7 +42,9 @@

Source code for cortex.mapper

 from .mapper import Mapper, _savecache
 
 
-
[docs]def get_mapper(subject, xfmname, type='nearest', recache=False, **kwargs): +
+[docs] +def get_mapper(subject, xfmname, type='nearest', recache=False, **kwargs): from ..database import db from . import point, patch, line @@ -75,6 +76,7 @@

Source code for cortex.mapper

         raise Exception
     except Exception:
         return Map._cache(cachefile, subject, xfmname, **kwargs)
+
@@ -125,7 +127,7 @@

Related Topics

- - + + @@ -148,11 +150,11 @@

Quick search

diff --git a/_modules/cortex/mapper/mapper.html b/_modules/cortex/mapper/mapper.html index 0a03cc9c7..99ce92bdd 100644 --- a/_modules/cortex/mapper/mapper.html +++ b/_modules/cortex/mapper/mapper.html @@ -1,28 +1,27 @@ - - + - cortex.mapper.mapper — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.mapper.mapper — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -43,9 +42,13 @@

Source code for cortex.mapper.mapper

 import warnings
 warnings.simplefilter('ignore', sparse.SparseEfficiencyWarning)
 
-
[docs]class Mapper(object): - '''Maps data from epi volume onto surface using various projections''' -
[docs] def __init__(self, left, right, shape, subject, xfmname): +
+[docs] +class Mapper(object): + '''Maps data from epi volume onto surface using various projections''' +
+[docs] + def __init__(self, left, right, shape, subject, xfmname): self.idxmap = None self.masks = [left, right] self.nverts = left.shape[0] + right.shape[0] @@ -53,6 +56,7 @@

Source code for cortex.mapper.mapper

         self.subject = subject
         self.xfmname = xfmname
+ @classmethod def from_cache(cls, cachefile, subject, xfmname): npz = np.load(cachefile) @@ -109,7 +113,7 @@

Source code for cortex.mapper.mapper

         return dataset.Vertex(np.hstack(mapped).squeeze(), data.subject)
 
     def backwards(self, vertexdata):
-        '''Projects vertex data back into volume space.
+        '''Projects vertex data back into volume space.
 
         Parameters
         ----------
@@ -167,6 +171,7 @@ 

Source code for cortex.mapper.mapper

         _savecache(filename, masks[0], masks[1], xfm.shape)
         return cls(masks[0], masks[1], xfm.shape, subject, xfmname)
+ def _savecache(filename, left, right, shape): np.savez(filename, left_data=left.data, @@ -230,7 +235,7 @@

Related Topics

- - + + @@ -253,11 +258,11 @@

Quick search

diff --git a/_modules/cortex/mni.html b/_modules/cortex/mni.html index 042baa966..241e86b54 100644 --- a/_modules/cortex/mni.html +++ b/_modules/cortex/mni.html @@ -1,28 +1,27 @@ - - + - cortex.mni — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.mni — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -66,9 +65,11 @@

Source code for cortex.mni

 def _load_fsl_xfm(filename):
     return np.loadtxt(filename)
 
-
[docs]def compute_mni_transform(subject, xfm, +
+[docs] +def compute_mni_transform(subject, xfm, template=default_template): - """ + """ Compute transform from the space specified by `xfm` to MNI standard space. Parameters @@ -110,9 +111,12 @@

Source code for cortex.mni

 
     return func_to_mni
-
[docs]def transform_to_mni(volumedata, func_to_mni, + +
+[docs] +def transform_to_mni(volumedata, func_to_mni, template=default_template): - """ + """ Transform data in `volumedata` to MNI space, resample at the resolution of the atlas image. @@ -150,8 +154,11 @@

Source code for cortex.mni

 
     return nibabel.load(func_in_mni)
-
[docs]def transform_surface_to_mni(subject, surfname): - """ + +
+[docs] +def transform_surface_to_mni(subject, surfname): + """ Transform the surface named `surfname` for subject called `subject` into MNI coordinates. Returns [(lpts, lpolys), (rpts, rpolys)]. @@ -168,7 +175,7 @@

Source code for cortex.mni

         MNI-transformed surface in same format returned by db.get_surf.
     """
     # Get MNI affine transform
-    mni_affine = nibabel.load(default_template).get_affine()
+    mni_affine = nibabel.load(default_template).affine
 
     # Get subject anatomical-to-MNI transform
     mni_xfm = np.dot(mni_affine, db.get_mnixfm(subject, "identity"))
@@ -188,9 +195,12 @@ 

Source code for cortex.mni

 
     return [(mni_lpts, lpolys), (mni_rpts, rpolys)]
-
[docs]def transform_mni_to_subject(subject, xfm, volarray, func_to_mni, + +
+[docs] +def transform_mni_to_subject(subject, xfm, volarray, func_to_mni, template=default_template): - """ + """ Transform data in `volarray` from MNI space to functional space specified by `xfm`. Parameters @@ -220,7 +230,7 @@

Source code for cortex.mni

     funcspace_nii = tempfile.mktemp(".nii.gz")
 
     # Save out relevant things
-    affine = nibabel.load(template).get_affine()
+    affine = nibabel.load(template).affine
     nibabel.save(nibabel.Nifti1Image(volarray, affine), mnispace_func_nii)
     _save_fsl_xfm(mni_to_func_xfm, np.linalg.inv(func_to_mni))
 
@@ -234,6 +244,7 @@ 

Source code for cortex.mni

                      "-out", funcspace_nii])
 
     return nibabel.load(funcspace_nii)
+
@@ -284,7 +295,7 @@

Related Topics

- - + + @@ -307,11 +318,11 @@

Quick search

diff --git a/_modules/cortex/polyutils/distortion.html b/_modules/cortex/polyutils/distortion.html index 295af4d4c..3251ea617 100644 --- a/_modules/cortex/polyutils/distortion.html +++ b/_modules/cortex/polyutils/distortion.html @@ -1,28 +1,27 @@ - - + - cortex.polyutils.distortion — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.polyutils.distortion — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -39,8 +38,10 @@

Source code for cortex.polyutils.distortion

 import numpy as np
 
 
-
[docs]class Distortion(object): - """Used to compute distortion metrics between fiducial and another (e.g. flat) +
+[docs] +class Distortion(object): + """Used to compute distortion metrics between fiducial and another (e.g. flat) surface. Parameters @@ -52,14 +53,17 @@

Source code for cortex.polyutils.distortion

     polys : 2D ndarray, shape (total_polys, 3)
         Triangle vertex indices in both `flat` and `ref`.
     """
-
[docs] def __init__(self, flat, ref, polys): +
+[docs] + def __init__(self, flat, ref, polys): self.flat = flat self.ref = ref self.polys = polys
+ @property def areal(self): - """Compute areal distortion of the flatmap. + """Compute areal distortion of the flatmap. Areal distortion is calculated at each triangle as the log2 ratio of the triangle area in the flatmap to the area in the reference surface. @@ -98,7 +102,7 @@

Source code for cortex.polyutils.distortion

 
     @property
     def metric(self):
-        """Compute metric distortion of the flatmap.
+        """Compute metric distortion of the flatmap.
 
         Metric distortion is calculated as the difference in squared distance
         from each vertex to its neighbors between the flatmap and the reference.
@@ -136,6 +140,7 @@ 

Source code for cortex.polyutils.distortion

         alldists = np.zeros((len(self.ref),))
         alldists[selverts] = msdists
         return alldists
+
@@ -186,7 +191,7 @@

Related Topics

- - + + @@ -209,11 +214,11 @@

Quick search

diff --git a/_modules/cortex/polyutils/surface.html b/_modules/cortex/polyutils/surface.html index d12a0148a..6e44cd74f 100644 --- a/_modules/cortex/polyutils/surface.html +++ b/_modules/cortex/polyutils/surface.html @@ -1,28 +1,27 @@ - - + - cortex.polyutils.surface — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.polyutils.surface — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -50,8 +49,10 @@

Source code for cortex.polyutils.surface

 from .misc import _memo
 
 
-
[docs]class Surface(exact_geodesic.ExactGeodesicMixin, subsurface.SubsurfaceMixin): - """Represents a single cortical hemisphere surface. Can be the white matter surface, +
+[docs] +class Surface(exact_geodesic.ExactGeodesicMixin, subsurface.SubsurfaceMixin): + """Represents a single cortical hemisphere surface. Can be the white matter surface, pial surface, fiducial (mid-cortical) surface, inflated surface, flattened surface, etc. @@ -64,7 +65,9 @@

Source code for cortex.polyutils.surface

     polys : 2D ndarray, shape (total_polys, 3)
         Indices of the vertices in each triangle in the surface.
     """
-
[docs] def __init__(self, pts, polys): +
+[docs] + def __init__(self, pts, polys): self.pts = pts.astype(np.double) self.polys = polys @@ -72,17 +75,18 @@

Source code for cortex.polyutils.surface

         self._rlfac_solvers = dict()
         self._nLC_solvers = dict()
+ @property @_memo def ppts(self): - """3D matrix of points in each face: n faces x 3 points per face x 3 coords per point. + """3D matrix of points in each face: n faces x 3 points per face x 3 coords per point. """ return self.pts[self.polys] @property @_memo def connected(self): - """Sparse matrix of vertex-face associations. + """Sparse matrix of vertex-face associations. """ npt = len(self.pts) npoly = len(self.polys) @@ -93,7 +97,7 @@

Source code for cortex.polyutils.surface

     @property
     @_memo
     def adj(self):
-        """Sparse vertex adjacency matrix.
+        """Sparse vertex adjacency matrix.
         """
         npt = len(self.pts)
         npoly = len(self.polys)
@@ -109,7 +113,7 @@ 

Source code for cortex.polyutils.surface

     @property
     @_memo
     def face_normals(self):
-        """Normal vector for each face.
+        """Normal vector for each face.
         """
         # Compute normal vector direction
         nnfnorms = np.cross(self.ppts[:,1] - self.ppts[:,0], 
@@ -122,7 +126,7 @@ 

Source code for cortex.polyutils.surface

     @property
     @_memo
     def vertex_normals(self):
-        """Normal vector for each vertex (average of normals for neighboring faces).
+        """Normal vector for each vertex (average of normals for neighboring faces).
         """
         # Average adjacent face normals
         nnvnorms = np.nan_to_num(self.connected.dot(self.face_normals) / self.connected.sum(1)).A
@@ -132,7 +136,7 @@ 

Source code for cortex.polyutils.surface

     @property
     @_memo
     def face_areas(self):
-        """Area of each face.
+        """Area of each face.
         """
         # Compute normal vector (length is face area)
         nnfnorms = np.cross(self.ppts[:,1] - self.ppts[:,0], 
@@ -143,7 +147,7 @@ 

Source code for cortex.polyutils.surface

     @property
     @_memo
     def cotangent_weights(self):
-        """Cotangent of angle opposite each vertex in each face.
+        """Cotangent of angle opposite each vertex in each face.
         """
         ppts = self.ppts
         cots1 = ((ppts[:,1]-ppts[:,0]) *
@@ -165,7 +169,7 @@ 

Source code for cortex.polyutils.surface

     @property
     @_memo
     def laplace_operator(self):
-        """Laplace-Beltrami operator for this surface. A sparse adjacency matrix with
+        """Laplace-Beltrami operator for this surface. A sparse adjacency matrix with
         edge weights determined by the cotangents of the angles opposite each edge.
         Returns a 4-tuple (B,D,W,V) where D is the 'lumped mass matrix', W is the weighted
         adjacency matrix, and V is a diagonal matrix that normalizes the adjacencies.
@@ -205,8 +209,10 @@ 

Source code for cortex.polyutils.surface

         B = (Be1 + Be1.T + Be2 + Be2.T + Be3 + Be3.T)/12 + dBd
         return B, D, W, V
 
-
[docs] def mean_curvature(self): - """Compute mean curvature of this surface using the Laplace-Beltrami operator. +
+[docs] + def mean_curvature(self): + """Compute mean curvature of this surface using the Laplace-Beltrami operator. Curvature is computed at each vertex. It's probably pretty noisy, and should be smoothed using smooth(). @@ -226,8 +232,11 @@

Source code for cortex.polyutils.surface

         curv = (L.dot(self.pts) * self.vertex_normals).sum(1)
         return curv
-
[docs] def smooth(self, scalars, factor=1.0, iterations=1): - """Smooth vertex-wise function given by `scalars` across the surface using + +
+[docs] + def smooth(self, scalars, factor=1.0, iterations=1): + """Smooth vertex-wise function given by `scalars` across the surface using mean curvature flow method (see http://brickisland.net/cs177fa12/?p=302). Amount of smoothing is controlled by `factor`. @@ -262,19 +271,22 @@

Source code for cortex.polyutils.surface

         smscalars = np.zeros(scalars.shape)
         smscalars[goodrows] = from_smooth
         return smscalars
+ @property @_memo def avg_edge_length(self): - """Average length of all edges in the surface. + """Average length of all edges in the surface. """ adj = self.adj tadj = sparse.triu(adj, 1) # only entries above main diagonal, in coo format edgelens = np.sqrt(((self.pts[tadj.row] - self.pts[tadj.col])**2).sum(1)) return edgelens.mean() -
[docs] def surface_gradient(self, scalars, at_verts=True): - """Gradient of a function with values `scalars` at each vertex on the surface. +
+[docs] + def surface_gradient(self, scalars, at_verts=True): + """Gradient of a function with values `scalars` at each vertex on the surface. If `at_verts`, returns values at each vertex. Otherwise, returns values at each face. @@ -284,7 +296,7 @@

Source code for cortex.polyutils.surface

             A scalar-valued function across the cortex.
         at_verts : bool, optional
             If True (default), values will be returned for each vertex. Otherwise,
-            values will be retruned for each face.
+            values will be returned for each face.
 
         Returns
         -------
@@ -307,8 +319,11 @@ 

Source code for cortex.polyutils.surface

             return (self.connected.dot(gradu).T / self.connected.sum(1).A.squeeze()).T
         return gradu
-
[docs] def create_biharmonic_solver(self, boundary_verts, clip_D=0.1): - r"""Set up biharmonic equation with Dirichlet boundary conditions on the cortical + +
+[docs] + def create_biharmonic_solver(self, boundary_verts, clip_D=0.1): + r"""Set up biharmonic equation with Dirichlet boundary conditions on the cortical mesh and precompute Cholesky factorization for solving it. The vertices listed in `boundary_verts` are considered part of the boundary, and will not be included in the factorization. @@ -369,8 +384,9 @@

Source code for cortex.polyutils.surface

         
         return lhs, D, Dinv, lhsfac, notboundary
+ def _create_interp(self, verts, bhsolver=None): - """Creates interpolator that will interpolate values at the given `verts` using + """Creates interpolator that will interpolate values at the given `verts` using biharmonic interpolation. Parameters @@ -395,7 +411,7 @@

Source code for cortex.polyutils.surface

         
         npt = len(D)
         def _interp(vals):
-            """Interpolate function with values `vals` at the knot points."""
+            """Interpolate function with values `vals` at the knot points."""
             v2 = np.atleast_2d(vals)
             nd,nv = v2.shape
             ij = np.zeros((2,nv*nd))
@@ -418,8 +434,10 @@ 

Source code for cortex.polyutils.surface

 
         return _interp
 
-
[docs] def interp(self, verts, vals): - """Interpolates a function between N knot points `verts` with the values `vals`. +
+[docs] + def interp(self, verts, vals): + """Interpolates a function between N knot points `verts` with the values `vals`. `vals` can be a D x N array to interpolate multiple functions with the same knot points. @@ -444,6 +462,7 @@

Source code for cortex.polyutils.surface

         """
         return self._create_interp(verts)(vals)
+ @property @_memo def _facenorm_cross_edge(self): @@ -454,8 +473,10 @@

Source code for cortex.polyutils.surface

         fe31 = np.cross(fnorms, ppts[:,0] - ppts[:,2])
         return fe12, fe23, fe31
 
-
[docs] def approx_geodesic_distance(self, verts, m=0.1): - """Computes approximate geodesic distance (in mm) from each vertex in +
+[docs] + def approx_geodesic_distance(self, verts, m=0.1): + """Computes approximate geodesic distance (in mm) from each vertex in the surface to any vertex in the collection `verts`. This approximation is computed using Varadhan's formula for geodesic distance based on the heat kernel. This is very fast (quite a bit faster than `geodesic_distance`) @@ -505,8 +526,11 @@

Source code for cortex.polyutils.surface

 
         return -4 * t * np.log(u)
-
[docs] def geodesic_distance(self, verts, m=1.0, fem=False): - """Minimum mesh geodesic distance (in mm) from each vertex in surface to any + +
+[docs] + def geodesic_distance(self, verts, m=1.0, fem=False): + """Minimum mesh geodesic distance (in mm) from each vertex in surface to any vertex in the collection `verts`. Geodesic distance is estimated using heat-based method (see 'Geodesics in Heat', @@ -603,8 +627,11 @@

Source code for cortex.polyutils.surface

 
         return phi
-
[docs] def geodesic_path(self, a, b, max_len=1000, d=None, **kwargs): - """Finds the shortest path between two points `a` and `b`. + +
+[docs] + def geodesic_path(self, a, b, max_len=1000, d=None, **kwargs): + """Finds the shortest path between two points `a` and `b`. This shortest path is based on geodesic distances across the surface. The path starts at point `a` and selects the neighbor of `a` in the @@ -650,6 +677,7 @@

Source code for cortex.polyutils.surface

                 return path
         return path
+ @property @_memo def _cot_edge(self): @@ -677,7 +705,7 @@

Source code for cortex.polyutils.surface

     @property
     @_memo
     def boundary_vertices(self):
-        """return mask of boundary vertices
+        """return mask of boundary vertices
 
         algorithm: for simple mesh, every edge appears in either 1 or 2 polys
             1 -> border edge
@@ -724,7 +752,7 @@ 

Source code for cortex.polyutils.surface

 
     @property
     def iter_surfedges_weighted(self):
-        """iterate through edges
+        """iterate through edges
 
         - same iteration order as self.edge_lengths
             - border edges will be iterated once, non-border edges will be iterated twice
@@ -740,20 +768,23 @@ 

Source code for cortex.polyutils.surface

     @property
     @_memo
     def graph(self):
-        """NetworkX undirected graph representing this Surface.
+        """NetworkX undirected graph representing this Surface.
         """
         import networkx as nx
         graph = nx.Graph()
         graph.add_edges_from(self.iter_surfedges)
         return graph
 
-
[docs] def get_graph(self): +
+[docs] + def get_graph(self): return self.graph
+ @property @_memo def edge_lengths(self): - """return vector of edge lengths + """return vector of edge lengths - same iteration order as iter_surfedges_listed() - border edges will be iterated once, non-border edges will be iterated twice @@ -779,8 +810,10 @@

Source code for cortex.polyutils.surface

         weighted_graph.add_weighted_edges_from(self.iter_surfedges_weighted)
         return weighted_graph
 
-
[docs] def extract_chunk(self, nfaces=100, seed=None, auxpts=None): - '''Extract a chunk of the surface using breadth first search, for testing purposes''' +
+[docs] + def extract_chunk(self, nfaces=100, seed=None, auxpts=None): + '''Extract a chunk of the surface using breadth first search, for testing purposes''' node = seed if seed is None: node = np.random.randint(len(self.pts)) @@ -814,8 +847,11 @@

Source code for cortex.polyutils.surface

 
         return np.array(pts), np.array(polys)
-
[docs] def extract_geodesic_chunk(self, origin, radius): - """Extract a chunk of the surface that is within radius of the origin by + +
+[docs] + def extract_geodesic_chunk(self, origin, radius): + """Extract a chunk of the surface that is within radius of the origin by geodesic distance. """ dist = self.geodesic_distance([origin]) @@ -837,8 +873,11 @@

Source code for cortex.polyutils.surface

         return sel_pts, sel_polys
-
[docs] def polyhedra(self, wm): - '''Iterates through the polyhedra that make up the closest volume to a certain vertex''' + +
+[docs] + def polyhedra(self, wm): + '''Iterates through the polyhedra that make up the closest volume to a certain vertex''' for p, facerow in enumerate(self.connected): faces = facerow.indices pts, polys = _ptset(), _quadset() @@ -867,7 +906,10 @@

Source code for cortex.polyutils.surface

 
             yield pts.points, np.array(list(polys.triangles))
-
[docs] def patches(self, auxpts=None, n=1): + +
+[docs] + def patches(self, auxpts=None, n=1): def align_polys(p, polys): x, y = np.nonzero(polys == p) y = np.vstack([y, (y+1)%3, (y+2)%3]).T @@ -911,10 +953,15 @@

Source code for cortex.polyutils.surface

             else:
                 yield None
-
[docs] def edge_collapse(self, p1, p2, target): + +
+[docs] + def edge_collapse(self, p1, p2, target): raise NotImplementedError face1 = self.connected[p1] - face2 = self.connected[p2]
+ face2 = self.connected[p2]
+
+ class _ptset(object): @@ -996,7 +1043,7 @@

Related Topics

- - + + @@ -1019,11 +1066,11 @@

Quick search

diff --git a/_modules/cortex/quickflat/view.html b/_modules/cortex/quickflat/view.html index e31e6006e..7ab4c4fdc 100644 --- a/_modules/cortex/quickflat/view.html +++ b/_modules/cortex/quickflat/view.html @@ -1,28 +1,27 @@ - - + - cortex.quickflat.view — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.quickflat.view — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -65,7 +64,9 @@

Source code for cortex.quickflat.view

     return default_colorbar_locations[colorbar_location]
 
 
-
[docs]def make_figure(braindata, recache=False, pixelwise=True, thick=32, sampler='nearest', +
+[docs] +def make_figure(braindata, recache=False, pixelwise=True, thick=32, sampler='nearest', height=1024, dpi=100, depth=0.5, with_rois=True, with_sulci=False, with_labels=True, with_colorbar=True, with_borders=False, with_dropout=False, with_curvature=False, extra_disp=None, @@ -75,7 +76,7 @@

Source code for cortex.quickflat.view

                 curvature_contrast=None, curvature_threshold=None, fig=None, extra_hatch=None,
                 colorbar_ticks=None, colorbar_location='center', roi_list=None,
                 nanmean=False, **kwargs):
-    """Show a Volume or Vertex on a flatmap with matplotlib.
+    """Show a Volume or Vertex on a flatmap with matplotlib.
 
     Note that **kwargs are ONLY present now for backward compatibility / warnings. No kwargs
     should be used.
@@ -116,7 +117,7 @@ 

Source code for cortex.quickflat.view

     linecolor : tuple of float, optional
         (R, G, B, A) specification of line color
     roifill : tuple of float, optional
-        (R, G, B, A) sepcification for the fill of each ROI region
+        (R, G, B, A) specification for the fill of each ROI region
     shadow : int, optional
         Standard deviation of the gaussian shadow. Set to 0 if you want no shadow
     labelsize : str, optional
@@ -263,7 +264,7 @@ 

Source code for cortex.quickflat.view

 
     # Add (apply) cutout of flatmap
     if cutout is not None:
-        extents = composite.add_cutout(ax, cutout, dataview, layers)
+        extents = composite.add_cutout(ax, cutout, dataview, layers, overlay_file=overlay_file)
 
     if with_colorbar:
         colorbar_location = _check_colorbar_location(colorbar_location)
@@ -287,9 +288,12 @@ 

Source code for cortex.quickflat.view

 
     return fig
-
[docs]def make_png(fname, braindata, recache=False, pixelwise=True, sampler='nearest', height=1024, + +
+[docs] +def make_png(fname, braindata, recache=False, pixelwise=True, sampler='nearest', height=1024, bgcolor=None, dpi=100, **kwargs): - """Create a PNG of the VertexData or VolumeData on a flatmap. + """Create a PNG of the VertexData or VolumeData on a flatmap. Parameters ---------- @@ -330,7 +334,7 @@

Source code for cortex.quickflat.view

     linecolor : tuple of float, optional
         (R, G, B, A) specification of line color
     roifill : tuple of float, optional
-        (R, G, B, A) sepcification for the fill of each ROI region
+        (R, G, B, A) specification for the fill of each ROI region
     shadow : int, optional
         Standard deviation of the gaussian shadow. Set to 0 if you want no shadow
     labelsize : str, optional
@@ -355,9 +359,12 @@ 

Source code for cortex.quickflat.view

     fig.clf()
     plt.close(fig)
-
[docs]def make_svg(fname, braindata, with_labels=False, with_curvature=True, layers=['rois'], + +
+[docs] +def make_svg(fname, braindata, with_labels=False, with_curvature=True, layers=['rois'], height=1024, overlay_file=None, with_dropout=False, **kwargs): - """Save an svg file of the desired flatmap. + """Save an svg file of the desired flatmap. This function creates an SVG file with vector graphic ROIs overlaid on a single png image. Ideally, this function would layer different images (curvature, data, dropout, etc), but @@ -447,8 +454,9 @@

Source code for cortex.quickflat.view

     roipack.get_svg(fname, layers=layers, labels=with_labels, with_ims=image_data)
+ def make_gif(output_destination, volumes, frame_duration=1, **figure_kwargs): - """Make an animated gif from several pycortex volumes + """Make an animated gif from several pycortex volumes Parameters ---------- @@ -489,13 +497,13 @@

Source code for cortex.quickflat.view

 
 
 def show(*args, **kwargs):
-    """Wrapper for make_figure()"""
+    """Wrapper for make_figure()"""
     return make_figure(*args, **kwargs)
 
 def make_movie(name, data, subject, xfmname, recache=False, height=1024,
                sampler='nearest', dpi=100, tr=2, interp='linear', fps=30,
                vcodec='libtheora', bitrate="8000k", vmin=None, vmax=None, **kwargs):
-    """Create a movie of an 4D data set"""
+    """Create a movie of an 4D data set"""
     raise NotImplementedError
     import sys
     import shlex
@@ -585,7 +593,7 @@ 

Related Topics

- - + + @@ -608,11 +616,11 @@

Quick search

diff --git a/_modules/cortex/segment.html b/_modules/cortex/segment.html index ff1f5b1c9..f32d50f35 100644 --- a/_modules/cortex/segment.html +++ b/_modules/cortex/segment.html @@ -1,28 +1,27 @@ - - + - cortex.segment — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.segment — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -58,8 +57,10 @@

Source code for cortex.segment

 slim_path = options.config.get('dependency_paths', 'slim')
 
 
-
[docs]def init_subject(subject, filenames, do_import_subject=False, **kwargs): - """Run the first initial segmentation for a subject's anatomy (in Freesurfer). +
+[docs] +def init_subject(subject, filenames, do_import_subject=False, **kwargs): + """Run the first initial segmentation for a subject's anatomy (in Freesurfer). This function creates a Freesurfer subject and runs autorecon-all, then (optionally) imports the subject into the pycortex database. @@ -100,11 +101,12 @@

Source code for cortex.segment

         import_freesurfer_subject(subject)
+ def edit_segmentation(subject, volumes=('aseg.mgz', 'brainmask.mgz', 'wm.mgz'), surfaces=('lh.smoothwm', 'rh.smoothwm', 'lh.pial', 'rh.pial'), freesurfer_subject_dir=None): - """Edit automatic segmentation results using freeview + """Edit automatic segmentation results using freeview Opens an instance of freeview with relevant files loaded. @@ -160,10 +162,12 @@

Source code for cortex.segment

     print("    `cortex.segment.run_freesurfer_recon('%s', 'pia')`"%subject)
 
 
-
[docs]def cut_surface(cx_subject, hemi, name='flatten', fs_subject=None, data=None, +
+[docs] +def cut_surface(cx_subject, hemi, name='flatten', fs_subject=None, data=None, freesurfer_subject_dir=None, flatten_with='freesurfer', do_import_subject=True, blender_cmd=None, **kwargs): - """Initializes an interface to cut the segmented surface for flatmapping. + """Initializes an interface to cut the segmented surface for flatmapping. This function creates or opens a blend file in your filestore which allows surfaces to be cut along hand-defined seams. Blender will automatically open the file. After edits are made, remember to save the file, then exit @@ -181,14 +185,15 @@

Source code for cortex.segment

         Which hemisphere to flatten. Should be "lh" or "rh"
     name : str, optional
         String name of the current flatten attempt. Defaults to "flatten"
-    data : Dataview
-        A data view object to display on the surface as a cutting guide.
+    data : Dataview or List(Dataview)
+        A data view object or list of data view objects to display on the 
+        surface as a cutting guide.
     fs_subject : str
         Name of Freesurfer subject (if different from pycortex subject)
         None defaults to `cx_subject`
     freesurfer_subject_dir : str
         Name of Freesurfer subject directory. None defaults to SUBJECTS_DIR
-        environment varible
+        environment variable
     flatten_with : str
         'freesurfer' or 'SLIM' - 'freesurfer' (default) uses freesurfer's 
         `mris_flatten` function to flatten the cut surface. 'SLIM' uses
@@ -219,7 +224,11 @@ 

Source code for cortex.segment

         blender.fs_cut(fname, fs_subject, hemi, freesurfer_subject_dir)
     # Add localizer data to facilitate cutting
     if data is not None:
-        blender.add_cutdata(fname, data, name=data.description)
+        if isinstance(data, list):
+            for d in data:
+                blender.add_cutdata(fname, d, name=d.description)
+        else:
+            blender.add_cutdata(fname, data, name=data.description)
     if blender_cmd is None:
         blender_cmd = options.config.get('dependency_paths', 'blender')
     # May be redundant after blender.fs_cut above...
@@ -270,9 +279,10 @@ 

Source code for cortex.segment

     return
+ def flatten_slim(subject, hemi, patch, n_iterations=20, freesurfer_subject_dir=None, slim_path=slim_path, do_flatten=None): - """Flatten brain w/ slim object flattening + """Flatten brain w/ slim object flattening Parameters ---------- @@ -371,7 +381,7 @@

Source code for cortex.segment

 
 
 def show_surface(subject, hemi, surface_type, patch=None, flatten_step=None, freesurfer_subject_dir=None):
-    """
+    """
     Parameters
     ----------
     subject: str
@@ -419,8 +429,10 @@ 

Source code for cortex.segment

 
 ### DEPRECATED ###
 
-
[docs]def fix_wm(subject): - """Initializes an interface to make white matter edits to the surface. +
+[docs] +def fix_wm(subject): + """Initializes an interface to make white matter edits to the surface. This will open two windows -- a tkmedit window that makes the actual edits, as well as a mayavi window to display the surface. Clicking on the mayavi window will drop markers which can be loaded using the "Goto Save Point" button in tkmedit. @@ -455,9 +467,12 @@

Source code for cortex.segment

 
     import_freesurfer_subject(subject)
-
[docs]def fix_pia(subject): - """Initializes an interface to make pial surface edits. - This function will open two windows -- a tkmedit window that makse the actual edits, + +
+[docs] +def fix_pia(subject): + """Initializes an interface to make pial surface edits. + This function will open two windows -- a tkmedit window that makes the actual edits, as well as a mayavi window to display the surface. Clicking on the mayavi window will drop markers which can be loaded using the "Goto Save Point" button in tkmedit. @@ -493,6 +508,7 @@

Source code for cortex.segment

 
 
 
+
 def _cycle_surf(subject, surf):
     status = mp.Value('b', 1)
     def cycle_surf():
@@ -561,7 +577,7 @@ 

Related Topics

- - + + @@ -584,11 +600,11 @@

Quick search

diff --git a/_modules/cortex/surfinfo.html b/_modules/cortex/surfinfo.html index c546a794b..00c4d9409 100644 --- a/_modules/cortex/surfinfo.html +++ b/_modules/cortex/surfinfo.html @@ -1,28 +1,27 @@ - - + - cortex.surfinfo — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.surfinfo — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -53,8 +52,10 @@

Source code for cortex.surfinfo

 from .database import db
 from .xfm import Transform
 
-
[docs]def curvature(outfile, subject, smooth=20): - """ +
+[docs] +def curvature(outfile, subject, smooth=20): + """ Compute smoothed mean curvature of the fiducial surface for the given subject and save it to `outfile`. @@ -74,8 +75,11 @@

Source code for cortex.surfinfo

         curvs.append(curv)
     np.savez(outfile, left=curvs[0], right=curvs[1])
-
[docs]def distortion(outfile, subject, dist_type='areal', smooth=20): - """ + +
+[docs] +def distortion(outfile, subject, dist_type='areal', smooth=20): + """ Compute distortion of flatmap relative to fiducial surface and save it at `outfile`. Several different types of distortion are available: @@ -112,8 +116,11 @@

Source code for cortex.surfinfo

 
     np.savez(outfile, left=distortions[0], right=distortions[1])
-
[docs]def thickness(outfile, subject): - """ + +
+[docs] +def thickness(outfile, subject): + """ Compute cortical thickness as the distance between corresponding pial and white matter vertices for the given subject. Note that this is slightly different than the method used by Freesurfer, and will yield ever-so-slightly @@ -133,8 +140,11 @@

Source code for cortex.surfinfo

     right = np.sqrt(((pr[0] - wr[0])**2).sum(1))
     np.savez(outfile, left=left, right=right)
-
[docs]def tissots_indicatrix(outfile, sub, radius=10, spacing=50): - """ + +
+[docs] +def tissots_indicatrix(outfile, sub, radius=10, spacing=50): + """ Compute a Tissot's indicatrix for the given subject and save the result to a file. This involves randomly filling in discs of fixed geodesic radius on the fiducial surface. @@ -184,10 +194,15 @@

Source code for cortex.surfinfo

 
         tissots.append(tissot_array)
         allcenters.append(np.array(centers))
-
+    
+    # make an array of objects to allow different lengths for each hemisphere
+    allcenters = np.array(allcenters, dtype="object")
     np.savez(outfile, left=tissots[0], right=tissots[1], centers=allcenters)
-
[docs]def flat_border(outfile, subject): + +
+[docs] +def flat_border(outfile, subject): flatpts, flatpolys = db.get_surf(subject, "flat", merge=True, nudge=True) flatpolyset = set([tuple(x) for x in flatpolys]) @@ -254,6 +269,7 @@

Source code for cortex.surfinfo

             lines.append(pts[pbnd,:2])
     
     np.savez(outfile, lines=lines, ismwalls=ismwalls)
+
@@ -304,7 +320,7 @@

Related Topics

- - + + @@ -327,11 +343,11 @@

Quick search

diff --git a/_modules/cortex/utils.html b/_modules/cortex/utils.html index 113e6c09d..260bd76a4 100644 --- a/_modules/cortex/utils.html +++ b/_modules/cortex/utils.html @@ -1,28 +1,27 @@ - - + - cortex.utils — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.utils — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -37,29 +36,28 @@

Source code for cortex.utils

 """Contain utility functions
 """
+import binascii
+import copy
 import io
 import os
-import h5py
-import copy
 import shutil
-import binascii
-import warnings
-import numpy as np
 import tarfile
-import wget
 import tempfile
-
+import warnings
 from distutils.version import LooseVersion
-
-from six import string_types
 from importlib import import_module
+
+import h5py
+import numpy as np
+import wget
+
+from . import formats
 from .database import db
-from .volume import anat2epispace
-from .options import config
 from .freesurfer import fs_aseg_dict
+from .options import config
 from .polyutils import Surface
-from . import formats
 from .testing_utils import INKSCAPE_VERSION
+from .volume import anat2epispace
 
 
 class DocLoader(object):
@@ -82,10 +80,12 @@ 

Source code for cortex.utils

 
 get_mapper = DocLoader("get_mapper", ".mapper", "cortex")
 
-
[docs]def get_ctmpack(subject, types=("inflated",), method="raw", level=0, recache=False, +
+[docs] +def get_ctmpack(subject, types=("inflated",), method="raw", level=0, recache=False, decimate=False, external_svg=None, overlays_available=None): - """Creates ctm file for the specified input arguments. + """Creates ctm file for the specified input arguments. This is a cached file that specifies (1) the surfaces between which to interpolate (`types` argument), (2) the `method` to interpolate @@ -142,8 +142,11 @@

Source code for cortex.utils

                                overlays_available=overlays_available)
     return ctmfile
-
[docs]def get_ctmmap(subject, **kwargs): - """ + +
+[docs] +def get_ctmmap(subject, **kwargs): + """ Parameters ---------- subject : str @@ -156,6 +159,7 @@

Source code for cortex.utils

     rnew :
     """
     from scipy.spatial import cKDTree
+
     from . import brainctm
     jsfile = get_ctmpack(subject, **kwargs)
     ctmfile = os.path.splitext(jsfile)[0]+".ctm"
@@ -171,8 +175,11 @@ 

Source code for cortex.utils

     rnew = rmap.query(right[0])[1]
     return lnew, rnew
-
[docs]def get_cortical_mask(subject, xfmname, type='nearest'): - """Gets the cortical mask for a particular transform + +
+[docs] +def get_cortical_mask(subject, xfmname, type='nearest'): + """Gets the cortical mask for a particular transform Parameters ---------- @@ -181,16 +188,24 @@

Source code for cortex.utils

     xfmname : str
         Transform name
     type : str
-        Mask type, one of {'cortical','thin','thick', 'nearest'}. 'cortical' is exactly the
-        cortical ribbon, between the freesurfer-estimated white matter and pial
-        surfaces; 'thin' is < 2mm away from fiducial surface; 'thick' is < 8mm
-        away from fiducial surface.
-        'nearest' is nearest voxel only (??)
+        Mask type, one of {"cortical", "thin", "thick", "nearest", "line_nearest"}.
+          - 'cortical' includes voxels contained within the cortical ribbon, 
+          between the freesurfer-estimated white matter and pial surfaces. 
+          - 'thin' includes voxels that are < 2mm away from the fiducial surface. 
+          - 'thick' includes voxels that are < 8mm away from the fiducial surface.
+          - 'nearest' includes only the voxels overlapping the fiducial surface.
+          - 'line_nearest' includes all voxels that have any part within the cortical 
+            ribbon.
 
     Returns
     -------
     mask : array
         boolean mask array for cortical voxels in functional space
+
+    Notes
+    -----
+    "nearest" is a conservative "cortical" mask, while "line_nearest" is a liberal 
+    "cortical" mask.
     """
     if type == 'cortical':
         ppts, polys = db.get_surf(subject, "pia", merge=True, nudge=False)
@@ -213,8 +228,11 @@ 

Source code for cortex.utils

         return get_mapper(subject, xfmname, type=type).mask
-
[docs]def get_vox_dist(subject, xfmname, surface="fiducial", max_dist=np.inf): - """Get the distance (in mm) from each functional voxel to the closest + +
+[docs] +def get_vox_dist(subject, xfmname, surface="fiducial", max_dist=np.inf): + """Get the distance (in mm) from each functional voxel to the closest point on the surface. Parameters @@ -223,20 +241,19 @@

Source code for cortex.utils

         Name of the subject
     xfmname : str
         Name of the transform
-    shape : tuple
-        Output shape for the mask
     max_dist : nonnegative float, optional
         Limit computation to only voxels within `max_dist` mm of the surface.
-        Makes computation orders of magnitude faster for high-resolution
-        volumes.
+        Makes computation orders of magnitude faster for high-resolution volumes.
 
     Returns
     -------
-    dist : ndarray
-        Distance (in mm) to the closest point on the surface
+    dist : ndarray (z, y, x)
+        Array with the same shape as the reference image of `xfmname` containing
+        the distance (in mm) of each voxel to the closest point on the surface.
 
-    argdist : ndarray
-        Point index for the closest point
+    argdist : ndarray (z, y, x)
+        Array with the same shape as the reference image of `xfmname` containing
+        for each voxel the index of the closest point on the surface.
     """
     from scipy.spatial import cKDTree
 
@@ -248,12 +265,16 @@ 

Source code for cortex.utils

 
     tree = cKDTree(fiducial)
     dist, argdist = tree.query(mm, distance_upper_bound=max_dist)
-    dist.shape = (x,y,z)
-    argdist.shape = (x,y,z)
+    dist.shape = (x, y, z)
+    argdist.shape = (x, y, z)
     return dist.T, argdist.T
-
[docs]def get_hemi_masks(subject, xfmname, type='nearest'): - '''Returns a binary mask of the left and right hemisphere + + +
+[docs] +def get_hemi_masks(subject, xfmname, type='nearest'): + '''Returns a binary mask of the left and right hemisphere surface voxels for the given subject. Parameters @@ -270,9 +291,12 @@

Source code for cortex.utils

     '''
     return get_mapper(subject, xfmname, type=type).hemimasks
-
[docs]def add_roi(data, name="new_roi", open_inkscape=True, add_path=True, + +
+[docs] +def add_roi(data, name="new_roi", open_inkscape=True, add_path=True, overlay_file=None, **kwargs): - """Add new flatmap image to the ROI file for a subject. + """Add new flatmap image to the ROI file for a subject. (The subject is specified in creation of the data object) @@ -303,8 +327,8 @@

Source code for cortex.utils

         Passed to cortex.quickflat.make_png
     """
     import subprocess as sp
-    from . import quickflat
-    from . import dataset
+
+    from . import dataset, quickflat
 
     dv = dataset.normalize(data)
     if isinstance(dv, dataset.Dataset):
@@ -325,8 +349,22 @@ 

Source code for cortex.utils

             cmd = [inkscape_cmd, svg.svgfile]
         return sp.call(cmd)
-
[docs]def get_roi_verts(subject, roi=None, mask=False, overlay_file=None): - """Return vertices for the given ROIs, or all ROIs if none are given. + + +def _get_neighbors_dict(polys): + """Return a dictionary of {vertex : set(neighbor vertices)} for the given polys""" + neighbors_dict = {} + for poly in polys: + for i, j in ((0, 1), (1, 2), (2, 0)): + neighbors_dict.setdefault(poly[i], set()).add(poly[j]) + neighbors_dict.setdefault(poly[j], set()).add(poly[i]) + return neighbors_dict + + +
+[docs] +def get_roi_verts(subject, roi=None, mask=False, overlay_file=None): + """Return vertices for the given ROIs, or all ROIs if none are given. Parameters ---------- @@ -338,6 +376,8 @@

Source code for cortex.utils

     mask : bool
         if True, return a logical mask across vertices for the roi
         if False, return a list of indices for the ROI
+    overlay_file : None or str
+        Pass another overlays file instead of the default overlays.svg
 
     Returns
     -------
@@ -355,17 +395,32 @@ 

Source code for cortex.utils

     pts, polys = db.get_surf(subject, "flat", merge=True)
     goodpts = np.unique(polys)
 
+    # Load also the pts and polys of the full surface without cuts, to recover
+    # vertices that were removed from the flat surface
+    _, polys_full = db.get_surf(subject, "fiducial", merge=True)
+    neighbors_dict = _get_neighbors_dict(polys_full)
+
     if roi is None:
         roi = svg.rois.shapes.keys()
 
     roidict = dict()
-    if isinstance(roi, string_types):
+    if isinstance(roi, str):
         roi = [roi]
 
     for name in roi:
         roi_idx = np.intersect1d(svg.rois.get_mask(name), goodpts)
+        # Now we want to include also the vertices that were removed from the flat 
+        # surface that is, for every vertex in roi_idx we want to add the pts that are 
+        # not in goodpts but that are in pts_full
+        # to do that, we need to find the neighboring indices from polys_full
+        extra_idx = set()
+        for idx in roi_idx:
+            extra_idx.update(ii for ii in neighbors_dict[idx] if ii not in goodpts)
+        if extra_idx:
+            roi_idx = np.unique(np.concatenate((roi_idx, list(extra_idx)))).astype(int)
+
         if mask:
-            roidict[name] = np.zeros(pts.shape[:1]) > 1
+            roidict[name] = np.zeros(pts.shape[:1], dtype=bool)
             if np.any(roi_idx):
                 roidict[name][roi_idx] = True
             else:
@@ -376,8 +431,9 @@ 

Source code for cortex.utils

     return roidict
-def get_roi_surf(subject, surf_type, roi): - """Similar to get_roi_verts, but gets both the points and the polys for an roi. + +def get_roi_surf(subject, surf_type, roi, overlay_file=None): + """Similar to get_roi_verts, but gets both the points and the polys for an roi. Parameters ---------- @@ -388,31 +444,35 @@

Source code for cortex.utils

         superinflated, flat)
     roi : str
         Name of ROI to get the surface geometry for.
+    overlay_file : None or str
+        Pass another overlays file instead of the default overlays.svg
 
     Returns
     -------
     pts, polys : (array, array)
         The points, specified in 3D space, as well as indices into pts specifying the polys.
     """
-    roi_verts_mask = get_roi_verts(subject, roi, mask=True)
+    roi_verts_mask = get_roi_verts(subject, roi, mask=True, overlay_file=overlay_file)
     pts, polys = db.get_surf(subject, surf_type, merge=True, nudge=True)
     vert_idx = np.where(roi_verts_mask[roi])[0]
     vert_set = set(vert_idx)
     roi_polys = []
-    for i in xrange(np.shape(polys)[0]):
-        if np.array(map(lambda x: x in vert_set, polys[i, :])).all():
+    for i in range(np.shape(polys)[0]):
+        if np.array(list(map(lambda x: x in vert_set, polys[i, :]))).all():
             roi_polys.append(polys[i, :])
     reindexed_polys = []
     vert_rev_hash_idx = {}
     for i, v in enumerate(vert_idx):
         vert_rev_hash_idx[v] = i
     for poly in roi_polys:
-        reindexed_polys.append(map(vert_rev_hash_idx.get, poly))
-    return (pts[vert_idx], np.array(reindexed_polys))
+        reindexed_polys.append(list(map(vert_rev_hash_idx.get, poly)))
+    return pts[vert_idx], np.array(reindexed_polys)
 
 
-
[docs]def get_roi_mask(subject, xfmname, roi=None, projection='nearest'): - """Return a mask for the given ROI(s) +
+[docs] +def get_roi_mask(subject, xfmname, roi=None, projection='nearest'): + """Return a mask for the given ROI(s) Deprecated - use get_roi_masks() @@ -440,13 +500,16 @@

Source code for cortex.utils

         # This is broken; unclear when/if backward mappers ever worked this way.
         #left, right = mapper.backwards(vert_mask)
         #output[name] = left + right
-        output[name] = mapper.backwards(verts.astype(np.float))
+        output[name] = mapper.backwards(verts.astype(float))
         # Threshold?
     return output
-
[docs]def get_aseg_mask(subject, aseg_name, xfmname=None, order=1, threshold=None, **kwargs): - """Return an epi space mask of the given ID from freesurfer's automatic segmentation + +
+[docs] +def get_aseg_mask(subject, aseg_name, xfmname=None, order=1, threshold=None, **kwargs): + """Return an epi space mask of the given ID from freesurfer's automatic segmentation Parameters ---------- @@ -487,7 +550,7 @@

Source code for cortex.utils

 
     """
     from .freesurfer import fs_aseg_dict
-    aseg = db.get_anat(subject, type="aseg").get_data().T
+    aseg = db.get_anat(subject, type="aseg").get_fdata().T
 
     if not isinstance(aseg_name, (list, tuple)):
         aseg_name = [aseg_name]
@@ -510,10 +573,13 @@ 

Source code for cortex.utils

     return mask
-
[docs]def get_roi_masks(subject, xfmname, roi_list=None, gm_sampler='cortical', split_lr=False, + +
+[docs] +def get_roi_masks(subject, xfmname, roi_list=None, gm_sampler='cortical', split_lr=False, allow_overlap=False, fail_for_missing_rois=True, exclude_empty_rois=False, threshold=None, return_dict=True, overlay_file=None): - """Return a dictionary of roi masks + """Return a dictionary of roi masks This function returns a single 3D array with a separate numerical index for each ROI, @@ -549,7 +615,7 @@

Source code for cortex.utils

         voxel (reflecting the fraction of that voxel inside the ROI) unless a threshold
         is provided.
     threshold : float [0-1]
-        value used to convert probablistic ROI values to a boolean mask for the ROI.
+        value used to convert probabilistic ROI values to a boolean mask for the ROI.
     split_lr : bool
         Whether to separate ROIs in to left and right hemispheres (e.g., 'V1' becomes
         'V1_L' and 'V1_R')
@@ -567,6 +633,9 @@ 

Source code for cortex.utils

         If True (default), function returns a dictionary of ROI masks; if False, a volume
         with integer indices for each ROI (similar to Freesurfer's aseg masks) and a
         dictionary of how the indices map to ROI names are returned.
+    overlay_file : str or None
+        If None, use the default `overlays.svg` file. Otherwise, use the passed
+        overlay file to look for the ROIs.
 
     Returns
     -------
@@ -592,19 +661,22 @@ 

Source code for cortex.utils

                    'cortical-liberal':'line_nearest'}
     # Method
     use_mapper = gm_sampler in mapper_dict
-    use_cortex_mask = (gm_sampler in ('cortical', 'thick', 'thin')) or not isinstance(gm_sampler, string_types)
+    use_cortex_mask = (gm_sampler in ('cortical', 'thick', 'thin')) or not isinstance(gm_sampler, str)
     if not (use_mapper or use_cortex_mask):
         raise ValueError('Unknown gray matter sampler (gm_sampler)!')
     # Initialize
     roi_voxels = {}
     pct_coverage = {}
     # Catch single-ROI input
-    if isinstance(roi_list, string_types):
+    if isinstance(roi_list, str):
         roi_list = [roi_list]
     if not return_dict:
         split_lr = True
         if use_mapper and threshold is None:
-            raise Exception("You must set a threshold for gm_mapper='%s' if you want an indexed volume output"%gm_mapper)
+            raise ValueError(
+                f"You must set a threshold for gm_sampler={gm_sampler} if you want an "
+                "indexed volume output"
+            )
     # Start with vertices
     if roi_list is None:
         roi_verts = get_roi_verts(subject, mask=use_mapper, overlay_file=overlay_file)
@@ -629,7 +701,7 @@ 

Source code for cortex.utils

     if use_mapper:
         mapper = get_mapper(subject, xfmname, type=mapper_dict[gm_sampler])
     elif use_cortex_mask:
-        if isinstance(gm_sampler, string_types):
+        if isinstance(gm_sampler, str):
             cortex_mask = db.get_mask(subject, xfmname, type=gm_sampler)
         else:
             cortex_mask = vox_dst <= gm_sampler
@@ -640,8 +712,8 @@ 

Source code for cortex.utils

                 print("ROI {} not found...".format(roi))
             continue
         if use_mapper:
-            roi_voxels[roi] = mapper.backwards(roi_verts[roi].astype(np.float))
-            # Optionally threshold probablistic values returned by mapper
+            roi_voxels[roi] = mapper.backwards(roi_verts[roi].astype(float))
+            # Optionally threshold probabilistic values returned by mapper
             if threshold is not None:
                 roi_voxels[roi] = roi_voxels[roi] > threshold
             # Check for partial / empty rois:
@@ -675,23 +747,25 @@ 

Source code for cortex.utils

         for roi in roi_list:
             roi_voxels[roi][all_mask > 1] = False
     # Split left / right hemispheres if desired
-    # There ought to be a more succinct way to do this - get_hemi_masks only does the cortical
-    # ribbon, and is not guaranteed to have all voxels in the cortex_mask specified in this fn
     if split_lr:
-        left_verts, right_verts = db.get_surf(subject, "flat", merge=False, nudge=True)
+        # Use the fiducial surface because we need to have all vertices
+        left_verts, _ = db.get_surf(subject, "fiducial", merge=False, nudge=True)  
         left_mask = vox_idx < len(np.unique(left_verts[1]))
         right_mask = np.logical_not(left_mask)
         roi_voxels_lr = {}
         for roi in roi_list:
-            roi_voxels_lr[roi+'_L'] = copy.copy(roi_voxels[roi]) # & left_mask
-            roi_voxels_lr[roi+'_L'][right_mask] = False # ?
-            roi_voxels_lr[roi+'_R'] = copy.copy(roi_voxels[roi]) # & right_mask
-            roi_voxels_lr[roi+'_R'][left_mask] = False # ?
+            # roi_voxels may contain float values if using a mapper, therefore we need
+            # to manually set the voxels in the other hemisphere to False. Then we let
+            # numpy do the conversion False -> 0. 
+            roi_voxels_lr[roi + '_L'] = copy.copy(roi_voxels[roi])
+            roi_voxels_lr[roi + '_L'][right_mask] = False
+            roi_voxels_lr[roi + '_R'] = copy.copy(roi_voxels[roi])
+            roi_voxels_lr[roi + '_R'][left_mask] = False
         output = roi_voxels_lr
     else:
         output = roi_voxels
 
-    # Check percent coverage / optionally cull emtpy ROIs
+    # Check percent coverage / optionally cull empty ROIs
     for roi in set(roi_list)-set(['Cortex']):
         if pct_coverage[roi] < 100:
             # if not np.any(mask) : reject ROI
@@ -720,8 +794,11 @@ 

Source code for cortex.utils

         idx_vol[left_mask] *= -1
         return idx_vol, idx_labels
-
[docs]def get_dropout(subject, xfmname, power=20): - """Create a dropout Volume showing where EPI signal + +
+[docs] +def get_dropout(subject, xfmname, power=20): + """Create a dropout Volume showing where EPI signal is very low. Parameters @@ -738,7 +815,7 @@

Source code for cortex.utils

         Pycortex volume of low signal locations
     """
     xfm = db.get_xfm(subject, xfmname)
-    rawdata = xfm.reference.get_data().T.astype(np.float32)
+    rawdata = xfm.reference.get_fdata().T.astype(np.float32)
 
     # Collapse epi across time if it's 4D
     if rawdata.ndim > 3:
@@ -751,8 +828,11 @@ 

Source code for cortex.utils

     from .dataset import Volume
     return Volume(normdata, subject, xfmname)
-
[docs]def make_movie(stim, outfile, fps=15, size="640x480"): - """Makes an .ogv movie + +
+[docs] +def make_movie(stim, outfile, fps=15, size="640x480"): + """Makes an .ogv movie A simple wrapper for ffmpeg. Calls: "ffmpeg -r {fps} -i {infile} -b 4800k -g 30 -s {size} -vcodec libtheora {outfile}.ogv" @@ -778,8 +858,11 @@

Source code for cortex.utils

     fcmd = cmd.format(infile=stim, size=size, fps=fps, outfile=outfile)
     sp.call(shlex.split(fcmd))
-
[docs]def vertex_to_voxel(subject): # Am I deprecated in favor of mappers??? Maybe? - """ + +
+[docs] +def vertex_to_voxel(subject): # Am I deprecated in favor of mappers??? Maybe? + """ Parameters ---------- subject : str @@ -809,8 +892,9 @@

Source code for cortex.utils

     return all_verts
+ def _set_edge_distance_graph_attribute(graph, pts, polys): - ''' + ''' adds the attribute 'edge distance' to a graph ''' import networkx as nx @@ -831,7 +915,7 @@

Source code for cortex.utils

 
 
 def get_shared_voxels(subject, xfmname, hemi="both", merge=True, use_astar=True):
-    '''Return voxels that are shared by multiple vertices, and for each such voxel,
+    '''Return voxels that are shared by multiple vertices, and for each such voxel,
        also returns the mutually farthest pair of vertices mapping to the voxel
     Parameters
     ----------
@@ -841,10 +925,10 @@ 

Source code for cortex.utils

         Name of the transform
     hemi : str, optional
         Which hemisphere to return. For now, only 'lh' or 'rh'
-    merge : bool, optinal
+    merge : bool, optional
         Join the hemispheres, if requesting both
     use_astar: bool, optional
-        Toggle to decide whether to use A* seach or geodesic paths for the
+        Toggle to decide whether to use A* search or geodesic paths for the
         shortest paths
 
     Returns
@@ -854,8 +938,8 @@ 

Source code for cortex.utils

     farthest_pair[1])
     '''
 
-    from scipy.sparse import find as sparse_find
     import networkx as nx
+    from scipy.sparse import find as sparse_find
     Lmask, Rmask = get_mapper(subject, xfmname).masks  # Get masks for left and right hemisphere
     if hemi == 'both':
         hemispheres = ['lh', 'rh']
@@ -916,7 +1000,7 @@ 

Source code for cortex.utils

 
 
 def load_sparse_array(fname, varname):
-    """Load a numpy sparse array from an hdf file
+    """Load a numpy sparse array from an hdf file
 
     Parameters
     ----------
@@ -938,7 +1022,7 @@ 

Source code for cortex.utils

 
 
 def save_sparse_array(fname, data, varname, mode='a'):
-    """Save a numpy sparse array to an hdf file
+    """Save a numpy sparse array to an hdf file
 
     Results in relatively smaller file size than numpy.savez
 
@@ -969,8 +1053,10 @@ 

Source code for cortex.utils

         hf.create_dataset(varname + '_shape', data=data_.shape, compression='gzip')
 
 
-
[docs]def get_cmap(name): - """Gets a colormaps +
+[docs] +def get_cmap(name): + """Gets a colormaps Parameters ---------- @@ -992,7 +1078,10 @@

Source code for cortex.utils

     if name in colormaps:
         I = plt.imread(colormaps[name])
         cmap = colors.ListedColormap(np.squeeze(I))
-        plt.cm.register_cmap(name,cmap)
+        try:
+            plt.cm.register_cmap(name,cmap)
+        except:
+            print(f"Color map {name} is already registered.")
     else:
         try:
             cmap = plt.cm.get_cmap(name)
@@ -1000,35 +1089,41 @@ 

Source code for cortex.utils

             raise Exception('Unkown color map!')
     return cmap
+ def add_cmap(cmap, name, cmapdir=None): - """Add a colormap to pycortex + """Add a colormap to pycortex. This stores a matplotlib colormap in the pycortex filestore, such that it can - be used in the webgl viewer in pycortex. See [] for more information about how - to generate colormaps in matplotlib + be used in the webgl viewer in pycortex. See + https://matplotlib.org/stable/users/explain/colors/colormap-manipulation.html + for more information about how to generate colormaps in matplotlib. Parameters ---------- cmap : matplotlib colormap Color map to be saved - name : - Name for colormap, e.g. 'jet', 'blue_to_yellow', etc. This will be a file name, - so no weird characters. This name will also be used to specify this colormap in - future calls to cortex.quickflat.make_figure() or cortex.webgl.show() + name : str + Name for colormap, e.g. 'jet', 'blue_to_yellow', etc. The name will be used + to generate a filename for the colormap stored in the pycortex store, + so avoid illegal characters for a filename. This name will also be used to + specify this colormap in future calls to `cortex.quickflat.make_figure()` + or `cortex.webgl.show()`. """ import matplotlib.pyplot as plt - from matplotlib import colors + x = np.linspace(0, 1, 256) - cmap_im = cmap(x).reshape((1,256,4)) + cmap_im = cmap(x).reshape((1, 256, 4)) if cmapdir is None: # Probably won't work due to permissions... - cmapdir = config.get('webgl', 'colormaps') - plt.imsave(os.path.join(cmapdir, name), cmap_im) + cmapdir = config.get("webgl", "colormaps") + # Make sure name ends with png + name = name if name.endswith(".png") else f"{name}.png" + plt.imsave(os.path.join(cmapdir, name), cmap_im, format="png") def download_subject(subject_id='fsaverage', url=None, pycortex_store=None, download_again=False): - """Download subjects to pycortex store + """Download subjects to pycortex store Parameters ---------- @@ -1079,7 +1174,7 @@

Source code for cortex.utils

 
 
 def rotate_flatmap(surf_id, theta, plot=False):
-    """Rotate flatmap to be less V-shaped
+    """Rotate flatmap to be less V-shaped
     
     Parameters
     ----------
@@ -1178,7 +1273,7 @@ 

Related Topics

- - + + @@ -1201,11 +1296,11 @@

Quick search

diff --git a/_modules/cortex/volume.html b/_modules/cortex/volume.html index d0760fb45..f94cc29c1 100644 --- a/_modules/cortex/volume.html +++ b/_modules/cortex/volume.html @@ -1,28 +1,27 @@ - - + - cortex.volume — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.volume — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -44,8 +43,10 @@

Source code for cortex.volume

 from .database import db
 from .xfm import Transform
 
-
[docs]def unmask(mask, data): - """unmask(mask, data) +
+[docs] +def unmask(mask, data): + """unmask(mask, data) Unmask the data, assuming it's been masked. Creates a volume the same size as `mask` containing `data` at the locations @@ -91,6 +92,7 @@

Source code for cortex.volume

 
     return output.squeeze()
+ def detrend_median(data, kernel=15): from scipy.signal import medfilt lowfreq = medfilt(data, [1, kernel, kernel]) @@ -121,8 +123,10 @@

Source code for cortex.volume

     else:
         return detrended.reshape(*s)
 
-
[docs]def mosaic(data, dim=0, show=True, **kwargs): - """ +
+[docs] +def mosaic(data, dim=0, show=True, **kwargs): + """ Turns volume data into a mosaic, useful for quickly viewing volumetric data with radiological convention (left side of figure is right side of subject). @@ -172,7 +176,10 @@

Source code for cortex.volume

 
     return output, (nwide, ntall)
-
[docs]def show_slice(dataview, **kwargs): + +
+[docs] +def show_slice(dataview, **kwargs): import nibabel from matplotlib import cm import matplotlib.pyplot as plt @@ -186,7 +193,7 @@

Source code for cortex.volume

     imshow_kw = dict(vmin=dataview.vmin, vmax=dataview.vmax, cmap=dataview.cmap)
     imshow_kw.update(kwargs)
 
-    anat = db.get_anat(subject, 'raw').get_data().T
+    anat = db.get_anat(subject, 'raw').get_fdata().T
     data = epi2anatspace(dataview)
 
     data[data < dataview.vmin] = np.nan
@@ -220,8 +227,11 @@ 

Source code for cortex.volume

     fig.canvas.mpl_connect('button_press_event', switchslice)
     return fig
-
[docs]def show_mip(data, **kwargs): - '''Display a maximum intensity projection for the data, using three subplots''' + +
+[docs] +def show_mip(data, **kwargs): + '''Display a maximum intensity projection for the data, using three subplots''' import matplotlib.pyplot as plt fig = plt.figure() fig.add_subplot(221).imshow(data.max(0), **kwargs) @@ -229,11 +239,14 @@

Source code for cortex.volume

     fig.add_subplot(223).imshow(data.max(2), **kwargs)
     return fig
-
[docs]def show_glass(dataview, pad=10): - '''Create a classic "glass brain" view of the data, with the outline''' + +
+[docs] +def show_glass(dataview, pad=10): + '''Create a classic "glass brain" view of the data, with the outline''' import nibabel nib = db.get_anat(subject, 'fiducial') - mask = nib.get_data() + mask = nib.get_fdata() left, right = np.nonzero(np.diff(mask.max(0).max(0)))[0][[0,-1]] front, back = np.nonzero(np.diff(mask.max(0).max(1)))[0][[0,-1]] @@ -245,8 +258,11 @@

Source code for cortex.volume

     #too much work for something we'll never use
     raise NotImplementedError
-
[docs]def epi2anatspace(volumedata, order=1): - """Resample an epi volume data into anatomical space using scipy. + +
+[docs] +def epi2anatspace(volumedata, order=1): + """Resample an epi volume data into anatomical space using scipy. Parameters ---------- @@ -267,8 +283,8 @@

Source code for cortex.volume

     anat = db.get_anat(volumedata.subject, "raw")
     xfm = db.get_xfm(volumedata.subject, volumedata.xfmname, "coord")
 
-    #allxfm =  Transform(anat.get_affine(), anat.shape).inv * xfm.inv
-    allxfm = xfm * Transform(anat.get_affine(), anat.shape)
+    #allxfm =  Transform(anat.affine, anat.shape).inv * xfm.inv
+    allxfm = xfm * Transform(anat.affine, anat.shape)
 
     rotpart = allxfm.xfm[:3, :3]
     transpart = allxfm.xfm[:3,-1]
@@ -276,8 +292,11 @@ 

Source code for cortex.volume

                             offset=transpart, output_shape=anat.shape[::-1],
                             cval=np.nan, order=order).T
-
[docs]def anat2epispace(anatdata, subject, xfmname, order=1): - """Resamples data from anatomical space into epi space + +
+[docs] +def anat2epispace(anatdata, subject, xfmname, order=1): + """Resamples data from anatomical space into epi space Parameters ---------- @@ -299,8 +318,8 @@

Source code for cortex.volume

     anatref = db.get_anat(subject)
     target = db.get_xfm(subject, xfmname, "coord")
 
-    allxfm =  Transform(anatref.get_affine(), anatref.shape).inv * target.inv
-    #allxfm = xfm * Transform(anat.get_affine(), anat.shape)
+    allxfm =  Transform(anatref.affine, anatref.shape).inv * target.inv
+    #allxfm = xfm * Transform(anat.affine, anat.shape)
 
     rotpart = allxfm.xfm[:3, :3]
     transpart = allxfm.xfm[:3,-1]
@@ -308,8 +327,11 @@ 

Source code for cortex.volume

     return affine_transform(anatdata.T, rotpart, offset=transpart, output_shape=target.shape[::-1], cval=np.nan, order=order).T
-
[docs]def epi2anatspace_fsl(volumedata): - """Resamples epi-space [data] into the anatomical space for the given [subject] + +
+[docs] +def epi2anatspace_fsl(volumedata): + """Resamples epi-space [data] into the anatomical space for the given [subject] using the given transformation [xfm]. """ #This function is currently broken! do not use it! @@ -336,7 +358,7 @@

Source code for cortex.volume

             xfmh.write(" ".join(["%0.5f"%f for f in ll])+"\n")
 
     ## Save out data into nifti file
-    datafile = nibabel.Nifti1Image(data.T, xfm.reference.get_affine(), xfm.reference.get_header())
+    datafile = nibabel.Nifti1Image(data.T, xfm.reference.affine, xfm.reference.header)
     datafilename = tempfile.mktemp(".nii")
     nibabel.save(datafile, datafilename)
 
@@ -352,15 +374,18 @@ 

Source code for cortex.volume

                      "-out", outfilename])
 
     ## Load resliced image
-    outdata = nibabel.load(outfilename+".gz").get_data().T
+    outdata = nibabel.load(outfilename+".gz").get_fdata().T
     ## Clean up
     os.remove(outfilename+".gz")
     os.remove(datafilename)
     ## Done!
     return outdata
-
[docs]def anat2epispace_fsl(data,subject,xfmname): - """Resamples anat-space data into the epi space for the given [subject] + +
+[docs] +def anat2epispace_fsl(data,subject,xfmname): + """Resamples anat-space data into the epi space for the given [subject] and transformation [xfm] """ import tempfile @@ -379,7 +404,7 @@

Source code for cortex.volume

             xfmh.write(" ".join(["%0.5f"%f for f in ll])+"\n")
 
     ## Save out data into nifti file
-    datafile = nibabel.Nifti1Image(data.T, anatNII.get_affine(), anatNII.get_header())
+    datafile = nibabel.Nifti1Image(data.T, anatNII.affine, anatNII.header)
     datafilename = tempfile.mktemp(".nii")
     nibabel.save(datafile, datafilename)
 
@@ -395,13 +420,14 @@ 

Source code for cortex.volume

                      "-applyxfm"])
 
     ## Load resliced image
-    outdata = nibabel.load(outfilename+".gz").get_data().T
+    outdata = nibabel.load(outfilename+".gz").get_fdata().T
     ## Clean up
     os.remove(outfilename+".gz")
     os.remove(datafilename)
     ## Done!
     return outdata
+ def fslview(*ims): import tempfile import subprocess @@ -470,7 +496,7 @@

Related Topics

- - + + @@ -493,11 +519,11 @@

Quick search

diff --git a/_modules/cortex/webgl/view.html b/_modules/cortex/webgl/view.html index ddc5c3095..cf33a17d8 100644 --- a/_modules/cortex/webgl/view.html +++ b/_modules/cortex/webgl/view.html @@ -1,28 +1,27 @@ - - + - cortex.webgl.view — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.webgl.view — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -35,43 +34,41 @@

Source code for cortex.webgl.view

-import six
-import os
-import glob
+import binascii
 import copy
-import json
-import time
-if six.PY2:  # python 2
-    from Queue import Queue
-    from ConfigParser import NoOptionError
-else:  # python 3
-    from queue import Queue
-    from configparser import NoOptionError
-import shutil
-import random
 import functools
-import binascii
+import glob
+import json
 import mimetypes
+import os
+import random
+import shutil
 import threading
+import time
 import warnings
 import webbrowser
+from configparser import NoOptionError
+
+# Now assumes python 3
+from queue import Queue
+
 import numpy as np
 from tornado import web
 
-from .FallbackLoader import FallbackLoader
-from .. import utils, options, volume, dataset
+from .. import dataset, options, utils, volume
 from ..database import db
 from . import serve
 from .data import Package
+from .FallbackLoader import FallbackLoader
 
 try:
     cmapdir = options.config.get('webgl', 'colormaps')
     if not os.path.exists(cmapdir):
-        raise Exception("Colormap directory (%s) does not exits"%cmapdir)
+        raise Exception("Colormap directory (%s) does not exist"%cmapdir)
 except NoOptionError:
     cmapdir = os.path.join(options.config.get("basic", "filestore"), "colormaps")
     if not os.path.exists(cmapdir):
-        raise Exception("Colormap directory was not defined in the config file and the default (%s) does not exits"%cmapdir)
+        raise Exception("Colormap directory was not defined in the config file and the default (%s) does not exist"%cmapdir)
 
 domain_name = options.config.get("webgl", "domain_name")
 
@@ -79,13 +76,15 @@ 

Source code for cortex.webgl.view

 colormaps = [(os.path.splitext(os.path.split(cm)[1])[0], serve.make_base64(cm))
              for cm in sorted(colormaps)]
 
-
[docs]def make_static(outpath, data, types=("inflated",), recache=False, cmap="RdBu_r", +
+[docs] +def make_static(outpath, data, types=("inflated",), recache=False, cmap="RdBu_r", template="static.html", layout=None, anonymize=False, overlays_available=None, html_embed=True, overlays_visible=('rois', 'sulci'), labels_visible=('rois', ), overlay_file=None, copy_ctmfiles=True, title='Brain', **kwargs): - """ + """ Creates a static webGL MRI viewer in your filesystem so that it can easily - be posted publically for sharing or just saved for later viewing. + be posted publicly for sharing or just saved for later viewing. Parameters ---------- @@ -104,7 +103,7 @@

Source code for cortex.webgl.view

         Whether to rename CTM and SVG files generically, for public distribution.
         Default False
     overlays_available : tuple, optional
-        Overlays availble in the viewer. If None, then all overlay layers of the
+        Overlays available in the viewer. If None, then all overlay layers of the
         svg file will be potentially available in the viewer (whether initially
         visible or not). This provides the option to include, e.g., only a subset
         of layers for a given static viewer.
@@ -141,6 +140,10 @@ 

Source code for cortex.webgl.view

     title : str, optional
         The title that is displayed on the viewer website when it is loaded in
         a browser.
+    layout : None or list of (int, int)
+        The layout of the viewer subwindows for showing multiple subjects, passed to
+        the template generator. 
+        Default to None, corresponding to no subwindows.
 
     Notes
     -----
@@ -172,8 +175,6 @@ 

Source code for cortex.webgl.view

     package.reorder(ctms)
 
     db.auxfile = None
-    if layout is None:
-        layout = [None, (1, 1), (2, 1), (3, 1), (2, 2), (3, 2), (3, 2), (3, 3), (3, 3), (3, 3)][len(subjects)]
 
     ## Rename files to anonymize
     submap = dict()
@@ -272,12 +273,19 @@ 

Source code for cortex.webgl.view

             htmlfile.write(html)
-
[docs]def show(data, types=("inflated", ), recache=False, cmap='RdBu_r', layout=None, + +
+[docs] +def show(data, types=("inflated", ), recache=False, cmap='RdBu_r', layout=None, autoclose=None, open_browser=None, port=None, pickerfun=None, template="mixer.html", overlays_available=None, overlays_visible=('rois', 'sulci'), labels_visible=('rois', ), - overlay_file=None, title='Brain', **kwargs): - """ + overlay_file=None, + curvature_brightness=None, + curvature_smoothness=None, + curvature_contrast=None, + title='Brain', **kwargs): + """ Creates a webGL MRI viewer that is dynamically served by a tornado server running inside the current python process. @@ -297,7 +305,7 @@

Source code for cortex.webgl.view

     port : int or None, optional
         The port that will be used by the server. If None, a random port will be
         selected from the range 1024-65536. Default None
-    pickerfun : funcion or None, optional
+    pickerfun : function or None, optional
         Should be a function that takes two arguments, a voxel index and a vertex
         index. Is called whenever a location on the surface is clicked in the
         viewer. This can be used to print information about individual voxels or
@@ -328,12 +336,22 @@ 

Source code for cortex.webgl.view

     overlay_file : str or None, optional
         Custom overlays.svg file to use instead of the default one for this
         subject (if not None). Default None.
+    curvature_brightness : float or None, optional
+        Brightness of curvature overlay. Default None, which uses the value
+        specified in the config file.
+    curvature_smoothness : float or None, optional
+        Smoothness of curvature overlay. Default None, which uses the value
+        specified in the config file.
+    curvature_contrast : float or None, optional
+        Contrast of curvature overlay. Default None, which uses the value
+        specified in the config file.
     title : str, optional
         The title that is displayed on the viewer website when it is loaded in
         a browser.
-    layout : (int, int), optional
-        The layout of the viewer subwindows for showing multiple subjects.
-        Default None, which selects the layout based on the number of subjects.
+    layout : None or list of (int, int), optional
+        The layout of the viewer subwindows for showing multiple subjects, passed to
+        the template generator.
+        Default None, corresponding to no subwindows.
     """
 
     # populate default webshow args
@@ -370,8 +388,6 @@ 

Source code for cortex.webgl.view

     subjectjs = json.dumps(dict((subj, "ctm/%s/"%subj) for subj in subjects))
     db.auxfile = None
 
-    if layout is None:
-        layout = [None, (1, 1), (2, 1), (3, 1), (2, 2), (3, 2), (3, 2), (3, 3), (3, 3), (3, 3)][len(subjects)]
 
     linear = lambda x, y, m: (1.-m)*x + m*y
     mixes = dict(
@@ -386,9 +402,12 @@ 

Source code for cortex.webgl.view

     my_viewopts = dict(options.config.items('webgl_viewopts'))
     my_viewopts['overlays_visible'] = overlays_visible
     my_viewopts['labels_visible'] = labels_visible
-    my_viewopts['brightness'] = options.config.get('curvature', 'brightness')
-    my_viewopts['smoothness'] = options.config.get('curvature', 'webgl_smooth')
-    my_viewopts['contrast'] = options.config.get('curvature', 'contrast')
+    my_viewopts['brightness'] = options.config.get('curvature', 'brightness') \
+        if curvature_brightness is None else curvature_brightness
+    my_viewopts['smoothness'] = options.config.get('curvature', 'webgl_smooth') \
+        if curvature_smoothness is None else curvature_smoothness
+    my_viewopts['contrast'] = options.config.get('curvature', 'contrast') \
+        if curvature_contrast is None else curvature_contrast
 
     for sec in options.config.sections():
         if 'paths' in sec or 'labels' in sec:
@@ -492,7 +511,7 @@ 

Source code for cortex.webgl.view

     class JSMixer(serve.JSProxy):
         @property
         def view_props(self):
-            """An enumerated list of settable properties for views. 
+            """An enumerated list of settable properties for views. 
             There may be a way to get this from the javascript object, 
             but I (ML) don't know how.
 
@@ -504,10 +523,11 @@ 

Source code for cortex.webgl.view

                 'visL', 'visR', 'alpha', 'rotationR', 'rotationL', 'projection',
                 'volume_vis', 'frame', 'slices']
             """
-
-            _camera_props = ['camera.%s'%k for k in self.ui.camera._controls.attrs.keys()]
-            _subject = list(self.ui.surface._folders.attrs.keys())[0]
-            _surface = getattr(self.ui.surface, _subject)
+            camera = getattr(self.ui, "camera")
+            _camera_props = ['camera.%s' % k for k in camera._controls.attrs.keys()]
+            surface = getattr(self.ui, "surface")
+            _subject = list(surface._folders.attrs.keys())[0]
+            _surface = getattr(surface, _subject)
             _surface_props = ['surface.{subject}.%s'%k for k in _surface._controls.attrs.keys()]
             _curvature_props = ['surface.{subject}.curvature.brightness',
                                 'surface.{subject}.curvature.contrast',
@@ -515,14 +535,15 @@ 

Source code for cortex.webgl.view

             return _camera_props + _surface_props + _curvature_props
 
         def _set_view(self, **kwargs):
-            """Low-level command: sets view parameters in the current viewer
+            """Low-level command: sets view parameters in the current viewer
 
             Sets each the state of each keyword argument provided. View parameters
             that can be set include all parameters in the data.gui in the html view.
 
             """
             # Set unfolding level first, as it interacts with other arguments
-            subject_list = self.ui.surface._folders.attrs.keys()
+            surface = getattr(self.ui, "surface")
+            subject_list = surface._folders.attrs.keys()
             # Better to only self.view_props once; it interacts with javascript, 
             # don't want to do that too often, it leads to glitches.
             vw_props = copy.copy(self.view_props)
@@ -540,7 +561,7 @@ 

Source code for cortex.webgl.view

                         time.sleep(0.03)
 
         def _capture_view(self, frame_time=None):
-            """Low-level command: returns a dict of current view parameters
+            """Low-level command: returns a dict of current view parameters
 
             Retrieves the following view parameters from current viewer:
 
@@ -573,7 +594,7 @@ 

Source code for cortex.webgl.view

             return view
 
         def save_view(self, subject, name, is_overwrite=False):
-            """Saves current view parameters to pycortex database
+            """Saves current view parameters to pycortex database
 
             Parameters
             ----------
@@ -592,7 +613,7 @@ 

Source code for cortex.webgl.view

             db.save_view(self, subject, name, is_overwrite)
 
         def get_view(self, subject, name):
-            """Get saved view from pycortex database.
+            """Get saved view from pycortex database.
 
             Retrieves named view from pycortex database and sets current
             viewer parameters to retrieved values.
@@ -619,7 +640,7 @@ 

Source code for cortex.webgl.view

             return Proxy(metadata)
 
         def getImage(self, filename, size=(1920, 1080)):
-            """Saves currently displayed view to a .png image file
+            """Saves currently displayed view to a .png image file
 
             Parameters
             ----------
@@ -634,7 +655,7 @@ 

Source code for cortex.webgl.view

 
         def makeMovie(self, animation, filename="brainmovie%07d.png", offset=0,
                       fps=30, size=(1920, 1080), interpolation="linear"):
-            """Renders movie frames for animation of mesh movement
+            """Renders movie frames for animation of mesh movement
 
             Makes an animation (for example, a transition between inflated and
             flattened brain or a rotating brain) of a cortical surface. Takes a
@@ -717,7 +738,7 @@ 

Source code for cortex.webgl.view

                 self.getImage(filename%(i+offset), size=size)
 
         def _get_anim_seq(self, keyframes, fps=30, interpolation='linear'):
-            """Convert a list of keyframes to a list of EVERY frame in an animation.
+            """Convert a list of keyframes to a list of EVERY frame in an animation.
 
             Utility function called by make_movie; separated out so that individual
             frames of an animation can be re-rendered, or for more control over the
@@ -744,7 +765,7 @@ 

Source code for cortex.webgl.view

                 tdif = float(t1-t0)
                 # Check whether to continue frame sequence to endpoint
                 use_endpoint = keyframes[-1]==end
-                nvalues = np.round(tdif/fs).astype(np.int)
+                nvalues = np.round(tdif/fs).astype(int)
                 if use_endpoint:
                     nvalues += 1
                 fr_time = np.linspace(0, 1, nvalues, endpoint=use_endpoint)
@@ -754,7 +775,7 @@ 

Source code for cortex.webgl.view

                     for prop in start.keys():
                         if prop=='time':
                             continue
-                        if (start[prop] is None) or (start[prop] == end[prop]) or isinstance(start[prop], (bool,) + six.string_types):
+                        if (start[prop] is None) or (start[prop] == end[prop]) or isinstance(start[prop], (bool, str)):
                             frame[prop] = start[prop]
                             continue
                         val = func(a(start[prop]), a(end[prop]), t)
@@ -768,7 +789,7 @@ 

Source code for cortex.webgl.view

         def make_movie_views(self, animation, filename="brainmovie%07d.png", 
             offset=0, fps=30, size=(1920, 1080), alpha=1, frame_sleep=0.05,
             frame_start=0, interpolation="linear"):
-            """Renders movie frames for animation of mesh movement
+            """Renders movie frames for animation of mesh movement
 
             Makes an animation (for example, a transition between inflated and
             flattened brain or a rotating brain) of a cortical surface. Takes a
@@ -863,11 +884,12 @@ 

Source code for cortex.webgl.view

         return client
     else:
         try:
-            from IPython.display import display, HTML
+            from IPython.display import HTML, display
             display(HTML('Open viewer: <a href="{0}" target="_blank">{0}</a>'.format(url)))
         except:
             pass
     return server
+
@@ -918,7 +940,7 @@

Related Topics

- - + + @@ -941,11 +963,11 @@

Quick search

diff --git a/_modules/cortex/xfm.html b/_modules/cortex/xfm.html index be20e0f6a..5a7aa3e63 100644 --- a/_modules/cortex/xfm.html +++ b/_modules/cortex/xfm.html @@ -1,28 +1,27 @@ - - + - cortex.xfm — pycortex 1.2.4 documentation - - - - - - - - - - + cortex.xfm — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -39,14 +38,18 @@

Source code for cortex.xfm

 """
 import os
 import numpy as np
-from six import string_types
+import subprocess
 
-
[docs]class Transform(object): - ''' +
+[docs] +class Transform(object): + ''' A standard affine transform. Typically holds a transform from anatomical magnet space to epi file space. ''' -
[docs] def __init__(self, xfm, reference): +
+[docs] + def __init__(self, xfm, reference): self.xfm = xfm self.reference = None @@ -63,6 +66,7 @@

Source code for cortex.xfm

             self.reference = reference
             self.shape = self.reference.shape[:3][::-1]
+ def __call__(self, pts): return np.dot(self.xfm, np.hstack([pts, np.ones((len(pts),1))]).T)[:3].T @@ -104,7 +108,7 @@

Source code for cortex.xfm

 
     @classmethod
     def from_fsl(cls, xfm, func_nii, anat_nii):
-        """Converts an fsl transform to a pycortex transform.
+        """Converts an fsl transform to a pycortex transform.
 
         Converts a transform computed using FSL's FLIRT to a transform ("xfm") object in pycortex.
         The transform must have been computed FROM the nifti volume specified in `func_nii` TO the
@@ -141,10 +145,10 @@ 

Source code for cortex.xfm

         inv = npl.inv
 
         # Load transform from text file, if string is provided
-        if isinstance(xfm, string_types):
+        if isinstance(xfm, str):
             with open(xfm, 'r') as fid:
                 L = fid.readlines()
-            xfm  = np.array([[np.float(s) for s in ll.split() if s] for ll in L])
+            xfm  = np.array([[np.float_(s) for s in ll.split() if s] for ll in L])
 
         # Internally, pycortex computes the OPPOSITE transform: from anatomical volume to functional volume.
         # Thus, assign anat to "infile" (starting point for transform)
@@ -160,8 +164,8 @@ 

Source code for cortex.xfm

             inIm = infile
 
         refIm = nibabel.load(reffile)
-        in_hdr = inIm.get_header()
-        ref_hdr = refIm.get_header()
+        in_hdr = inIm.header
+        ref_hdr = refIm.header
         # get_zooms gets the positive voxel sizes as returned in the header
         inspace = np.diag(in_hdr.get_zooms()[:3] + (1,))
         refspace = np.diag(ref_hdr.get_zooms()[:3] + (1,))
@@ -173,17 +177,17 @@ 

Source code for cortex.xfm

         if npl.det(ref_hdr.get_best_affine())>=0:
             refspace = np.dot(refspace, _x_flipper(ref_hdr.get_data_shape()[0]))
 
-        inAffine = inIm.get_affine()
+        inAffine = inIm.affine
 
         coord = np.dot(inv(refspace),np.dot(xfm,np.dot(inspace,inv(inAffine))))
         return cls(coord, refIm)
 
     def to_fsl(self, anat_nii, direction='func>anat'):
-        """Converts a pycortex transform to an FSL transform.
+        """Converts a pycortex transform to an FSL transform.
 
         Uses the stored "reference" file provided when the transform was created (usually
         a functional data or statistical volume) and the supplied anatomical file to
-        create an FSL transform. By default, returns the transform FROM the refernce volume
+        create an FSL transform. By default, returns the transform FROM the reference volume
         (usually the functional data volume) to the anatomical volume (`anat_nii` input).
 
         Parameters
@@ -213,8 +217,8 @@ 

Source code for cortex.xfm

             inIm = nibabel.load(infile)
         except AttributeError:
             inIm = infile
-        in_hdr = inIm.get_header()
-        ref_hdr = self.reference.get_header()
+        in_hdr = inIm.header
+        ref_hdr = self.reference.header
         # get_zooms gets the positive voxel sizes as returned in the header
         inspace = np.diag(in_hdr.get_zooms()[:3] + (1,))
         refspace = np.diag(ref_hdr.get_zooms()[:3] + (1,))
@@ -228,7 +232,7 @@ 

Source code for cortex.xfm

             print("Determinant is > 0: FLIPPING!")
             refspace = np.dot(refspace, _x_flipper(ref_hdr.get_data_shape()[0]))
 
-        inAffine = inIm.get_affine()
+        inAffine = inIm.affine
 
         fslx = np.dot(refspace,np.dot(self.xfm,np.dot(inAffine,inv(inspace))))
         if direction=='func>anat':
@@ -238,7 +242,7 @@ 

Source code for cortex.xfm

 
     @classmethod
     def from_freesurfer(cls, fs_register, func_nii, subject, freesurfer_subject_dir=None):
-        """Converts a FreeSurfer transform to a pycortex transform.
+        """Converts a FreeSurfer transform to a pycortex transform.
 
         Converts a transform computed using FreeSurfer alignment tools (e.g., bbregister) to
         a transform ("xfm") object in pycortex. The transform must have been computed
@@ -280,11 +284,10 @@ 

Source code for cortex.xfm

         inv = npl.inv
 
         # Load anatomical to functional transform from register.dat file, if string is provided
-        if isinstance(fs_register, string_types):
+        if isinstance(fs_register, str):
             with open(fs_register, 'r') as fid:
                 L = fid.readlines()
-
-            anat2func = np.array([[np.float(s) for s in ll.split() if s] for ll in L[4:8]])
+            anat2func = np.array([[np.float_(s) for s in ll.split() if s] for ll in L[4:8]])
         else:
             anat2func = fs_register
 
@@ -299,34 +302,16 @@ 

Source code for cortex.xfm

         try:
             cmd = ('mri_info', '--vox2ras', anat_mgz)
             L = decode(subprocess.check_output(cmd)).splitlines()
-            anat_vox2ras = np.array([[np.float(s) for s in ll.split() if s] for ll in L])
+            anat_vox2ras = np.array([[np.float_(s) for s in ll.split() if s] for ll in L])
         except OSError:
-            print ("Error occured while executing:\n{}".format(' '.join(cmd)))
+            print ("Error occurred while executing:\n{}".format(' '.join(cmd)))
             raise
 
-        # Read tkrvox2ras transform for the  anatomical volume
-        try:
-            cmd = ('mri_info', '--vox2ras-tkr', anat_mgz)
-            L = decode(subprocess.check_output(cmd)).splitlines()
-            anat_tkrvox2ras = np.array([[np.float(s) for s in ll.split() if s] for ll in L])
-        except OSError:
-            print ("Error occured while executing:\n{}".format(' '.join(cmd)))
-            raise
+        # Read tkrvox2ras transform for the anatomical volume
+        anat_tkrvox2ras = _vox2ras_tkr(anat_mgz)
 
         # Read tkvox2ras transform for the functional volume
-        try:
-            cmd = ('mri_info', '--vox2ras-tkr', func_nii)
-            L = decode(subprocess.check_output(cmd)).splitlines()
-            # The [1:] index skips a first line that is present only if an error occurs
-            # or some info is missing when the transform is created - i.e.
-            # not in all cases, just in the case that the transform is 
-            # created exactly as it is now. 
-            if len(L) == 5:
-                L = L[1:]
-            func_tkrvox2ras = np.array([[np.float(s) for s in ll.split() if s] for ll in L])
-        except OSError:
-            print ("Error occured while executing:\n{}".format(' '.join(cmd)))
-            raise
+        func_tkrvox2ras = _vox2ras_tkr(func_nii)
 
         # Calculate pycorex transform (i.e. scanner to functional transform)
         coord = np.dot(inv(func_tkrvox2ras), np.dot(anat2func, np.dot(anat_tkrvox2ras, inv(anat_vox2ras))))
@@ -338,8 +323,9 @@ 

Source code for cortex.xfm

 
         return cls(coord, refIm)
 
+
     def to_freesurfer(self, fs_register, subject, freesurfer_subject_dir=None):
-        """Converts a pycortex transform to a FreeSurfer transform.
+        """Converts a pycortex transform to a FreeSurfer transform.
 
         Converts a transform stored in pycortex xfm object to the FreeSurfer format
         (i.e., register.dat format: https://surfer.nmr.mgh.harvard.edu/fswiki/RegisterDat)
@@ -371,31 +357,10 @@ 

Source code for cortex.xfm

         anat_vox2ras = anat.affine
 
         # Read tkrvox2ras transform for the  anatomical volume
-        try:
-            cmd = ('mri_info', '--vox2ras-tkr', anat.get_filename())
-            L = decode(subprocess.check_output(cmd)).splitlines()
-            anat_tkrvox2ras = np.array([[np.float(s) for s in ll.split() if s] for ll in L])
-        except OSError:
-            print ("Error occured while executing:\n{}".format(' '.join(cmd)))
-            raise
+        anat_tkrvox2ras = _vox2ras_tkr(anat.get_filename())
 
         # Read tkvox2ras transform for the functional volume
-        try:
-            cmd = ('mri_info', '--vox2ras-tkr', self.reference.get_filename())
-            L = decode(subprocess.check_output(cmd)).splitlines()
-            # The [1:] index skips a first line that is present only if an error occurs
-            # or some info is missing when the transform is created - i.e.
-            # not in all cases, just in the case that the transform is 
-            # created exactly as it is now. 
-            if len(L) == 5:
-            	L = L[1:]
-            func_tkrvox2ras = np.array([[np.float(s) for s in ll.split() if s] for ll in L])
-        except OSError:
-            print ("Error occured while executing:\n{}".format(' '.join(cmd)))
-            raise
-        # Debugging code
-        #print('Shape of func_tkrvox2ras is: [SHOULD BE (4,4) !!]')
-        #print(func_tkrvox2ras.shape)
+        func_tkrvox2ras = _vox2ras_tkr(self.reference.get_filename())
 
         # Read voxel resolution of the functional volume
         func_voxres = self.reference.header.get_zooms()
@@ -403,9 +368,6 @@ 

Source code for cortex.xfm

         # Calculate FreeSurfer transform
         fs_anat2func = np.dot(func_tkrvox2ras, np.dot(self.xfm, np.dot(anat_vox2ras, inv(anat_tkrvox2ras))))
 
-        # Debugging code
-        #if not fs_anat2func.shape == (4, 4):
-        #    raise Exception("bad assumptions led to bad transformation matrix.")
         # Write out to `fs_register` in register.dat format
         with open(fs_register, 'w') as fid:
             fid.write('{}\n'.format(subject))
@@ -419,8 +381,9 @@ 

Source code for cortex.xfm

 
         return fs_anat2func
+ def isstr(obj): - """Check for stringy-ness in python 2.7 or 3""" + """Check for stringy-ness in python 2.7 or 3""" try: return isinstance(obj, basestring) except NameError: @@ -437,6 +400,32 @@

Source code for cortex.xfm

     flipr = np.diag([-1, 1, 1, 1])
     flipr[0,3] = N_i - 1
     return flipr
+
+
+def _vox2ras_tkr(image):
+    """Run `mri_info --vox2ras-tkr` on `image` and return a numpy array with the
+    output affine"""
+    try:
+        cmd = ('mri_info', '--vox2ras-tkr', image)
+        L = decode(subprocess.check_output(cmd)).splitlines()
+        # Skip headers/additional information. Example output of
+        # mri_info --vox2ras-tkr
+        #
+        # niiRead(): NIFTI_UNITS_UNKNOWN, assuming mm
+        #   -2.61900    0.00000    0.00000   81.18900
+        #    0.00000    0.00000    2.60000  -63.70000
+        #    0.00000   -2.61900    0.00000   87.73650
+        #    0.00000    0.00000    0.00000    1.00000
+        #
+        # Just take the last 4 lines because the length of the extra info is
+        # unpredictable.
+        L = L[-4:]
+        tkrvox2ras = np.array(
+            [[np.float_(s) for s in ll.split() if s] for ll in L])
+    except OSError as e:
+        print("Error occurred while executing:\n{}".format(' '.join(cmd)))
+        raise e
+    return tkrvox2ras
 
@@ -487,7 +476,7 @@

Related Topics

- - + + @@ -510,11 +499,11 @@

Quick search

diff --git a/_modules/index.html b/_modules/index.html index bb49115a7..54e10011b 100644 --- a/_modules/index.html +++ b/_modules/index.html @@ -1,28 +1,27 @@ - - + - Overview: module code — pycortex 1.2.4 documentation - - - - - - - - - - + Overview: module code — pycortex 1.2.8 documentation + + + + + + + + + + + - @@ -103,7 +102,7 @@

Related Topics

- - + + @@ -126,11 +125,11 @@

Quick search

diff --git a/_sources/align.rst.txt b/_sources/align.rst.txt index c2e42d948..06b4ad9bb 100644 --- a/_sources/align.rst.txt +++ b/_sources/align.rst.txt @@ -75,7 +75,7 @@ There's weird gray blobs - click anywhere to get rid of them. .. image:: ./aligner/snapshot2.png :width: 600 px -Here you see 4 different views, showing the saggital, coronal, and transverse slices, and also the three slices in 3D. +Here you see 4 different views, showing the sagittal, coronal, and transverse slices, and also the three slices in 3D. The background image is the reference image, and the mesh that you see is the surface that you will be aligning. You'll be moving the mesh until it's aligned as much as possible with the reference. @@ -105,7 +105,7 @@ You can also use the ``contrast`` and ``brightness`` sliders to adjust the color :width: 600 px The ``Outline color`` and ``Outline rep`` can be used to change the surface color, and the surface from a mesh (the default), to points only, to a solid surface. -Also, the sliders can be used to chane line and point weights. +Also, the sliders can be used to change line and point weights. Here, we changed it to a green points only representation, with smaller points. .. image:: ./aligner/surface.png diff --git a/_sources/auto_examples/datasets/index.rst.txt b/_sources/auto_examples/datasets/index.rst.txt new file mode 100644 index 000000000..ac0f7d189 --- /dev/null +++ b/_sources/auto_examples/datasets/index.rst.txt @@ -0,0 +1,170 @@ + + +.. _sphx_glr_auto_examples_datasets: + +Datasets Examples +------------------------------ + +Examples demonstrating how to create, manipulate, plot datasets. + + + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_dataset_arithmetic_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_dataset_arithmetic.py` + +.. raw:: html + +
Dataset Arithmetic
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume_to_vertex_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_volume_to_vertex.py` + +.. raw:: html + +
Map from Volume to Vertex Data
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_volume.py` + +.. raw:: html + +
Plot Volume Data
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertex_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_vertex.py` + +.. raw:: html + +
Plot Vertex Data
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertex2D_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_vertex2D.py` + +.. raw:: html + +
Plot 2D Vertex Data
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume2D_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_volume2D.py` + +.. raw:: html + +
Plot 2D Volume Data
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertexRGB_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_vertexRGB.py` + +.. raw:: html + +
Plot RGB Vertex Data
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volumeRGB_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_datasets_plot_volumeRGB.py` + +.. raw:: html + +
Plot RGB Volume Data
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/datasets/plot_dataset_arithmetic + /auto_examples/datasets/plot_volume_to_vertex + /auto_examples/datasets/plot_volume + /auto_examples/datasets/plot_vertex + /auto_examples/datasets/plot_vertex2D + /auto_examples/datasets/plot_volume2D + /auto_examples/datasets/plot_vertexRGB + /auto_examples/datasets/plot_volumeRGB + diff --git a/_sources/auto_examples/datasets/plot_dataset_arithmetic.rst.txt b/_sources/auto_examples/datasets/plot_dataset_arithmetic.rst.txt index e0a541614..afa1ae329 100644 --- a/_sources/auto_examples/datasets/plot_dataset_arithmetic.rst.txt +++ b/_sources/auto_examples/datasets/plot_dataset_arithmetic.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -60,23 +60,15 @@ normal arithmetic operators like +, -, *, /, and ** .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none Generating a flatmap cache - Failed to get connection - ** (inkscape:5116): CRITICAL **: 01:26:49.265: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5116): CRITICAL **: 01:26:49.265: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5116): CRITICAL **: 01:26:49.265: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5119): CRITICAL **: 01:26:50.304: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5119): CRITICAL **: 01:26:50.304: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5119): CRITICAL **: 01:26:50.304: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5122): CRITICAL **: 01:26:51.342: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5122): CRITICAL **: 01:26:51.342: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5122): CRITICAL **: 01:26:51.342: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -85,7 +77,7 @@ normal arithmetic operators like +, -, *, /, and ** | -.. code-block:: default +.. code-block:: Python import cortex @@ -119,28 +111,22 @@ normal arithmetic operators like +, -, *, /, and ** .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 18.572 seconds) + **Total running time of the script:** (0 minutes 14.861 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_dataset_arithmetic.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_dataset_arithmetic.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_dataset_arithmetic.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_dataset_arithmetic.ipynb ` + :download:`Download Python source code: plot_dataset_arithmetic.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/plot_vertex.rst.txt b/_sources/auto_examples/datasets/plot_vertex.rst.txt index 18370e858..b9bc3697f 100644 --- a/_sources/auto_examples/datasets/plot_vertex.rst.txt +++ b/_sources/auto_examples/datasets/plot_vertex.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -61,18 +61,12 @@ filled in with zeros. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5153): CRITICAL **: 01:27:09.888: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5153): CRITICAL **: 01:27:09.888: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5153): CRITICAL **: 01:27:09.888: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5156): CRITICAL **: 01:27:10.878: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5156): CRITICAL **: 01:27:10.878: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5156): CRITICAL **: 01:27:10.878: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -81,7 +75,7 @@ filled in with zeros. | -.. code-block:: default +.. code-block:: Python import cortex @@ -121,28 +115,22 @@ filled in with zeros. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 4.388 seconds) + **Total running time of the script:** (0 minutes 3.304 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_vertex.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_vertex.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_vertex.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_vertex.ipynb ` + :download:`Download Python source code: plot_vertex.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/plot_vertex2D.rst.txt b/_sources/auto_examples/datasets/plot_vertex2D.rst.txt index 2e77d0ebc..c95a57307 100644 --- a/_sources/auto_examples/datasets/plot_vertex2D.rst.txt +++ b/_sources/auto_examples/datasets/plot_vertex2D.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -28,7 +28,7 @@ subject in the pycortex filestore. The cortex.Vertex2D object is instantiated with two numpy arrays of the same size as the total number of vertices in that subject's flatmap. Each pixel is -colored according to both vlaues given for the nearest vertex in the flatmap. +colored according to both values given for the nearest vertex in the flatmap. Instead of random test data, you can replace these with any arrays that are the length of the all the vertices in the subject. @@ -45,14 +45,10 @@ the length of the all the vertices in the subject. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5161): CRITICAL **: 01:27:14.312: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5161): CRITICAL **: 01:27:14.312: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5161): CRITICAL **: 01:27:14.312: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -61,7 +57,7 @@ the length of the all the vertices in the subject. | -.. code-block:: default +.. code-block:: Python import cortex @@ -98,28 +94,22 @@ the length of the all the vertices in the subject. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 1.972 seconds) + **Total running time of the script:** (0 minutes 1.433 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_vertex2D.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_vertex2D.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_vertex2D.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_vertex2D.ipynb ` + :download:`Download Python source code: plot_vertex2D.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/plot_vertexRGB.rst.txt b/_sources/auto_examples/datasets/plot_vertexRGB.rst.txt index e8a98f9d1..7a8496c86 100644 --- a/_sources/auto_examples/datasets/plot_vertexRGB.rst.txt +++ b/_sources/auto_examples/datasets/plot_vertexRGB.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -46,14 +46,10 @@ use any cortex.Vertex objects in their place though. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5177): CRITICAL **: 01:27:22.876: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5177): CRITICAL **: 01:27:22.876: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5177): CRITICAL **: 01:27:22.876: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -62,7 +58,7 @@ use any cortex.Vertex objects in their place though. | -.. code-block:: default +.. code-block:: Python import cortex @@ -116,28 +112,22 @@ use any cortex.Vertex objects in their place though. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 1.988 seconds) + **Total running time of the script:** (0 minutes 1.425 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_vertexRGB.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_vertexRGB.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_vertexRGB.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_vertexRGB.ipynb ` + :download:`Download Python source code: plot_vertexRGB.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/plot_volume.rst.txt b/_sources/auto_examples/datasets/plot_volume.rst.txt index 936b7cac7..c646a9fca 100644 --- a/_sources/auto_examples/datasets/plot_volume.rst.txt +++ b/_sources/auto_examples/datasets/plot_volume.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -67,22 +67,14 @@ on the brain. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5140): CRITICAL **: 01:27:03.098: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5140): CRITICAL **: 01:27:03.098: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5140): CRITICAL **: 01:27:03.098: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5144): CRITICAL **: 01:27:04.129: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5144): CRITICAL **: 01:27:04.129: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5144): CRITICAL **: 01:27:04.129: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5147): CRITICAL **: 01:27:05.165: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5147): CRITICAL **: 01:27:05.165: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5147): CRITICAL **: 01:27:05.165: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -91,7 +83,7 @@ on the brain. | -.. code-block:: default +.. code-block:: Python import cortex @@ -126,28 +118,22 @@ on the brain. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 6.435 seconds) + **Total running time of the script:** (0 minutes 4.868 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_volume.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_volume.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_volume.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_volume.ipynb ` + :download:`Download Python source code: plot_volume.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/plot_volume2D.rst.txt b/_sources/auto_examples/datasets/plot_volume2D.rst.txt index 80579a828..131867439 100644 --- a/_sources/auto_examples/datasets/plot_volume2D.rst.txt +++ b/_sources/auto_examples/datasets/plot_volume2D.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -74,26 +74,14 @@ used in the last flatmap is .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /home/runner/work/pycortex/pycortex/cortex/quickflat/utils.py:497: UserWarning: Trying to register the cmap 'RdBu_covar' which already exists. - cm.register_cmap(dataview.cmap, cmap) - Failed to get connection - ** (inkscape:5164): CRITICAL **: 01:27:16.461: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5164): CRITICAL **: 01:27:16.461: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5164): CRITICAL **: 01:27:16.461: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - /home/runner/work/pycortex/pycortex/cortex/quickflat/utils.py:497: UserWarning: Trying to register the cmap 'RdBu_covar' which already exists. - cm.register_cmap(dataview.cmap, cmap) - Failed to get connection - ** (inkscape:5168): CRITICAL **: 01:27:17.574: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5168): CRITICAL **: 01:27:17.574: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5168): CRITICAL **: 01:27:17.574: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5171): CRITICAL **: 01:27:18.683: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5171): CRITICAL **: 01:27:18.683: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5171): CRITICAL **: 01:27:18.683: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -102,7 +90,7 @@ used in the last flatmap is | -.. code-block:: default +.. code-block:: Python import cortex @@ -142,28 +130,22 @@ used in the last flatmap is .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 6.264 seconds) + **Total running time of the script:** (0 minutes 4.602 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_volume2D.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_volume2D.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_volume2D.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_volume2D.ipynb ` + :download:`Download Python source code: plot_volume2D.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/plot_volumeRGB.rst.txt b/_sources/auto_examples/datasets/plot_volumeRGB.rst.txt index 930a153e0..155a8b836 100644 --- a/_sources/auto_examples/datasets/plot_volumeRGB.rst.txt +++ b/_sources/auto_examples/datasets/plot_volumeRGB.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -80,22 +80,14 @@ shared_vmax` will allow you to specify minimum and maximum values manually. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5180): CRITICAL **: 01:27:25.026: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5180): CRITICAL **: 01:27:25.026: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5180): CRITICAL **: 01:27:25.026: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5192): CRITICAL **: 01:27:31.612: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5192): CRITICAL **: 01:27:31.612: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5192): CRITICAL **: 01:27:31.612: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5202): CRITICAL **: 01:27:38.226: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5202): CRITICAL **: 01:27:38.227: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5202): CRITICAL **: 01:27:38.227: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -104,7 +96,7 @@ shared_vmax` will allow you to specify minimum and maximum values manually. | -.. code-block:: default +.. code-block:: Python import cortex @@ -167,28 +159,22 @@ shared_vmax` will allow you to specify minimum and maximum values manually. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 17.227 seconds) + **Total running time of the script:** (0 minutes 11.075 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_volumeRGB.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_volumeRGB.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_volumeRGB.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_volumeRGB.ipynb ` + :download:`Download Python source code: plot_volumeRGB.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/plot_volume_to_vertex.rst.txt b/_sources/auto_examples/datasets/plot_volume_to_vertex.rst.txt index fd1c04e3c..e19aeeb7a 100644 --- a/_sources/auto_examples/datasets/plot_volume_to_vertex.rst.txt +++ b/_sources/auto_examples/datasets/plot_volume_to_vertex.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -52,19 +52,13 @@ vertex mapping of that data. You can plot both of these as you normally would. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5131): CRITICAL **: 01:26:57.515: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5131): CRITICAL **: 01:26:57.515: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5131): CRITICAL **: 01:26:57.515: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) Generating a flatmap cache - Failed to get connection - ** (inkscape:5134): CRITICAL **: 01:26:59.615: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5134): CRITICAL **: 01:26:59.615: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5134): CRITICAL **: 01:26:59.615: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -73,7 +67,7 @@ vertex mapping of that data. You can plot both of these as you normally would. | -.. code-block:: default +.. code-block:: Python import cortex @@ -104,28 +98,22 @@ vertex mapping of that data. You can plot both of these as you normally would. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 7.047 seconds) + **Total running time of the script:** (0 minutes 5.438 seconds) .. _sphx_glr_download_auto_examples_datasets_plot_volume_to_vertex.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_volume_to_vertex.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_volume_to_vertex.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_volume_to_vertex.ipynb ` + :download:`Download Python source code: plot_volume_to_vertex.py ` .. only:: html diff --git a/_sources/auto_examples/datasets/sg_execution_times.rst.txt b/_sources/auto_examples/datasets/sg_execution_times.rst.txt index 940064ea3..d0932ae9e 100644 --- a/_sources/auto_examples/datasets/sg_execution_times.rst.txt +++ b/_sources/auto_examples/datasets/sg_execution_times.rst.txt @@ -3,24 +3,56 @@ .. _sphx_glr_auto_examples_datasets_sg_execution_times: + Computation times ================= -**01:03.893** total execution time for **auto_examples_datasets** files: - -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_dataset_arithmetic.py` (``plot_dataset_arithmetic.py``) | 00:18.572 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_volumeRGB.py` (``plot_volumeRGB.py``) | 00:17.227 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_volume_to_vertex.py` (``plot_volume_to_vertex.py``) | 00:07.047 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_volume.py` (``plot_volume.py``) | 00:06.435 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_volume2D.py` (``plot_volume2D.py``) | 00:06.264 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_vertex.py` (``plot_vertex.py``) | 00:04.388 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_vertexRGB.py` (``plot_vertexRGB.py``) | 00:01.988 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_datasets_plot_vertex2D.py` (``plot_vertex2D.py``) | 00:01.972 | 0.0 MB | -+----------------------------------------------------------------------------------------------------+-----------+--------+ +**00:47.006** total execution time for 8 files **from auto_examples/datasets**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_datasets_plot_dataset_arithmetic.py` (``plot_dataset_arithmetic.py``) + - 00:14.861 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volumeRGB.py` (``plot_volumeRGB.py``) + - 00:11.075 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volume_to_vertex.py` (``plot_volume_to_vertex.py``) + - 00:05.438 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volume.py` (``plot_volume.py``) + - 00:04.868 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volume2D.py` (``plot_volume2D.py``) + - 00:04.602 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_vertex.py` (``plot_vertex.py``) + - 00:03.304 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_vertex2D.py` (``plot_vertex2D.py``) + - 00:01.433 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_vertexRGB.py` (``plot_vertexRGB.py``) + - 00:01.425 + - 0.0 diff --git a/_sources/auto_examples/fsaverage/index.rst.txt b/_sources/auto_examples/fsaverage/index.rst.txt new file mode 100644 index 000000000..81a6e42b3 --- /dev/null +++ b/_sources/auto_examples/fsaverage/index.rst.txt @@ -0,0 +1,42 @@ + + +.. _sphx_glr_auto_examples_fsaverage: + +Examples with fsaverage +------------------------------ + +Examples showing how to use PyCortex to visualize data on fsaverage. + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/fsaverage/images/thumb/sphx_glr_upsample_to_fsaverage_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_fsaverage_upsample_to_fsaverage.py` + +.. raw:: html + +
Upsample data from a lower resolution fsaverage template to fsaverage for visualization
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/fsaverage/upsample_to_fsaverage + diff --git a/_sources/auto_examples/fsaverage/sg_execution_times.rst.txt b/_sources/auto_examples/fsaverage/sg_execution_times.rst.txt new file mode 100644 index 000000000..bd43cb0da --- /dev/null +++ b/_sources/auto_examples/fsaverage/sg_execution_times.rst.txt @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_auto_examples_fsaverage_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 1 file **from auto_examples/fsaverage**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_fsaverage_upsample_to_fsaverage.py` (``upsample_to_fsaverage.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/auto_examples/fsaverage/upsample_to_fsaverage.rst.txt b/_sources/auto_examples/fsaverage/upsample_to_fsaverage.rst.txt new file mode 100644 index 000000000..2c8156818 --- /dev/null +++ b/_sources/auto_examples/fsaverage/upsample_to_fsaverage.rst.txt @@ -0,0 +1,81 @@ + +.. DO NOT EDIT. +.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. +.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: +.. "auto_examples/fsaverage/upsample_to_fsaverage.py" +.. LINE NUMBERS ARE GIVEN BELOW. + +.. only:: html + + .. note:: + :class: sphx-glr-download-link-note + + :ref:`Go to the end ` + to download the full example code + +.. rst-class:: sphx-glr-example-title + +.. _sphx_glr_auto_examples_fsaverage_upsample_to_fsaverage.py: + + +=================== +Upsample data from a lower resolution fsaverage template to fsaverage for visualization +=================== + +This example shows how data in a lower resolution fsaverage template +(e.g., fsaverage5 or fsaverage6) can be upsampled to the high resolution fsaverage +template for visualization. + +.. GENERATED FROM PYTHON SOURCE LINES 10-37 + +.. code-block:: Python + + + import matplotlib.pyplot as plt + import numpy as np + + import cortex + + subject = "fsaverage" + + # First we check if the fsaverage template is already in the pycortex filestore. If not, + # we download the template from the web and add it to the filestore. + if subject not in cortex.db.subjects: + cortex.download_subject(subject) + + # Next we create some data on fsaverage5. Each hemisphere has 10242 vertices. + n_vertices_fsaverage5 = 10242 + data_fs5 = np.arange(1, n_vertices_fsaverage5 + 1) + # We concatenate the data to itself to create a vector of length 20484, corresponding to + # the two hemispheres together. + data_fs5 = np.concatenate((data_fs5, data_fs5)) + # Finally, we upsample the data to fsaverage. + data_fs7 = cortex.freesurfer.upsample_to_fsaverage(data_fs5, "fsaverage5") + + # Now that the data is in the fsaverage template, we can visualize it in PyCortex as any + # other vertex dataset. + vtx = cortex.Vertex(data_fs7, subject, vmin=0, vmax=n_vertices_fsaverage5, cmap="turbo") + cortex.quickshow(vtx, with_curvature=False, with_colorbar=False) + plt.show() + + +.. _sphx_glr_download_auto_examples_fsaverage_upsample_to_fsaverage.py: + +.. only:: html + + .. container:: sphx-glr-footer sphx-glr-footer-example + + .. container:: sphx-glr-download sphx-glr-download-jupyter + + :download:`Download Jupyter notebook: upsample_to_fsaverage.ipynb ` + + .. container:: sphx-glr-download sphx-glr-download-python + + :download:`Download Python source code: upsample_to_fsaverage.py ` + + +.. only:: html + + .. rst-class:: sphx-glr-signature + + `Gallery generated by Sphinx-Gallery `_ diff --git a/_sources/auto_examples/import_surface/import_fmriprep.rst.txt b/_sources/auto_examples/import_surface/import_fmriprep.rst.txt index 526a71af8..87a0f0510 100644 --- a/_sources/auto_examples/import_surface/import_fmriprep.rst.txt +++ b/_sources/auto_examples/import_surface/import_fmriprep.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -31,7 +31,7 @@ NB: `cortex.fmriprep` is a work-in-progress and cannot currently handle multiple .. GENERATED FROM PYTHON SOURCE LINES 13-36 -.. code-block:: default +.. code-block:: Python import cortex @@ -58,30 +58,19 @@ NB: `cortex.fmriprep` is a work-in-progress and cannot currently handle multiple cortex.webgl.show(ds) -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_import_surface_import_fmriprep.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: import_fmriprep.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: import_fmriprep.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: import_fmriprep.ipynb ` + :download:`Download Python source code: import_fmriprep.py ` .. only:: html diff --git a/_sources/auto_examples/import_surface/index.rst.txt b/_sources/auto_examples/import_surface/index.rst.txt new file mode 100644 index 000000000..ba9eebe77 --- /dev/null +++ b/_sources/auto_examples/import_surface/index.rst.txt @@ -0,0 +1,45 @@ + + +.. _sphx_glr_auto_examples_import_surface: + +Importing Surfaces Examples +------------------------------ + +Examples demonstrating how to import surfraces from other software (e.g. +FreeSurfer, fmriprep). + + + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/import_surface/images/thumb/sphx_glr_import_fmriprep_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_import_surface_import_fmriprep.py` + +.. raw:: html + +
Import fmriprep output
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/import_surface/import_fmriprep + diff --git a/_sources/auto_examples/import_surface/sg_execution_times.rst.txt b/_sources/auto_examples/import_surface/sg_execution_times.rst.txt new file mode 100644 index 000000000..1b120f1cb --- /dev/null +++ b/_sources/auto_examples/import_surface/sg_execution_times.rst.txt @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_auto_examples_import_surface_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 1 file **from auto_examples/import_surface**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_import_surface_import_fmriprep.py` (``import_fmriprep.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/auto_examples/index.rst.txt b/_sources/auto_examples/index.rst.txt index ea26267f4..cb5285cca 100644 --- a/_sources/auto_examples/index.rst.txt +++ b/_sources/auto_examples/index.rst.txt @@ -1,9 +1,5 @@ :orphan: - - -.. _sphx_glr_auto_examples: - .. _general_examples: Example Gallery @@ -14,13 +10,15 @@ Example Gallery :depth: 2 + .. raw:: html -
+
+.. raw:: html -.. _sphx_glr_auto_examples_datasets: +
Datasets Examples ------------------------------ @@ -30,180 +28,182 @@ Examples demonstrating how to create, manipulate, plot datasets. +.. raw:: html + +
+ + .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_dataset_arithmetic_thumb.png - :alt: Dataset Arithmetic + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_dataset_arithmetic_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_dataset_arithmetic.py` + :ref:`sphx_glr_auto_examples_datasets_plot_dataset_arithmetic.py` .. raw:: html +
Dataset Arithmetic
-.. toctree:: - :hidden: - - /auto_examples/datasets/plot_dataset_arithmetic - .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume_to_vertex_thumb.png - :alt: Map from Volume to Vertex Data + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume_to_vertex_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_volume_to_vertex.py` + :ref:`sphx_glr_auto_examples_datasets_plot_volume_to_vertex.py` .. raw:: html +
Map from Volume to Vertex Data
-.. toctree:: - :hidden: - - /auto_examples/datasets/plot_volume_to_vertex - .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume_thumb.png - :alt: Plot Volume Data + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_volume.py` + :ref:`sphx_glr_auto_examples_datasets_plot_volume.py` .. raw:: html +
Plot Volume Data
-.. toctree:: - :hidden: - - /auto_examples/datasets/plot_volume - .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertex_thumb.png - :alt: Plot Vertex Data + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertex_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_vertex.py` + :ref:`sphx_glr_auto_examples_datasets_plot_vertex.py` .. raw:: html +
Plot Vertex Data
-.. toctree:: - :hidden: - - /auto_examples/datasets/plot_vertex - .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertex2D_thumb.png - :alt: Plot 2D Vertex Data + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertex2D_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_vertex2D.py` + :ref:`sphx_glr_auto_examples_datasets_plot_vertex2D.py` .. raw:: html +
Plot 2D Vertex Data
-.. toctree:: - :hidden: - - /auto_examples/datasets/plot_vertex2D - .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume2D_thumb.png - :alt: Plot 2D Volume Data + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volume2D_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_volume2D.py` + :ref:`sphx_glr_auto_examples_datasets_plot_volume2D.py` .. raw:: html +
Plot 2D Volume Data
-.. toctree:: - :hidden: - - /auto_examples/datasets/plot_volume2D - .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertexRGB_thumb.png - :alt: Plot RGB Vertex Data + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_vertexRGB_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_vertexRGB.py` + :ref:`sphx_glr_auto_examples_datasets_plot_vertexRGB.py` .. raw:: html +
Plot RGB Vertex Data
-.. toctree:: - :hidden: - - /auto_examples/datasets/plot_vertexRGB - .. raw:: html
.. only:: html - .. figure:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volumeRGB_thumb.png - :alt: Plot RGB Volume Data + .. image:: /auto_examples/datasets/images/thumb/sphx_glr_plot_volumeRGB_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_datasets_plot_volumeRGB.py` + :ref:`sphx_glr_auto_examples_datasets_plot_volumeRGB.py` .. raw:: html +
Plot RGB Volume Data
-.. toctree:: - :hidden: +.. raw:: html + +
+ +Examples with fsaverage +------------------------------ + +Examples showing how to use PyCortex to visualize data on fsaverage. + - /auto_examples/datasets/plot_volumeRGB .. raw:: html -
+
+.. raw:: html + +
+ +.. only:: html -.. _sphx_glr_auto_examples_import_surface: + .. image:: /auto_examples/fsaverage/images/thumb/sphx_glr_upsample_to_fsaverage_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_fsaverage_upsample_to_fsaverage.py` + +.. raw:: html + +
Upsample data from a lower resolution fsaverage template to fsaverage for visualization
+
+ + +.. raw:: html + +
Importing Surfaces Examples ------------------------------ @@ -214,33 +214,31 @@ FreeSurfer, fmriprep). +.. raw:: html + +
+ + .. raw:: html
.. only:: html - .. figure:: /auto_examples/import_surface/images/thumb/sphx_glr_import_fmriprep_thumb.png - :alt: Import fmriprep output + .. image:: /auto_examples/import_surface/images/thumb/sphx_glr_import_fmriprep_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_import_surface_import_fmriprep.py` + :ref:`sphx_glr_auto_examples_import_surface_import_fmriprep.py` .. raw:: html +
Import fmriprep output
-.. toctree:: - :hidden: - - /auto_examples/import_surface/import_fmriprep .. raw:: html -
- - - -.. _sphx_glr_auto_examples_quickflat: +
Quickflat Examples ------------------------------ @@ -250,264 +248,218 @@ Examples demonstrating how to create flatmaps. +.. raw:: html + +
+ + .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_sulci_thumb.png - :alt: Plot sulci on the flatmap + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_sulci_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_sulci.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_sulci.py` .. raw:: html +
Plot sulci on the flatmap
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_sulci - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_dropout_thumb.png - :alt: Plot dropout regions on the flatmap + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_dropout_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_dropout.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_dropout.py` .. raw:: html +
Plot dropout regions on the flatmap
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_dropout - .. raw:: html -
+
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_svg_thumb.png - :alt: Save a 2D static flatmap as SVG + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_png_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_make_svg.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_make_png.py` .. raw:: html +
Save a 2D static flatmap as PNG
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_make_svg - .. raw:: html -
+
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_png_thumb.png - :alt: Save a 2D static flatmap as PNG + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_svg_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_make_png.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_make_svg.py` .. raw:: html +
Save a 2D static flatmap as SVG
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_make_png - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_cutouts_thumb.png - :alt: Plot cutouts on the flatmap + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_cutouts_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_cutouts.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_cutouts.py` .. raw:: html +
Plot cutouts on the flatmap
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_cutouts - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_rois_thumb.png - :alt: Plot ROIs on the flatmap + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_rois_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_rois.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_rois.py` .. raw:: html +
Plot ROIs on the flatmap
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_rois - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_connected_vertices_thumb.png - :alt: Plot which vertices are inside the same voxels + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_connected_vertices_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_connected_vertices.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_connected_vertices.py` .. raw:: html +
Plot which vertices are inside the same voxels
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_connected_vertices - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_gif_thumb.png - :alt: Animate a series of volumes as a GIF + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_gif_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_make_gif.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_make_gif.py` .. raw:: html +
Animate a series of volumes as a GIF
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_make_gif - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_thickness_nanmean_thumb.png - :alt: Ignore NaN (not-a-number) values in thickness mapping + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_thickness_nanmean_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_thickness_nanmean.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_thickness_nanmean.py` .. raw:: html +
Ignore NaN (not-a-number) values in thickness mapping
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_thickness_nanmean - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_zoom_to_roi_thumb.png - :alt: Plotting a zoomed view of one ROI + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_zoom_to_roi_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_zoom_to_roi.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_zoom_to_roi.py` .. raw:: html +
Plotting a zoomed view of one ROI
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_zoom_to_roi - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_figure_thumb.png - :alt: Plot a 2D static flatmap + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_figure_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_make_figure.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_make_figure.py` .. raw:: html +
Plot a 2D static flatmap
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_make_figure - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_advanced_compositing_thumb.png - :alt: Plot with advanced compositing + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_advanced_compositing_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickflat_plot_advanced_compositing.py` + :ref:`sphx_glr_auto_examples_quickflat_plot_advanced_compositing.py` .. raw:: html +
Plot with advanced compositing
-.. toctree:: - :hidden: - - /auto_examples/quickflat/plot_advanced_compositing .. raw:: html -
- - - -.. _sphx_glr_auto_examples_quickstart: +
Quickstart Examples ------------------------------ @@ -517,75 +469,65 @@ Examples demonstrating how to get started with pycortex. +.. raw:: html + +
+ + .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickstart/images/thumb/sphx_glr_retinotopy_webgl_thumb.png - :alt: Plot Example Retinotopy in Web Viewer + .. image:: /auto_examples/quickstart/images/thumb/sphx_glr_retinotopy_webgl_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickstart_retinotopy_webgl.py` + :ref:`sphx_glr_auto_examples_quickstart_retinotopy_webgl.py` .. raw:: html +
Plot Example Retinotopy in Web Viewer
-.. toctree:: - :hidden: - - /auto_examples/quickstart/retinotopy_webgl - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickstart/images/thumb/sphx_glr_show_config_thumb.png - :alt: Finding out where the config and filestore are + .. image:: /auto_examples/quickstart/images/thumb/sphx_glr_show_config_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickstart_show_config.py` + :ref:`sphx_glr_auto_examples_quickstart_show_config.py` .. raw:: html +
Finding out where the config and filestore are
-.. toctree:: - :hidden: - - /auto_examples/quickstart/show_config - .. raw:: html
.. only:: html - .. figure:: /auto_examples/quickstart/images/thumb/sphx_glr_plot_retinotopy_flatmap_thumb.png - :alt: Plot Example Retinotopy Flatmaps + .. image:: /auto_examples/quickstart/images/thumb/sphx_glr_plot_retinotopy_flatmap_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_quickstart_plot_retinotopy_flatmap.py` + :ref:`sphx_glr_auto_examples_quickstart_plot_retinotopy_flatmap.py` .. raw:: html +
Plot Example Retinotopy Flatmaps
-.. toctree:: - :hidden: - - /auto_examples/quickstart/plot_retinotopy_flatmap .. raw:: html -
- - - -.. _sphx_glr_auto_examples_surface_analyses: +
Surface Analysis Examples ------------------------------ @@ -595,138 +537,116 @@ Examples demonstrating operations and analyses done on brain surfaces. +.. raw:: html + +
+ + .. raw:: html
.. only:: html - .. figure:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_tissots_indicatrix_thumb.png - :alt: Tissot's Indicatrix + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_tissots_indicatrix_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_surface_analyses_plot_tissots_indicatrix.py` + :ref:`sphx_glr_auto_examples_surface_analyses_plot_tissots_indicatrix.py` .. raw:: html +
Tissot's Indicatrix
-.. toctree:: - :hidden: - - /auto_examples/surface_analyses/plot_tissots_indicatrix - .. raw:: html
.. only:: html - .. figure:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_geodesic_path_thumb.png - :alt: Plotting Geodesic Paths + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_geodesic_path_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_path.py` + :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_path.py` .. raw:: html +
Plotting Geodesic Paths
-.. toctree:: - :hidden: - - /auto_examples/surface_analyses/plot_geodesic_path - .. raw:: html
.. only:: html - .. figure:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_geodesic_distance_thumb.png - :alt: Plotting Geodesic Distances + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_geodesic_distance_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_distance.py` + :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_distance.py` .. raw:: html +
Plotting Geodesic Distances
-.. toctree:: - :hidden: - - /auto_examples/surface_analyses/plot_geodesic_distance - .. raw:: html
.. only:: html - .. figure:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_flatmap_distortion_thumb.png - :alt: Flatmap Distortion + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_flatmap_distortion_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_surface_analyses_plot_flatmap_distortion.py` + :ref:`sphx_glr_auto_examples_surface_analyses_plot_flatmap_distortion.py` .. raw:: html +
Flatmap Distortion
-.. toctree:: - :hidden: - - /auto_examples/surface_analyses/plot_flatmap_distortion - .. raw:: html
.. only:: html - .. figure:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_subsurfaces_thumb.png - :alt: Plot and Use Subsurface Tools + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_subsurfaces_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_surface_analyses_plot_subsurfaces.py` + :ref:`sphx_glr_auto_examples_surface_analyses_plot_subsurfaces.py` .. raw:: html +
Plot and Use Subsurface Tools
-.. toctree:: - :hidden: - - /auto_examples/surface_analyses/plot_subsurfaces - .. raw:: html
.. only:: html - .. figure:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_interpolate_data_thumb.png - :alt: Interpolate Data + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_interpolate_data_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_surface_analyses_plot_interpolate_data.py` + :ref:`sphx_glr_auto_examples_surface_analyses_plot_interpolate_data.py` .. raw:: html +
Interpolate Data
-.. toctree:: - :hidden: - - /auto_examples/surface_analyses/plot_interpolate_data .. raw:: html -
- - - -.. _sphx_glr_auto_examples_utils: +
Utility Examples ------------------------------ @@ -736,180 +656,150 @@ Examples demonstrating how to do all sorts of beautiful things using pycortex. +.. raw:: html + +
+ + .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_plot_get_roi_vertices_thumb.png - :alt: Get Vertices for an ROI + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_get_roi_vertices_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_plot_get_roi_vertices.py` + :ref:`sphx_glr_auto_examples_utils_plot_get_roi_vertices.py` .. raw:: html +
Get Vertices for an ROI
-.. toctree:: - :hidden: - - /auto_examples/utils/plot_get_roi_vertices - .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_plot_voxel_distance_from_surface_thumb.png - :alt: Voxel distance from surface + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_voxel_distance_from_surface_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_plot_voxel_distance_from_surface.py` + :ref:`sphx_glr_auto_examples_utils_plot_voxel_distance_from_surface.py` .. raw:: html +
Voxel distance from surface
-.. toctree:: - :hidden: - - /auto_examples/utils/plot_voxel_distance_from_surface - .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_plot_mosaic_thumb.png - :alt: Mosaic plot + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_mosaic_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_plot_mosaic.py` + :ref:`sphx_glr_auto_examples_utils_plot_mosaic.py` .. raw:: html +
Mosaic plot
-.. toctree:: - :hidden: - - /auto_examples/utils/plot_mosaic - .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_subject_to_mni_thumb.png - :alt: Transform from Subject to MNI Space + .. image:: /auto_examples/utils/images/thumb/sphx_glr_subject_to_mni_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_subject_to_mni.py` + :ref:`sphx_glr_auto_examples_utils_subject_to_mni.py` .. raw:: html +
Transform from Subject to MNI Space
-.. toctree:: - :hidden: - - /auto_examples/utils/subject_to_mni - .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_plot_roi_voxel_mask_thumb.png - :alt: Get ROI Voxel Mask + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_roi_voxel_mask_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_mask.py` + :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_mask.py` .. raw:: html +
Get ROI Voxel Mask
-.. toctree:: - :hidden: - - /auto_examples/utils/plot_roi_voxel_mask - .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_mni_to_subject_thumb.png - :alt: Transform from MNI to Subject Space + .. image:: /auto_examples/utils/images/thumb/sphx_glr_mni_to_subject_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_mni_to_subject.py` + :ref:`sphx_glr_auto_examples_utils_mni_to_subject.py` .. raw:: html +
Transform from MNI to Subject Space
-.. toctree:: - :hidden: - - /auto_examples/utils/mni_to_subject - .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_multi_panels_plots_thumb.png - :alt: Multi-panels figures + .. image:: /auto_examples/utils/images/thumb/sphx_glr_multi_panels_plots_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_multi_panels_plots.py` + :ref:`sphx_glr_auto_examples_utils_multi_panels_plots.py` .. raw:: html +
Multi-panels figures
-.. toctree:: - :hidden: - - /auto_examples/utils/multi_panels_plots - .. raw:: html
.. only:: html - .. figure:: /auto_examples/utils/images/thumb/sphx_glr_plot_roi_voxel_index_volume_thumb.png - :alt: Get ROI Index Volume + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_roi_voxel_index_volume_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_index_volume.py` + :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_index_volume.py` .. raw:: html +
Get ROI Index Volume
-.. toctree:: - :hidden: - - /auto_examples/utils/plot_roi_voxel_index_volume .. raw:: html -
- - - -.. _sphx_glr_auto_examples_webgl: +
WebGL Examples ------------------------------ @@ -919,131 +809,127 @@ Examples demonstrating how to make beautiful interactive 3-D viewers +.. raw:: html + +
+ + .. raw:: html
.. only:: html - .. figure:: /auto_examples/webgl/images/thumb/sphx_glr_single_dataset_thumb.png - :alt: Create a 3D WebGL Viewer + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_single_dataset_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_webgl_single_dataset.py` + :ref:`sphx_glr_auto_examples_webgl_single_dataset.py` .. raw:: html +
Create a 3D WebGL Viewer
-.. toctree:: - :hidden: - - /auto_examples/webgl/single_dataset - .. raw:: html
.. only:: html - .. figure:: /auto_examples/webgl/images/thumb/sphx_glr_static_thumb.png - :alt: Create a static viewer + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_static_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_webgl_static.py` + :ref:`sphx_glr_auto_examples_webgl_static.py` .. raw:: html +
Create a static viewer
-.. toctree:: - :hidden: - - /auto_examples/webgl/static - .. raw:: html
.. only:: html - .. figure:: /auto_examples/webgl/images/thumb/sphx_glr_dynamic_with_custom_template_thumb.png - :alt: Dynamic viewer with html template + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_dynamic_with_custom_template_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_webgl_dynamic_with_custom_template.py` + :ref:`sphx_glr_auto_examples_webgl_dynamic_with_custom_template.py` .. raw:: html +
Dynamic viewer with html template
-.. toctree:: - :hidden: - - /auto_examples/webgl/dynamic_with_custom_template - .. raw:: html
.. only:: html - .. figure:: /auto_examples/webgl/images/thumb/sphx_glr_static_with_custom_template_thumb.png - :alt: Static viewer with html template + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_static_with_custom_template_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_webgl_static_with_custom_template.py` + :ref:`sphx_glr_auto_examples_webgl_static_with_custom_template.py` .. raw:: html +
Static viewer with html template
-.. toctree:: - :hidden: - - /auto_examples/webgl/static_with_custom_template - .. raw:: html
.. only:: html - .. figure:: /auto_examples/webgl/images/thumb/sphx_glr_multiple_datasets_thumb.png - :alt: Create a 3D WebGL Viewer with Multiple Datasets + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_multiple_datasets_thumb.png + :alt: - :ref:`sphx_glr_auto_examples_webgl_multiple_datasets.py` + :ref:`sphx_glr_auto_examples_webgl_multiple_datasets.py` .. raw:: html +
Create a 3D WebGL Viewer with Multiple Datasets
-.. toctree:: - :hidden: - - /auto_examples/webgl/multiple_datasets .. raw:: html -
+
+.. toctree:: + :hidden: + :includehidden: -.. only :: html - .. container:: sphx-glr-footer - :class: sphx-glr-footer-gallery + /auto_examples/datasets/index.rst + /auto_examples/fsaverage/index.rst + /auto_examples/import_surface/index.rst + /auto_examples/quickflat/index.rst + /auto_examples/quickstart/index.rst + /auto_examples/surface_analyses/index.rst + /auto_examples/utils/index.rst + /auto_examples/webgl/index.rst - .. container:: sphx-glr-download sphx-glr-download-python +.. only:: html - :download:`Download all examples in Python source code: auto_examples_python.zip ` + .. container:: sphx-glr-footer sphx-glr-footer-gallery + .. container:: sphx-glr-download sphx-glr-download-python + :download:`Download all examples in Python source code: auto_examples_python.zip ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-jupyter - :download:`Download all examples in Jupyter notebooks: auto_examples_jupyter.zip ` + :download:`Download all examples in Jupyter notebooks: auto_examples_jupyter.zip ` .. only:: html diff --git a/_sources/auto_examples/quickflat/index.rst.txt b/_sources/auto_examples/quickflat/index.rst.txt new file mode 100644 index 000000000..2477d0ef9 --- /dev/null +++ b/_sources/auto_examples/quickflat/index.rst.txt @@ -0,0 +1,242 @@ + + +.. _sphx_glr_auto_examples_quickflat: + +Quickflat Examples +------------------------------ + +Examples demonstrating how to create flatmaps. + + + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_sulci_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_sulci.py` + +.. raw:: html + +
Plot sulci on the flatmap
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_dropout_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_dropout.py` + +.. raw:: html + +
Plot dropout regions on the flatmap
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_png_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_make_png.py` + +.. raw:: html + +
Save a 2D static flatmap as PNG
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_svg_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_make_svg.py` + +.. raw:: html + +
Save a 2D static flatmap as SVG
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_cutouts_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_cutouts.py` + +.. raw:: html + +
Plot cutouts on the flatmap
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_rois_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_rois.py` + +.. raw:: html + +
Plot ROIs on the flatmap
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_connected_vertices_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_connected_vertices.py` + +.. raw:: html + +
Plot which vertices are inside the same voxels
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_gif_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_make_gif.py` + +.. raw:: html + +
Animate a series of volumes as a GIF
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_thickness_nanmean_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_thickness_nanmean.py` + +.. raw:: html + +
Ignore NaN (not-a-number) values in thickness mapping
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_zoom_to_roi_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_zoom_to_roi.py` + +.. raw:: html + +
Plotting a zoomed view of one ROI
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_make_figure_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_make_figure.py` + +.. raw:: html + +
Plot a 2D static flatmap
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickflat/images/thumb/sphx_glr_plot_advanced_compositing_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickflat_plot_advanced_compositing.py` + +.. raw:: html + +
Plot with advanced compositing
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/quickflat/plot_sulci + /auto_examples/quickflat/plot_dropout + /auto_examples/quickflat/plot_make_png + /auto_examples/quickflat/plot_make_svg + /auto_examples/quickflat/plot_cutouts + /auto_examples/quickflat/plot_rois + /auto_examples/quickflat/plot_connected_vertices + /auto_examples/quickflat/plot_make_gif + /auto_examples/quickflat/plot_thickness_nanmean + /auto_examples/quickflat/plot_zoom_to_roi + /auto_examples/quickflat/plot_make_figure + /auto_examples/quickflat/plot_advanced_compositing + diff --git a/_sources/auto_examples/quickflat/plot_advanced_compositing.rst.txt b/_sources/auto_examples/quickflat/plot_advanced_compositing.rst.txt index a914b5323..f3d916b62 100644 --- a/_sources/auto_examples/quickflat/plot_advanced_compositing.rst.txt +++ b/_sources/auto_examples/quickflat/plot_advanced_compositing.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -40,22 +40,14 @@ quickflat.composite sub-module. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5421): CRITICAL **: 01:31:23.379: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5421): CRITICAL **: 01:31:23.379: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5421): CRITICAL **: 01:31:23.379: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5424): CRITICAL **: 01:31:24.128: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5424): CRITICAL **: 01:31:24.128: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5424): CRITICAL **: 01:31:24.128: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5427): CRITICAL **: 01:31:24.950: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5427): CRITICAL **: 01:31:24.950: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5427): CRITICAL **: 01:31:24.950: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -64,7 +56,7 @@ quickflat.composite sub-module. | -.. code-block:: default +.. code-block:: Python import cortex @@ -106,28 +98,22 @@ quickflat.composite sub-module. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 5.141 seconds) + **Total running time of the script:** (0 minutes 3.674 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_advanced_compositing.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_advanced_compositing.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_advanced_compositing.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_advanced_compositing.ipynb ` + :download:`Download Python source code: plot_advanced_compositing.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_connected_vertices.rst.txt b/_sources/auto_examples/quickflat/plot_connected_vertices.rst.txt index ba54c9b66..8ffc24f1d 100644 --- a/_sources/auto_examples/quickflat/plot_connected_vertices.rst.txt +++ b/_sources/auto_examples/quickflat/plot_connected_vertices.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -40,15 +40,11 @@ connecting lines. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none Generating a flatmap cache - Failed to get connection - ** (inkscape:5268): CRITICAL **: 01:28:18.292: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5268): CRITICAL **: 01:28:18.293: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5268): CRITICAL **: 01:28:18.293: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) Shared voxel array not found, generating... Caching mapper... @@ -59,7 +55,7 @@ connecting lines. | -.. code-block:: default +.. code-block:: Python import cortex import numpy as np @@ -81,28 +77,22 @@ connecting lines. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 2 minutes 3.094 seconds) + **Total running time of the script:** (1 minutes 6.515 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_connected_vertices.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_connected_vertices.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_connected_vertices.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_connected_vertices.ipynb ` + :download:`Download Python source code: plot_connected_vertices.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_cutouts.rst.txt b/_sources/auto_examples/quickflat/plot_cutouts.rst.txt index bb838042b..703b412d2 100644 --- a/_sources/auto_examples/quickflat/plot_cutouts.rst.txt +++ b/_sources/auto_examples/quickflat/plot_cutouts.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -43,18 +43,12 @@ name of the flatmap cutout defined in the `overlays.svg` file. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5248): CRITICAL **: 01:28:04.376: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5248): CRITICAL **: 01:28:04.376: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5248): CRITICAL **: 01:28:04.376: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5251): CRITICAL **: 01:28:05.243: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5251): CRITICAL **: 01:28:05.243: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5251): CRITICAL **: 01:28:05.243: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -63,7 +57,7 @@ name of the flatmap cutout defined in the `overlays.svg` file. | -.. code-block:: default +.. code-block:: Python import cortex import numpy as np @@ -84,28 +78,22 @@ name of the flatmap cutout defined in the `overlays.svg` file. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 2.057 seconds) + **Total running time of the script:** (0 minutes 1.811 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_cutouts.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_cutouts.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_cutouts.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_cutouts.ipynb ` + :download:`Download Python source code: plot_cutouts.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_dropout.rst.txt b/_sources/auto_examples/quickflat/plot_dropout.rst.txt index 565c1b2c5..03d88ea04 100644 --- a/_sources/auto_examples/quickflat/plot_dropout.rst.txt +++ b/_sources/auto_examples/quickflat/plot_dropout.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -49,14 +49,10 @@ of this using the following formula: .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5219): CRITICAL **: 01:27:52.316: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5219): CRITICAL **: 01:27:52.317: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5219): CRITICAL **: 01:27:52.317: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -65,7 +61,7 @@ of this using the following formula: | -.. code-block:: default +.. code-block:: Python import cortex @@ -84,28 +80,22 @@ of this using the following formula: .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 3.200 seconds) + **Total running time of the script:** (0 minutes 2.353 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_dropout.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_dropout.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_dropout.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_dropout.ipynb ` + :download:`Download Python source code: plot_dropout.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_make_figure.rst.txt b/_sources/auto_examples/quickflat/plot_make_figure.rst.txt index bbeaab476..1322a9c3c 100644 --- a/_sources/auto_examples/quickflat/plot_make_figure.rst.txt +++ b/_sources/auto_examples/quickflat/plot_make_figure.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -92,30 +92,18 @@ This can be helpful if you think there is no reason that the .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5402): CRITICAL **: 01:31:11.806: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5402): CRITICAL **: 01:31:11.806: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5402): CRITICAL **: 01:31:11.806: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5406): CRITICAL **: 01:31:12.783: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5406): CRITICAL **: 01:31:12.783: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5406): CRITICAL **: 01:31:12.783: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5409): CRITICAL **: 01:31:13.881: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5409): CRITICAL **: 01:31:13.881: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5409): CRITICAL **: 01:31:13.881: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5412): CRITICAL **: 01:31:14.979: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5412): CRITICAL **: 01:31:14.979: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5412): CRITICAL **: 01:31:14.979: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5415): CRITICAL **: 01:31:16.268: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5415): CRITICAL **: 01:31:16.269: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5415): CRITICAL **: 01:31:16.269: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -124,7 +112,7 @@ This can be helpful if you think there is no reason that the | -.. code-block:: default +.. code-block:: Python import cortex import matplotlib.pyplot as plt @@ -172,28 +160,22 @@ This can be helpful if you think there is no reason that the .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 11.182 seconds) + **Total running time of the script:** (0 minutes 8.499 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_make_figure.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_make_figure.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_make_figure.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_make_figure.ipynb ` + :download:`Download Python source code: plot_make_figure.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_make_gif.rst.txt b/_sources/auto_examples/quickflat/plot_make_gif.rst.txt index 4cafc0822..7d6ebe91e 100644 --- a/_sources/auto_examples/quickflat/plot_make_gif.rst.txt +++ b/_sources/auto_examples/quickflat/plot_make_gif.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -28,7 +28,7 @@ to make an animated gif in which each frame is a flatmap. .. GENERATED FROM PYTHON SOURCE LINES 11-16 -.. code-block:: default +.. code-block:: Python import cortex import matplotlib.pyplot as plt @@ -49,7 +49,7 @@ Create several pycortex Volumes .. GENERATED FROM PYTHON SOURCE LINES 19-23 -.. code-block:: default +.. code-block:: Python volumes = {'first': cortex.Volume.random(subject='S1', xfmname='fullhead', vmin=-2, vmax=2, cmap="RdBu_r"), @@ -69,7 +69,7 @@ Plot flat maps individually .. GENERATED FROM PYTHON SOURCE LINES 26-32 -.. code-block:: default +.. code-block:: Python _ = cortex.quickflat.make_figure(volumes['first'], colorbar_location="right") @@ -100,18 +100,12 @@ Plot flat maps individually .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5327): CRITICAL **: 01:30:14.896: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5327): CRITICAL **: 01:30:14.896: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5327): CRITICAL **: 01:30:14.896: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5332): CRITICAL **: 01:30:15.933: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5332): CRITICAL **: 01:30:15.933: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5332): CRITICAL **: 01:30:15.933: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -123,7 +117,7 @@ Generate an animated gif that switches between frames every 1.5 seconds .. GENERATED FROM PYTHON SOURCE LINES 35-39 -.. code-block:: default +.. code-block:: Python filename = "./flatmap_comparison.gif" @@ -135,18 +129,12 @@ Generate an animated gif that switches between frames every 1.5 seconds .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5337): CRITICAL **: 01:30:19.261: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5337): CRITICAL **: 01:30:19.261: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5337): CRITICAL **: 01:30:19.262: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5341): CRITICAL **: 01:30:21.048: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5341): CRITICAL **: 01:30:21.049: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5341): CRITICAL **: 01:30:21.049: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -158,7 +146,7 @@ Display gif inline in an IPython notebook .. GENERATED FROM PYTHON SOURCE LINES 42-52 -.. code-block:: default +.. code-block:: Python import io @@ -176,18 +164,12 @@ Display gif inline in an IPython notebook .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5347): CRITICAL **: 01:30:23.595: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5347): CRITICAL **: 01:30:23.595: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5347): CRITICAL **: 01:30:23.595: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5351): CRITICAL **: 01:30:25.381: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5351): CRITICAL **: 01:30:25.381: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5351): CRITICAL **: 01:30:25.381: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -200,28 +182,22 @@ Display gif inline in an IPython notebook .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 12.570 seconds) + **Total running time of the script:** (0 minutes 9.046 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_make_gif.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_make_gif.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_make_gif.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_make_gif.ipynb ` + :download:`Download Python source code: plot_make_gif.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_make_png.rst.txt b/_sources/auto_examples/quickflat/plot_make_png.rst.txt index efb68d7be..5325fdda3 100644 --- a/_sources/auto_examples/quickflat/plot_make_png.rst.txt +++ b/_sources/auto_examples/quickflat/plot_make_png.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -49,18 +49,12 @@ that use the parameter `bgcolor`. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5233): CRITICAL **: 01:27:59.628: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5233): CRITICAL **: 01:27:59.628: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5233): CRITICAL **: 01:27:59.628: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5238): CRITICAL **: 01:28:00.663: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5238): CRITICAL **: 01:28:00.663: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5238): CRITICAL **: 01:28:00.663: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -69,7 +63,7 @@ that use the parameter `bgcolor`. | -.. code-block:: default +.. code-block:: Python import cortex import matplotlib.pyplot as plt @@ -90,28 +84,22 @@ that use the parameter `bgcolor`. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 4.446 seconds) + **Total running time of the script:** (0 minutes 3.343 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_make_png.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_make_png.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_make_png.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_make_png.ipynb ` + :download:`Download Python source code: plot_make_png.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_make_svg.rst.txt b/_sources/auto_examples/quickflat/plot_make_svg.rst.txt index 13689d23a..c9a902ef1 100644 --- a/_sources/auto_examples/quickflat/plot_make_svg.rst.txt +++ b/_sources/auto_examples/quickflat/plot_make_svg.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -49,18 +49,12 @@ that use the parameter `bgcolor`. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5223): CRITICAL **: 01:27:55.257: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5223): CRITICAL **: 01:27:55.257: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5223): CRITICAL **: 01:27:55.257: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5226): CRITICAL **: 01:27:56.295: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5226): CRITICAL **: 01:27:56.295: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5226): CRITICAL **: 01:27:56.295: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -69,7 +63,7 @@ that use the parameter `bgcolor`. | -.. code-block:: default +.. code-block:: Python import cortex import matplotlib.pyplot as plt @@ -90,28 +84,22 @@ that use the parameter `bgcolor`. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 4.189 seconds) + **Total running time of the script:** (0 minutes 3.335 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_make_svg.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_make_svg.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_make_svg.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_make_svg.ipynb ` + :download:`Download Python source code: plot_make_svg.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_rois.rst.txt b/_sources/auto_examples/quickflat/plot_rois.rst.txt index e02da57df..67341e394 100644 --- a/_sources/auto_examples/quickflat/plot_rois.rst.txt +++ b/_sources/auto_examples/quickflat/plot_rois.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -62,18 +62,12 @@ By default, ROIs and ROI labels are displayed when a flatmap is plotted using .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5256): CRITICAL **: 01:28:06.354: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5256): CRITICAL **: 01:28:06.354: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5256): CRITICAL **: 01:28:06.354: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5260): CRITICAL **: 01:28:07.392: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5260): CRITICAL **: 01:28:07.392: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5260): CRITICAL **: 01:28:07.392: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -82,7 +76,7 @@ By default, ROIs and ROI labels are displayed when a flatmap is plotted using | -.. code-block:: default +.. code-block:: Python import cortex import numpy as np @@ -108,28 +102,22 @@ By default, ROIs and ROI labels are displayed when a flatmap is plotted using .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 5.128 seconds) + **Total running time of the script:** (0 minutes 3.855 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_rois.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_rois.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_rois.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_rois.ipynb ` + :download:`Download Python source code: plot_rois.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_sulci.rst.txt b/_sources/auto_examples/quickflat/plot_sulci.rst.txt index 5a5c9e16f..8ae029fe0 100644 --- a/_sources/auto_examples/quickflat/plot_sulci.rst.txt +++ b/_sources/auto_examples/quickflat/plot_sulci.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -40,21 +40,13 @@ displaying the sulci on the surface. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none Generating curvature surface info... - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - Failed to get connection - ** (inkscape:5209): CRITICAL **: 01:27:48.014: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5209): CRITICAL **: 01:27:48.014: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5209): CRITICAL **: 01:27:48.014: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5213): CRITICAL **: 01:27:48.884: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5213): CRITICAL **: 01:27:48.884: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5213): CRITICAL **: 01:27:48.884: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -63,7 +55,7 @@ displaying the sulci on the surface. | -.. code-block:: default +.. code-block:: Python import cortex import numpy as np @@ -81,28 +73,22 @@ displaying the sulci on the surface. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 9.313 seconds) + **Total running time of the script:** (0 minutes 7.101 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_sulci.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_sulci.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_sulci.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_sulci.ipynb ` + :download:`Download Python source code: plot_sulci.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_thickness_nanmean.rst.txt b/_sources/auto_examples/quickflat/plot_thickness_nanmean.rst.txt index d9397aa25..a540f3931 100644 --- a/_sources/auto_examples/quickflat/plot_thickness_nanmean.rst.txt +++ b/_sources/auto_examples/quickflat/plot_thickness_nanmean.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -55,18 +55,12 @@ has the value NaN. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5358): CRITICAL **: 01:30:27.787: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5358): CRITICAL **: 01:30:27.787: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5358): CRITICAL **: 01:30:27.787: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5361): CRITICAL **: 01:30:28.963: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5361): CRITICAL **: 01:30:28.963: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5361): CRITICAL **: 01:30:28.963: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -75,7 +69,7 @@ has the value NaN. | -.. code-block:: default +.. code-block:: Python import cortex @@ -109,28 +103,22 @@ has the value NaN. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 4.428 seconds) + **Total running time of the script:** (0 minutes 3.378 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_thickness_nanmean.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_thickness_nanmean.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_thickness_nanmean.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_thickness_nanmean.ipynb ` + :download:`Download Python source code: plot_thickness_nanmean.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/plot_zoom_to_roi.rst.txt b/_sources/auto_examples/quickflat/plot_zoom_to_roi.rst.txt index d4dbef349..03bc2e604 100644 --- a/_sources/auto_examples/quickflat/plot_zoom_to_roi.rst.txt +++ b/_sources/auto_examples/quickflat/plot_zoom_to_roi.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -50,19 +50,13 @@ show just the region around that ROI. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5375): CRITICAL **: 01:30:32.250: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5375): CRITICAL **: 01:30:32.251: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5375): CRITICAL **: 01:30:32.251: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) Generating a flatmap cache - Failed to get connection - ** (inkscape:5393): CRITICAL **: 01:31:05.967: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5393): CRITICAL **: 01:31:05.967: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5393): CRITICAL **: 01:31:05.967: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 3921 x 2048 pixels (192 dpi) @@ -71,7 +65,7 @@ show just the region around that ROI. | -.. code-block:: default +.. code-block:: Python # sphinx_gallery_thumbnail_number = 2 @@ -111,28 +105,22 @@ show just the region around that ROI. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 39.235 seconds) + **Total running time of the script:** (0 minutes 36.630 seconds) .. _sphx_glr_download_auto_examples_quickflat_plot_zoom_to_roi.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_zoom_to_roi.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_zoom_to_roi.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_zoom_to_roi.ipynb ` + :download:`Download Python source code: plot_zoom_to_roi.py ` .. only:: html diff --git a/_sources/auto_examples/quickflat/sg_execution_times.rst.txt b/_sources/auto_examples/quickflat/sg_execution_times.rst.txt index 17743c8d8..77a5d623d 100644 --- a/_sources/auto_examples/quickflat/sg_execution_times.rst.txt +++ b/_sources/auto_examples/quickflat/sg_execution_times.rst.txt @@ -3,32 +3,68 @@ .. _sphx_glr_auto_examples_quickflat_sg_execution_times: + Computation times ================= -**03:43.983** total execution time for **auto_examples_quickflat** files: - -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_connected_vertices.py` (``plot_connected_vertices.py``) | 02:03.094 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_zoom_to_roi.py` (``plot_zoom_to_roi.py``) | 00:39.235 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_make_gif.py` (``plot_make_gif.py``) | 00:12.570 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_make_figure.py` (``plot_make_figure.py``) | 00:11.182 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_sulci.py` (``plot_sulci.py``) | 00:09.313 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_advanced_compositing.py` (``plot_advanced_compositing.py``) | 00:05.141 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_rois.py` (``plot_rois.py``) | 00:05.128 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_make_png.py` (``plot_make_png.py``) | 00:04.446 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_thickness_nanmean.py` (``plot_thickness_nanmean.py``) | 00:04.428 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_make_svg.py` (``plot_make_svg.py``) | 00:04.189 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_dropout.py` (``plot_dropout.py``) | 00:03.200 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickflat_plot_cutouts.py` (``plot_cutouts.py``) | 00:02.057 | 0.0 MB | -+---------------------------------------------------------------------------------------------------------+-----------+--------+ +**02:29.541** total execution time for 12 files **from auto_examples/quickflat**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_quickflat_plot_connected_vertices.py` (``plot_connected_vertices.py``) + - 01:06.515 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_zoom_to_roi.py` (``plot_zoom_to_roi.py``) + - 00:36.630 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_gif.py` (``plot_make_gif.py``) + - 00:09.046 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_figure.py` (``plot_make_figure.py``) + - 00:08.499 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_sulci.py` (``plot_sulci.py``) + - 00:07.101 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_rois.py` (``plot_rois.py``) + - 00:03.855 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_advanced_compositing.py` (``plot_advanced_compositing.py``) + - 00:03.674 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_thickness_nanmean.py` (``plot_thickness_nanmean.py``) + - 00:03.378 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_png.py` (``plot_make_png.py``) + - 00:03.343 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_svg.py` (``plot_make_svg.py``) + - 00:03.335 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_dropout.py` (``plot_dropout.py``) + - 00:02.353 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_cutouts.py` (``plot_cutouts.py``) + - 00:01.811 + - 0.0 diff --git a/_sources/auto_examples/quickstart/index.rst.txt b/_sources/auto_examples/quickstart/index.rst.txt new file mode 100644 index 000000000..79ae82302 --- /dev/null +++ b/_sources/auto_examples/quickstart/index.rst.txt @@ -0,0 +1,80 @@ + + +.. _sphx_glr_auto_examples_quickstart: + +Quickstart Examples +------------------------------ + +Examples demonstrating how to get started with pycortex. + + + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickstart/images/thumb/sphx_glr_retinotopy_webgl_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickstart_retinotopy_webgl.py` + +.. raw:: html + +
Plot Example Retinotopy in Web Viewer
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickstart/images/thumb/sphx_glr_show_config_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickstart_show_config.py` + +.. raw:: html + +
Finding out where the config and filestore are
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/quickstart/images/thumb/sphx_glr_plot_retinotopy_flatmap_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_quickstart_plot_retinotopy_flatmap.py` + +.. raw:: html + +
Plot Example Retinotopy Flatmaps
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/quickstart/retinotopy_webgl + /auto_examples/quickstart/show_config + /auto_examples/quickstart/plot_retinotopy_flatmap + diff --git a/_sources/auto_examples/quickstart/plot_retinotopy_flatmap.rst.txt b/_sources/auto_examples/quickstart/plot_retinotopy_flatmap.rst.txt index 564192d45..c536dddb8 100644 --- a/_sources/auto_examples/quickstart/plot_retinotopy_flatmap.rst.txt +++ b/_sources/auto_examples/quickstart/plot_retinotopy_flatmap.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -28,13 +28,13 @@ dataset_, but that can also be done automatically through the `urllib` command that is included. -.. _dataset: http://gallantlab.org/pycortex/S1_retinotopy.hdf +.. _dataset: https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf S1 is the example subject that comes with pycortex, but if you want to plot data onto a different subject, you will need to have them in your filestore, and you will also need a flatmap for them. -.. GENERATED FROM PYTHON SOURCE LINES 18-46 +.. GENERATED FROM PYTHON SOURCE LINES 18-44 @@ -58,19 +58,13 @@ and you will also need a flatmap for them. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none Mask not found, generating... - Failed to get connection - ** (inkscape:5434): CRITICAL **: 01:31:30.199: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5434): CRITICAL **: 01:31:30.199: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5434): CRITICAL **: 01:31:30.200: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5438): CRITICAL **: 01:31:31.326: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5438): CRITICAL **: 01:31:31.326: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5438): CRITICAL **: 01:31:31.326: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -79,20 +73,18 @@ and you will also need a flatmap for them. | -.. code-block:: default +.. code-block:: Python - import six import cortex import matplotlib.pyplot as plt - if six.PY2: - from urllib import urlretrieve - elif six.PY3: - from urllib.request import urlretrieve + from urllib.request import urlretrieve # Download the dataset and load it - _ = urlretrieve("http://gallantlab.org/pycortex/S1_retinotopy.hdf", - "S1_retinotopy.hdf") + _ = urlretrieve( + "https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf", + "S1_retinotopy.hdf" + ) ret_data = cortex.load("S1_retinotopy.hdf") # The retinotopy data has to be divided into left and right hemispheres @@ -113,28 +105,22 @@ and you will also need a flatmap for them. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 6.018 seconds) + **Total running time of the script:** (0 minutes 5.836 seconds) .. _sphx_glr_download_auto_examples_quickstart_plot_retinotopy_flatmap.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_retinotopy_flatmap.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_retinotopy_flatmap.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_retinotopy_flatmap.ipynb ` + :download:`Download Python source code: plot_retinotopy_flatmap.py ` .. only:: html diff --git a/_sources/auto_examples/quickstart/retinotopy_webgl.rst.txt b/_sources/auto_examples/quickstart/retinotopy_webgl.rst.txt index 489f6e55d..0e166adff 100644 --- a/_sources/auto_examples/quickstart/retinotopy_webgl.rst.txt +++ b/_sources/auto_examples/quickstart/retinotopy_webgl.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -27,7 +27,7 @@ in a web viewer. In order for this demo to work, you need to download this dataset_, but that can also be done automatically through the `urllib` command that is included. -.. _dataset: http://gallantlab.org/pycortex/S1_retinotopy.hdf +.. _dataset: https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf S1 is the example subject that comes with pycortex, but if you want to plot data onto a different subject, you will need to have them in your filestore. @@ -37,51 +37,39 @@ yourself you will get a viewer showing something like the following. .. image:: ../../webgl/angle_left.png -.. GENERATED FROM PYTHON SOURCE LINES 22-37 +.. GENERATED FROM PYTHON SOURCE LINES 22-36 -.. code-block:: default +.. code-block:: Python import cortex - try: # python 2 - from urllib import urlretrieve - except ImportError: # python 3 - from urllib.request import urlretrieve + from urllib.request import urlretrieve # Download and load in retinotopy data - _ = urlretrieve("http://gallantlab.org/pycortex/S1_retinotopy.hdf", - "S1_retinotopy.hdf") + _ = urlretrieve( + "https://s3.us-west-1.wasabisys.com/glab-public-datasets/S1_retinotopy.hdf", + "S1_retinotopy.hdf" + ) ret_data = cortex.load("S1_retinotopy.hdf") # Open the webviewer cortex.webshow(ret_data) -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_quickstart_retinotopy_webgl.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: retinotopy_webgl.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: retinotopy_webgl.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: retinotopy_webgl.ipynb ` + :download:`Download Python source code: retinotopy_webgl.py ` .. only:: html diff --git a/_sources/auto_examples/quickstart/sg_execution_times.rst.txt b/_sources/auto_examples/quickstart/sg_execution_times.rst.txt index cf25927b0..fd890a1d3 100644 --- a/_sources/auto_examples/quickstart/sg_execution_times.rst.txt +++ b/_sources/auto_examples/quickstart/sg_execution_times.rst.txt @@ -3,14 +3,41 @@ .. _sphx_glr_auto_examples_quickstart_sg_execution_times: + Computation times ================= -**00:06.018** total execution time for **auto_examples_quickstart** files: - -+------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickstart_plot_retinotopy_flatmap.py` (``plot_retinotopy_flatmap.py``) | 00:06.018 | 0.0 MB | -+------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickstart_retinotopy_webgl.py` (``retinotopy_webgl.py``) | 00:00.000 | 0.0 MB | -+------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_quickstart_show_config.py` (``show_config.py``) | 00:00.000 | 0.0 MB | -+------------------------------------------------------------------------------------------------------+-----------+--------+ +**00:05.836** total execution time for 3 files **from auto_examples/quickstart**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_quickstart_plot_retinotopy_flatmap.py` (``plot_retinotopy_flatmap.py``) + - 00:05.836 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickstart_retinotopy_webgl.py` (``retinotopy_webgl.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickstart_show_config.py` (``show_config.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/auto_examples/quickstart/show_config.rst.txt b/_sources/auto_examples/quickstart/show_config.rst.txt index b0a344c54..4404abc6c 100644 --- a/_sources/auto_examples/quickstart/show_config.rst.txt +++ b/_sources/auto_examples/quickstart/show_config.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -27,7 +27,7 @@ This comes in useful when things don't work because the config file is not set c .. GENERATED FROM PYTHON SOURCE LINES 9-13 -.. code-block:: default +.. code-block:: Python from __future__ import print_function import cortex @@ -40,7 +40,7 @@ Finding where your config file is. .. GENERATED FROM PYTHON SOURCE LINES 15-17 -.. code-block:: default +.. code-block:: Python print(cortex.options.usercfg) @@ -52,7 +52,7 @@ Useful for when your subjects don't show up in cortex.db, and all you have is S1 .. GENERATED FROM PYTHON SOURCE LINES 20-22 -.. code-block:: default +.. code-block:: Python print(config.get('basic', 'filestore')) @@ -64,7 +64,7 @@ Useful for when you get color map not found messages. .. GENERATED FROM PYTHON SOURCE LINES 25-27 -.. code-block:: default +.. code-block:: Python print(config.get('webgl', 'colormaps')) @@ -76,7 +76,7 @@ However, you *can* still look at options from within pycortex. .. GENERATED FROM PYTHON SOURCE LINES 30-37 -.. code-block:: default +.. code-block:: Python # sections gets the upper-level sections in the config file @@ -87,30 +87,19 @@ However, you *can* still look at options from within pycortex. basic_config = config.items('paths_default') print(basic_config) -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_quickstart_show_config.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: show_config.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: show_config.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: show_config.ipynb ` + :download:`Download Python source code: show_config.py ` .. only:: html diff --git a/_sources/auto_examples/sg_execution_times.rst.txt b/_sources/auto_examples/sg_execution_times.rst.txt new file mode 100644 index 000000000..ccb2da185 --- /dev/null +++ b/_sources/auto_examples/sg_execution_times.rst.txt @@ -0,0 +1,37 @@ + +:orphan: + +.. _sphx_glr_auto_examples_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 0 files **from auto_examples**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - N/A + - N/A + - N/A diff --git a/_sources/auto_examples/surface_analyses/index.rst.txt b/_sources/auto_examples/surface_analyses/index.rst.txt new file mode 100644 index 000000000..f21308989 --- /dev/null +++ b/_sources/auto_examples/surface_analyses/index.rst.txt @@ -0,0 +1,134 @@ + + +.. _sphx_glr_auto_examples_surface_analyses: + +Surface Analysis Examples +------------------------------ + +Examples demonstrating operations and analyses done on brain surfaces. + + + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_tissots_indicatrix_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_surface_analyses_plot_tissots_indicatrix.py` + +.. raw:: html + +
Tissot's Indicatrix
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_geodesic_path_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_path.py` + +.. raw:: html + +
Plotting Geodesic Paths
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_geodesic_distance_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_distance.py` + +.. raw:: html + +
Plotting Geodesic Distances
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_flatmap_distortion_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_surface_analyses_plot_flatmap_distortion.py` + +.. raw:: html + +
Flatmap Distortion
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_subsurfaces_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_surface_analyses_plot_subsurfaces.py` + +.. raw:: html + +
Plot and Use Subsurface Tools
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/surface_analyses/images/thumb/sphx_glr_plot_interpolate_data_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_surface_analyses_plot_interpolate_data.py` + +.. raw:: html + +
Interpolate Data
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/surface_analyses/plot_tissots_indicatrix + /auto_examples/surface_analyses/plot_geodesic_path + /auto_examples/surface_analyses/plot_geodesic_distance + /auto_examples/surface_analyses/plot_flatmap_distortion + /auto_examples/surface_analyses/plot_subsurfaces + /auto_examples/surface_analyses/plot_interpolate_data + diff --git a/_sources/auto_examples/surface_analyses/plot_flatmap_distortion.rst.txt b/_sources/auto_examples/surface_analyses/plot_flatmap_distortion.rst.txt index aa7e8ada9..d3a926d9d 100644 --- a/_sources/auto_examples/surface_analyses/plot_flatmap_distortion.rst.txt +++ b/_sources/auto_examples/surface_analyses/plot_flatmap_distortion.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -62,21 +62,15 @@ the original. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /home/runner/work/pycortex/pycortex/cortex/polyutils/distortion.py:57: RuntimeWarning: invalid value encountered in true_divide + /home/runner/work/pycortex/pycortex/cortex/polyutils/distortion.py:57: RuntimeWarning: invalid value encountered in divide vertratios /= np.bincount(self.polys.ravel(), minlength=len(self.ref)) Generating distortion surface info... - /home/runner/work/pycortex/pycortex/cortex/polyutils/distortion.py:57: RuntimeWarning: invalid value encountered in true_divide + /home/runner/work/pycortex/pycortex/cortex/polyutils/distortion.py:57: RuntimeWarning: invalid value encountered in divide vertratios /= np.bincount(self.polys.ravel(), minlength=len(self.ref)) - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - /home/runner/work/pycortex/pycortex/cortex/polyutils/distortion.py:57: RuntimeWarning: invalid value encountered in true_divide + /home/runner/work/pycortex/pycortex/cortex/polyutils/distortion.py:57: RuntimeWarning: invalid value encountered in divide vertratios /= np.bincount(self.polys.ravel(), minlength=len(self.ref)) - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) Generating distortion surface info... @@ -86,7 +80,7 @@ the original. | -.. code-block:: default +.. code-block:: Python import cortex @@ -136,28 +130,22 @@ the original. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 30.161 seconds) + **Total running time of the script:** (0 minutes 23.561 seconds) .. _sphx_glr_download_auto_examples_surface_analyses_plot_flatmap_distortion.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_flatmap_distortion.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_flatmap_distortion.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_flatmap_distortion.ipynb ` + :download:`Download Python source code: plot_flatmap_distortion.py ` .. only:: html diff --git a/_sources/auto_examples/surface_analyses/plot_geodesic_distance.rst.txt b/_sources/auto_examples/surface_analyses/plot_geodesic_distance.rst.txt index acf90a75b..9253135ea 100644 --- a/_sources/auto_examples/surface_analyses/plot_geodesic_distance.rst.txt +++ b/_sources/auto_examples/surface_analyses/plot_geodesic_distance.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -58,20 +58,12 @@ The two hemispheres must be run separately. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - Failed to get connection - ** (inkscape:5473): CRITICAL **: 01:32:28.085: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5473): CRITICAL **: 01:32:28.085: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5473): CRITICAL **: 01:32:28.085: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5477): CRITICAL **: 01:32:29.814: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5477): CRITICAL **: 01:32:29.814: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5477): CRITICAL **: 01:32:29.814: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -80,7 +72,7 @@ The two hemispheres must be run separately. | -.. code-block:: default +.. code-block:: Python import cortex import cortex.polyutils @@ -124,28 +116,22 @@ The two hemispheres must be run separately. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 14.953 seconds) + **Total running time of the script:** (0 minutes 14.610 seconds) .. _sphx_glr_download_auto_examples_surface_analyses_plot_geodesic_distance.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_geodesic_distance.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_geodesic_distance.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_geodesic_distance.ipynb ` + :download:`Download Python source code: plot_geodesic_distance.py ` .. only:: html diff --git a/_sources/auto_examples/surface_analyses/plot_geodesic_path.rst.txt b/_sources/auto_examples/surface_analyses/plot_geodesic_path.rst.txt index 27bae8682..4068736ff 100644 --- a/_sources/auto_examples/surface_analyses/plot_geodesic_path.rst.txt +++ b/_sources/auto_examples/surface_analyses/plot_geodesic_path.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -32,7 +32,7 @@ All you need to do is supply a surface object and two vertices on that surface and you can find the geodesic path. This script additionally makes a plot to show all of the vertices listed in the path. -.. GENERATED FROM PYTHON SOURCE LINES 16-45 +.. GENERATED FROM PYTHON SOURCE LINES 16-47 @@ -44,16 +44,10 @@ show all of the vertices listed in the path. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - Failed to get connection - ** (inkscape:5462): CRITICAL **: 01:32:15.597: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5462): CRITICAL **: 01:32:15.597: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5462): CRITICAL **: 01:32:15.597: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -62,7 +56,7 @@ show all of the vertices listed in the path. | -.. code-block:: default +.. code-block:: Python import cortex import cortex.polyutils @@ -75,6 +69,8 @@ show all of the vertices listed in the path. surfs = [cortex.polyutils.Surface(*d) for d in cortex.db.get_surf(subject, "fiducial")] numl = surfs[0].pts.shape[0] + numr = surfs[1].pts.shape[0] + num_vertices = numl + numr # Now we need to pick the start and end points of the line we will draw pt_a = 100 @@ -84,41 +80,35 @@ show all of the vertices listed in the path. path = surfs[0].geodesic_path(pt_a, pt_b) # In order to plot this on the cortical surface, we need an array that is the - # same size as the number of vertices in the left hemisphere - path_data = np.zeros(numl) + # same size as the number of vertices + path_data = np.zeros(num_vertices) * np.nan for v in path: path_data[v] = 1 # And now plot these distances onto the cortical surface - path_verts = cortex.Vertex(path_data, subject, cmap="Blues_r") - cortex.quickshow(path_verts, with_colorbar=False) + path_verts = cortex.Vertex(path_data, subject, cmap="Reds", vmin=0, vmax=1) + cortex.quickshow(path_verts, with_colorbar=False, with_curvature=True) plt.show() .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 8.814 seconds) + **Total running time of the script:** (0 minutes 7.153 seconds) .. _sphx_glr_download_auto_examples_surface_analyses_plot_geodesic_path.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_geodesic_path.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_geodesic_path.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_geodesic_path.ipynb ` + :download:`Download Python source code: plot_geodesic_path.py ` .. only:: html diff --git a/_sources/auto_examples/surface_analyses/plot_interpolate_data.rst.txt b/_sources/auto_examples/surface_analyses/plot_interpolate_data.rst.txt index 2c5c9e34e..33ca617eb 100644 --- a/_sources/auto_examples/surface_analyses/plot_interpolate_data.rst.txt +++ b/_sources/auto_examples/surface_analyses/plot_interpolate_data.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -39,23 +39,10 @@ the selected points. This is similar to thin plate splines. :class: sphx-glr-single-img -.. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - - - - - - -| - -.. code-block:: default +.. code-block:: Python import cortex @@ -109,28 +96,22 @@ the selected points. This is similar to thin plate splines. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 15.640 seconds) + **Total running time of the script:** (0 minutes 11.818 seconds) .. _sphx_glr_download_auto_examples_surface_analyses_plot_interpolate_data.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_interpolate_data.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_interpolate_data.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_interpolate_data.ipynb ` + :download:`Download Python source code: plot_interpolate_data.py ` .. only:: html diff --git a/_sources/auto_examples/surface_analyses/plot_subsurfaces.rst.txt b/_sources/auto_examples/surface_analyses/plot_subsurfaces.rst.txt index 829f54623..e1dd83dbc 100644 --- a/_sources/auto_examples/surface_analyses/plot_subsurfaces.rst.txt +++ b/_sources/auto_examples/surface_analyses/plot_subsurfaces.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -26,7 +26,7 @@ Subsurfaces can be used for efficient operations on subsets of cortical surface .. GENERATED FROM PYTHON SOURCE LINES 9-24 -.. code-block:: default +.. code-block:: Python import tempfile @@ -56,7 +56,7 @@ create subsurface .. GENERATED FROM PYTHON SOURCE LINES 26-33 -.. code-block:: default +.. code-block:: Python center = 125000 @@ -69,15 +69,6 @@ create subsurface -.. rst-class:: sphx-glr-script-out - - Out: - - .. code-block:: none - - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - @@ -87,7 +78,7 @@ plot data on subsurface .. GENERATED FROM PYTHON SOURCE LINES 35-42 -.. code-block:: default +.. code-block:: Python data = subsurface.geodesic_distance([0]) + 20 @@ -107,16 +98,10 @@ plot data on subsurface .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - Failed to get connection - ** (inkscape:5499): CRITICAL **: 01:33:03.252: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5499): CRITICAL **: 01:33:03.252: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5499): CRITICAL **: 01:33:03.252: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -128,7 +113,7 @@ plot subsurface as gif .. GENERATED FROM PYTHON SOURCE LINES 45-51 -.. code-block:: default +.. code-block:: Python f, path = tempfile.mkstemp() @@ -154,7 +139,7 @@ create many patches .. GENERATED FROM PYTHON SOURCE LINES 58-76 -.. code-block:: default +.. code-block:: Python @@ -185,16 +170,10 @@ create many patches .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - Failed to get connection - ** (inkscape:5506): CRITICAL **: 01:33:09.549: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5506): CRITICAL **: 01:33:09.549: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5506): CRITICAL **: 01:33:09.549: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -205,7 +184,7 @@ create geodesic strip patch .. GENERATED FROM PYTHON SOURCE LINES 78-95 -.. code-block:: default +.. code-block:: Python patch = left_surface.get_geodesic_strip_patch(v0=70000, v1=125000, radius=5) @@ -254,24 +233,14 @@ create geodesic strip patch .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) - Failed to get connection - ** (inkscape:5514): CRITICAL **: 01:33:20.494: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5514): CRITICAL **: 01:33:20.494: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5514): CRITICAL **: 01:33:20.494: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5517): CRITICAL **: 01:33:21.485: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5517): CRITICAL **: 01:33:21.485: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5517): CRITICAL **: 01:33:21.486: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed - Failed to get connection - ** (inkscape:5520): CRITICAL **: 01:33:22.471: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5520): CRITICAL **: 01:33:22.471: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5520): CRITICAL **: 01:33:22.471: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -279,28 +248,22 @@ create geodesic strip patch .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 22.744 seconds) + **Total running time of the script:** (0 minutes 19.551 seconds) .. _sphx_glr_download_auto_examples_surface_analyses_plot_subsurfaces.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_subsurfaces.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_subsurfaces.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_subsurfaces.ipynb ` + :download:`Download Python source code: plot_subsurfaces.py ` .. only:: html diff --git a/_sources/auto_examples/surface_analyses/plot_tissots_indicatrix.rst.txt b/_sources/auto_examples/surface_analyses/plot_tissots_indicatrix.rst.txt index 3449963e6..61b1bd38b 100644 --- a/_sources/auto_examples/surface_analyses/plot_tissots_indicatrix.rst.txt +++ b/_sources/auto_examples/surface_analyses/plot_tissots_indicatrix.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -53,13 +53,9 @@ introduced by flattening the globe onto a map: .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none Generating tissots_indicatrix surface info... - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/scipy/sparse/linalg/_dsolve/linsolve.py:322: SparseEfficiencyWarning: splu requires CSC matrix format - warn('splu requires CSC matrix format', SparseEfficiencyWarning) Adding vertex 88060.. Adding vertex 93467.. Adding vertex 51981.. @@ -209,8 +205,6 @@ introduced by flattening the globe onto a map: Adding vertex 6044.. Adding vertex 67298.. Adding vertex 40064.. - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/numpy/lib/npyio.py:713: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray. - val = np.asanyarray(val) @@ -219,7 +213,7 @@ introduced by flattening the globe onto a map: | -.. code-block:: default +.. code-block:: Python import cortex @@ -234,28 +228,22 @@ introduced by flattening the globe onto a map: .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 33.731 seconds) + **Total running time of the script:** (0 minutes 25.962 seconds) .. _sphx_glr_download_auto_examples_surface_analyses_plot_tissots_indicatrix.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_tissots_indicatrix.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_tissots_indicatrix.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_tissots_indicatrix.ipynb ` + :download:`Download Python source code: plot_tissots_indicatrix.py ` .. only:: html diff --git a/_sources/auto_examples/surface_analyses/sg_execution_times.rst.txt b/_sources/auto_examples/surface_analyses/sg_execution_times.rst.txt index 38cdd114a..361c3cafd 100644 --- a/_sources/auto_examples/surface_analyses/sg_execution_times.rst.txt +++ b/_sources/auto_examples/surface_analyses/sg_execution_times.rst.txt @@ -3,20 +3,50 @@ .. _sphx_glr_auto_examples_surface_analyses_sg_execution_times: + Computation times ================= -**02:06.044** total execution time for **auto_examples_surface_analyses** files: - -+------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_surface_analyses_plot_tissots_indicatrix.py` (``plot_tissots_indicatrix.py``) | 00:33.731 | 0.0 MB | -+------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_surface_analyses_plot_flatmap_distortion.py` (``plot_flatmap_distortion.py``) | 00:30.161 | 0.0 MB | -+------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_surface_analyses_plot_subsurfaces.py` (``plot_subsurfaces.py``) | 00:22.744 | 0.0 MB | -+------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_surface_analyses_plot_interpolate_data.py` (``plot_interpolate_data.py``) | 00:15.640 | 0.0 MB | -+------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_distance.py` (``plot_geodesic_distance.py``) | 00:14.953 | 0.0 MB | -+------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_path.py` (``plot_geodesic_path.py``) | 00:08.814 | 0.0 MB | -+------------------------------------------------------------------------------------------------------------+-----------+--------+ +**01:42.654** total execution time for 6 files **from auto_examples/surface_analyses**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_tissots_indicatrix.py` (``plot_tissots_indicatrix.py``) + - 00:25.962 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_flatmap_distortion.py` (``plot_flatmap_distortion.py``) + - 00:23.561 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_subsurfaces.py` (``plot_subsurfaces.py``) + - 00:19.551 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_distance.py` (``plot_geodesic_distance.py``) + - 00:14.610 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_interpolate_data.py` (``plot_interpolate_data.py``) + - 00:11.818 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_path.py` (``plot_geodesic_path.py``) + - 00:07.153 + - 0.0 diff --git a/_sources/auto_examples/utils/index.rst.txt b/_sources/auto_examples/utils/index.rst.txt new file mode 100644 index 000000000..63c77703e --- /dev/null +++ b/_sources/auto_examples/utils/index.rst.txt @@ -0,0 +1,170 @@ + + +.. _sphx_glr_auto_examples_utils: + +Utility Examples +------------------------------ + +Examples demonstrating how to do all sorts of beautiful things using pycortex. + + + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_get_roi_vertices_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_plot_get_roi_vertices.py` + +.. raw:: html + +
Get Vertices for an ROI
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_voxel_distance_from_surface_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_plot_voxel_distance_from_surface.py` + +.. raw:: html + +
Voxel distance from surface
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_mosaic_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_plot_mosaic.py` + +.. raw:: html + +
Mosaic plot
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_subject_to_mni_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_subject_to_mni.py` + +.. raw:: html + +
Transform from Subject to MNI Space
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_roi_voxel_mask_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_mask.py` + +.. raw:: html + +
Get ROI Voxel Mask
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_mni_to_subject_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_mni_to_subject.py` + +.. raw:: html + +
Transform from MNI to Subject Space
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_multi_panels_plots_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_multi_panels_plots.py` + +.. raw:: html + +
Multi-panels figures
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/utils/images/thumb/sphx_glr_plot_roi_voxel_index_volume_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_index_volume.py` + +.. raw:: html + +
Get ROI Index Volume
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/utils/plot_get_roi_vertices + /auto_examples/utils/plot_voxel_distance_from_surface + /auto_examples/utils/plot_mosaic + /auto_examples/utils/subject_to_mni + /auto_examples/utils/plot_roi_voxel_mask + /auto_examples/utils/mni_to_subject + /auto_examples/utils/multi_panels_plots + /auto_examples/utils/plot_roi_voxel_index_volume + diff --git a/_sources/auto_examples/utils/mni_to_subject.rst.txt b/_sources/auto_examples/utils/mni_to_subject.rst.txt index d6fef910a..d245dc3dd 100644 --- a/_sources/auto_examples/utils/mni_to_subject.rst.txt +++ b/_sources/auto_examples/utils/mni_to_subject.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -31,7 +31,7 @@ into subject space from MNI space. .. GENERATED FROM PYTHON SOURCE LINES 14-45 -.. code-block:: default +.. code-block:: Python import cortex @@ -59,37 +59,26 @@ into subject space from MNI space. data.data, s1_to_mni) # subject_data is a nibabel Nifti1Image - subject_data_vol = mni_data.get_data() # the actual array, shape=(100,100,31) + subject_data_vol = mni_data.get_fdata() # the actual array, shape=(100,100,31) # That was the manual method. pycortex can also cache these transforms for you # if you get them using the pycortex database s1_to_mni_db = cortex.db.get_mnixfm('S1', 'fullhead') # this is the same as s1_to_mni, but will return instantly on subsequent calls -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_utils_mni_to_subject.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: mni_to_subject.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: mni_to_subject.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: mni_to_subject.ipynb ` + :download:`Download Python source code: mni_to_subject.py ` .. only:: html diff --git a/_sources/auto_examples/utils/multi_panels_plots.rst.txt b/_sources/auto_examples/utils/multi_panels_plots.rst.txt index 755ebf345..48b79219a 100644 --- a/_sources/auto_examples/utils/multi_panels_plots.rst.txt +++ b/_sources/auto_examples/utils/multi_panels_plots.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -30,7 +30,7 @@ The function needs to be run on a system with a display, since it will launch a webgl viewer. The best way to get the expected results is to keep the webgl viewer visible during the process. -The selection of views and the aggregation is controled by a list of "panels". +The selection of views and the aggregation is controlled by a list of "panels". Examples of panels can be imported with: from cortex.export import params_flatmap_lateral_medial @@ -38,7 +38,7 @@ Examples of panels can be imported with: .. GENERATED FROM PYTHON SOURCE LINES 21-31 -.. code-block:: default +.. code-block:: Python import os import tempfile @@ -57,7 +57,7 @@ create some artificial data .. GENERATED FROM PYTHON SOURCE LINES 33-38 -.. code-block:: default +.. code-block:: Python shape = cortex.db.get_xfm(subject, 'identity').shape @@ -71,7 +71,7 @@ Show examples of multi-panels figures .. GENERATED FROM PYTHON SOURCE LINES 40-49 -.. code-block:: default +.. code-block:: Python params = cortex.export.params_flatmap_lateral_medial @@ -89,7 +89,7 @@ List all predefined angles .. GENERATED FROM PYTHON SOURCE LINES 51-65 -.. code-block:: default +.. code-block:: Python base_name = os.path.join(tempfile.mkdtemp(), 'fig') @@ -112,7 +112,7 @@ List all predefined surfaces .. GENERATED FROM PYTHON SOURCE LINES 67-81 -.. code-block:: default +.. code-block:: Python base_name = os.path.join(tempfile.mkdtemp(), 'fig') @@ -130,30 +130,19 @@ List all predefined surfaces plt.show() -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_utils_multi_panels_plots.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: multi_panels_plots.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: multi_panels_plots.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: multi_panels_plots.ipynb ` + :download:`Download Python source code: multi_panels_plots.py ` .. only:: html diff --git a/_sources/auto_examples/utils/plot_get_roi_vertices.rst.txt b/_sources/auto_examples/utils/plot_get_roi_vertices.rst.txt index 01bc61459..642505a8c 100644 --- a/_sources/auto_examples/utils/plot_get_roi_vertices.rst.txt +++ b/_sources/auto_examples/utils/plot_get_roi_vertices.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -37,14 +37,10 @@ defined in the SVG ROI file (see :doc:`/rois.rst`). .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - Failed to get connection - ** (inkscape:5534): CRITICAL **: 01:33:42.301: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5534): CRITICAL **: 01:33:42.301: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5534): CRITICAL **: 01:33:42.301: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi)
@@ -54,7 +50,7 @@ defined in the SVG ROI file (see :doc:`/rois.rst`). | -.. code-block:: default +.. code-block:: Python import cortex @@ -75,28 +71,22 @@ defined in the SVG ROI file (see :doc:`/rois.rst`). .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 2.277 seconds) + **Total running time of the script:** (0 minutes 4.012 seconds) .. _sphx_glr_download_auto_examples_utils_plot_get_roi_vertices.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_get_roi_vertices.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_get_roi_vertices.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_get_roi_vertices.ipynb ` + :download:`Download Python source code: plot_get_roi_vertices.py ` .. only:: html diff --git a/_sources/auto_examples/utils/plot_mosaic.rst.txt b/_sources/auto_examples/utils/plot_mosaic.rst.txt index ecab1d109..c371bbd14 100644 --- a/_sources/auto_examples/utils/plot_mosaic.rst.txt +++ b/_sources/auto_examples/utils/plot_mosaic.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -53,26 +53,10 @@ The function `mosaic` plots all of the slices in a volume in a matplotlib figure :class: sphx-glr-multi-img -.. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /home/runner/work/pycortex/pycortex/examples/utils/plot_mosaic.py:17: DeprecationWarning: get_data() is deprecated in favor of get_fdata(), which has a more predictable return type. To obtain get_data() behavior going forward, use numpy.asanyarray(img.dataobj). - - * deprecated from version: 3.0 - * Will raise as of version: 5.0 - volume_arr = cortex.db.get_xfm('S1', 'fullhead').reference.get_data().T - - - - - - -| - -.. code-block:: default +.. code-block:: Python # sphinx_gallery_thumbnail_number = 3 @@ -80,7 +64,7 @@ The function `mosaic` plots all of the slices in a volume in a matplotlib figure import matplotlib.pyplot as plt # load reference functional image for test purposes - volume_arr = cortex.db.get_xfm('S1', 'fullhead').reference.get_data().T + volume_arr = cortex.db.get_xfm('S1', 'fullhead').reference.get_fdata().T # volume_arr is a (31,100,100) ndarray @@ -104,28 +88,22 @@ The function `mosaic` plots all of the slices in a volume in a matplotlib figure .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 0.272 seconds) + **Total running time of the script:** (0 minutes 0.202 seconds) .. _sphx_glr_download_auto_examples_utils_plot_mosaic.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_mosaic.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_mosaic.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_mosaic.ipynb ` + :download:`Download Python source code: plot_mosaic.py ` .. only:: html diff --git a/_sources/auto_examples/utils/plot_roi_voxel_index_volume.rst.txt b/_sources/auto_examples/utils/plot_roi_voxel_index_volume.rst.txt index dcac0aa38..cdd890bd9 100644 --- a/_sources/auto_examples/utils/plot_roi_voxel_index_volume.rst.txt +++ b/_sources/auto_examples/utils/plot_roi_voxel_index_volume.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -38,64 +38,62 @@ ROIs in the right hemisphere will have positive values. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:491: UserWarning: Requested layer in svg file (V3A) contains no splines + /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:499: UserWarning: Requested layer in svg file (V3A) contains no splines warnings.warn("Requested layer in svg file (%s) contains no splines"%self.name) - /home/runner/work/pycortex/pycortex/cortex/utils.py:335: UserWarning: No vertices found in V3A! + /home/runner/work/pycortex/pycortex/cortex/utils.py:371: UserWarning: No vertices found in V3A! warnings.warn("No vertices found in {}!".format(name)) - /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:491: UserWarning: Requested layer in svg file (V3B) contains no splines + /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:499: UserWarning: Requested layer in svg file (V3B) contains no splines warnings.warn("Requested layer in svg file (%s) contains no splines"%self.name) - /home/runner/work/pycortex/pycortex/cortex/utils.py:335: UserWarning: No vertices found in V3B! + /home/runner/work/pycortex/pycortex/cortex/utils.py:371: UserWarning: No vertices found in V3B! warnings.warn("No vertices found in {}!".format(name)) - /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:491: UserWarning: Requested layer in svg file (LO) contains no splines + /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:499: UserWarning: Requested layer in svg file (LO) contains no splines warnings.warn("Requested layer in svg file (%s) contains no splines"%self.name) - /home/runner/work/pycortex/pycortex/cortex/utils.py:335: UserWarning: No vertices found in LO! + /home/runner/work/pycortex/pycortex/cortex/utils.py:371: UserWarning: No vertices found in LO! warnings.warn("No vertices found in {}!".format(name)) - /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:491: UserWarning: Requested layer in svg file (V4) contains no splines + /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:499: UserWarning: Requested layer in svg file (V4) contains no splines warnings.warn("Requested layer in svg file (%s) contains no splines"%self.name) - /home/runner/work/pycortex/pycortex/cortex/utils.py:335: UserWarning: No vertices found in V4! + /home/runner/work/pycortex/pycortex/cortex/utils.py:371: UserWarning: No vertices found in V4! warnings.warn("No vertices found in {}!".format(name)) - /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:491: UserWarning: Requested layer in svg file (V7) contains no splines + /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:499: UserWarning: Requested layer in svg file (V7) contains no splines warnings.warn("Requested layer in svg file (%s) contains no splines"%self.name) - /home/runner/work/pycortex/pycortex/cortex/utils.py:335: UserWarning: No vertices found in V7! + /home/runner/work/pycortex/pycortex/cortex/utils.py:371: UserWarning: No vertices found in V7! warnings.warn("No vertices found in {}!".format(name)) - /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:491: UserWarning: Requested layer in svg file (IFSFP) contains no splines + /home/runner/work/pycortex/pycortex/cortex/svgoverlay.py:499: UserWarning: Requested layer in svg file (IFSFP) contains no splines warnings.warn("Requested layer in svg file (%s) contains no splines"%self.name) - /home/runner/work/pycortex/pycortex/cortex/utils.py:335: UserWarning: No vertices found in IFSFP! + /home/runner/work/pycortex/pycortex/cortex/utils.py:371: UserWarning: No vertices found in IFSFP! warnings.warn("No vertices found in {}!".format(name)) Found 100.00% of S1H Found 100.00% of S1M Found 100.00% of sPMv Found 100.00% of PMvh - Found 100.00% of M1F + Found 97.46% of M1F Found 100.00% of M1H Found 100.00% of Broca Found 100.00% of SMFA Found 100.00% of M1M - /home/runner/work/pycortex/pycortex/cortex/utils.py:621: RuntimeWarning: Mean of empty slice. + /home/runner/work/pycortex/pycortex/cortex/utils.py:665: RuntimeWarning: Mean of empty slice. pct_coverage[roi] = vert_in_scan.mean() * 100 - /opt/hostedtoolcache/Python/3.9.12/x64/lib/python3.9/site-packages/numpy/core/_methods.py:189: RuntimeWarning: invalid value encountered in double_scalars + /opt/hostedtoolcache/Python/3.9.19/x64/lib/python3.9/site-packages/numpy/core/_methods.py:129: RuntimeWarning: invalid value encountered in scalar divide ret = ret.dtype.type(ret / rcount) Found nan% of V3A Found nan% of V3B Found 100.00% of FO Found 100.00% of PPA Found 100.00% of S2F - Found 100.00% of SEF + Found 91.46% of SEF Found nan% of LO - Found 100.00% of V1 + Found 98.03% of V1 Found 100.00% of V2 Found 100.00% of V3 Found nan% of V4 Found nan% of V7 Found 100.00% of FEF - Found 100.00% of AC + Found 99.92% of AC Found 100.00% of OFA Found nan% of IFSFP - Found 100.00% of S1F + Found 97.23% of S1F Found 100.00% of OPA Found 100.00% of EBA Found 100.00% of RSC @@ -103,10 +101,18 @@ ROIs in the right hemisphere will have positive values. Found 100.00% of SMHA Found 100.00% of FFA Cutting 0 overlapping voxels (should be < ~50) - Failed to get connection - ** (inkscape:5552): CRITICAL **: 01:34:04.502: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5552): CRITICAL **: 01:34:04.502: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5552): CRITICAL **: 01:34:04.502: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + /home/runner/work/pycortex/pycortex/cortex/utils.py:718: UserWarning: ROI S1F is only 97.23% contained in your scan protocol! + warnings.warn('ROI %s is only %0.2f%% contained in your scan protocol!'%(roi, pct_coverage[roi])) + /home/runner/work/pycortex/pycortex/cortex/utils.py:718: UserWarning: ROI M1F is only 97.46% contained in your scan protocol! + warnings.warn('ROI %s is only %0.2f%% contained in your scan protocol!'%(roi, pct_coverage[roi])) + /home/runner/work/pycortex/pycortex/cortex/utils.py:718: UserWarning: ROI V1 is only 98.03% contained in your scan protocol! + warnings.warn('ROI %s is only %0.2f%% contained in your scan protocol!'%(roi, pct_coverage[roi])) + /home/runner/work/pycortex/pycortex/cortex/utils.py:718: UserWarning: ROI SEF is only 91.46% contained in your scan protocol! + warnings.warn('ROI %s is only %0.2f%% contained in your scan protocol!'%(roi, pct_coverage[roi])) + /home/runner/work/pycortex/pycortex/cortex/utils.py:718: UserWarning: ROI AC is only 99.92% contained in your scan protocol! + warnings.warn('ROI %s is only %0.2f%% contained in your scan protocol!'%(roi, pct_coverage[roi])) + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) Index keys for which ROI is which in `index_volume`: {'S1H': 1, 'S1M': 2, 'sPMv': 3, 'PMvh': 4, 'M1F': 5, 'M1H': 6, 'Broca': 7, 'SMFA': 8, 'M1M': 9, 'V3A': 10, 'V3B': 11, 'FO': 12, 'PPA': 13, 'S2F': 14, 'SEF': 15, 'LO': 16, 'V1': 17, 'V2': 18, 'V3': 19, 'V4': 20, 'V7': 21, 'FEF': 22, 'AC': 23, 'OFA': 24, 'IFSFP': 25, 'S1F': 26, 'OPA': 27, 'EBA': 28, 'RSC': 29, 'IPS': 30, 'SMHA': 31, 'FFA': 32} @@ -117,7 +123,7 @@ ROIs in the right hemisphere will have positive values. | -.. code-block:: default +.. code-block:: Python import cortex @@ -157,28 +163,22 @@ ROIs in the right hemisphere will have positive values. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 9.884 seconds) + **Total running time of the script:** (0 minutes 22.996 seconds) .. _sphx_glr_download_auto_examples_utils_plot_roi_voxel_index_volume.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_roi_voxel_index_volume.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_roi_voxel_index_volume.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_roi_voxel_index_volume.ipynb ` + :download:`Download Python source code: plot_roi_voxel_index_volume.py ` .. only:: html diff --git a/_sources/auto_examples/utils/plot_roi_voxel_mask.rst.txt b/_sources/auto_examples/utils/plot_roi_voxel_mask.rst.txt index 38ec1dc7b..a9e5e4134 100644 --- a/_sources/auto_examples/utils/plot_roi_voxel_mask.rst.txt +++ b/_sources/auto_examples/utils/plot_roi_voxel_mask.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -24,7 +24,7 @@ Get ROI Voxel Mask Get proportion of each voxel that exists within a named ROI (this constitutes a probability map for the ROI, with values ranging from -0-1). Plot this probablistic roi mask onto a flatmap. +0-1). Plot this probabilistic roi mask onto a flatmap. In order for this to work, the specified ROI must exist in the overlays.svg file in the pycortex filestore for this subject. @@ -41,18 +41,14 @@ overlays.svg file in the pycortex filestore for this subject. .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none Caching mapper... Found 100.00% of EBA Cutting 0 overlapping voxels (should be < ~50) Generating a flatmap cache - Failed to get connection - ** (inkscape:5543): CRITICAL **: 01:33:54.463: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed - ** (inkscape:5543): CRITICAL **: 01:33:54.463: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed - ** (inkscape:5543): CRITICAL **: 01:33:54.464: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed + Background RRGGBBAA: ffffff00 + Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi) @@ -61,7 +57,7 @@ overlays.svg file in the pycortex filestore for this subject. | -.. code-block:: default +.. code-block:: Python import cortex @@ -76,7 +72,7 @@ overlays.svg file in the pycortex filestore for this subject. roi_list=[roi], gm_sampler='cortical-conservative', # Select only voxels mostly within cortex split_lr=False, # No separate left/right ROIs - threshold=None, # Leave roi mask values as probabilites / fractions + threshold=None, # Leave roi mask values as probabilities / fractions return_dict=True ) @@ -98,28 +94,22 @@ overlays.svg file in the pycortex filestore for this subject. .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 7.399 seconds) + **Total running time of the script:** (0 minutes 8.659 seconds) .. _sphx_glr_download_auto_examples_utils_plot_roi_voxel_mask.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_roi_voxel_mask.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_roi_voxel_mask.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_roi_voxel_mask.ipynb ` + :download:`Download Python source code: plot_roi_voxel_mask.py ` .. only:: html diff --git a/_sources/auto_examples/utils/plot_voxel_distance_from_surface.rst.txt b/_sources/auto_examples/utils/plot_voxel_distance_from_surface.rst.txt index 265a631b1..8f2a7260c 100644 --- a/_sources/auto_examples/utils/plot_voxel_distance_from_surface.rst.txt +++ b/_sources/auto_examples/utils/plot_voxel_distance_from_surface.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -36,12 +36,10 @@ The utility function `get_vox_dist` returns the distance from each voxel in some .. rst-class:: sphx-glr-script-out - Out: - .. code-block:: none - + @@ -49,7 +47,7 @@ The utility function `get_vox_dist` returns the distance from each voxel in some | -.. code-block:: default +.. code-block:: Python import cortex @@ -73,28 +71,22 @@ The utility function `get_vox_dist` returns the distance from each voxel in some .. rst-class:: sphx-glr-timing - **Total running time of the script:** ( 0 minutes 4.326 seconds) + **Total running time of the script:** (0 minutes 3.643 seconds) .. _sphx_glr_download_auto_examples_utils_plot_voxel_distance_from_surface.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: plot_voxel_distance_from_surface.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: plot_voxel_distance_from_surface.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: plot_voxel_distance_from_surface.ipynb ` + :download:`Download Python source code: plot_voxel_distance_from_surface.py ` .. only:: html diff --git a/_sources/auto_examples/utils/sg_execution_times.rst.txt b/_sources/auto_examples/utils/sg_execution_times.rst.txt index 720ada408..56eafd03e 100644 --- a/_sources/auto_examples/utils/sg_execution_times.rst.txt +++ b/_sources/auto_examples/utils/sg_execution_times.rst.txt @@ -3,24 +3,56 @@ .. _sphx_glr_auto_examples_utils_sg_execution_times: + Computation times ================= -**00:24.158** total execution time for **auto_examples_utils** files: - -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_index_volume.py` (``plot_roi_voxel_index_volume.py``) | 00:09.884 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_mask.py` (``plot_roi_voxel_mask.py``) | 00:07.399 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_plot_voxel_distance_from_surface.py` (``plot_voxel_distance_from_surface.py``) | 00:04.326 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_plot_get_roi_vertices.py` (``plot_get_roi_vertices.py``) | 00:02.277 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_plot_mosaic.py` (``plot_mosaic.py``) | 00:00.272 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_mni_to_subject.py` (``mni_to_subject.py``) | 00:00.000 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_multi_panels_plots.py` (``multi_panels_plots.py``) | 00:00.000 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ -| :ref:`sphx_glr_auto_examples_utils_subject_to_mni.py` (``subject_to_mni.py``) | 00:00.000 | 0.0 MB | -+-------------------------------------------------------------------------------------------------------------------+-----------+--------+ +**00:39.512** total execution time for 8 files **from auto_examples/utils**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_index_volume.py` (``plot_roi_voxel_index_volume.py``) + - 00:22.996 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_mask.py` (``plot_roi_voxel_mask.py``) + - 00:08.659 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_get_roi_vertices.py` (``plot_get_roi_vertices.py``) + - 00:04.012 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_voxel_distance_from_surface.py` (``plot_voxel_distance_from_surface.py``) + - 00:03.643 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_mosaic.py` (``plot_mosaic.py``) + - 00:00.202 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_mni_to_subject.py` (``mni_to_subject.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_multi_panels_plots.py` (``multi_panels_plots.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_subject_to_mni.py` (``subject_to_mni.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/auto_examples/utils/subject_to_mni.rst.txt b/_sources/auto_examples/utils/subject_to_mni.rst.txt index f88618703..9dcf174be 100644 --- a/_sources/auto_examples/utils/subject_to_mni.rst.txt +++ b/_sources/auto_examples/utils/subject_to_mni.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -30,7 +30,7 @@ to MNI space, and how to apply that transform to a dataset. .. GENERATED FROM PYTHON SOURCE LINES 13-40 -.. code-block:: default +.. code-block:: Python import cortex @@ -54,37 +54,26 @@ to MNI space, and how to apply that transform to a dataset. mni_data = mni.transform_to_mni(data, s1_to_mni) # mni_data is a nibabel Nifti1Image - mni_data_vol = mni_data.get_data() # the actual array, shape=(182,218,182) + mni_data_vol = mni_data.get_fdata() # the actual array, shape=(182,218,182) # That was the manual method. pycortex can also cache these transforms for you # if you get them using the pycortex database s1_to_mni_db = cortex.db.get_mnixfm('S1', 'fullhead') # this is the same as s1_to_mni, but will return instantly on subsequent calls -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_utils_subject_to_mni.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: subject_to_mni.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: subject_to_mni.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: subject_to_mni.ipynb ` + :download:`Download Python source code: subject_to_mni.py ` .. only:: html diff --git a/_sources/auto_examples/webgl/dynamic_with_custom_template.rst.txt b/_sources/auto_examples/webgl/dynamic_with_custom_template.rst.txt index 20452d07d..33034e533 100644 --- a/_sources/auto_examples/webgl/dynamic_with_custom_template.rst.txt +++ b/_sources/auto_examples/webgl/dynamic_with_custom_template.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -63,7 +63,7 @@ the following css code: .. GENERATED FROM PYTHON SOURCE LINES 47-61 -.. code-block:: default +.. code-block:: Python import cortex @@ -81,30 +81,19 @@ the following css code: # the viewer can then be accessed in a web browser, in this case at "localhost:39140" # the viewer will display the modifications specified in the template -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_webgl_dynamic_with_custom_template.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: dynamic_with_custom_template.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: dynamic_with_custom_template.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: dynamic_with_custom_template.ipynb ` + :download:`Download Python source code: dynamic_with_custom_template.py ` .. only:: html diff --git a/_sources/auto_examples/webgl/index.rst.txt b/_sources/auto_examples/webgl/index.rst.txt new file mode 100644 index 000000000..b40550767 --- /dev/null +++ b/_sources/auto_examples/webgl/index.rst.txt @@ -0,0 +1,116 @@ + + +.. _sphx_glr_auto_examples_webgl: + +WebGL Examples +------------------------------ + +Examples demonstrating how to make beautiful interactive 3-D viewers + + + + +.. raw:: html + +
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_single_dataset_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_webgl_single_dataset.py` + +.. raw:: html + +
Create a 3D WebGL Viewer
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_static_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_webgl_static.py` + +.. raw:: html + +
Create a static viewer
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_dynamic_with_custom_template_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_webgl_dynamic_with_custom_template.py` + +.. raw:: html + +
Dynamic viewer with html template
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_static_with_custom_template_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_webgl_static_with_custom_template.py` + +.. raw:: html + +
Static viewer with html template
+
+ + +.. raw:: html + +
+ +.. only:: html + + .. image:: /auto_examples/webgl/images/thumb/sphx_glr_multiple_datasets_thumb.png + :alt: + + :ref:`sphx_glr_auto_examples_webgl_multiple_datasets.py` + +.. raw:: html + +
Create a 3D WebGL Viewer with Multiple Datasets
+
+ + +.. raw:: html + +
+ + +.. toctree:: + :hidden: + + /auto_examples/webgl/single_dataset + /auto_examples/webgl/static + /auto_examples/webgl/dynamic_with_custom_template + /auto_examples/webgl/static_with_custom_template + /auto_examples/webgl/multiple_datasets + diff --git a/_sources/auto_examples/webgl/multiple_datasets.rst.txt b/_sources/auto_examples/webgl/multiple_datasets.rst.txt index a5fae358b..d7d21afe9 100644 --- a/_sources/auto_examples/webgl/multiple_datasets.rst.txt +++ b/_sources/auto_examples/webgl/multiple_datasets.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -34,7 +34,7 @@ In the browser you can switch between datasets with the + and - keys .. GENERATED FROM PYTHON SOURCE LINES 17-38 -.. code-block:: default +.. code-block:: Python import cortex @@ -59,30 +59,19 @@ In the browser you can switch between datasets with the + and - keys # the viewer can then be accessed in a web browser, in this case at "localhost:39140" -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_webgl_multiple_datasets.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: multiple_datasets.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: multiple_datasets.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: multiple_datasets.ipynb ` + :download:`Download Python source code: multiple_datasets.py ` .. only:: html diff --git a/_sources/auto_examples/webgl/sg_execution_times.rst.txt b/_sources/auto_examples/webgl/sg_execution_times.rst.txt new file mode 100644 index 000000000..00957eaf8 --- /dev/null +++ b/_sources/auto_examples/webgl/sg_execution_times.rst.txt @@ -0,0 +1,49 @@ + +:orphan: + +.. _sphx_glr_auto_examples_webgl_sg_execution_times: + + +Computation times +================= +**00:00.000** total execution time for 5 files **from auto_examples/webgl**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_webgl_dynamic_with_custom_template.py` (``dynamic_with_custom_template.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_multiple_datasets.py` (``multiple_datasets.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_single_dataset.py` (``single_dataset.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_static.py` (``static.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_static_with_custom_template.py` (``static_with_custom_template.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/auto_examples/webgl/single_dataset.rst.txt b/_sources/auto_examples/webgl/single_dataset.rst.txt index 8615b2268..42429151d 100644 --- a/_sources/auto_examples/webgl/single_dataset.rst.txt +++ b/_sources/auto_examples/webgl/single_dataset.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -26,7 +26,7 @@ A webgl viewer displays a 3D view of brain data in a web browser .. GENERATED FROM PYTHON SOURCE LINES 9-23 -.. code-block:: default +.. code-block:: Python import cortex @@ -44,30 +44,19 @@ A webgl viewer displays a 3D view of brain data in a web browser # the viewer can then be accessed in a web browser, in this case at "localhost:39140" -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_webgl_single_dataset.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: single_dataset.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: single_dataset.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: single_dataset.ipynb ` + :download:`Download Python source code: single_dataset.py ` .. only:: html diff --git a/_sources/auto_examples/webgl/static.rst.txt b/_sources/auto_examples/webgl/static.rst.txt index 779a91790..0af66cf00 100644 --- a/_sources/auto_examples/webgl/static.rst.txt +++ b/_sources/auto_examples/webgl/static.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -30,7 +30,7 @@ The viewer directory must be hosted by a server such as nginx .. GENERATED FROM PYTHON SOURCE LINES 12-28 -.. code-block:: default +.. code-block:: Python import cortex @@ -50,30 +50,19 @@ The viewer directory must be hosted by a server such as nginx # a webserver such as nginx can then be used to host the static viewer -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_webgl_static.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: static.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: static.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: static.ipynb ` + :download:`Download Python source code: static.py ` .. only:: html diff --git a/_sources/auto_examples/webgl/static_with_custom_template.rst.txt b/_sources/auto_examples/webgl/static_with_custom_template.rst.txt index f229eab82..7384db5f5 100644 --- a/_sources/auto_examples/webgl/static_with_custom_template.rst.txt +++ b/_sources/auto_examples/webgl/static_with_custom_template.rst.txt @@ -10,7 +10,7 @@ .. note:: :class: sphx-glr-download-link-note - Click :ref:`here ` + :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title @@ -65,7 +65,7 @@ the following css code: .. GENERATED FROM PYTHON SOURCE LINES 49-66 -.. code-block:: default +.. code-block:: Python import cortex @@ -86,30 +86,19 @@ the following css code: # a webserver such as nginx can then be used to host the static viewer # with the new template -.. rst-class:: sphx-glr-timing - - **Total running time of the script:** ( 0 minutes 0.000 seconds) - - .. _sphx_glr_download_auto_examples_webgl_static_with_custom_template.py: +.. only:: html -.. only :: html - - .. container:: sphx-glr-footer - :class: sphx-glr-footer-example - - - - .. container:: sphx-glr-download sphx-glr-download-python - - :download:`Download Python source code: static_with_custom_template.py ` + .. container:: sphx-glr-footer sphx-glr-footer-example + .. container:: sphx-glr-download sphx-glr-download-jupyter + :download:`Download Jupyter notebook: static_with_custom_template.ipynb ` - .. container:: sphx-glr-download sphx-glr-download-jupyter + .. container:: sphx-glr-download sphx-glr-download-python - :download:`Download Jupyter notebook: static_with_custom_template.ipynb ` + :download:`Download Python source code: static_with_custom_template.py ` .. only:: html diff --git a/_sources/database.rst.txt b/_sources/database.rst.txt index e2b728df8..44be7a592 100644 --- a/_sources/database.rst.txt +++ b/_sources/database.rst.txt @@ -43,7 +43,7 @@ In order to plot cortical data for a subject, at least the fiducial and flat geo Accessing surfaces ~~~~~~~~~~~~~~~~~~ -Two methods exist for accessing the surface data once they are committed to the database: direct command access, or via a convienient tab completion interface. +Two methods exist for accessing the surface data once they are committed to the database: direct command access, or via a convenient tab completion interface. Command access ~~~~~~~~~~~~~~ @@ -109,7 +109,7 @@ Transformations in pycortex are stored as **affine** matrices encoded in magnet Each transform is stored in its own subdirectory containing two files: ``matrices.xfm``, and ``reference.nii.gz``. Masks are also stored in the transforms directory. -Transforms are saved as JSON-encoded text files. They have the format ``{subject}_{transform}.xfm``. There are four fields in this JSON structure: ``subject``, ``epifile``, ``coord``, ``magnet``. ``epifile`` gives the filename of the functional volume (EPI) that served as the reference for this transform. ``coord`` stores the transform from fiducial to coordinate space (for fast index lookups). ``magnet`` stores the transform from the fiducial to the magnet space, as defined in the return of ``nibabel.get_affine()``. +Transforms are saved as JSON-encoded text files. They have the format ``{subject}_{transform}.xfm``. There are four fields in this JSON structure: ``subject``, ``epifile``, ``coord``, ``magnet``. ``epifile`` gives the filename of the functional volume (EPI) that served as the reference for this transform. ``coord`` stores the transform from fiducial to coordinate space (for fast index lookups). ``magnet`` stores the transform from the fiducial to the magnet space, as defined in the return of ``nibabel.affine``. Reference volumes are typically in Nifti_ format (*.nii), but can be any format that nibabel_ understands. These are stored to ensure that we know what the reference for any transform was. This makes it possible to visually verify and tweak alignments as well as keep a static store of images for future coregistrations. diff --git a/_sources/generated/Vertex/cortex.dataset.Vertex.get_cmapdict.rst.txt b/_sources/generated/Vertex/cortex.dataset.Vertex.get_cmapdict.rst.txt new file mode 100644 index 000000000..409ff3aaf --- /dev/null +++ b/_sources/generated/Vertex/cortex.dataset.Vertex.get_cmapdict.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.Vertex.get\_cmapdict +=================================== + +.. currentmodule:: cortex.dataset + +.. automethod:: Vertex.get_cmapdict \ No newline at end of file diff --git a/_sources/generated/Vertex2D/cortex.dataset.Vertex2D.get_cmapdict.rst.txt b/_sources/generated/Vertex2D/cortex.dataset.Vertex2D.get_cmapdict.rst.txt new file mode 100644 index 000000000..8283b134f --- /dev/null +++ b/_sources/generated/Vertex2D/cortex.dataset.Vertex2D.get_cmapdict.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.Vertex2D.get\_cmapdict +===================================== + +.. currentmodule:: cortex.dataset + +.. automethod:: Vertex2D.get_cmapdict \ No newline at end of file diff --git a/_sources/generated/VertexRGB/cortex.dataset.VertexRGB.alpha.rst.txt b/_sources/generated/VertexRGB/cortex.dataset.VertexRGB.alpha.rst.txt new file mode 100644 index 000000000..6adccaa38 --- /dev/null +++ b/_sources/generated/VertexRGB/cortex.dataset.VertexRGB.alpha.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.VertexRGB.alpha +============================== + +.. currentmodule:: cortex.dataset + +.. autoproperty:: VertexRGB.alpha \ No newline at end of file diff --git a/_sources/generated/VertexRGB/cortex.dataset.VertexRGB.get_cmapdict.rst.txt b/_sources/generated/VertexRGB/cortex.dataset.VertexRGB.get_cmapdict.rst.txt new file mode 100644 index 000000000..df0c8366b --- /dev/null +++ b/_sources/generated/VertexRGB/cortex.dataset.VertexRGB.get_cmapdict.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.VertexRGB.get\_cmapdict +====================================== + +.. currentmodule:: cortex.dataset + +.. automethod:: VertexRGB.get_cmapdict \ No newline at end of file diff --git a/_sources/generated/Volume/cortex.dataset.Volume.get_cmapdict.rst.txt b/_sources/generated/Volume/cortex.dataset.Volume.get_cmapdict.rst.txt new file mode 100644 index 000000000..dbff2ab65 --- /dev/null +++ b/_sources/generated/Volume/cortex.dataset.Volume.get_cmapdict.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.Volume.get\_cmapdict +=================================== + +.. currentmodule:: cortex.dataset + +.. automethod:: Volume.get_cmapdict \ No newline at end of file diff --git a/_sources/generated/Volume2D/cortex.dataset.Volume2D.get_cmapdict.rst.txt b/_sources/generated/Volume2D/cortex.dataset.Volume2D.get_cmapdict.rst.txt new file mode 100644 index 000000000..4486c2566 --- /dev/null +++ b/_sources/generated/Volume2D/cortex.dataset.Volume2D.get_cmapdict.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.Volume2D.get\_cmapdict +===================================== + +.. currentmodule:: cortex.dataset + +.. automethod:: Volume2D.get_cmapdict \ No newline at end of file diff --git a/_sources/generated/VolumeRGB/cortex.dataset.VolumeRGB.alpha.rst.txt b/_sources/generated/VolumeRGB/cortex.dataset.VolumeRGB.alpha.rst.txt new file mode 100644 index 000000000..35d65ab86 --- /dev/null +++ b/_sources/generated/VolumeRGB/cortex.dataset.VolumeRGB.alpha.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.VolumeRGB.alpha +============================== + +.. currentmodule:: cortex.dataset + +.. autoproperty:: VolumeRGB.alpha \ No newline at end of file diff --git a/_sources/generated/VolumeRGB/cortex.dataset.VolumeRGB.get_cmapdict.rst.txt b/_sources/generated/VolumeRGB/cortex.dataset.VolumeRGB.get_cmapdict.rst.txt new file mode 100644 index 000000000..961e620da --- /dev/null +++ b/_sources/generated/VolumeRGB/cortex.dataset.VolumeRGB.get_cmapdict.rst.txt @@ -0,0 +1,6 @@ +cortex.dataset.VolumeRGB.get\_cmapdict +====================================== + +.. currentmodule:: cortex.dataset + +.. automethod:: VolumeRGB.get_cmapdict \ No newline at end of file diff --git a/_sources/generated/cortex.dataset.Vertex.rst.txt b/_sources/generated/cortex.dataset.Vertex.rst.txt index 75f46aafe..8930f63f9 100644 --- a/_sources/generated/cortex.dataset.Vertex.rst.txt +++ b/_sources/generated/cortex.dataset.Vertex.rst.txt @@ -19,6 +19,7 @@ ~Vertex.empty ~Vertex.exp ~Vertex.from_hdf + ~Vertex.get_cmapdict ~Vertex.map ~Vertex.random ~Vertex.to_json diff --git a/_sources/generated/cortex.dataset.Vertex2D.rst.txt b/_sources/generated/cortex.dataset.Vertex2D.rst.txt index aa5c808c3..3e91cb76d 100644 --- a/_sources/generated/cortex.dataset.Vertex2D.rst.txt +++ b/_sources/generated/cortex.dataset.Vertex2D.rst.txt @@ -17,6 +17,7 @@ ~Vertex2D.blend_curvature ~Vertex2D.copy ~Vertex2D.from_hdf + ~Vertex2D.get_cmapdict ~Vertex2D.to_json ~Vertex2D.uniques diff --git a/_sources/generated/cortex.dataset.VertexRGB.rst.txt b/_sources/generated/cortex.dataset.VertexRGB.rst.txt index 9aada55e9..4de14527d 100644 --- a/_sources/generated/cortex.dataset.VertexRGB.rst.txt +++ b/_sources/generated/cortex.dataset.VertexRGB.rst.txt @@ -17,6 +17,7 @@ ~VertexRGB.blend_curvature ~VertexRGB.copy ~VertexRGB.from_hdf + ~VertexRGB.get_cmapdict ~VertexRGB.to_json ~VertexRGB.uniques @@ -29,6 +30,7 @@ .. autosummary:: :toctree: VertexRGB + ~VertexRGB.alpha ~VertexRGB.left ~VertexRGB.name ~VertexRGB.priority diff --git a/_sources/generated/cortex.dataset.Volume.rst.txt b/_sources/generated/cortex.dataset.Volume.rst.txt index 6c74bb5c1..0247d388c 100644 --- a/_sources/generated/cortex.dataset.Volume.rst.txt +++ b/_sources/generated/cortex.dataset.Volume.rst.txt @@ -18,6 +18,7 @@ ~Volume.empty ~Volume.exp ~Volume.from_hdf + ~Volume.get_cmapdict ~Volume.map ~Volume.random ~Volume.save diff --git a/_sources/generated/cortex.dataset.Volume2D.rst.txt b/_sources/generated/cortex.dataset.Volume2D.rst.txt index 277a7e1f2..39f21f96d 100644 --- a/_sources/generated/cortex.dataset.Volume2D.rst.txt +++ b/_sources/generated/cortex.dataset.Volume2D.rst.txt @@ -16,6 +16,7 @@ ~Volume2D.__init__ ~Volume2D.copy ~Volume2D.from_hdf + ~Volume2D.get_cmapdict ~Volume2D.to_json ~Volume2D.uniques diff --git a/_sources/generated/cortex.dataset.VolumeRGB.rst.txt b/_sources/generated/cortex.dataset.VolumeRGB.rst.txt index 362e2f277..e07916088 100644 --- a/_sources/generated/cortex.dataset.VolumeRGB.rst.txt +++ b/_sources/generated/cortex.dataset.VolumeRGB.rst.txt @@ -17,6 +17,7 @@ ~VolumeRGB.color_voxels ~VolumeRGB.copy ~VolumeRGB.from_hdf + ~VolumeRGB.get_cmapdict ~VolumeRGB.to_json ~VolumeRGB.uniques @@ -29,6 +30,7 @@ .. autosummary:: :toctree: VolumeRGB + ~VolumeRGB.alpha ~VolumeRGB.name ~VolumeRGB.priority ~VolumeRGB.raw diff --git a/_sources/install.rst.txt b/_sources/install.rst.txt index 4d21ba2ac..e208b65da 100644 --- a/_sources/install.rst.txt +++ b/_sources/install.rst.txt @@ -14,7 +14,7 @@ If you wish to install the development version of pycortex, you can install it d To do so, replace the second install line above with the following:: # Install development version of pycortex from github - pip install -U git+git://github.com/gallantlab/pycortex.git + pip install -U git+https://github.com/gallantlab/pycortex.git Optional Dependencies --------------------- diff --git a/_sources/sg_execution_times.rst.txt b/_sources/sg_execution_times.rst.txt new file mode 100644 index 000000000..568276a08 --- /dev/null +++ b/_sources/sg_execution_times.rst.txt @@ -0,0 +1,166 @@ + +:orphan: + +.. _sphx_glr_sg_execution_times: + + +Computation times +================= +**05:44.549** total execution time for 44 files **from all galleries**: + +.. container:: + + .. raw:: html + + + + + + + + .. list-table:: + :header-rows: 1 + :class: table table-striped sg-datatable + + * - Example + - Time + - Mem (MB) + * - :ref:`sphx_glr_auto_examples_quickflat_plot_connected_vertices.py` (``../examples/quickflat/plot_connected_vertices.py``) + - 01:06.515 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_zoom_to_roi.py` (``../examples/quickflat/plot_zoom_to_roi.py``) + - 00:36.630 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_tissots_indicatrix.py` (``../examples/surface_analyses/plot_tissots_indicatrix.py``) + - 00:25.962 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_flatmap_distortion.py` (``../examples/surface_analyses/plot_flatmap_distortion.py``) + - 00:23.561 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_index_volume.py` (``../examples/utils/plot_roi_voxel_index_volume.py``) + - 00:22.996 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_subsurfaces.py` (``../examples/surface_analyses/plot_subsurfaces.py``) + - 00:19.551 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_dataset_arithmetic.py` (``../examples/datasets/plot_dataset_arithmetic.py``) + - 00:14.861 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_distance.py` (``../examples/surface_analyses/plot_geodesic_distance.py``) + - 00:14.610 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_interpolate_data.py` (``../examples/surface_analyses/plot_interpolate_data.py``) + - 00:11.818 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volumeRGB.py` (``../examples/datasets/plot_volumeRGB.py``) + - 00:11.075 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_gif.py` (``../examples/quickflat/plot_make_gif.py``) + - 00:09.046 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_roi_voxel_mask.py` (``../examples/utils/plot_roi_voxel_mask.py``) + - 00:08.659 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_figure.py` (``../examples/quickflat/plot_make_figure.py``) + - 00:08.499 + - 0.0 + * - :ref:`sphx_glr_auto_examples_surface_analyses_plot_geodesic_path.py` (``../examples/surface_analyses/plot_geodesic_path.py``) + - 00:07.153 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_sulci.py` (``../examples/quickflat/plot_sulci.py``) + - 00:07.101 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickstart_plot_retinotopy_flatmap.py` (``../examples/quickstart/plot_retinotopy_flatmap.py``) + - 00:05.836 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volume_to_vertex.py` (``../examples/datasets/plot_volume_to_vertex.py``) + - 00:05.438 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volume.py` (``../examples/datasets/plot_volume.py``) + - 00:04.868 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_volume2D.py` (``../examples/datasets/plot_volume2D.py``) + - 00:04.602 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_get_roi_vertices.py` (``../examples/utils/plot_get_roi_vertices.py``) + - 00:04.012 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_rois.py` (``../examples/quickflat/plot_rois.py``) + - 00:03.855 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_advanced_compositing.py` (``../examples/quickflat/plot_advanced_compositing.py``) + - 00:03.674 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_voxel_distance_from_surface.py` (``../examples/utils/plot_voxel_distance_from_surface.py``) + - 00:03.643 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_thickness_nanmean.py` (``../examples/quickflat/plot_thickness_nanmean.py``) + - 00:03.378 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_png.py` (``../examples/quickflat/plot_make_png.py``) + - 00:03.343 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_make_svg.py` (``../examples/quickflat/plot_make_svg.py``) + - 00:03.335 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_vertex.py` (``../examples/datasets/plot_vertex.py``) + - 00:03.304 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_dropout.py` (``../examples/quickflat/plot_dropout.py``) + - 00:02.353 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickflat_plot_cutouts.py` (``../examples/quickflat/plot_cutouts.py``) + - 00:01.811 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_vertex2D.py` (``../examples/datasets/plot_vertex2D.py``) + - 00:01.433 + - 0.0 + * - :ref:`sphx_glr_auto_examples_datasets_plot_vertexRGB.py` (``../examples/datasets/plot_vertexRGB.py``) + - 00:01.425 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_plot_mosaic.py` (``../examples/utils/plot_mosaic.py``) + - 00:00.202 + - 0.0 + * - :ref:`sphx_glr_auto_examples_fsaverage_upsample_to_fsaverage.py` (``../examples/fsaverage/upsample_to_fsaverage.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_import_surface_import_fmriprep.py` (``../examples/import_surface/import_fmriprep.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickstart_retinotopy_webgl.py` (``../examples/quickstart/retinotopy_webgl.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_quickstart_show_config.py` (``../examples/quickstart/show_config.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_mni_to_subject.py` (``../examples/utils/mni_to_subject.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_multi_panels_plots.py` (``../examples/utils/multi_panels_plots.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_utils_subject_to_mni.py` (``../examples/utils/subject_to_mni.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_dynamic_with_custom_template.py` (``../examples/webgl/dynamic_with_custom_template.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_multiple_datasets.py` (``../examples/webgl/multiple_datasets.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_single_dataset.py` (``../examples/webgl/single_dataset.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_static.py` (``../examples/webgl/static.py``) + - 00:00.000 + - 0.0 + * - :ref:`sphx_glr_auto_examples_webgl_static_with_custom_template.py` (``../examples/webgl/static_with_custom_template.py``) + - 00:00.000 + - 0.0 diff --git a/_sources/transforms.rst.txt b/_sources/transforms.rst.txt index e61b1b8ba..4fb41472c 100644 --- a/_sources/transforms.rst.txt +++ b/_sources/transforms.rst.txt @@ -6,7 +6,7 @@ pycortex includes a tool based on mayavi_ to do manual **affine** alignments. Pl * **Subject** : name of the subject, must match the surfaces used to create the transform * **Name** : A unique identifier for this transform - * **type** : The type of transform -- from fiducial to functional **magnet** space, or fiducial to **coord** inate space + * **type** : The type of transform -- from fiducial to functional **magnet** space, or fiducial to **coord** innate space * **epifile** : the filename of the functional data that the fiducial is aligned to Transforms always store the epifile in order to allow visual validation of alignment using the :module:`align` module. diff --git a/_sources/userguide/webgl.rst.txt b/_sources/userguide/webgl.rst.txt index da248b6c6..46c45b525 100644 --- a/_sources/userguide/webgl.rst.txt +++ b/_sources/userguide/webgl.rst.txt @@ -20,7 +20,7 @@ It is simple to post pycortex visualizations to a web page for public viewing. T Using the WebGL Viewer ---------------------- -There are two ways to create a WebGL viewer. A **dynamic viewer** is temporary viewer that is hosted by the pyhton process that generated it. A **static viewer** is a viewer that is saved permanently to disk and will persist beyond the lifetime of the python process. Using a static viewer requires hosting the created directory with a webserver such as nginx. +There are two ways to create a WebGL viewer. A **dynamic viewer** is temporary viewer that is hosted by the python process that generated it. A **static viewer** is a viewer that is saved permanently to disk and will persist beyond the lifetime of the python process. Using a static viewer requires hosting the created directory with a webserver such as nginx. Keyboard Shortcuts diff --git a/_static/alabaster.css b/_static/alabaster.css index 0eddaeb07..e3174bf93 100644 --- a/_static/alabaster.css +++ b/_static/alabaster.css @@ -69,6 +69,11 @@ div.relations { } +div.sphinxsidebar { + max-height: 100%; + overflow-y: auto; +} + div.sphinxsidebar a { color: #444; text-decoration: none; @@ -155,6 +160,14 @@ div.sphinxsidebar input { font-size: 1em; } +div.sphinxsidebar #searchbox input[type="text"] { + width: 160px; +} + +div.sphinxsidebar .search > div { + display: table-cell; +} + div.sphinxsidebar hr { border: none; height: 1px; @@ -419,7 +432,9 @@ table.footnote td { } dl { - margin: 0; + margin-left: 0; + margin-right: 0; + margin-top: 0; padding: 0; } @@ -636,15 +651,7 @@ a:hover tt, a:hover code { display: none!important; } -/* Make nested-list/multi-paragraph items look better in Releases changelog - * pages. Without this, docutils' magical list fuckery causes inconsistent - * formatting between different release sub-lists. - */ -div#changelog > div.section > ul > li > p:only-child { - margin-bottom: 0; -} - -/* Hide fugly table cell borders in ..bibliography:: directive output */ +/* Hide ugly table cell borders in ..bibliography:: directive output */ table.docutils.citation, table.docutils.citation td, table.docutils.citation th { border: none; /* Below needed in some edge cases; if not applied, bottom shadows appear */ diff --git a/_static/basic.css b/_static/basic.css index bf18350b6..e5179b7a9 100644 --- a/_static/basic.css +++ b/_static/basic.css @@ -4,7 +4,7 @@ * * Sphinx stylesheet -- basic theme. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ @@ -222,7 +222,7 @@ table.modindextable td { /* -- general body styles --------------------------------------------------- */ div.body { - min-width: 450px; + min-width: inherit; max-width: 800px; } @@ -237,14 +237,8 @@ a.headerlink { visibility: hidden; } -a.brackets:before, -span.brackets > a:before{ - content: "["; -} - -a.brackets:after, -span.brackets > a:after { - content: "]"; +a:visited { + color: #551A8B; } h1:hover > a.headerlink, @@ -335,12 +329,16 @@ p.sidebar-title { font-weight: bold; } +nav.contents, +aside.topic, div.admonition, div.topic, blockquote { clear: left; } /* -- topics ---------------------------------------------------------------- */ +nav.contents, +aside.topic, div.topic { border: 1px solid #ccc; padding: 7px; @@ -379,6 +377,8 @@ div.body p.centered { div.sidebar > :last-child, aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, div.topic > :last-child, div.admonition > :last-child { margin-bottom: 0; @@ -386,6 +386,8 @@ div.admonition > :last-child { div.sidebar::after, aside.sidebar::after, +nav.contents::after, +aside.topic::after, div.topic::after, div.admonition::after, blockquote::after { @@ -428,10 +430,6 @@ table.docutils td, table.docutils th { border-bottom: 1px solid #aaa; } -table.footnote td, table.footnote th { - border: 0 !important; -} - th { text-align: left; padding-right: 5px; @@ -615,19 +613,26 @@ ul.simple p { margin-bottom: 0; } -dl.footnote > dt, -dl.citation > dt { +aside.footnote > span, +div.citation > span { float: left; - margin-right: 0.5em; } - -dl.footnote > dd, -dl.citation > dd { +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { margin-bottom: 0em; } - -dl.footnote > dd:after, -dl.citation > dd:after { +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { content: ""; clear: both; } @@ -644,10 +649,6 @@ dl.field-list > dt { padding-right: 5px; } -dl.field-list > dt:after { - content: ":"; -} - dl.field-list > dd { padding-left: 0.5em; margin-top: 0em; @@ -673,6 +674,16 @@ dd { margin-left: 30px; } +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + dl > dd:last-child, dl > dd:last-child > :last-child { margin-bottom: 0; @@ -741,6 +752,14 @@ abbr, acronym { cursor: help; } +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + /* -- code displays --------------------------------------------------------- */ pre { diff --git a/_static/doctools.js b/_static/doctools.js index e1bfd708b..4d67807d1 100644 --- a/_static/doctools.js +++ b/_static/doctools.js @@ -2,357 +2,155 @@ * doctools.js * ~~~~~~~~~~~ * - * Sphinx JavaScript utilities for all documentation. + * Base JavaScript utilities for all Sphinx HTML documentation. * - * :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS. + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. * :license: BSD, see LICENSE for details. * */ - -/** - * select a different prefix for underscore - */ -$u = _.noConflict(); - -/** - * make the code below compatible with browsers without - * an installed firebug like debugger -if (!window.console || !console.firebug) { - var names = ["log", "debug", "info", "warn", "error", "assert", "dir", - "dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace", - "profile", "profileEnd"]; - window.console = {}; - for (var i = 0; i < names.length; ++i) - window.console[names[i]] = function() {}; -} - */ - -/** - * small helper function to urldecode strings - * - * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL - */ -jQuery.urldecode = function(x) { - if (!x) { - return x - } - return decodeURIComponent(x.replace(/\+/g, ' ')); -}; - -/** - * small helper function to urlencode strings - */ -jQuery.urlencode = encodeURIComponent; - -/** - * This function returns the parsed url parameters of the - * current request. Multiple values per key are supported, - * it will always return arrays of strings for the value parts. - */ -jQuery.getQueryParameters = function(s) { - if (typeof s === 'undefined') - s = document.location.search; - var parts = s.substr(s.indexOf('?') + 1).split('&'); - var result = {}; - for (var i = 0; i < parts.length; i++) { - var tmp = parts[i].split('=', 2); - var key = jQuery.urldecode(tmp[0]); - var value = jQuery.urldecode(tmp[1]); - if (key in result) - result[key].push(value); - else - result[key] = [value]; - } - return result; -}; - -/** - * highlight a given string on a jquery object by wrapping it in - * span elements with the given class name. - */ -jQuery.fn.highlightText = function(text, className) { - function highlight(node, addItems) { - if (node.nodeType === 3) { - var val = node.nodeValue; - var pos = val.toLowerCase().indexOf(text); - if (pos >= 0 && - !jQuery(node.parentNode).hasClass(className) && - !jQuery(node.parentNode).hasClass("nohighlight")) { - var span; - var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); - if (isInSVG) { - span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); - } else { - span = document.createElement("span"); - span.className = className; - } - span.appendChild(document.createTextNode(val.substr(pos, text.length))); - node.parentNode.insertBefore(span, node.parentNode.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling)); - node.nodeValue = val.substr(0, pos); - if (isInSVG) { - var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - var bbox = node.parentElement.getBBox(); - rect.x.baseVal.value = bbox.x; - rect.y.baseVal.value = bbox.y; - rect.width.baseVal.value = bbox.width; - rect.height.baseVal.value = bbox.height; - rect.setAttribute('class', className); - addItems.push({ - "parent": node.parentNode, - "target": rect}); - } - } - } - else if (!jQuery(node).is("button, select, textarea")) { - jQuery.each(node.childNodes, function() { - highlight(this, addItems); - }); - } - } - var addItems = []; - var result = this.each(function() { - highlight(this, addItems); - }); - for (var i = 0; i < addItems.length; ++i) { - jQuery(addItems[i].parent).before(addItems[i].target); +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); } - return result; }; -/* - * backward compatibility for jQuery.browser - * This will be supported until firefox bug is fixed. - */ -if (!jQuery.browser) { - jQuery.uaMatch = function(ua) { - ua = ua.toLowerCase(); - - var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || - /(webkit)[ \/]([\w.]+)/.exec(ua) || - /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || - /(msie) ([\w.]+)/.exec(ua) || - ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || - []; - - return { - browser: match[ 1 ] || "", - version: match[ 2 ] || "0" - }; - }; - jQuery.browser = {}; - jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; -} - /** * Small JavaScript module for the documentation. */ -var Documentation = { - - init : function() { - this.fixFirefoxAnchorBug(); - this.highlightSearchWords(); - this.initIndexTable(); - this.initOnKeyListeners(); +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); }, /** * i18n support */ - TRANSLATIONS : {}, - PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; }, - LOCALE : 'unknown', + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", // gettext and ngettext don't access this so that the functions // can safely bound to a different name (_ = Documentation.gettext) - gettext : function(string) { - var translated = Documentation.TRANSLATIONS[string]; - if (typeof translated === 'undefined') - return string; - return (typeof translated === 'string') ? translated : translated[0]; - }, - - ngettext : function(singular, plural, n) { - var translated = Documentation.TRANSLATIONS[singular]; - if (typeof translated === 'undefined') - return (n == 1) ? singular : plural; - return translated[Documentation.PLURALEXPR(n)]; - }, - - addTranslations : function(catalog) { - for (var key in catalog.messages) - this.TRANSLATIONS[key] = catalog.messages[key]; - this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')'); - this.LOCALE = catalog.locale; - }, - - /** - * add context elements like header anchor links - */ - addContextElements : function() { - $('div[id] > :header:first').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this headline')). - appendTo(this); - }); - $('dt[id]').each(function() { - $('\u00B6'). - attr('href', '#' + this.id). - attr('title', _('Permalink to this definition')). - appendTo(this); - }); - }, - - /** - * workaround a firefox stupidity - * see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075 - */ - fixFirefoxAnchorBug : function() { - if (document.location.hash && $.browser.mozilla) - window.setTimeout(function() { - document.location.href += ''; - }, 10); - }, - - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords : function() { - var params = $.getQueryParameters(); - var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : []; - if (terms.length) { - var body = $('div.body'); - if (!body.length) { - body = $('body'); - } - window.setTimeout(function() { - $.each(terms, function() { - body.highlightText(this.toLowerCase(), 'highlighted'); - }); - }, 10); - $('') - .appendTo($('#searchbox')); + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists } }, - /** - * init the domain index toggle buttons - */ - initIndexTable : function() { - var togglers = $('img.toggler').click(function() { - var src = $(this).attr('src'); - var idnum = $(this).attr('id').substr(7); - $('tr.cg-' + idnum).toggle(); - if (src.substr(-9) === 'minus.png') - $(this).attr('src', src.substr(0, src.length-9) + 'plus.png'); - else - $(this).attr('src', src.substr(0, src.length-8) + 'minus.png'); - }).css('display', ''); - if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) { - togglers.click(); - } + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; }, - /** - * helper function to hide the search marks again - */ - hideSearchWords : function() { - $('#searchbox .highlight-link').fadeOut(300); - $('span.highlighted').removeClass('highlighted'); - var url = new URL(window.location); - url.searchParams.delete('highlight'); - window.history.replaceState({}, '', url); + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; }, - /** + /** * helper function to focus on search bar */ - focusSearchBar : function() { - $('input[name=q]').first().focus(); + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); }, /** - * make the url absolute + * Initialise the domain index toggle buttons */ - makeURL : function(relativeURL) { - return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL; - }, + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; - /** - * get the current relative url - */ - getCurrentURL : function() { - var path = document.location.pathname; - var parts = path.split(/\//); - $.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() { - if (this === '..') - parts.pop(); - }); - var url = parts.join('/'); - return path.substring(url.lastIndexOf('/') + 1, path.length - 1); + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); }, - initOnKeyListeners: function() { + initOnKeyListeners: () => { // only install a listener if it is really needed - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && - !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - return; - - $(document).keydown(function(event) { - var activeElementType = document.activeElement.tagName; - // don't navigate when in search box, textarea, dropdown or button - if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT' - && activeElementType !== 'BUTTON') { - if (event.altKey || event.ctrlKey || event.metaKey) - return; - - if (!event.shiftKey) { - switch (event.key) { - case 'ArrowLeft': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var prevHref = $('link[rel="prev"]').prop('href'); - if (prevHref) { - window.location.href = prevHref; - return false; - } - break; - case 'ArrowRight': - if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) - break; - var nextHref = $('link[rel="next"]').prop('href'); - if (nextHref) { - window.location.href = nextHref; - return false; - } - break; - case 'Escape': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.hideSearchWords(); - return false; - } - } - - // some keyboard layouts may need Shift to get / + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { switch (event.key) { - case '/': - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) - break; - Documentation.focusSearchBar(); - return false; + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; } } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } }); - } + }, }; // quick alias for translations -_ = Documentation.gettext; +const _ = Documentation.gettext; -$(document).ready(function() { - Documentation.init(); -}); +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js index 62e970da4..c60288528 100644 --- a/_static/documentation_options.js +++ b/_static/documentation_options.js @@ -1,7 +1,6 @@ -var DOCUMENTATION_OPTIONS = { - URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), - VERSION: '1.2.4', - LANGUAGE: 'None', +const DOCUMENTATION_OPTIONS = { + VERSION: '1.2.8', + LANGUAGE: 'en', COLLAPSE_INDEX: false, BUILDER: 'html', FILE_SUFFIX: '.html', diff --git a/_static/jquery-3.5.1.js b/_static/jquery-3.5.1.js deleted file mode 100644 index 50937333b..000000000 --- a/_static/jquery-3.5.1.js +++ /dev/null @@ -1,10872 +0,0 @@ -/*! - * jQuery JavaScript Library v3.5.1 - * https://jquery.com/ - * - * Includes Sizzle.js - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://jquery.org/license - * - * Date: 2020-05-04T22:49Z - */ -( function( global, factory ) { - - "use strict"; - - if ( typeof module === "object" && typeof module.exports === "object" ) { - - // For CommonJS and CommonJS-like environments where a proper `window` - // is present, execute the factory and get jQuery. - // For environments that do not have a `window` with a `document` - // (such as Node.js), expose a factory as module.exports. - // This accentuates the need for the creation of a real `window`. - // e.g. var jQuery = require("jquery")(window); - // See ticket #14549 for more info. - module.exports = global.document ? - factory( global, true ) : - function( w ) { - if ( !w.document ) { - throw new Error( "jQuery requires a window with a document" ); - } - return factory( w ); - }; - } else { - factory( global ); - } - -// Pass this if window is not defined yet -} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { - -// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 -// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode -// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common -// enough that all such attempts are guarded in a try block. -"use strict"; - -var arr = []; - -var getProto = Object.getPrototypeOf; - -var slice = arr.slice; - -var flat = arr.flat ? function( array ) { - return arr.flat.call( array ); -} : function( array ) { - return arr.concat.apply( [], array ); -}; - - -var push = arr.push; - -var indexOf = arr.indexOf; - -var class2type = {}; - -var toString = class2type.toString; - -var hasOwn = class2type.hasOwnProperty; - -var fnToString = hasOwn.toString; - -var ObjectFunctionString = fnToString.call( Object ); - -var support = {}; - -var isFunction = function isFunction( obj ) { - - // Support: Chrome <=57, Firefox <=52 - // In some browsers, typeof returns "function" for HTML elements - // (i.e., `typeof document.createElement( "object" ) === "function"`). - // We don't want to classify *any* DOM node as a function. - return typeof obj === "function" && typeof obj.nodeType !== "number"; - }; - - -var isWindow = function isWindow( obj ) { - return obj != null && obj === obj.window; - }; - - -var document = window.document; - - - - var preservedScriptAttributes = { - type: true, - src: true, - nonce: true, - noModule: true - }; - - function DOMEval( code, node, doc ) { - doc = doc || document; - - var i, val, - script = doc.createElement( "script" ); - - script.text = code; - if ( node ) { - for ( i in preservedScriptAttributes ) { - - // Support: Firefox 64+, Edge 18+ - // Some browsers don't support the "nonce" property on scripts. - // On the other hand, just using `getAttribute` is not enough as - // the `nonce` attribute is reset to an empty string whenever it - // becomes browsing-context connected. - // See https://github.com/whatwg/html/issues/2369 - // See https://html.spec.whatwg.org/#nonce-attributes - // The `node.getAttribute` check was added for the sake of - // `jQuery.globalEval` so that it can fake a nonce-containing node - // via an object. - val = node[ i ] || node.getAttribute && node.getAttribute( i ); - if ( val ) { - script.setAttribute( i, val ); - } - } - } - doc.head.appendChild( script ).parentNode.removeChild( script ); - } - - -function toType( obj ) { - if ( obj == null ) { - return obj + ""; - } - - // Support: Android <=2.3 only (functionish RegExp) - return typeof obj === "object" || typeof obj === "function" ? - class2type[ toString.call( obj ) ] || "object" : - typeof obj; -} -/* global Symbol */ -// Defining this global in .eslintrc.json would create a danger of using the global -// unguarded in another place, it seems safer to define global only for this module - - - -var - version = "3.5.1", - - // Define a local copy of jQuery - jQuery = function( selector, context ) { - - // The jQuery object is actually just the init constructor 'enhanced' - // Need init if jQuery is called (just allow error to be thrown if not included) - return new jQuery.fn.init( selector, context ); - }; - -jQuery.fn = jQuery.prototype = { - - // The current version of jQuery being used - jquery: version, - - constructor: jQuery, - - // The default length of a jQuery object is 0 - length: 0, - - toArray: function() { - return slice.call( this ); - }, - - // Get the Nth element in the matched element set OR - // Get the whole matched element set as a clean array - get: function( num ) { - - // Return all the elements in a clean array - if ( num == null ) { - return slice.call( this ); - } - - // Return just the one element from the set - return num < 0 ? this[ num + this.length ] : this[ num ]; - }, - - // Take an array of elements and push it onto the stack - // (returning the new matched element set) - pushStack: function( elems ) { - - // Build a new jQuery matched element set - var ret = jQuery.merge( this.constructor(), elems ); - - // Add the old object onto the stack (as a reference) - ret.prevObject = this; - - // Return the newly-formed element set - return ret; - }, - - // Execute a callback for every element in the matched set. - each: function( callback ) { - return jQuery.each( this, callback ); - }, - - map: function( callback ) { - return this.pushStack( jQuery.map( this, function( elem, i ) { - return callback.call( elem, i, elem ); - } ) ); - }, - - slice: function() { - return this.pushStack( slice.apply( this, arguments ) ); - }, - - first: function() { - return this.eq( 0 ); - }, - - last: function() { - return this.eq( -1 ); - }, - - even: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return ( i + 1 ) % 2; - } ) ); - }, - - odd: function() { - return this.pushStack( jQuery.grep( this, function( _elem, i ) { - return i % 2; - } ) ); - }, - - eq: function( i ) { - var len = this.length, - j = +i + ( i < 0 ? len : 0 ); - return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); - }, - - end: function() { - return this.prevObject || this.constructor(); - }, - - // For internal use only. - // Behaves like an Array's method, not like a jQuery method. - push: push, - sort: arr.sort, - splice: arr.splice -}; - -jQuery.extend = jQuery.fn.extend = function() { - var options, name, src, copy, copyIsArray, clone, - target = arguments[ 0 ] || {}, - i = 1, - length = arguments.length, - deep = false; - - // Handle a deep copy situation - if ( typeof target === "boolean" ) { - deep = target; - - // Skip the boolean and the target - target = arguments[ i ] || {}; - i++; - } - - // Handle case when target is a string or something (possible in deep copy) - if ( typeof target !== "object" && !isFunction( target ) ) { - target = {}; - } - - // Extend jQuery itself if only one argument is passed - if ( i === length ) { - target = this; - i--; - } - - for ( ; i < length; i++ ) { - - // Only deal with non-null/undefined values - if ( ( options = arguments[ i ] ) != null ) { - - // Extend the base object - for ( name in options ) { - copy = options[ name ]; - - // Prevent Object.prototype pollution - // Prevent never-ending loop - if ( name === "__proto__" || target === copy ) { - continue; - } - - // Recurse if we're merging plain objects or arrays - if ( deep && copy && ( jQuery.isPlainObject( copy ) || - ( copyIsArray = Array.isArray( copy ) ) ) ) { - src = target[ name ]; - - // Ensure proper type for the source value - if ( copyIsArray && !Array.isArray( src ) ) { - clone = []; - } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { - clone = {}; - } else { - clone = src; - } - copyIsArray = false; - - // Never move original objects, clone them - target[ name ] = jQuery.extend( deep, clone, copy ); - - // Don't bring in undefined values - } else if ( copy !== undefined ) { - target[ name ] = copy; - } - } - } - } - - // Return the modified object - return target; -}; - -jQuery.extend( { - - // Unique for each copy of jQuery on the page - expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), - - // Assume jQuery is ready without the ready module - isReady: true, - - error: function( msg ) { - throw new Error( msg ); - }, - - noop: function() {}, - - isPlainObject: function( obj ) { - var proto, Ctor; - - // Detect obvious negatives - // Use toString instead of jQuery.type to catch host objects - if ( !obj || toString.call( obj ) !== "[object Object]" ) { - return false; - } - - proto = getProto( obj ); - - // Objects with no prototype (e.g., `Object.create( null )`) are plain - if ( !proto ) { - return true; - } - - // Objects with prototype are plain iff they were constructed by a global Object function - Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; - return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; - }, - - isEmptyObject: function( obj ) { - var name; - - for ( name in obj ) { - return false; - } - return true; - }, - - // Evaluates a script in a provided context; falls back to the global one - // if not specified. - globalEval: function( code, options, doc ) { - DOMEval( code, { nonce: options && options.nonce }, doc ); - }, - - each: function( obj, callback ) { - var length, i = 0; - - if ( isArrayLike( obj ) ) { - length = obj.length; - for ( ; i < length; i++ ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } else { - for ( i in obj ) { - if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { - break; - } - } - } - - return obj; - }, - - // results is for internal usage only - makeArray: function( arr, results ) { - var ret = results || []; - - if ( arr != null ) { - if ( isArrayLike( Object( arr ) ) ) { - jQuery.merge( ret, - typeof arr === "string" ? - [ arr ] : arr - ); - } else { - push.call( ret, arr ); - } - } - - return ret; - }, - - inArray: function( elem, arr, i ) { - return arr == null ? -1 : indexOf.call( arr, elem, i ); - }, - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - merge: function( first, second ) { - var len = +second.length, - j = 0, - i = first.length; - - for ( ; j < len; j++ ) { - first[ i++ ] = second[ j ]; - } - - first.length = i; - - return first; - }, - - grep: function( elems, callback, invert ) { - var callbackInverse, - matches = [], - i = 0, - length = elems.length, - callbackExpect = !invert; - - // Go through the array, only saving the items - // that pass the validator function - for ( ; i < length; i++ ) { - callbackInverse = !callback( elems[ i ], i ); - if ( callbackInverse !== callbackExpect ) { - matches.push( elems[ i ] ); - } - } - - return matches; - }, - - // arg is for internal usage only - map: function( elems, callback, arg ) { - var length, value, - i = 0, - ret = []; - - // Go through the array, translating each of the items to their new values - if ( isArrayLike( elems ) ) { - length = elems.length; - for ( ; i < length; i++ ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - - // Go through every key on the object, - } else { - for ( i in elems ) { - value = callback( elems[ i ], i, arg ); - - if ( value != null ) { - ret.push( value ); - } - } - } - - // Flatten any nested arrays - return flat( ret ); - }, - - // A global GUID counter for objects - guid: 1, - - // jQuery.support is not used in Core but other projects attach their - // properties to it so it needs to exist. - support: support -} ); - -if ( typeof Symbol === "function" ) { - jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; -} - -// Populate the class2type map -jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), -function( _i, name ) { - class2type[ "[object " + name + "]" ] = name.toLowerCase(); -} ); - -function isArrayLike( obj ) { - - // Support: real iOS 8.2 only (not reproducible in simulator) - // `in` check used to prevent JIT error (gh-2145) - // hasOwn isn't used here due to false negatives - // regarding Nodelist length in IE - var length = !!obj && "length" in obj && obj.length, - type = toType( obj ); - - if ( isFunction( obj ) || isWindow( obj ) ) { - return false; - } - - return type === "array" || length === 0 || - typeof length === "number" && length > 0 && ( length - 1 ) in obj; -} -var Sizzle = -/*! - * Sizzle CSS Selector Engine v2.3.5 - * https://sizzlejs.com/ - * - * Copyright JS Foundation and other contributors - * Released under the MIT license - * https://js.foundation/ - * - * Date: 2020-03-14 - */ -( function( window ) { -var i, - support, - Expr, - getText, - isXML, - tokenize, - compile, - select, - outermostContext, - sortInput, - hasDuplicate, - - // Local document vars - setDocument, - document, - docElem, - documentIsHTML, - rbuggyQSA, - rbuggyMatches, - matches, - contains, - - // Instance-specific data - expando = "sizzle" + 1 * new Date(), - preferredDoc = window.document, - dirruns = 0, - done = 0, - classCache = createCache(), - tokenCache = createCache(), - compilerCache = createCache(), - nonnativeSelectorCache = createCache(), - sortOrder = function( a, b ) { - if ( a === b ) { - hasDuplicate = true; - } - return 0; - }, - - // Instance methods - hasOwn = ( {} ).hasOwnProperty, - arr = [], - pop = arr.pop, - pushNative = arr.push, - push = arr.push, - slice = arr.slice, - - // Use a stripped-down indexOf as it's faster than native - // https://jsperf.com/thor-indexof-vs-for/5 - indexOf = function( list, elem ) { - var i = 0, - len = list.length; - for ( ; i < len; i++ ) { - if ( list[ i ] === elem ) { - return i; - } - } - return -1; - }, - - booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|" + - "ismap|loop|multiple|open|readonly|required|scoped", - - // Regular expressions - - // http://www.w3.org/TR/css3-selectors/#whitespace - whitespace = "[\\x20\\t\\r\\n\\f]", - - // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram - identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + - "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", - - // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors - attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + - - // Operator (capture 2) - "*([*^$|!~]?=)" + whitespace + - - // "Attribute values must be CSS identifiers [capture 5] - // or strings [capture 3 or capture 4]" - "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + - whitespace + "*\\]", - - pseudos = ":(" + identifier + ")(?:\\((" + - - // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: - // 1. quoted (capture 3; capture 4 or capture 5) - "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + - - // 2. simple (capture 6) - "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + - - // 3. anything else (capture 2) - ".*" + - ")\\)|)", - - // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter - rwhitespace = new RegExp( whitespace + "+", "g" ), - rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + - whitespace + "+$", "g" ), - - rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), - rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + - "*" ), - rdescend = new RegExp( whitespace + "|>" ), - - rpseudo = new RegExp( pseudos ), - ridentifier = new RegExp( "^" + identifier + "$" ), - - matchExpr = { - "ID": new RegExp( "^#(" + identifier + ")" ), - "CLASS": new RegExp( "^\\.(" + identifier + ")" ), - "TAG": new RegExp( "^(" + identifier + "|[*])" ), - "ATTR": new RegExp( "^" + attributes ), - "PSEUDO": new RegExp( "^" + pseudos ), - "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + - whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + - whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), - "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), - - // For use in libraries implementing .is() - // We use this for POS matching in `select` - "needsContext": new RegExp( "^" + whitespace + - "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + - "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) - }, - - rhtml = /HTML$/i, - rinputs = /^(?:input|select|textarea|button)$/i, - rheader = /^h\d$/i, - - rnative = /^[^{]+\{\s*\[native \w/, - - // Easily-parseable/retrievable ID or TAG or CLASS selectors - rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - - rsibling = /[+~]/, - - // CSS escapes - // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters - runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + "?|\\\\([^\\r\\n\\f])", "g" ), - funescape = function( escape, nonHex ) { - var high = "0x" + escape.slice( 1 ) - 0x10000; - - return nonHex ? - - // Strip the backslash prefix from a non-hex escape sequence - nonHex : - - // Replace a hexadecimal escape sequence with the encoded Unicode code point - // Support: IE <=11+ - // For values outside the Basic Multilingual Plane (BMP), manually construct a - // surrogate pair - high < 0 ? - String.fromCharCode( high + 0x10000 ) : - String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); - }, - - // CSS string/identifier serialization - // https://drafts.csswg.org/cssom/#common-serializing-idioms - rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - fcssescape = function( ch, asCodePoint ) { - if ( asCodePoint ) { - - // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER - if ( ch === "\0" ) { - return "\uFFFD"; - } - - // Control characters and (dependent upon position) numbers get escaped as code points - return ch.slice( 0, -1 ) + "\\" + - ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; - } - - // Other potentially-special ASCII characters get backslash-escaped - return "\\" + ch; - }, - - // Used for iframes - // See setDocument() - // Removing the function wrapper causes a "Permission Denied" - // error in IE - unloadHandler = function() { - setDocument(); - }, - - inDisabledFieldset = addCombinator( - function( elem ) { - return elem.disabled === true && elem.nodeName.toLowerCase() === "fieldset"; - }, - { dir: "parentNode", next: "legend" } - ); - -// Optimize for push.apply( _, NodeList ) -try { - push.apply( - ( arr = slice.call( preferredDoc.childNodes ) ), - preferredDoc.childNodes - ); - - // Support: Android<4.0 - // Detect silently failing push.apply - // eslint-disable-next-line no-unused-expressions - arr[ preferredDoc.childNodes.length ].nodeType; -} catch ( e ) { - push = { apply: arr.length ? - - // Leverage slice if possible - function( target, els ) { - pushNative.apply( target, slice.call( els ) ); - } : - - // Support: IE<9 - // Otherwise append directly - function( target, els ) { - var j = target.length, - i = 0; - - // Can't trust NodeList.length - while ( ( target[ j++ ] = els[ i++ ] ) ) {} - target.length = j - 1; - } - }; -} - -function Sizzle( selector, context, results, seed ) { - var m, i, elem, nid, match, groups, newSelector, - newContext = context && context.ownerDocument, - - // nodeType defaults to 9, since context defaults to document - nodeType = context ? context.nodeType : 9; - - results = results || []; - - // Return early from calls with invalid selector or context - if ( typeof selector !== "string" || !selector || - nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { - - return results; - } - - // Try to shortcut find operations (as opposed to filters) in HTML documents - if ( !seed ) { - setDocument( context ); - context = context || document; - - if ( documentIsHTML ) { - - // If the selector is sufficiently simple, try using a "get*By*" DOM method - // (excepting DocumentFragment context, where the methods don't exist) - if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { - - // ID selector - if ( ( m = match[ 1 ] ) ) { - - // Document context - if ( nodeType === 9 ) { - if ( ( elem = context.getElementById( m ) ) ) { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( elem.id === m ) { - results.push( elem ); - return results; - } - } else { - return results; - } - - // Element context - } else { - - // Support: IE, Opera, Webkit - // TODO: identify versions - // getElementById can match elements by name instead of ID - if ( newContext && ( elem = newContext.getElementById( m ) ) && - contains( context, elem ) && - elem.id === m ) { - - results.push( elem ); - return results; - } - } - - // Type selector - } else if ( match[ 2 ] ) { - push.apply( results, context.getElementsByTagName( selector ) ); - return results; - - // Class selector - } else if ( ( m = match[ 3 ] ) && support.getElementsByClassName && - context.getElementsByClassName ) { - - push.apply( results, context.getElementsByClassName( m ) ); - return results; - } - } - - // Take advantage of querySelectorAll - if ( support.qsa && - !nonnativeSelectorCache[ selector + " " ] && - ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) && - - // Support: IE 8 only - // Exclude object elements - ( nodeType !== 1 || context.nodeName.toLowerCase() !== "object" ) ) { - - newSelector = selector; - newContext = context; - - // qSA considers elements outside a scoping root when evaluating child or - // descendant combinators, which is not what we want. - // In such cases, we work around the behavior by prefixing every selector in the - // list with an ID selector referencing the scope context. - // The technique has to be used as well when a leading combinator is used - // as such selectors are not recognized by querySelectorAll. - // Thanks to Andrew Dupont for this technique. - if ( nodeType === 1 && - ( rdescend.test( selector ) || rcombinators.test( selector ) ) ) { - - // Expand context for sibling selectors - newContext = rsibling.test( selector ) && testContext( context.parentNode ) || - context; - - // We can use :scope instead of the ID hack if the browser - // supports it & if we're not changing the context. - if ( newContext !== context || !support.scope ) { - - // Capture the context ID, setting it first if necessary - if ( ( nid = context.getAttribute( "id" ) ) ) { - nid = nid.replace( rcssescape, fcssescape ); - } else { - context.setAttribute( "id", ( nid = expando ) ); - } - } - - // Prefix every selector in the list - groups = tokenize( selector ); - i = groups.length; - while ( i-- ) { - groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + - toSelector( groups[ i ] ); - } - newSelector = groups.join( "," ); - } - - try { - push.apply( results, - newContext.querySelectorAll( newSelector ) - ); - return results; - } catch ( qsaError ) { - nonnativeSelectorCache( selector, true ); - } finally { - if ( nid === expando ) { - context.removeAttribute( "id" ); - } - } - } - } - } - - // All others - return select( selector.replace( rtrim, "$1" ), context, results, seed ); -} - -/** - * Create key-value caches of limited size - * @returns {function(string, object)} Returns the Object data after storing it on itself with - * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) - * deleting the oldest entry - */ -function createCache() { - var keys = []; - - function cache( key, value ) { - - // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) - if ( keys.push( key + " " ) > Expr.cacheLength ) { - - // Only keep the most recent entries - delete cache[ keys.shift() ]; - } - return ( cache[ key + " " ] = value ); - } - return cache; -} - -/** - * Mark a function for special use by Sizzle - * @param {Function} fn The function to mark - */ -function markFunction( fn ) { - fn[ expando ] = true; - return fn; -} - -/** - * Support testing using an element - * @param {Function} fn Passed the created element and returns a boolean result - */ -function assert( fn ) { - var el = document.createElement( "fieldset" ); - - try { - return !!fn( el ); - } catch ( e ) { - return false; - } finally { - - // Remove from its parent by default - if ( el.parentNode ) { - el.parentNode.removeChild( el ); - } - - // release memory in IE - el = null; - } -} - -/** - * Adds the same handler for all of the specified attrs - * @param {String} attrs Pipe-separated list of attributes - * @param {Function} handler The method that will be applied - */ -function addHandle( attrs, handler ) { - var arr = attrs.split( "|" ), - i = arr.length; - - while ( i-- ) { - Expr.attrHandle[ arr[ i ] ] = handler; - } -} - -/** - * Checks document order of two siblings - * @param {Element} a - * @param {Element} b - * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b - */ -function siblingCheck( a, b ) { - var cur = b && a, - diff = cur && a.nodeType === 1 && b.nodeType === 1 && - a.sourceIndex - b.sourceIndex; - - // Use IE sourceIndex if available on both nodes - if ( diff ) { - return diff; - } - - // Check if b follows a - if ( cur ) { - while ( ( cur = cur.nextSibling ) ) { - if ( cur === b ) { - return -1; - } - } - } - - return a ? 1 : -1; -} - -/** - * Returns a function to use in pseudos for input types - * @param {String} type - */ -function createInputPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for buttons - * @param {String} type - */ -function createButtonPseudo( type ) { - return function( elem ) { - var name = elem.nodeName.toLowerCase(); - return ( name === "input" || name === "button" ) && elem.type === type; - }; -} - -/** - * Returns a function to use in pseudos for :enabled/:disabled - * @param {Boolean} disabled true for :disabled; false for :enabled - */ -function createDisabledPseudo( disabled ) { - - // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable - return function( elem ) { - - // Only certain elements can match :enabled or :disabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled - // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled - if ( "form" in elem ) { - - // Check for inherited disabledness on relevant non-disabled elements: - // * listed form-associated elements in a disabled fieldset - // https://html.spec.whatwg.org/multipage/forms.html#category-listed - // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled - // * option elements in a disabled optgroup - // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled - // All such elements have a "form" property. - if ( elem.parentNode && elem.disabled === false ) { - - // Option elements defer to a parent optgroup if present - if ( "label" in elem ) { - if ( "label" in elem.parentNode ) { - return elem.parentNode.disabled === disabled; - } else { - return elem.disabled === disabled; - } - } - - // Support: IE 6 - 11 - // Use the isDisabled shortcut property to check for disabled fieldset ancestors - return elem.isDisabled === disabled || - - // Where there is no isDisabled, check manually - /* jshint -W018 */ - elem.isDisabled !== !disabled && - inDisabledFieldset( elem ) === disabled; - } - - return elem.disabled === disabled; - - // Try to winnow out elements that can't be disabled before trusting the disabled property. - // Some victims get caught in our net (label, legend, menu, track), but it shouldn't - // even exist on them, let alone have a boolean value. - } else if ( "label" in elem ) { - return elem.disabled === disabled; - } - - // Remaining elements are neither :enabled nor :disabled - return false; - }; -} - -/** - * Returns a function to use in pseudos for positionals - * @param {Function} fn - */ -function createPositionalPseudo( fn ) { - return markFunction( function( argument ) { - argument = +argument; - return markFunction( function( seed, matches ) { - var j, - matchIndexes = fn( [], seed.length, argument ), - i = matchIndexes.length; - - // Match elements found at the specified indexes - while ( i-- ) { - if ( seed[ ( j = matchIndexes[ i ] ) ] ) { - seed[ j ] = !( matches[ j ] = seed[ j ] ); - } - } - } ); - } ); -} - -/** - * Checks a node for validity as a Sizzle context - * @param {Element|Object=} context - * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value - */ -function testContext( context ) { - return context && typeof context.getElementsByTagName !== "undefined" && context; -} - -// Expose support vars for convenience -support = Sizzle.support = {}; - -/** - * Detects XML nodes - * @param {Element|Object} elem An element or a document - * @returns {Boolean} True iff elem is a non-HTML XML node - */ -isXML = Sizzle.isXML = function( elem ) { - var namespace = elem.namespaceURI, - docElem = ( elem.ownerDocument || elem ).documentElement; - - // Support: IE <=8 - // Assume HTML when documentElement doesn't yet exist, such as inside loading iframes - // https://bugs.jquery.com/ticket/4833 - return !rhtml.test( namespace || docElem && docElem.nodeName || "HTML" ); -}; - -/** - * Sets document-related variables once based on the current document - * @param {Element|Object} [doc] An element or document object to use to set the document - * @returns {Object} Returns the current document - */ -setDocument = Sizzle.setDocument = function( node ) { - var hasCompare, subWindow, - doc = node ? node.ownerDocument || node : preferredDoc; - - // Return early if doc is invalid or already selected - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { - return document; - } - - // Update global variables - document = doc; - docElem = document.documentElement; - documentIsHTML = !isXML( document ); - - // Support: IE 9 - 11+, Edge 12 - 18+ - // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( preferredDoc != document && - ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { - - // Support: IE 11, Edge - if ( subWindow.addEventListener ) { - subWindow.addEventListener( "unload", unloadHandler, false ); - - // Support: IE 9 - 10 only - } else if ( subWindow.attachEvent ) { - subWindow.attachEvent( "onunload", unloadHandler ); - } - } - - // Support: IE 8 - 11+, Edge 12 - 18+, Chrome <=16 - 25 only, Firefox <=3.6 - 31 only, - // Safari 4 - 5 only, Opera <=11.6 - 12.x only - // IE/Edge & older browsers don't support the :scope pseudo-class. - // Support: Safari 6.0 only - // Safari 6.0 supports :scope but it's an alias of :root there. - support.scope = assert( function( el ) { - docElem.appendChild( el ).appendChild( document.createElement( "div" ) ); - return typeof el.querySelectorAll !== "undefined" && - !el.querySelectorAll( ":scope fieldset div" ).length; - } ); - - /* Attributes - ---------------------------------------------------------------------- */ - - // Support: IE<8 - // Verify that getAttribute really returns attributes and not properties - // (excepting IE8 booleans) - support.attributes = assert( function( el ) { - el.className = "i"; - return !el.getAttribute( "className" ); - } ); - - /* getElement(s)By* - ---------------------------------------------------------------------- */ - - // Check if getElementsByTagName("*") returns only elements - support.getElementsByTagName = assert( function( el ) { - el.appendChild( document.createComment( "" ) ); - return !el.getElementsByTagName( "*" ).length; - } ); - - // Support: IE<9 - support.getElementsByClassName = rnative.test( document.getElementsByClassName ); - - // Support: IE<10 - // Check if getElementById returns elements by name - // The broken getElementById methods don't pick up programmatically-set names, - // so use a roundabout getElementsByName test - support.getById = assert( function( el ) { - docElem.appendChild( el ).id = expando; - return !document.getElementsByName || !document.getElementsByName( expando ).length; - } ); - - // ID filter and find - if ( support.getById ) { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - return elem.getAttribute( "id" ) === attrId; - }; - }; - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var elem = context.getElementById( id ); - return elem ? [ elem ] : []; - } - }; - } else { - Expr.filter[ "ID" ] = function( id ) { - var attrId = id.replace( runescape, funescape ); - return function( elem ) { - var node = typeof elem.getAttributeNode !== "undefined" && - elem.getAttributeNode( "id" ); - return node && node.value === attrId; - }; - }; - - // Support: IE 6 - 7 only - // getElementById is not reliable as a find shortcut - Expr.find[ "ID" ] = function( id, context ) { - if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { - var node, i, elems, - elem = context.getElementById( id ); - - if ( elem ) { - - // Verify the id attribute - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - - // Fall back on getElementsByName - elems = context.getElementsByName( id ); - i = 0; - while ( ( elem = elems[ i++ ] ) ) { - node = elem.getAttributeNode( "id" ); - if ( node && node.value === id ) { - return [ elem ]; - } - } - } - - return []; - } - }; - } - - // Tag - Expr.find[ "TAG" ] = support.getElementsByTagName ? - function( tag, context ) { - if ( typeof context.getElementsByTagName !== "undefined" ) { - return context.getElementsByTagName( tag ); - - // DocumentFragment nodes don't have gEBTN - } else if ( support.qsa ) { - return context.querySelectorAll( tag ); - } - } : - - function( tag, context ) { - var elem, - tmp = [], - i = 0, - - // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too - results = context.getElementsByTagName( tag ); - - // Filter out possible comments - if ( tag === "*" ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem.nodeType === 1 ) { - tmp.push( elem ); - } - } - - return tmp; - } - return results; - }; - - // Class - Expr.find[ "CLASS" ] = support.getElementsByClassName && function( className, context ) { - if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { - return context.getElementsByClassName( className ); - } - }; - - /* QSA/matchesSelector - ---------------------------------------------------------------------- */ - - // QSA and matchesSelector support - - // matchesSelector(:active) reports false when true (IE9/Opera 11.5) - rbuggyMatches = []; - - // qSa(:focus) reports false when true (Chrome 21) - // We allow this because of a bug in IE8/9 that throws an error - // whenever `document.activeElement` is accessed on an iframe - // So, we allow :focus to pass through QSA all the time to avoid the IE error - // See https://bugs.jquery.com/ticket/13378 - rbuggyQSA = []; - - if ( ( support.qsa = rnative.test( document.querySelectorAll ) ) ) { - - // Build QSA regex - // Regex strategy adopted from Diego Perini - assert( function( el ) { - - var input; - - // Select is set to empty string on purpose - // This is to test IE's treatment of not explicitly - // setting a boolean content attribute, - // since its presence should be enough - // https://bugs.jquery.com/ticket/12359 - docElem.appendChild( el ).innerHTML = "" + - ""; - - // Support: IE8, Opera 11-12.16 - // Nothing should be selected when empty strings follow ^= or $= or *= - // The test attribute must be unknown in Opera but "safe" for WinRT - // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section - if ( el.querySelectorAll( "[msallowcapture^='']" ).length ) { - rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); - } - - // Support: IE8 - // Boolean attributes and "value" are not treated correctly - if ( !el.querySelectorAll( "[selected]" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); - } - - // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ - if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { - rbuggyQSA.push( "~=" ); - } - - // Support: IE 11+, Edge 15 - 18+ - // IE 11/Edge don't find elements on a `[name='']` query in some cases. - // Adding a temporary attribute to the document before the selection works - // around the issue. - // Interestingly, IE 10 & older don't seem to have the issue. - input = document.createElement( "input" ); - input.setAttribute( "name", "" ); - el.appendChild( input ); - if ( !el.querySelectorAll( "[name='']" ).length ) { - rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + - whitespace + "*(?:''|\"\")" ); - } - - // Webkit/Opera - :checked should return selected option elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - // IE8 throws error here and will not see later tests - if ( !el.querySelectorAll( ":checked" ).length ) { - rbuggyQSA.push( ":checked" ); - } - - // Support: Safari 8+, iOS 8+ - // https://bugs.webkit.org/show_bug.cgi?id=136851 - // In-page `selector#id sibling-combinator selector` fails - if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { - rbuggyQSA.push( ".#.+[+~]" ); - } - - // Support: Firefox <=3.6 - 5 only - // Old Firefox doesn't throw on a badly-escaped identifier. - el.querySelectorAll( "\\\f" ); - rbuggyQSA.push( "[\\r\\n\\f]" ); - } ); - - assert( function( el ) { - el.innerHTML = "" + - ""; - - // Support: Windows 8 Native Apps - // The type and name attributes are restricted during .innerHTML assignment - var input = document.createElement( "input" ); - input.setAttribute( "type", "hidden" ); - el.appendChild( input ).setAttribute( "name", "D" ); - - // Support: IE8 - // Enforce case-sensitivity of name attribute - if ( el.querySelectorAll( "[name=d]" ).length ) { - rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); - } - - // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) - // IE8 throws error here and will not see later tests - if ( el.querySelectorAll( ":enabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: IE9-11+ - // IE's :disabled selector does not pick up the children of disabled fieldsets - docElem.appendChild( el ).disabled = true; - if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { - rbuggyQSA.push( ":enabled", ":disabled" ); - } - - // Support: Opera 10 - 11 only - // Opera 10-11 does not throw on post-comma invalid pseudos - el.querySelectorAll( "*,:x" ); - rbuggyQSA.push( ",.*:" ); - } ); - } - - if ( ( support.matchesSelector = rnative.test( ( matches = docElem.matches || - docElem.webkitMatchesSelector || - docElem.mozMatchesSelector || - docElem.oMatchesSelector || - docElem.msMatchesSelector ) ) ) ) { - - assert( function( el ) { - - // Check to see if it's possible to do matchesSelector - // on a disconnected node (IE 9) - support.disconnectedMatch = matches.call( el, "*" ); - - // This should fail with an exception - // Gecko does not error, returns false instead - matches.call( el, "[s!='']:x" ); - rbuggyMatches.push( "!=", pseudos ); - } ); - } - - rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); - rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join( "|" ) ); - - /* Contains - ---------------------------------------------------------------------- */ - hasCompare = rnative.test( docElem.compareDocumentPosition ); - - // Element contains another - // Purposefully self-exclusive - // As in, an element does not contain itself - contains = hasCompare || rnative.test( docElem.contains ) ? - function( a, b ) { - var adown = a.nodeType === 9 ? a.documentElement : a, - bup = b && b.parentNode; - return a === bup || !!( bup && bup.nodeType === 1 && ( - adown.contains ? - adown.contains( bup ) : - a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 - ) ); - } : - function( a, b ) { - if ( b ) { - while ( ( b = b.parentNode ) ) { - if ( b === a ) { - return true; - } - } - } - return false; - }; - - /* Sorting - ---------------------------------------------------------------------- */ - - // Document order sorting - sortOrder = hasCompare ? - function( a, b ) { - - // Flag for duplicate removal - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - // Sort on method existence if only one input has compareDocumentPosition - var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; - if ( compare ) { - return compare; - } - - // Calculate position if both inputs belong to the same document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? - a.compareDocumentPosition( b ) : - - // Otherwise we know they are disconnected - 1; - - // Disconnected nodes - if ( compare & 1 || - ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { - - // Choose the first element that is related to our preferred document - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( a == document || a.ownerDocument == preferredDoc && - contains( preferredDoc, a ) ) { - return -1; - } - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( b == document || b.ownerDocument == preferredDoc && - contains( preferredDoc, b ) ) { - return 1; - } - - // Maintain original order - return sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - } - - return compare & 4 ? -1 : 1; - } : - function( a, b ) { - - // Exit early if the nodes are identical - if ( a === b ) { - hasDuplicate = true; - return 0; - } - - var cur, - i = 0, - aup = a.parentNode, - bup = b.parentNode, - ap = [ a ], - bp = [ b ]; - - // Parentless nodes are either documents or disconnected - if ( !aup || !bup ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - return a == document ? -1 : - b == document ? 1 : - /* eslint-enable eqeqeq */ - aup ? -1 : - bup ? 1 : - sortInput ? - ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : - 0; - - // If the nodes are siblings, we can do a quick check - } else if ( aup === bup ) { - return siblingCheck( a, b ); - } - - // Otherwise we need full lists of their ancestors for comparison - cur = a; - while ( ( cur = cur.parentNode ) ) { - ap.unshift( cur ); - } - cur = b; - while ( ( cur = cur.parentNode ) ) { - bp.unshift( cur ); - } - - // Walk down the tree looking for a discrepancy - while ( ap[ i ] === bp[ i ] ) { - i++; - } - - return i ? - - // Do a sibling check if the nodes have a common ancestor - siblingCheck( ap[ i ], bp[ i ] ) : - - // Otherwise nodes in our document sort first - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - /* eslint-disable eqeqeq */ - ap[ i ] == preferredDoc ? -1 : - bp[ i ] == preferredDoc ? 1 : - /* eslint-enable eqeqeq */ - 0; - }; - - return document; -}; - -Sizzle.matches = function( expr, elements ) { - return Sizzle( expr, null, null, elements ); -}; - -Sizzle.matchesSelector = function( elem, expr ) { - setDocument( elem ); - - if ( support.matchesSelector && documentIsHTML && - !nonnativeSelectorCache[ expr + " " ] && - ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && - ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { - - try { - var ret = matches.call( elem, expr ); - - // IE 9's matchesSelector returns false on disconnected nodes - if ( ret || support.disconnectedMatch || - - // As well, disconnected nodes are said to be in a document - // fragment in IE 9 - elem.document && elem.document.nodeType !== 11 ) { - return ret; - } - } catch ( e ) { - nonnativeSelectorCache( expr, true ); - } - } - - return Sizzle( expr, document, null, [ elem ] ).length > 0; -}; - -Sizzle.contains = function( context, elem ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( context.ownerDocument || context ) != document ) { - setDocument( context ); - } - return contains( context, elem ); -}; - -Sizzle.attr = function( elem, name ) { - - // Set document vars if needed - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( ( elem.ownerDocument || elem ) != document ) { - setDocument( elem ); - } - - var fn = Expr.attrHandle[ name.toLowerCase() ], - - // Don't get fooled by Object.prototype properties (jQuery #13807) - val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? - fn( elem, name, !documentIsHTML ) : - undefined; - - return val !== undefined ? - val : - support.attributes || !documentIsHTML ? - elem.getAttribute( name ) : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; -}; - -Sizzle.escape = function( sel ) { - return ( sel + "" ).replace( rcssescape, fcssescape ); -}; - -Sizzle.error = function( msg ) { - throw new Error( "Syntax error, unrecognized expression: " + msg ); -}; - -/** - * Document sorting and removing duplicates - * @param {ArrayLike} results - */ -Sizzle.uniqueSort = function( results ) { - var elem, - duplicates = [], - j = 0, - i = 0; - - // Unless we *know* we can detect duplicates, assume their presence - hasDuplicate = !support.detectDuplicates; - sortInput = !support.sortStable && results.slice( 0 ); - results.sort( sortOrder ); - - if ( hasDuplicate ) { - while ( ( elem = results[ i++ ] ) ) { - if ( elem === results[ i ] ) { - j = duplicates.push( i ); - } - } - while ( j-- ) { - results.splice( duplicates[ j ], 1 ); - } - } - - // Clear input after sorting to release objects - // See https://github.com/jquery/sizzle/pull/225 - sortInput = null; - - return results; -}; - -/** - * Utility function for retrieving the text value of an array of DOM nodes - * @param {Array|Element} elem - */ -getText = Sizzle.getText = function( elem ) { - var node, - ret = "", - i = 0, - nodeType = elem.nodeType; - - if ( !nodeType ) { - - // If no nodeType, this is expected to be an array - while ( ( node = elem[ i++ ] ) ) { - - // Do not traverse comment nodes - ret += getText( node ); - } - } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { - - // Use textContent for elements - // innerText usage removed for consistency of new lines (jQuery #11153) - if ( typeof elem.textContent === "string" ) { - return elem.textContent; - } else { - - // Traverse its children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - ret += getText( elem ); - } - } - } else if ( nodeType === 3 || nodeType === 4 ) { - return elem.nodeValue; - } - - // Do not include comment or processing instruction nodes - - return ret; -}; - -Expr = Sizzle.selectors = { - - // Can be adjusted by the user - cacheLength: 50, - - createPseudo: markFunction, - - match: matchExpr, - - attrHandle: {}, - - find: {}, - - relative: { - ">": { dir: "parentNode", first: true }, - " ": { dir: "parentNode" }, - "+": { dir: "previousSibling", first: true }, - "~": { dir: "previousSibling" } - }, - - preFilter: { - "ATTR": function( match ) { - match[ 1 ] = match[ 1 ].replace( runescape, funescape ); - - // Move the given value to match[3] whether quoted or unquoted - match[ 3 ] = ( match[ 3 ] || match[ 4 ] || - match[ 5 ] || "" ).replace( runescape, funescape ); - - if ( match[ 2 ] === "~=" ) { - match[ 3 ] = " " + match[ 3 ] + " "; - } - - return match.slice( 0, 4 ); - }, - - "CHILD": function( match ) { - - /* matches from matchExpr["CHILD"] - 1 type (only|nth|...) - 2 what (child|of-type) - 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) - 4 xn-component of xn+y argument ([+-]?\d*n|) - 5 sign of xn-component - 6 x of xn-component - 7 sign of y-component - 8 y of y-component - */ - match[ 1 ] = match[ 1 ].toLowerCase(); - - if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { - - // nth-* requires argument - if ( !match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - // numeric x and y parameters for Expr.filter.CHILD - // remember that false/true cast respectively to 0/1 - match[ 4 ] = +( match[ 4 ] ? - match[ 5 ] + ( match[ 6 ] || 1 ) : - 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) ); - match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); - - // other types prohibit arguments - } else if ( match[ 3 ] ) { - Sizzle.error( match[ 0 ] ); - } - - return match; - }, - - "PSEUDO": function( match ) { - var excess, - unquoted = !match[ 6 ] && match[ 2 ]; - - if ( matchExpr[ "CHILD" ].test( match[ 0 ] ) ) { - return null; - } - - // Accept quoted arguments as-is - if ( match[ 3 ] ) { - match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; - - // Strip excess characters from unquoted arguments - } else if ( unquoted && rpseudo.test( unquoted ) && - - // Get excess from tokenize (recursively) - ( excess = tokenize( unquoted, true ) ) && - - // advance to the next closing parenthesis - ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { - - // excess is a negative index - match[ 0 ] = match[ 0 ].slice( 0, excess ); - match[ 2 ] = unquoted.slice( 0, excess ); - } - - // Return only captures needed by the pseudo filter method (type and argument) - return match.slice( 0, 3 ); - } - }, - - filter: { - - "TAG": function( nodeNameSelector ) { - var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); - return nodeNameSelector === "*" ? - function() { - return true; - } : - function( elem ) { - return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; - }; - }, - - "CLASS": function( className ) { - var pattern = classCache[ className + " " ]; - - return pattern || - ( pattern = new RegExp( "(^|" + whitespace + - ")" + className + "(" + whitespace + "|$)" ) ) && classCache( - className, function( elem ) { - return pattern.test( - typeof elem.className === "string" && elem.className || - typeof elem.getAttribute !== "undefined" && - elem.getAttribute( "class" ) || - "" - ); - } ); - }, - - "ATTR": function( name, operator, check ) { - return function( elem ) { - var result = Sizzle.attr( elem, name ); - - if ( result == null ) { - return operator === "!="; - } - if ( !operator ) { - return true; - } - - result += ""; - - /* eslint-disable max-len */ - - return operator === "=" ? result === check : - operator === "!=" ? result !== check : - operator === "^=" ? check && result.indexOf( check ) === 0 : - operator === "*=" ? check && result.indexOf( check ) > -1 : - operator === "$=" ? check && result.slice( -check.length ) === check : - operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : - operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : - false; - /* eslint-enable max-len */ - - }; - }, - - "CHILD": function( type, what, _argument, first, last ) { - var simple = type.slice( 0, 3 ) !== "nth", - forward = type.slice( -4 ) !== "last", - ofType = what === "of-type"; - - return first === 1 && last === 0 ? - - // Shortcut for :nth-*(n) - function( elem ) { - return !!elem.parentNode; - } : - - function( elem, _context, xml ) { - var cache, uniqueCache, outerCache, node, nodeIndex, start, - dir = simple !== forward ? "nextSibling" : "previousSibling", - parent = elem.parentNode, - name = ofType && elem.nodeName.toLowerCase(), - useCache = !xml && !ofType, - diff = false; - - if ( parent ) { - - // :(first|last|only)-(child|of-type) - if ( simple ) { - while ( dir ) { - node = elem; - while ( ( node = node[ dir ] ) ) { - if ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) { - - return false; - } - } - - // Reverse direction for :only-* (if we haven't yet done so) - start = dir = type === "only" && !start && "nextSibling"; - } - return true; - } - - start = [ forward ? parent.firstChild : parent.lastChild ]; - - // non-xml :nth-child(...) stores cache data on `parent` - if ( forward && useCache ) { - - // Seek `elem` from a previously-cached index - - // ...in a gzip-friendly way - node = parent; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex && cache[ 2 ]; - node = nodeIndex && parent.childNodes[ nodeIndex ]; - - while ( ( node = ++nodeIndex && node && node[ dir ] || - - // Fallback to seeking `elem` from the start - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - // When found, cache indexes on `parent` and break - if ( node.nodeType === 1 && ++diff && node === elem ) { - uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; - break; - } - } - - } else { - - // Use previously-cached element index if available - if ( useCache ) { - - // ...in a gzip-friendly way - node = elem; - outerCache = node[ expando ] || ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - cache = uniqueCache[ type ] || []; - nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; - diff = nodeIndex; - } - - // xml :nth-child(...) - // or :nth-last-child(...) or :nth(-last)?-of-type(...) - if ( diff === false ) { - - // Use the same loop as above to seek `elem` from the start - while ( ( node = ++nodeIndex && node && node[ dir ] || - ( diff = nodeIndex = 0 ) || start.pop() ) ) { - - if ( ( ofType ? - node.nodeName.toLowerCase() === name : - node.nodeType === 1 ) && - ++diff ) { - - // Cache the index of each encountered element - if ( useCache ) { - outerCache = node[ expando ] || - ( node[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ node.uniqueID ] || - ( outerCache[ node.uniqueID ] = {} ); - - uniqueCache[ type ] = [ dirruns, diff ]; - } - - if ( node === elem ) { - break; - } - } - } - } - } - - // Incorporate the offset, then check against cycle size - diff -= last; - return diff === first || ( diff % first === 0 && diff / first >= 0 ); - } - }; - }, - - "PSEUDO": function( pseudo, argument ) { - - // pseudo-class names are case-insensitive - // http://www.w3.org/TR/selectors/#pseudo-classes - // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters - // Remember that setFilters inherits from pseudos - var args, - fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || - Sizzle.error( "unsupported pseudo: " + pseudo ); - - // The user may use createPseudo to indicate that - // arguments are needed to create the filter function - // just as Sizzle does - if ( fn[ expando ] ) { - return fn( argument ); - } - - // But maintain support for old signatures - if ( fn.length > 1 ) { - args = [ pseudo, pseudo, "", argument ]; - return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? - markFunction( function( seed, matches ) { - var idx, - matched = fn( seed, argument ), - i = matched.length; - while ( i-- ) { - idx = indexOf( seed, matched[ i ] ); - seed[ idx ] = !( matches[ idx ] = matched[ i ] ); - } - } ) : - function( elem ) { - return fn( elem, 0, args ); - }; - } - - return fn; - } - }, - - pseudos: { - - // Potentially complex pseudos - "not": markFunction( function( selector ) { - - // Trim the selector passed to compile - // to avoid treating leading and trailing - // spaces as combinators - var input = [], - results = [], - matcher = compile( selector.replace( rtrim, "$1" ) ); - - return matcher[ expando ] ? - markFunction( function( seed, matches, _context, xml ) { - var elem, - unmatched = matcher( seed, null, xml, [] ), - i = seed.length; - - // Match elements unmatched by `matcher` - while ( i-- ) { - if ( ( elem = unmatched[ i ] ) ) { - seed[ i ] = !( matches[ i ] = elem ); - } - } - } ) : - function( elem, _context, xml ) { - input[ 0 ] = elem; - matcher( input, null, xml, results ); - - // Don't keep the element (issue #299) - input[ 0 ] = null; - return !results.pop(); - }; - } ), - - "has": markFunction( function( selector ) { - return function( elem ) { - return Sizzle( selector, elem ).length > 0; - }; - } ), - - "contains": markFunction( function( text ) { - text = text.replace( runescape, funescape ); - return function( elem ) { - return ( elem.textContent || getText( elem ) ).indexOf( text ) > -1; - }; - } ), - - // "Whether an element is represented by a :lang() selector - // is based solely on the element's language value - // being equal to the identifier C, - // or beginning with the identifier C immediately followed by "-". - // The matching of C against the element's language value is performed case-insensitively. - // The identifier C does not have to be a valid language name." - // http://www.w3.org/TR/selectors/#lang-pseudo - "lang": markFunction( function( lang ) { - - // lang value must be a valid identifier - if ( !ridentifier.test( lang || "" ) ) { - Sizzle.error( "unsupported lang: " + lang ); - } - lang = lang.replace( runescape, funescape ).toLowerCase(); - return function( elem ) { - var elemLang; - do { - if ( ( elemLang = documentIsHTML ? - elem.lang : - elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { - - elemLang = elemLang.toLowerCase(); - return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; - } - } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); - return false; - }; - } ), - - // Miscellaneous - "target": function( elem ) { - var hash = window.location && window.location.hash; - return hash && hash.slice( 1 ) === elem.id; - }, - - "root": function( elem ) { - return elem === docElem; - }, - - "focus": function( elem ) { - return elem === document.activeElement && - ( !document.hasFocus || document.hasFocus() ) && - !!( elem.type || elem.href || ~elem.tabIndex ); - }, - - // Boolean properties - "enabled": createDisabledPseudo( false ), - "disabled": createDisabledPseudo( true ), - - "checked": function( elem ) { - - // In CSS3, :checked should return both checked and selected elements - // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked - var nodeName = elem.nodeName.toLowerCase(); - return ( nodeName === "input" && !!elem.checked ) || - ( nodeName === "option" && !!elem.selected ); - }, - - "selected": function( elem ) { - - // Accessing this property makes selected-by-default - // options in Safari work properly - if ( elem.parentNode ) { - // eslint-disable-next-line no-unused-expressions - elem.parentNode.selectedIndex; - } - - return elem.selected === true; - }, - - // Contents - "empty": function( elem ) { - - // http://www.w3.org/TR/selectors/#empty-pseudo - // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), - // but not by others (comment: 8; processing instruction: 7; etc.) - // nodeType < 6 works because attributes (2) do not appear as children - for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { - if ( elem.nodeType < 6 ) { - return false; - } - } - return true; - }, - - "parent": function( elem ) { - return !Expr.pseudos[ "empty" ]( elem ); - }, - - // Element/input types - "header": function( elem ) { - return rheader.test( elem.nodeName ); - }, - - "input": function( elem ) { - return rinputs.test( elem.nodeName ); - }, - - "button": function( elem ) { - var name = elem.nodeName.toLowerCase(); - return name === "input" && elem.type === "button" || name === "button"; - }, - - "text": function( elem ) { - var attr; - return elem.nodeName.toLowerCase() === "input" && - elem.type === "text" && - - // Support: IE<8 - // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" - ( ( attr = elem.getAttribute( "type" ) ) == null || - attr.toLowerCase() === "text" ); - }, - - // Position-in-collection - "first": createPositionalPseudo( function() { - return [ 0 ]; - } ), - - "last": createPositionalPseudo( function( _matchIndexes, length ) { - return [ length - 1 ]; - } ), - - "eq": createPositionalPseudo( function( _matchIndexes, length, argument ) { - return [ argument < 0 ? argument + length : argument ]; - } ), - - "even": createPositionalPseudo( function( matchIndexes, length ) { - var i = 0; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "odd": createPositionalPseudo( function( matchIndexes, length ) { - var i = 1; - for ( ; i < length; i += 2 ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "lt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? - argument + length : - argument > length ? - length : - argument; - for ( ; --i >= 0; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ), - - "gt": createPositionalPseudo( function( matchIndexes, length, argument ) { - var i = argument < 0 ? argument + length : argument; - for ( ; ++i < length; ) { - matchIndexes.push( i ); - } - return matchIndexes; - } ) - } -}; - -Expr.pseudos[ "nth" ] = Expr.pseudos[ "eq" ]; - -// Add button/input type pseudos -for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { - Expr.pseudos[ i ] = createInputPseudo( i ); -} -for ( i in { submit: true, reset: true } ) { - Expr.pseudos[ i ] = createButtonPseudo( i ); -} - -// Easy API for creating new setFilters -function setFilters() {} -setFilters.prototype = Expr.filters = Expr.pseudos; -Expr.setFilters = new setFilters(); - -tokenize = Sizzle.tokenize = function( selector, parseOnly ) { - var matched, match, tokens, type, - soFar, groups, preFilters, - cached = tokenCache[ selector + " " ]; - - if ( cached ) { - return parseOnly ? 0 : cached.slice( 0 ); - } - - soFar = selector; - groups = []; - preFilters = Expr.preFilter; - - while ( soFar ) { - - // Comma and first run - if ( !matched || ( match = rcomma.exec( soFar ) ) ) { - if ( match ) { - - // Don't consume trailing commas as valid - soFar = soFar.slice( match[ 0 ].length ) || soFar; - } - groups.push( ( tokens = [] ) ); - } - - matched = false; - - // Combinators - if ( ( match = rcombinators.exec( soFar ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - - // Cast descendant combinators to space - type: match[ 0 ].replace( rtrim, " " ) - } ); - soFar = soFar.slice( matched.length ); - } - - // Filters - for ( type in Expr.filter ) { - if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || - ( match = preFilters[ type ]( match ) ) ) ) { - matched = match.shift(); - tokens.push( { - value: matched, - type: type, - matches: match - } ); - soFar = soFar.slice( matched.length ); - } - } - - if ( !matched ) { - break; - } - } - - // Return the length of the invalid excess - // if we're just parsing - // Otherwise, throw an error or return tokens - return parseOnly ? - soFar.length : - soFar ? - Sizzle.error( selector ) : - - // Cache the tokens - tokenCache( selector, groups ).slice( 0 ); -}; - -function toSelector( tokens ) { - var i = 0, - len = tokens.length, - selector = ""; - for ( ; i < len; i++ ) { - selector += tokens[ i ].value; - } - return selector; -} - -function addCombinator( matcher, combinator, base ) { - var dir = combinator.dir, - skip = combinator.next, - key = skip || dir, - checkNonElements = base && key === "parentNode", - doneName = done++; - - return combinator.first ? - - // Check against closest ancestor/preceding element - function( elem, context, xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - return matcher( elem, context, xml ); - } - } - return false; - } : - - // Check against all ancestor/preceding elements - function( elem, context, xml ) { - var oldCache, uniqueCache, outerCache, - newCache = [ dirruns, doneName ]; - - // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching - if ( xml ) { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - if ( matcher( elem, context, xml ) ) { - return true; - } - } - } - } else { - while ( ( elem = elem[ dir ] ) ) { - if ( elem.nodeType === 1 || checkNonElements ) { - outerCache = elem[ expando ] || ( elem[ expando ] = {} ); - - // Support: IE <9 only - // Defend against cloned attroperties (jQuery gh-1709) - uniqueCache = outerCache[ elem.uniqueID ] || - ( outerCache[ elem.uniqueID ] = {} ); - - if ( skip && skip === elem.nodeName.toLowerCase() ) { - elem = elem[ dir ] || elem; - } else if ( ( oldCache = uniqueCache[ key ] ) && - oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { - - // Assign to newCache so results back-propagate to previous elements - return ( newCache[ 2 ] = oldCache[ 2 ] ); - } else { - - // Reuse newcache so results back-propagate to previous elements - uniqueCache[ key ] = newCache; - - // A match means we're done; a fail means we have to keep checking - if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { - return true; - } - } - } - } - } - return false; - }; -} - -function elementMatcher( matchers ) { - return matchers.length > 1 ? - function( elem, context, xml ) { - var i = matchers.length; - while ( i-- ) { - if ( !matchers[ i ]( elem, context, xml ) ) { - return false; - } - } - return true; - } : - matchers[ 0 ]; -} - -function multipleContexts( selector, contexts, results ) { - var i = 0, - len = contexts.length; - for ( ; i < len; i++ ) { - Sizzle( selector, contexts[ i ], results ); - } - return results; -} - -function condense( unmatched, map, filter, context, xml ) { - var elem, - newUnmatched = [], - i = 0, - len = unmatched.length, - mapped = map != null; - - for ( ; i < len; i++ ) { - if ( ( elem = unmatched[ i ] ) ) { - if ( !filter || filter( elem, context, xml ) ) { - newUnmatched.push( elem ); - if ( mapped ) { - map.push( i ); - } - } - } - } - - return newUnmatched; -} - -function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { - if ( postFilter && !postFilter[ expando ] ) { - postFilter = setMatcher( postFilter ); - } - if ( postFinder && !postFinder[ expando ] ) { - postFinder = setMatcher( postFinder, postSelector ); - } - return markFunction( function( seed, results, context, xml ) { - var temp, i, elem, - preMap = [], - postMap = [], - preexisting = results.length, - - // Get initial elements from seed or context - elems = seed || multipleContexts( - selector || "*", - context.nodeType ? [ context ] : context, - [] - ), - - // Prefilter to get matcher input, preserving a map for seed-results synchronization - matcherIn = preFilter && ( seed || !selector ) ? - condense( elems, preMap, preFilter, context, xml ) : - elems, - - matcherOut = matcher ? - - // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, - postFinder || ( seed ? preFilter : preexisting || postFilter ) ? - - // ...intermediate processing is necessary - [] : - - // ...otherwise use results directly - results : - matcherIn; - - // Find primary matches - if ( matcher ) { - matcher( matcherIn, matcherOut, context, xml ); - } - - // Apply postFilter - if ( postFilter ) { - temp = condense( matcherOut, postMap ); - postFilter( temp, [], context, xml ); - - // Un-match failing elements by moving them back to matcherIn - i = temp.length; - while ( i-- ) { - if ( ( elem = temp[ i ] ) ) { - matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); - } - } - } - - if ( seed ) { - if ( postFinder || preFilter ) { - if ( postFinder ) { - - // Get the final matcherOut by condensing this intermediate into postFinder contexts - temp = []; - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) ) { - - // Restore matcherIn since elem is not yet a final match - temp.push( ( matcherIn[ i ] = elem ) ); - } - } - postFinder( null, ( matcherOut = [] ), temp, xml ); - } - - // Move matched elements from seed to results to keep them synchronized - i = matcherOut.length; - while ( i-- ) { - if ( ( elem = matcherOut[ i ] ) && - ( temp = postFinder ? indexOf( seed, elem ) : preMap[ i ] ) > -1 ) { - - seed[ temp ] = !( results[ temp ] = elem ); - } - } - } - - // Add elements to results, through postFinder if defined - } else { - matcherOut = condense( - matcherOut === results ? - matcherOut.splice( preexisting, matcherOut.length ) : - matcherOut - ); - if ( postFinder ) { - postFinder( null, results, matcherOut, xml ); - } else { - push.apply( results, matcherOut ); - } - } - } ); -} - -function matcherFromTokens( tokens ) { - var checkContext, matcher, j, - len = tokens.length, - leadingRelative = Expr.relative[ tokens[ 0 ].type ], - implicitRelative = leadingRelative || Expr.relative[ " " ], - i = leadingRelative ? 1 : 0, - - // The foundational matcher ensures that elements are reachable from top-level context(s) - matchContext = addCombinator( function( elem ) { - return elem === checkContext; - }, implicitRelative, true ), - matchAnyContext = addCombinator( function( elem ) { - return indexOf( checkContext, elem ) > -1; - }, implicitRelative, true ), - matchers = [ function( elem, context, xml ) { - var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( - ( checkContext = context ).nodeType ? - matchContext( elem, context, xml ) : - matchAnyContext( elem, context, xml ) ); - - // Avoid hanging onto element (issue #299) - checkContext = null; - return ret; - } ]; - - for ( ; i < len; i++ ) { - if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { - matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; - } else { - matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); - - // Return special upon seeing a positional matcher - if ( matcher[ expando ] ) { - - // Find the next relative operator (if any) for proper handling - j = ++i; - for ( ; j < len; j++ ) { - if ( Expr.relative[ tokens[ j ].type ] ) { - break; - } - } - return setMatcher( - i > 1 && elementMatcher( matchers ), - i > 1 && toSelector( - - // If the preceding token was a descendant combinator, insert an implicit any-element `*` - tokens - .slice( 0, i - 1 ) - .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) - ).replace( rtrim, "$1" ), - matcher, - i < j && matcherFromTokens( tokens.slice( i, j ) ), - j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), - j < len && toSelector( tokens ) - ); - } - matchers.push( matcher ); - } - } - - return elementMatcher( matchers ); -} - -function matcherFromGroupMatchers( elementMatchers, setMatchers ) { - var bySet = setMatchers.length > 0, - byElement = elementMatchers.length > 0, - superMatcher = function( seed, context, xml, results, outermost ) { - var elem, j, matcher, - matchedCount = 0, - i = "0", - unmatched = seed && [], - setMatched = [], - contextBackup = outermostContext, - - // We must always have either seed elements or outermost context - elems = seed || byElement && Expr.find[ "TAG" ]( "*", outermost ), - - // Use integer dirruns iff this is the outermost matcher - dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), - len = elems.length; - - if ( outermost ) { - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - outermostContext = context == document || context || outermost; - } - - // Add elements passing elementMatchers directly to results - // Support: IE<9, Safari - // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id - for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { - if ( byElement && elem ) { - j = 0; - - // Support: IE 11+, Edge 17 - 18+ - // IE/Edge sometimes throw a "Permission denied" error when strict-comparing - // two documents; shallow comparisons work. - // eslint-disable-next-line eqeqeq - if ( !context && elem.ownerDocument != document ) { - setDocument( elem ); - xml = !documentIsHTML; - } - while ( ( matcher = elementMatchers[ j++ ] ) ) { - if ( matcher( elem, context || document, xml ) ) { - results.push( elem ); - break; - } - } - if ( outermost ) { - dirruns = dirrunsUnique; - } - } - - // Track unmatched elements for set filters - if ( bySet ) { - - // They will have gone through all possible matchers - if ( ( elem = !matcher && elem ) ) { - matchedCount--; - } - - // Lengthen the array for every element, matched or not - if ( seed ) { - unmatched.push( elem ); - } - } - } - - // `i` is now the count of elements visited above, and adding it to `matchedCount` - // makes the latter nonnegative. - matchedCount += i; - - // Apply set filters to unmatched elements - // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` - // equals `i`), unless we didn't visit _any_ elements in the above loop because we have - // no element matchers and no seed. - // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that - // case, which will result in a "00" `matchedCount` that differs from `i` but is also - // numerically zero. - if ( bySet && i !== matchedCount ) { - j = 0; - while ( ( matcher = setMatchers[ j++ ] ) ) { - matcher( unmatched, setMatched, context, xml ); - } - - if ( seed ) { - - // Reintegrate element matches to eliminate the need for sorting - if ( matchedCount > 0 ) { - while ( i-- ) { - if ( !( unmatched[ i ] || setMatched[ i ] ) ) { - setMatched[ i ] = pop.call( results ); - } - } - } - - // Discard index placeholder values to get only actual matches - setMatched = condense( setMatched ); - } - - // Add matches to results - push.apply( results, setMatched ); - - // Seedless set matches succeeding multiple successful matchers stipulate sorting - if ( outermost && !seed && setMatched.length > 0 && - ( matchedCount + setMatchers.length ) > 1 ) { - - Sizzle.uniqueSort( results ); - } - } - - // Override manipulation of globals by nested matchers - if ( outermost ) { - dirruns = dirrunsUnique; - outermostContext = contextBackup; - } - - return unmatched; - }; - - return bySet ? - markFunction( superMatcher ) : - superMatcher; -} - -compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { - var i, - setMatchers = [], - elementMatchers = [], - cached = compilerCache[ selector + " " ]; - - if ( !cached ) { - - // Generate a function of recursive functions that can be used to check each element - if ( !match ) { - match = tokenize( selector ); - } - i = match.length; - while ( i-- ) { - cached = matcherFromTokens( match[ i ] ); - if ( cached[ expando ] ) { - setMatchers.push( cached ); - } else { - elementMatchers.push( cached ); - } - } - - // Cache the compiled function - cached = compilerCache( - selector, - matcherFromGroupMatchers( elementMatchers, setMatchers ) - ); - - // Save selector and tokenization - cached.selector = selector; - } - return cached; -}; - -/** - * A low-level selection function that works with Sizzle's compiled - * selector functions - * @param {String|Function} selector A selector or a pre-compiled - * selector function built with Sizzle.compile - * @param {Element} context - * @param {Array} [results] - * @param {Array} [seed] A set of elements to match against - */ -select = Sizzle.select = function( selector, context, results, seed ) { - var i, tokens, token, type, find, - compiled = typeof selector === "function" && selector, - match = !seed && tokenize( ( selector = compiled.selector || selector ) ); - - results = results || []; - - // Try to minimize operations if there is only one selector in the list and no seed - // (the latter of which guarantees us context) - if ( match.length === 1 ) { - - // Reduce context if the leading compound selector is an ID - tokens = match[ 0 ] = match[ 0 ].slice( 0 ); - if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && - context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { - - context = ( Expr.find[ "ID" ]( token.matches[ 0 ] - .replace( runescape, funescape ), context ) || [] )[ 0 ]; - if ( !context ) { - return results; - - // Precompiled matchers will still verify ancestry, so step up a level - } else if ( compiled ) { - context = context.parentNode; - } - - selector = selector.slice( tokens.shift().value.length ); - } - - // Fetch a seed set for right-to-left matching - i = matchExpr[ "needsContext" ].test( selector ) ? 0 : tokens.length; - while ( i-- ) { - token = tokens[ i ]; - - // Abort if we hit a combinator - if ( Expr.relative[ ( type = token.type ) ] ) { - break; - } - if ( ( find = Expr.find[ type ] ) ) { - - // Search, expanding context for leading sibling combinators - if ( ( seed = find( - token.matches[ 0 ].replace( runescape, funescape ), - rsibling.test( tokens[ 0 ].type ) && testContext( context.parentNode ) || - context - ) ) ) { - - // If seed is empty or no tokens remain, we can return early - tokens.splice( i, 1 ); - selector = seed.length && toSelector( tokens ); - if ( !selector ) { - push.apply( results, seed ); - return results; - } - - break; - } - } - } - } - - // Compile and execute a filtering function if one is not provided - // Provide `match` to avoid retokenization if we modified the selector above - ( compiled || compile( selector, match ) )( - seed, - context, - !documentIsHTML, - results, - !context || rsibling.test( selector ) && testContext( context.parentNode ) || context - ); - return results; -}; - -// One-time assignments - -// Sort stability -support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; - -// Support: Chrome 14-35+ -// Always assume duplicates if they aren't passed to the comparison function -support.detectDuplicates = !!hasDuplicate; - -// Initialize against the default document -setDocument(); - -// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) -// Detached nodes confoundingly follow *each other* -support.sortDetached = assert( function( el ) { - - // Should return 1, but returns 4 (following) - return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; -} ); - -// Support: IE<8 -// Prevent attribute/property "interpolation" -// https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx -if ( !assert( function( el ) { - el.innerHTML = ""; - return el.firstChild.getAttribute( "href" ) === "#"; -} ) ) { - addHandle( "type|href|height|width", function( elem, name, isXML ) { - if ( !isXML ) { - return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); - } - } ); -} - -// Support: IE<9 -// Use defaultValue in place of getAttribute("value") -if ( !support.attributes || !assert( function( el ) { - el.innerHTML = ""; - el.firstChild.setAttribute( "value", "" ); - return el.firstChild.getAttribute( "value" ) === ""; -} ) ) { - addHandle( "value", function( elem, _name, isXML ) { - if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { - return elem.defaultValue; - } - } ); -} - -// Support: IE<9 -// Use getAttributeNode to fetch booleans when getAttribute lies -if ( !assert( function( el ) { - return el.getAttribute( "disabled" ) == null; -} ) ) { - addHandle( booleans, function( elem, name, isXML ) { - var val; - if ( !isXML ) { - return elem[ name ] === true ? name.toLowerCase() : - ( val = elem.getAttributeNode( name ) ) && val.specified ? - val.value : - null; - } - } ); -} - -return Sizzle; - -} )( window ); - - - -jQuery.find = Sizzle; -jQuery.expr = Sizzle.selectors; - -// Deprecated -jQuery.expr[ ":" ] = jQuery.expr.pseudos; -jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; -jQuery.text = Sizzle.getText; -jQuery.isXMLDoc = Sizzle.isXML; -jQuery.contains = Sizzle.contains; -jQuery.escapeSelector = Sizzle.escape; - - - - -var dir = function( elem, dir, until ) { - var matched = [], - truncate = until !== undefined; - - while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { - if ( elem.nodeType === 1 ) { - if ( truncate && jQuery( elem ).is( until ) ) { - break; - } - matched.push( elem ); - } - } - return matched; -}; - - -var siblings = function( n, elem ) { - var matched = []; - - for ( ; n; n = n.nextSibling ) { - if ( n.nodeType === 1 && n !== elem ) { - matched.push( n ); - } - } - - return matched; -}; - - -var rneedsContext = jQuery.expr.match.needsContext; - - - -function nodeName( elem, name ) { - - return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); - -}; -var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); - - - -// Implement the identical functionality for filter and not -function winnow( elements, qualifier, not ) { - if ( isFunction( qualifier ) ) { - return jQuery.grep( elements, function( elem, i ) { - return !!qualifier.call( elem, i, elem ) !== not; - } ); - } - - // Single element - if ( qualifier.nodeType ) { - return jQuery.grep( elements, function( elem ) { - return ( elem === qualifier ) !== not; - } ); - } - - // Arraylike of elements (jQuery, arguments, Array) - if ( typeof qualifier !== "string" ) { - return jQuery.grep( elements, function( elem ) { - return ( indexOf.call( qualifier, elem ) > -1 ) !== not; - } ); - } - - // Filtered directly for both simple and complex selectors - return jQuery.filter( qualifier, elements, not ); -} - -jQuery.filter = function( expr, elems, not ) { - var elem = elems[ 0 ]; - - if ( not ) { - expr = ":not(" + expr + ")"; - } - - if ( elems.length === 1 && elem.nodeType === 1 ) { - return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; - } - - return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { - return elem.nodeType === 1; - } ) ); -}; - -jQuery.fn.extend( { - find: function( selector ) { - var i, ret, - len = this.length, - self = this; - - if ( typeof selector !== "string" ) { - return this.pushStack( jQuery( selector ).filter( function() { - for ( i = 0; i < len; i++ ) { - if ( jQuery.contains( self[ i ], this ) ) { - return true; - } - } - } ) ); - } - - ret = this.pushStack( [] ); - - for ( i = 0; i < len; i++ ) { - jQuery.find( selector, self[ i ], ret ); - } - - return len > 1 ? jQuery.uniqueSort( ret ) : ret; - }, - filter: function( selector ) { - return this.pushStack( winnow( this, selector || [], false ) ); - }, - not: function( selector ) { - return this.pushStack( winnow( this, selector || [], true ) ); - }, - is: function( selector ) { - return !!winnow( - this, - - // If this is a positional/relative selector, check membership in the returned set - // so $("p:first").is("p:last") won't return true for a doc with two "p". - typeof selector === "string" && rneedsContext.test( selector ) ? - jQuery( selector ) : - selector || [], - false - ).length; - } -} ); - - -// Initialize a jQuery object - - -// A central reference to the root jQuery(document) -var rootjQuery, - - // A simple way to check for HTML strings - // Prioritize #id over to avoid XSS via location.hash (#9521) - // Strict HTML recognition (#11290: must start with <) - // Shortcut simple #id case for speed - rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, - - init = jQuery.fn.init = function( selector, context, root ) { - var match, elem; - - // HANDLE: $(""), $(null), $(undefined), $(false) - if ( !selector ) { - return this; - } - - // Method init() accepts an alternate rootjQuery - // so migrate can support jQuery.sub (gh-2101) - root = root || rootjQuery; - - // Handle HTML strings - if ( typeof selector === "string" ) { - if ( selector[ 0 ] === "<" && - selector[ selector.length - 1 ] === ">" && - selector.length >= 3 ) { - - // Assume that strings that start and end with <> are HTML and skip the regex check - match = [ null, selector, null ]; - - } else { - match = rquickExpr.exec( selector ); - } - - // Match html or make sure no context is specified for #id - if ( match && ( match[ 1 ] || !context ) ) { - - // HANDLE: $(html) -> $(array) - if ( match[ 1 ] ) { - context = context instanceof jQuery ? context[ 0 ] : context; - - // Option to run scripts is true for back-compat - // Intentionally let the error be thrown if parseHTML is not present - jQuery.merge( this, jQuery.parseHTML( - match[ 1 ], - context && context.nodeType ? context.ownerDocument || context : document, - true - ) ); - - // HANDLE: $(html, props) - if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { - for ( match in context ) { - - // Properties of context are called as methods if possible - if ( isFunction( this[ match ] ) ) { - this[ match ]( context[ match ] ); - - // ...and otherwise set as attributes - } else { - this.attr( match, context[ match ] ); - } - } - } - - return this; - - // HANDLE: $(#id) - } else { - elem = document.getElementById( match[ 2 ] ); - - if ( elem ) { - - // Inject the element directly into the jQuery object - this[ 0 ] = elem; - this.length = 1; - } - return this; - } - - // HANDLE: $(expr, $(...)) - } else if ( !context || context.jquery ) { - return ( context || root ).find( selector ); - - // HANDLE: $(expr, context) - // (which is just equivalent to: $(context).find(expr) - } else { - return this.constructor( context ).find( selector ); - } - - // HANDLE: $(DOMElement) - } else if ( selector.nodeType ) { - this[ 0 ] = selector; - this.length = 1; - return this; - - // HANDLE: $(function) - // Shortcut for document ready - } else if ( isFunction( selector ) ) { - return root.ready !== undefined ? - root.ready( selector ) : - - // Execute immediately if ready is not present - selector( jQuery ); - } - - return jQuery.makeArray( selector, this ); - }; - -// Give the init function the jQuery prototype for later instantiation -init.prototype = jQuery.fn; - -// Initialize central reference -rootjQuery = jQuery( document ); - - -var rparentsprev = /^(?:parents|prev(?:Until|All))/, - - // Methods guaranteed to produce a unique set when starting from a unique set - guaranteedUnique = { - children: true, - contents: true, - next: true, - prev: true - }; - -jQuery.fn.extend( { - has: function( target ) { - var targets = jQuery( target, this ), - l = targets.length; - - return this.filter( function() { - var i = 0; - for ( ; i < l; i++ ) { - if ( jQuery.contains( this, targets[ i ] ) ) { - return true; - } - } - } ); - }, - - closest: function( selectors, context ) { - var cur, - i = 0, - l = this.length, - matched = [], - targets = typeof selectors !== "string" && jQuery( selectors ); - - // Positional selectors never match, since there's no _selection_ context - if ( !rneedsContext.test( selectors ) ) { - for ( ; i < l; i++ ) { - for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { - - // Always skip document fragments - if ( cur.nodeType < 11 && ( targets ? - targets.index( cur ) > -1 : - - // Don't pass non-elements to Sizzle - cur.nodeType === 1 && - jQuery.find.matchesSelector( cur, selectors ) ) ) { - - matched.push( cur ); - break; - } - } - } - } - - return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); - }, - - // Determine the position of an element within the set - index: function( elem ) { - - // No argument, return index in parent - if ( !elem ) { - return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; - } - - // Index in selector - if ( typeof elem === "string" ) { - return indexOf.call( jQuery( elem ), this[ 0 ] ); - } - - // Locate the position of the desired element - return indexOf.call( this, - - // If it receives a jQuery object, the first element is used - elem.jquery ? elem[ 0 ] : elem - ); - }, - - add: function( selector, context ) { - return this.pushStack( - jQuery.uniqueSort( - jQuery.merge( this.get(), jQuery( selector, context ) ) - ) - ); - }, - - addBack: function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - } -} ); - -function sibling( cur, dir ) { - while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} - return cur; -} - -jQuery.each( { - parent: function( elem ) { - var parent = elem.parentNode; - return parent && parent.nodeType !== 11 ? parent : null; - }, - parents: function( elem ) { - return dir( elem, "parentNode" ); - }, - parentsUntil: function( elem, _i, until ) { - return dir( elem, "parentNode", until ); - }, - next: function( elem ) { - return sibling( elem, "nextSibling" ); - }, - prev: function( elem ) { - return sibling( elem, "previousSibling" ); - }, - nextAll: function( elem ) { - return dir( elem, "nextSibling" ); - }, - prevAll: function( elem ) { - return dir( elem, "previousSibling" ); - }, - nextUntil: function( elem, _i, until ) { - return dir( elem, "nextSibling", until ); - }, - prevUntil: function( elem, _i, until ) { - return dir( elem, "previousSibling", until ); - }, - siblings: function( elem ) { - return siblings( ( elem.parentNode || {} ).firstChild, elem ); - }, - children: function( elem ) { - return siblings( elem.firstChild ); - }, - contents: function( elem ) { - if ( elem.contentDocument != null && - - // Support: IE 11+ - // elements with no `data` attribute has an object - // `contentDocument` with a `null` prototype. - getProto( elem.contentDocument ) ) { - - return elem.contentDocument; - } - - // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only - // Treat the template element as a regular one in browsers that - // don't support it. - if ( nodeName( elem, "template" ) ) { - elem = elem.content || elem; - } - - return jQuery.merge( [], elem.childNodes ); - } -}, function( name, fn ) { - jQuery.fn[ name ] = function( until, selector ) { - var matched = jQuery.map( this, fn, until ); - - if ( name.slice( -5 ) !== "Until" ) { - selector = until; - } - - if ( selector && typeof selector === "string" ) { - matched = jQuery.filter( selector, matched ); - } - - if ( this.length > 1 ) { - - // Remove duplicates - if ( !guaranteedUnique[ name ] ) { - jQuery.uniqueSort( matched ); - } - - // Reverse order for parents* and prev-derivatives - if ( rparentsprev.test( name ) ) { - matched.reverse(); - } - } - - return this.pushStack( matched ); - }; -} ); -var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); - - - -// Convert String-formatted options into Object-formatted ones -function createOptions( options ) { - var object = {}; - jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { - object[ flag ] = true; - } ); - return object; -} - -/* - * Create a callback list using the following parameters: - * - * options: an optional list of space-separated options that will change how - * the callback list behaves or a more traditional option object - * - * By default a callback list will act like an event callback list and can be - * "fired" multiple times. - * - * Possible options: - * - * once: will ensure the callback list can only be fired once (like a Deferred) - * - * memory: will keep track of previous values and will call any callback added - * after the list has been fired right away with the latest "memorized" - * values (like a Deferred) - * - * unique: will ensure a callback can only be added once (no duplicate in the list) - * - * stopOnFalse: interrupt callings when a callback returns false - * - */ -jQuery.Callbacks = function( options ) { - - // Convert options from String-formatted to Object-formatted if needed - // (we check in cache first) - options = typeof options === "string" ? - createOptions( options ) : - jQuery.extend( {}, options ); - - var // Flag to know if list is currently firing - firing, - - // Last fire value for non-forgettable lists - memory, - - // Flag to know if list was already fired - fired, - - // Flag to prevent firing - locked, - - // Actual callback list - list = [], - - // Queue of execution data for repeatable lists - queue = [], - - // Index of currently firing callback (modified by add/remove as needed) - firingIndex = -1, - - // Fire callbacks - fire = function() { - - // Enforce single-firing - locked = locked || options.once; - - // Execute callbacks for all pending executions, - // respecting firingIndex overrides and runtime changes - fired = firing = true; - for ( ; queue.length; firingIndex = -1 ) { - memory = queue.shift(); - while ( ++firingIndex < list.length ) { - - // Run callback and check for early termination - if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && - options.stopOnFalse ) { - - // Jump to end and forget the data so .add doesn't re-fire - firingIndex = list.length; - memory = false; - } - } - } - - // Forget the data if we're done with it - if ( !options.memory ) { - memory = false; - } - - firing = false; - - // Clean up if we're done firing for good - if ( locked ) { - - // Keep an empty list if we have data for future add calls - if ( memory ) { - list = []; - - // Otherwise, this object is spent - } else { - list = ""; - } - } - }, - - // Actual Callbacks object - self = { - - // Add a callback or a collection of callbacks to the list - add: function() { - if ( list ) { - - // If we have memory from a past run, we should fire after adding - if ( memory && !firing ) { - firingIndex = list.length - 1; - queue.push( memory ); - } - - ( function add( args ) { - jQuery.each( args, function( _, arg ) { - if ( isFunction( arg ) ) { - if ( !options.unique || !self.has( arg ) ) { - list.push( arg ); - } - } else if ( arg && arg.length && toType( arg ) !== "string" ) { - - // Inspect recursively - add( arg ); - } - } ); - } )( arguments ); - - if ( memory && !firing ) { - fire(); - } - } - return this; - }, - - // Remove a callback from the list - remove: function() { - jQuery.each( arguments, function( _, arg ) { - var index; - while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { - list.splice( index, 1 ); - - // Handle firing indexes - if ( index <= firingIndex ) { - firingIndex--; - } - } - } ); - return this; - }, - - // Check if a given callback is in the list. - // If no argument is given, return whether or not list has callbacks attached. - has: function( fn ) { - return fn ? - jQuery.inArray( fn, list ) > -1 : - list.length > 0; - }, - - // Remove all callbacks from the list - empty: function() { - if ( list ) { - list = []; - } - return this; - }, - - // Disable .fire and .add - // Abort any current/pending executions - // Clear all callbacks and values - disable: function() { - locked = queue = []; - list = memory = ""; - return this; - }, - disabled: function() { - return !list; - }, - - // Disable .fire - // Also disable .add unless we have memory (since it would have no effect) - // Abort any pending executions - lock: function() { - locked = queue = []; - if ( !memory && !firing ) { - list = memory = ""; - } - return this; - }, - locked: function() { - return !!locked; - }, - - // Call all callbacks with the given context and arguments - fireWith: function( context, args ) { - if ( !locked ) { - args = args || []; - args = [ context, args.slice ? args.slice() : args ]; - queue.push( args ); - if ( !firing ) { - fire(); - } - } - return this; - }, - - // Call all the callbacks with the given arguments - fire: function() { - self.fireWith( this, arguments ); - return this; - }, - - // To know if the callbacks have already been called at least once - fired: function() { - return !!fired; - } - }; - - return self; -}; - - -function Identity( v ) { - return v; -} -function Thrower( ex ) { - throw ex; -} - -function adoptValue( value, resolve, reject, noValue ) { - var method; - - try { - - // Check for promise aspect first to privilege synchronous behavior - if ( value && isFunction( ( method = value.promise ) ) ) { - method.call( value ).done( resolve ).fail( reject ); - - // Other thenables - } else if ( value && isFunction( ( method = value.then ) ) ) { - method.call( value, resolve, reject ); - - // Other non-thenables - } else { - - // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: - // * false: [ value ].slice( 0 ) => resolve( value ) - // * true: [ value ].slice( 1 ) => resolve() - resolve.apply( undefined, [ value ].slice( noValue ) ); - } - - // For Promises/A+, convert exceptions into rejections - // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in - // Deferred#then to conditionally suppress rejection. - } catch ( value ) { - - // Support: Android 4.0 only - // Strict mode functions invoked without .call/.apply get global-object context - reject.apply( undefined, [ value ] ); - } -} - -jQuery.extend( { - - Deferred: function( func ) { - var tuples = [ - - // action, add listener, callbacks, - // ... .then handlers, argument index, [final state] - [ "notify", "progress", jQuery.Callbacks( "memory" ), - jQuery.Callbacks( "memory" ), 2 ], - [ "resolve", "done", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 0, "resolved" ], - [ "reject", "fail", jQuery.Callbacks( "once memory" ), - jQuery.Callbacks( "once memory" ), 1, "rejected" ] - ], - state = "pending", - promise = { - state: function() { - return state; - }, - always: function() { - deferred.done( arguments ).fail( arguments ); - return this; - }, - "catch": function( fn ) { - return promise.then( null, fn ); - }, - - // Keep pipe for back-compat - pipe: function( /* fnDone, fnFail, fnProgress */ ) { - var fns = arguments; - - return jQuery.Deferred( function( newDefer ) { - jQuery.each( tuples, function( _i, tuple ) { - - // Map tuples (progress, done, fail) to arguments (done, fail, progress) - var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; - - // deferred.progress(function() { bind to newDefer or newDefer.notify }) - // deferred.done(function() { bind to newDefer or newDefer.resolve }) - // deferred.fail(function() { bind to newDefer or newDefer.reject }) - deferred[ tuple[ 1 ] ]( function() { - var returned = fn && fn.apply( this, arguments ); - if ( returned && isFunction( returned.promise ) ) { - returned.promise() - .progress( newDefer.notify ) - .done( newDefer.resolve ) - .fail( newDefer.reject ); - } else { - newDefer[ tuple[ 0 ] + "With" ]( - this, - fn ? [ returned ] : arguments - ); - } - } ); - } ); - fns = null; - } ).promise(); - }, - then: function( onFulfilled, onRejected, onProgress ) { - var maxDepth = 0; - function resolve( depth, deferred, handler, special ) { - return function() { - var that = this, - args = arguments, - mightThrow = function() { - var returned, then; - - // Support: Promises/A+ section 2.3.3.3.3 - // https://promisesaplus.com/#point-59 - // Ignore double-resolution attempts - if ( depth < maxDepth ) { - return; - } - - returned = handler.apply( that, args ); - - // Support: Promises/A+ section 2.3.1 - // https://promisesaplus.com/#point-48 - if ( returned === deferred.promise() ) { - throw new TypeError( "Thenable self-resolution" ); - } - - // Support: Promises/A+ sections 2.3.3.1, 3.5 - // https://promisesaplus.com/#point-54 - // https://promisesaplus.com/#point-75 - // Retrieve `then` only once - then = returned && - - // Support: Promises/A+ section 2.3.4 - // https://promisesaplus.com/#point-64 - // Only check objects and functions for thenability - ( typeof returned === "object" || - typeof returned === "function" ) && - returned.then; - - // Handle a returned thenable - if ( isFunction( then ) ) { - - // Special processors (notify) just wait for resolution - if ( special ) { - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ) - ); - - // Normal processors (resolve) also hook into progress - } else { - - // ...and disregard older resolution values - maxDepth++; - - then.call( - returned, - resolve( maxDepth, deferred, Identity, special ), - resolve( maxDepth, deferred, Thrower, special ), - resolve( maxDepth, deferred, Identity, - deferred.notifyWith ) - ); - } - - // Handle all other returned values - } else { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Identity ) { - that = undefined; - args = [ returned ]; - } - - // Process the value(s) - // Default process is resolve - ( special || deferred.resolveWith )( that, args ); - } - }, - - // Only normal processors (resolve) catch and reject exceptions - process = special ? - mightThrow : - function() { - try { - mightThrow(); - } catch ( e ) { - - if ( jQuery.Deferred.exceptionHook ) { - jQuery.Deferred.exceptionHook( e, - process.stackTrace ); - } - - // Support: Promises/A+ section 2.3.3.3.4.1 - // https://promisesaplus.com/#point-61 - // Ignore post-resolution exceptions - if ( depth + 1 >= maxDepth ) { - - // Only substitute handlers pass on context - // and multiple values (non-spec behavior) - if ( handler !== Thrower ) { - that = undefined; - args = [ e ]; - } - - deferred.rejectWith( that, args ); - } - } - }; - - // Support: Promises/A+ section 2.3.3.3.1 - // https://promisesaplus.com/#point-57 - // Re-resolve promises immediately to dodge false rejection from - // subsequent errors - if ( depth ) { - process(); - } else { - - // Call an optional hook to record the stack, in case of exception - // since it's otherwise lost when execution goes async - if ( jQuery.Deferred.getStackHook ) { - process.stackTrace = jQuery.Deferred.getStackHook(); - } - window.setTimeout( process ); - } - }; - } - - return jQuery.Deferred( function( newDefer ) { - - // progress_handlers.add( ... ) - tuples[ 0 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onProgress ) ? - onProgress : - Identity, - newDefer.notifyWith - ) - ); - - // fulfilled_handlers.add( ... ) - tuples[ 1 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onFulfilled ) ? - onFulfilled : - Identity - ) - ); - - // rejected_handlers.add( ... ) - tuples[ 2 ][ 3 ].add( - resolve( - 0, - newDefer, - isFunction( onRejected ) ? - onRejected : - Thrower - ) - ); - } ).promise(); - }, - - // Get a promise for this deferred - // If obj is provided, the promise aspect is added to the object - promise: function( obj ) { - return obj != null ? jQuery.extend( obj, promise ) : promise; - } - }, - deferred = {}; - - // Add list-specific methods - jQuery.each( tuples, function( i, tuple ) { - var list = tuple[ 2 ], - stateString = tuple[ 5 ]; - - // promise.progress = list.add - // promise.done = list.add - // promise.fail = list.add - promise[ tuple[ 1 ] ] = list.add; - - // Handle state - if ( stateString ) { - list.add( - function() { - - // state = "resolved" (i.e., fulfilled) - // state = "rejected" - state = stateString; - }, - - // rejected_callbacks.disable - // fulfilled_callbacks.disable - tuples[ 3 - i ][ 2 ].disable, - - // rejected_handlers.disable - // fulfilled_handlers.disable - tuples[ 3 - i ][ 3 ].disable, - - // progress_callbacks.lock - tuples[ 0 ][ 2 ].lock, - - // progress_handlers.lock - tuples[ 0 ][ 3 ].lock - ); - } - - // progress_handlers.fire - // fulfilled_handlers.fire - // rejected_handlers.fire - list.add( tuple[ 3 ].fire ); - - // deferred.notify = function() { deferred.notifyWith(...) } - // deferred.resolve = function() { deferred.resolveWith(...) } - // deferred.reject = function() { deferred.rejectWith(...) } - deferred[ tuple[ 0 ] ] = function() { - deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); - return this; - }; - - // deferred.notifyWith = list.fireWith - // deferred.resolveWith = list.fireWith - // deferred.rejectWith = list.fireWith - deferred[ tuple[ 0 ] + "With" ] = list.fireWith; - } ); - - // Make the deferred a promise - promise.promise( deferred ); - - // Call given func if any - if ( func ) { - func.call( deferred, deferred ); - } - - // All done! - return deferred; - }, - - // Deferred helper - when: function( singleValue ) { - var - - // count of uncompleted subordinates - remaining = arguments.length, - - // count of unprocessed arguments - i = remaining, - - // subordinate fulfillment data - resolveContexts = Array( i ), - resolveValues = slice.call( arguments ), - - // the master Deferred - master = jQuery.Deferred(), - - // subordinate callback factory - updateFunc = function( i ) { - return function( value ) { - resolveContexts[ i ] = this; - resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; - if ( !( --remaining ) ) { - master.resolveWith( resolveContexts, resolveValues ); - } - }; - }; - - // Single- and empty arguments are adopted like Promise.resolve - if ( remaining <= 1 ) { - adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject, - !remaining ); - - // Use .then() to unwrap secondary thenables (cf. gh-3000) - if ( master.state() === "pending" || - isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { - - return master.then(); - } - } - - // Multiple arguments are aggregated like Promise.all array elements - while ( i-- ) { - adoptValue( resolveValues[ i ], updateFunc( i ), master.reject ); - } - - return master.promise(); - } -} ); - - -// These usually indicate a programmer mistake during development, -// warn about them ASAP rather than swallowing them by default. -var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - -jQuery.Deferred.exceptionHook = function( error, stack ) { - - // Support: IE 8 - 9 only - // Console exists when dev tools are open, which can happen at any time - if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { - window.console.warn( "jQuery.Deferred exception: " + error.message, error.stack, stack ); - } -}; - - - - -jQuery.readyException = function( error ) { - window.setTimeout( function() { - throw error; - } ); -}; - - - - -// The deferred used on DOM ready -var readyList = jQuery.Deferred(); - -jQuery.fn.ready = function( fn ) { - - readyList - .then( fn ) - - // Wrap jQuery.readyException in a function so that the lookup - // happens at the time of error handling instead of callback - // registration. - .catch( function( error ) { - jQuery.readyException( error ); - } ); - - return this; -}; - -jQuery.extend( { - - // Is the DOM ready to be used? Set to true once it occurs. - isReady: false, - - // A counter to track how many items to wait for before - // the ready event fires. See #6781 - readyWait: 1, - - // Handle when the DOM is ready - ready: function( wait ) { - - // Abort if there are pending holds or we're already ready - if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { - return; - } - - // Remember that the DOM is ready - jQuery.isReady = true; - - // If a normal DOM Ready event fired, decrement, and wait if need be - if ( wait !== true && --jQuery.readyWait > 0 ) { - return; - } - - // If there are functions bound, to execute - readyList.resolveWith( document, [ jQuery ] ); - } -} ); - -jQuery.ready.then = readyList.then; - -// The ready event handler and self cleanup method -function completed() { - document.removeEventListener( "DOMContentLoaded", completed ); - window.removeEventListener( "load", completed ); - jQuery.ready(); -} - -// Catch cases where $(document).ready() is called -// after the browser event has already occurred. -// Support: IE <=9 - 10 only -// Older IE sometimes signals "interactive" too soon -if ( document.readyState === "complete" || - ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { - - // Handle it asynchronously to allow scripts the opportunity to delay ready - window.setTimeout( jQuery.ready ); - -} else { - - // Use the handy event callback - document.addEventListener( "DOMContentLoaded", completed ); - - // A fallback to window.onload, that will always work - window.addEventListener( "load", completed ); -} - - - - -// Multifunctional method to get and set values of a collection -// The value/s can optionally be executed if it's a function -var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { - var i = 0, - len = elems.length, - bulk = key == null; - - // Sets many values - if ( toType( key ) === "object" ) { - chainable = true; - for ( i in key ) { - access( elems, fn, i, key[ i ], true, emptyGet, raw ); - } - - // Sets one value - } else if ( value !== undefined ) { - chainable = true; - - if ( !isFunction( value ) ) { - raw = true; - } - - if ( bulk ) { - - // Bulk operations run against the entire set - if ( raw ) { - fn.call( elems, value ); - fn = null; - - // ...except when executing function values - } else { - bulk = fn; - fn = function( elem, _key, value ) { - return bulk.call( jQuery( elem ), value ); - }; - } - } - - if ( fn ) { - for ( ; i < len; i++ ) { - fn( - elems[ i ], key, raw ? - value : - value.call( elems[ i ], i, fn( elems[ i ], key ) ) - ); - } - } - } - - if ( chainable ) { - return elems; - } - - // Gets - if ( bulk ) { - return fn.call( elems ); - } - - return len ? fn( elems[ 0 ], key ) : emptyGet; -}; - - -// Matches dashed string for camelizing -var rmsPrefix = /^-ms-/, - rdashAlpha = /-([a-z])/g; - -// Used by camelCase as callback to replace() -function fcamelCase( _all, letter ) { - return letter.toUpperCase(); -} - -// Convert dashed to camelCase; used by the css and data modules -// Support: IE <=9 - 11, Edge 12 - 15 -// Microsoft forgot to hump their vendor prefix (#9572) -function camelCase( string ) { - return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); -} -var acceptData = function( owner ) { - - // Accepts only: - // - Node - // - Node.ELEMENT_NODE - // - Node.DOCUMENT_NODE - // - Object - // - Any - return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); -}; - - - - -function Data() { - this.expando = jQuery.expando + Data.uid++; -} - -Data.uid = 1; - -Data.prototype = { - - cache: function( owner ) { - - // Check if the owner object already has a cache - var value = owner[ this.expando ]; - - // If not, create one - if ( !value ) { - value = {}; - - // We can accept data for non-element nodes in modern browsers, - // but we should not, see #8335. - // Always return an empty object. - if ( acceptData( owner ) ) { - - // If it is a node unlikely to be stringify-ed or looped over - // use plain assignment - if ( owner.nodeType ) { - owner[ this.expando ] = value; - - // Otherwise secure it in a non-enumerable property - // configurable must be true to allow the property to be - // deleted when data is removed - } else { - Object.defineProperty( owner, this.expando, { - value: value, - configurable: true - } ); - } - } - } - - return value; - }, - set: function( owner, data, value ) { - var prop, - cache = this.cache( owner ); - - // Handle: [ owner, key, value ] args - // Always use camelCase key (gh-2257) - if ( typeof data === "string" ) { - cache[ camelCase( data ) ] = value; - - // Handle: [ owner, { properties } ] args - } else { - - // Copy the properties one-by-one to the cache object - for ( prop in data ) { - cache[ camelCase( prop ) ] = data[ prop ]; - } - } - return cache; - }, - get: function( owner, key ) { - return key === undefined ? - this.cache( owner ) : - - // Always use camelCase key (gh-2257) - owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; - }, - access: function( owner, key, value ) { - - // In cases where either: - // - // 1. No key was specified - // 2. A string key was specified, but no value provided - // - // Take the "read" path and allow the get method to determine - // which value to return, respectively either: - // - // 1. The entire cache object - // 2. The data stored at the key - // - if ( key === undefined || - ( ( key && typeof key === "string" ) && value === undefined ) ) { - - return this.get( owner, key ); - } - - // When the key is not a string, or both a key and value - // are specified, set or extend (existing objects) with either: - // - // 1. An object of properties - // 2. A key and value - // - this.set( owner, key, value ); - - // Since the "set" path can have two possible entry points - // return the expected data based on which path was taken[*] - return value !== undefined ? value : key; - }, - remove: function( owner, key ) { - var i, - cache = owner[ this.expando ]; - - if ( cache === undefined ) { - return; - } - - if ( key !== undefined ) { - - // Support array or space separated string of keys - if ( Array.isArray( key ) ) { - - // If key is an array of keys... - // We always set camelCase keys, so remove that. - key = key.map( camelCase ); - } else { - key = camelCase( key ); - - // If a key with the spaces exists, use it. - // Otherwise, create an array by matching non-whitespace - key = key in cache ? - [ key ] : - ( key.match( rnothtmlwhite ) || [] ); - } - - i = key.length; - - while ( i-- ) { - delete cache[ key[ i ] ]; - } - } - - // Remove the expando if there's no more data - if ( key === undefined || jQuery.isEmptyObject( cache ) ) { - - // Support: Chrome <=35 - 45 - // Webkit & Blink performance suffers when deleting properties - // from DOM nodes, so set to undefined instead - // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) - if ( owner.nodeType ) { - owner[ this.expando ] = undefined; - } else { - delete owner[ this.expando ]; - } - } - }, - hasData: function( owner ) { - var cache = owner[ this.expando ]; - return cache !== undefined && !jQuery.isEmptyObject( cache ); - } -}; -var dataPriv = new Data(); - -var dataUser = new Data(); - - - -// Implementation Summary -// -// 1. Enforce API surface and semantic compatibility with 1.9.x branch -// 2. Improve the module's maintainability by reducing the storage -// paths to a single mechanism. -// 3. Use the same single mechanism to support "private" and "user" data. -// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) -// 5. Avoid exposing implementation details on user objects (eg. expando properties) -// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 - -var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - rmultiDash = /[A-Z]/g; - -function getData( data ) { - if ( data === "true" ) { - return true; - } - - if ( data === "false" ) { - return false; - } - - if ( data === "null" ) { - return null; - } - - // Only convert to a number if it doesn't change the string - if ( data === +data + "" ) { - return +data; - } - - if ( rbrace.test( data ) ) { - return JSON.parse( data ); - } - - return data; -} - -function dataAttr( elem, key, data ) { - var name; - - // If nothing was found internally, try to fetch any - // data from the HTML5 data-* attribute - if ( data === undefined && elem.nodeType === 1 ) { - name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); - data = elem.getAttribute( name ); - - if ( typeof data === "string" ) { - try { - data = getData( data ); - } catch ( e ) {} - - // Make sure we set the data so it isn't changed later - dataUser.set( elem, key, data ); - } else { - data = undefined; - } - } - return data; -} - -jQuery.extend( { - hasData: function( elem ) { - return dataUser.hasData( elem ) || dataPriv.hasData( elem ); - }, - - data: function( elem, name, data ) { - return dataUser.access( elem, name, data ); - }, - - removeData: function( elem, name ) { - dataUser.remove( elem, name ); - }, - - // TODO: Now that all calls to _data and _removeData have been replaced - // with direct calls to dataPriv methods, these can be deprecated. - _data: function( elem, name, data ) { - return dataPriv.access( elem, name, data ); - }, - - _removeData: function( elem, name ) { - dataPriv.remove( elem, name ); - } -} ); - -jQuery.fn.extend( { - data: function( key, value ) { - var i, name, data, - elem = this[ 0 ], - attrs = elem && elem.attributes; - - // Gets all values - if ( key === undefined ) { - if ( this.length ) { - data = dataUser.get( elem ); - - if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { - i = attrs.length; - while ( i-- ) { - - // Support: IE 11 only - // The attrs elements can be null (#14894) - if ( attrs[ i ] ) { - name = attrs[ i ].name; - if ( name.indexOf( "data-" ) === 0 ) { - name = camelCase( name.slice( 5 ) ); - dataAttr( elem, name, data[ name ] ); - } - } - } - dataPriv.set( elem, "hasDataAttrs", true ); - } - } - - return data; - } - - // Sets multiple values - if ( typeof key === "object" ) { - return this.each( function() { - dataUser.set( this, key ); - } ); - } - - return access( this, function( value ) { - var data; - - // The calling jQuery object (element matches) is not empty - // (and therefore has an element appears at this[ 0 ]) and the - // `value` parameter was not undefined. An empty jQuery object - // will result in `undefined` for elem = this[ 0 ] which will - // throw an exception if an attempt to read a data cache is made. - if ( elem && value === undefined ) { - - // Attempt to get data from the cache - // The key will always be camelCased in Data - data = dataUser.get( elem, key ); - if ( data !== undefined ) { - return data; - } - - // Attempt to "discover" the data in - // HTML5 custom data-* attrs - data = dataAttr( elem, key ); - if ( data !== undefined ) { - return data; - } - - // We tried really hard, but the data doesn't exist. - return; - } - - // Set the data... - this.each( function() { - - // We always store the camelCased key - dataUser.set( this, key, value ); - } ); - }, null, value, arguments.length > 1, null, true ); - }, - - removeData: function( key ) { - return this.each( function() { - dataUser.remove( this, key ); - } ); - } -} ); - - -jQuery.extend( { - queue: function( elem, type, data ) { - var queue; - - if ( elem ) { - type = ( type || "fx" ) + "queue"; - queue = dataPriv.get( elem, type ); - - // Speed up dequeue by getting out quickly if this is just a lookup - if ( data ) { - if ( !queue || Array.isArray( data ) ) { - queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); - } else { - queue.push( data ); - } - } - return queue || []; - } - }, - - dequeue: function( elem, type ) { - type = type || "fx"; - - var queue = jQuery.queue( elem, type ), - startLength = queue.length, - fn = queue.shift(), - hooks = jQuery._queueHooks( elem, type ), - next = function() { - jQuery.dequeue( elem, type ); - }; - - // If the fx queue is dequeued, always remove the progress sentinel - if ( fn === "inprogress" ) { - fn = queue.shift(); - startLength--; - } - - if ( fn ) { - - // Add a progress sentinel to prevent the fx queue from being - // automatically dequeued - if ( type === "fx" ) { - queue.unshift( "inprogress" ); - } - - // Clear up the last queue stop function - delete hooks.stop; - fn.call( elem, next, hooks ); - } - - if ( !startLength && hooks ) { - hooks.empty.fire(); - } - }, - - // Not public - generate a queueHooks object, or return the current one - _queueHooks: function( elem, type ) { - var key = type + "queueHooks"; - return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { - empty: jQuery.Callbacks( "once memory" ).add( function() { - dataPriv.remove( elem, [ type + "queue", key ] ); - } ) - } ); - } -} ); - -jQuery.fn.extend( { - queue: function( type, data ) { - var setter = 2; - - if ( typeof type !== "string" ) { - data = type; - type = "fx"; - setter--; - } - - if ( arguments.length < setter ) { - return jQuery.queue( this[ 0 ], type ); - } - - return data === undefined ? - this : - this.each( function() { - var queue = jQuery.queue( this, type, data ); - - // Ensure a hooks for this queue - jQuery._queueHooks( this, type ); - - if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { - jQuery.dequeue( this, type ); - } - } ); - }, - dequeue: function( type ) { - return this.each( function() { - jQuery.dequeue( this, type ); - } ); - }, - clearQueue: function( type ) { - return this.queue( type || "fx", [] ); - }, - - // Get a promise resolved when queues of a certain type - // are emptied (fx is the type by default) - promise: function( type, obj ) { - var tmp, - count = 1, - defer = jQuery.Deferred(), - elements = this, - i = this.length, - resolve = function() { - if ( !( --count ) ) { - defer.resolveWith( elements, [ elements ] ); - } - }; - - if ( typeof type !== "string" ) { - obj = type; - type = undefined; - } - type = type || "fx"; - - while ( i-- ) { - tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); - if ( tmp && tmp.empty ) { - count++; - tmp.empty.add( resolve ); - } - } - resolve(); - return defer.promise( obj ); - } -} ); -var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; - -var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); - - -var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; - -var documentElement = document.documentElement; - - - - var isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ); - }, - composed = { composed: true }; - - // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only - // Check attachment across shadow DOM boundaries when possible (gh-3504) - // Support: iOS 10.0-10.2 only - // Early iOS 10 versions support `attachShadow` but not `getRootNode`, - // leading to errors. We need to check for `getRootNode`. - if ( documentElement.getRootNode ) { - isAttached = function( elem ) { - return jQuery.contains( elem.ownerDocument, elem ) || - elem.getRootNode( composed ) === elem.ownerDocument; - }; - } -var isHiddenWithinTree = function( elem, el ) { - - // isHiddenWithinTree might be called from jQuery#filter function; - // in that case, element will be second argument - elem = el || elem; - - // Inline style trumps all - return elem.style.display === "none" || - elem.style.display === "" && - - // Otherwise, check computed style - // Support: Firefox <=43 - 45 - // Disconnected elements can have computed display: none, so first confirm that elem is - // in the document. - isAttached( elem ) && - - jQuery.css( elem, "display" ) === "none"; - }; - - - -function adjustCSS( elem, prop, valueParts, tween ) { - var adjusted, scale, - maxIterations = 20, - currentValue = tween ? - function() { - return tween.cur(); - } : - function() { - return jQuery.css( elem, prop, "" ); - }, - initial = currentValue(), - unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), - - // Starting value computation is required for potential unit mismatches - initialInUnit = elem.nodeType && - ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && - rcssNum.exec( jQuery.css( elem, prop ) ); - - if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { - - // Support: Firefox <=54 - // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) - initial = initial / 2; - - // Trust units reported by jQuery.css - unit = unit || initialInUnit[ 3 ]; - - // Iteratively approximate from a nonzero starting point - initialInUnit = +initial || 1; - - while ( maxIterations-- ) { - - // Evaluate and update our best guess (doubling guesses that zero out). - // Finish if the scale equals or crosses 1 (making the old*new product non-positive). - jQuery.style( elem, prop, initialInUnit + unit ); - if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { - maxIterations = 0; - } - initialInUnit = initialInUnit / scale; - - } - - initialInUnit = initialInUnit * 2; - jQuery.style( elem, prop, initialInUnit + unit ); - - // Make sure we update the tween properties later on - valueParts = valueParts || []; - } - - if ( valueParts ) { - initialInUnit = +initialInUnit || +initial || 0; - - // Apply relative offset (+=/-=) if specified - adjusted = valueParts[ 1 ] ? - initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : - +valueParts[ 2 ]; - if ( tween ) { - tween.unit = unit; - tween.start = initialInUnit; - tween.end = adjusted; - } - } - return adjusted; -} - - -var defaultDisplayMap = {}; - -function getDefaultDisplay( elem ) { - var temp, - doc = elem.ownerDocument, - nodeName = elem.nodeName, - display = defaultDisplayMap[ nodeName ]; - - if ( display ) { - return display; - } - - temp = doc.body.appendChild( doc.createElement( nodeName ) ); - display = jQuery.css( temp, "display" ); - - temp.parentNode.removeChild( temp ); - - if ( display === "none" ) { - display = "block"; - } - defaultDisplayMap[ nodeName ] = display; - - return display; -} - -function showHide( elements, show ) { - var display, elem, - values = [], - index = 0, - length = elements.length; - - // Determine new display value for elements that need to change - for ( ; index < length; index++ ) { - elem = elements[ index ]; - if ( !elem.style ) { - continue; - } - - display = elem.style.display; - if ( show ) { - - // Since we force visibility upon cascade-hidden elements, an immediate (and slow) - // check is required in this first loop unless we have a nonempty display value (either - // inline or about-to-be-restored) - if ( display === "none" ) { - values[ index ] = dataPriv.get( elem, "display" ) || null; - if ( !values[ index ] ) { - elem.style.display = ""; - } - } - if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { - values[ index ] = getDefaultDisplay( elem ); - } - } else { - if ( display !== "none" ) { - values[ index ] = "none"; - - // Remember what we're overwriting - dataPriv.set( elem, "display", display ); - } - } - } - - // Set the display of the elements in a second loop to avoid constant reflow - for ( index = 0; index < length; index++ ) { - if ( values[ index ] != null ) { - elements[ index ].style.display = values[ index ]; - } - } - - return elements; -} - -jQuery.fn.extend( { - show: function() { - return showHide( this, true ); - }, - hide: function() { - return showHide( this ); - }, - toggle: function( state ) { - if ( typeof state === "boolean" ) { - return state ? this.show() : this.hide(); - } - - return this.each( function() { - if ( isHiddenWithinTree( this ) ) { - jQuery( this ).show(); - } else { - jQuery( this ).hide(); - } - } ); - } -} ); -var rcheckableType = ( /^(?:checkbox|radio)$/i ); - -var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); - -var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); - - - -( function() { - var fragment = document.createDocumentFragment(), - div = fragment.appendChild( document.createElement( "div" ) ), - input = document.createElement( "input" ); - - // Support: Android 4.0 - 4.3 only - // Check state lost if the name is set (#11217) - // Support: Windows Web Apps (WWA) - // `name` and `type` must use .setAttribute for WWA (#14901) - input.setAttribute( "type", "radio" ); - input.setAttribute( "checked", "checked" ); - input.setAttribute( "name", "t" ); - - div.appendChild( input ); - - // Support: Android <=4.1 only - // Older WebKit doesn't clone checked state correctly in fragments - support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; - - // Support: IE <=11 only - // Make sure textarea (and checkbox) defaultValue is properly cloned - div.innerHTML = ""; - support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; - - // Support: IE <=9 only - // IE <=9 replaces "; - support.option = !!div.lastChild; -} )(); - - -// We have to close these tags to support XHTML (#13200) -var wrapMap = { - - // XHTML parsers do not magically insert elements in the - // same way that tag soup parsers do. So we cannot shorten - // this by omitting or other required elements. - thead: [ 1, "", "
" ], - col: [ 2, "", "
" ], - tr: [ 2, "", "
" ], - td: [ 3, "", "
" ], - - _default: [ 0, "", "" ] -}; - -wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; -wrapMap.th = wrapMap.td; - -// Support: IE <=9 only -if ( !support.option ) { - wrapMap.optgroup = wrapMap.option = [ 1, "" ]; -} - - -function getAll( context, tag ) { - - // Support: IE <=9 - 11 only - // Use typeof to avoid zero-argument method invocation on host objects (#15151) - var ret; - - if ( typeof context.getElementsByTagName !== "undefined" ) { - ret = context.getElementsByTagName( tag || "*" ); - - } else if ( typeof context.querySelectorAll !== "undefined" ) { - ret = context.querySelectorAll( tag || "*" ); - - } else { - ret = []; - } - - if ( tag === undefined || tag && nodeName( context, tag ) ) { - return jQuery.merge( [ context ], ret ); - } - - return ret; -} - - -// Mark scripts as having already been evaluated -function setGlobalEval( elems, refElements ) { - var i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - dataPriv.set( - elems[ i ], - "globalEval", - !refElements || dataPriv.get( refElements[ i ], "globalEval" ) - ); - } -} - - -var rhtml = /<|&#?\w+;/; - -function buildFragment( elems, context, scripts, selection, ignored ) { - var elem, tmp, tag, wrap, attached, j, - fragment = context.createDocumentFragment(), - nodes = [], - i = 0, - l = elems.length; - - for ( ; i < l; i++ ) { - elem = elems[ i ]; - - if ( elem || elem === 0 ) { - - // Add nodes directly - if ( toType( elem ) === "object" ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); - - // Convert non-html into a text node - } else if ( !rhtml.test( elem ) ) { - nodes.push( context.createTextNode( elem ) ); - - // Convert html into DOM nodes - } else { - tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); - - // Deserialize a standard representation - tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); - wrap = wrapMap[ tag ] || wrapMap._default; - tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; - - // Descend through wrappers to the right content - j = wrap[ 0 ]; - while ( j-- ) { - tmp = tmp.lastChild; - } - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( nodes, tmp.childNodes ); - - // Remember the top-level container - tmp = fragment.firstChild; - - // Ensure the created nodes are orphaned (#12392) - tmp.textContent = ""; - } - } - } - - // Remove wrapper from fragment - fragment.textContent = ""; - - i = 0; - while ( ( elem = nodes[ i++ ] ) ) { - - // Skip elements already in the context collection (trac-4087) - if ( selection && jQuery.inArray( elem, selection ) > -1 ) { - if ( ignored ) { - ignored.push( elem ); - } - continue; - } - - attached = isAttached( elem ); - - // Append to fragment - tmp = getAll( fragment.appendChild( elem ), "script" ); - - // Preserve script evaluation history - if ( attached ) { - setGlobalEval( tmp ); - } - - // Capture executables - if ( scripts ) { - j = 0; - while ( ( elem = tmp[ j++ ] ) ) { - if ( rscriptType.test( elem.type || "" ) ) { - scripts.push( elem ); - } - } - } - } - - return fragment; -} - - -var - rkeyEvent = /^key/, - rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - rtypenamespace = /^([^.]*)(?:\.(.+)|)/; - -function returnTrue() { - return true; -} - -function returnFalse() { - return false; -} - -// Support: IE <=9 - 11+ -// focus() and blur() are asynchronous, except when they are no-op. -// So expect focus to be synchronous when the element is already active, -// and blur to be synchronous when the element is not already active. -// (focus and blur are always synchronous in other supported browsers, -// this just defines when we can count on it). -function expectSync( elem, type ) { - return ( elem === safeActiveElement() ) === ( type === "focus" ); -} - -// Support: IE <=9 only -// Accessing document.activeElement can throw unexpectedly -// https://bugs.jquery.com/ticket/13393 -function safeActiveElement() { - try { - return document.activeElement; - } catch ( err ) { } -} - -function on( elem, types, selector, data, fn, one ) { - var origFn, type; - - // Types can be a map of types/handlers - if ( typeof types === "object" ) { - - // ( types-Object, selector, data ) - if ( typeof selector !== "string" ) { - - // ( types-Object, data ) - data = data || selector; - selector = undefined; - } - for ( type in types ) { - on( elem, type, selector, data, types[ type ], one ); - } - return elem; - } - - if ( data == null && fn == null ) { - - // ( types, fn ) - fn = selector; - data = selector = undefined; - } else if ( fn == null ) { - if ( typeof selector === "string" ) { - - // ( types, selector, fn ) - fn = data; - data = undefined; - } else { - - // ( types, data, fn ) - fn = data; - data = selector; - selector = undefined; - } - } - if ( fn === false ) { - fn = returnFalse; - } else if ( !fn ) { - return elem; - } - - if ( one === 1 ) { - origFn = fn; - fn = function( event ) { - - // Can use an empty set, since event contains the info - jQuery().off( event ); - return origFn.apply( this, arguments ); - }; - - // Use same guid so caller can remove using origFn - fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); - } - return elem.each( function() { - jQuery.event.add( this, types, fn, data, selector ); - } ); -} - -/* - * Helper functions for managing events -- not part of the public interface. - * Props to Dean Edwards' addEvent library for many of the ideas. - */ -jQuery.event = { - - global: {}, - - add: function( elem, types, handler, data, selector ) { - - var handleObjIn, eventHandle, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.get( elem ); - - // Only attach events to objects that accept data - if ( !acceptData( elem ) ) { - return; - } - - // Caller can pass in an object of custom data in lieu of the handler - if ( handler.handler ) { - handleObjIn = handler; - handler = handleObjIn.handler; - selector = handleObjIn.selector; - } - - // Ensure that invalid selectors throw exceptions at attach time - // Evaluate against documentElement in case elem is a non-element node (e.g., document) - if ( selector ) { - jQuery.find.matchesSelector( documentElement, selector ); - } - - // Make sure that the handler has a unique ID, used to find/remove it later - if ( !handler.guid ) { - handler.guid = jQuery.guid++; - } - - // Init the element's event structure and main handler, if this is the first - if ( !( events = elemData.events ) ) { - events = elemData.events = Object.create( null ); - } - if ( !( eventHandle = elemData.handle ) ) { - eventHandle = elemData.handle = function( e ) { - - // Discard the second event of a jQuery.event.trigger() and - // when an event is called after a page has unloaded - return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? - jQuery.event.dispatch.apply( elem, arguments ) : undefined; - }; - } - - // Handle multiple events separated by a space - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // There *must* be a type, no attaching namespace-only handlers - if ( !type ) { - continue; - } - - // If event changes its type, use the special event handlers for the changed type - special = jQuery.event.special[ type ] || {}; - - // If selector defined, determine special event api type, otherwise given type - type = ( selector ? special.delegateType : special.bindType ) || type; - - // Update special based on newly reset type - special = jQuery.event.special[ type ] || {}; - - // handleObj is passed to all event handlers - handleObj = jQuery.extend( { - type: type, - origType: origType, - data: data, - handler: handler, - guid: handler.guid, - selector: selector, - needsContext: selector && jQuery.expr.match.needsContext.test( selector ), - namespace: namespaces.join( "." ) - }, handleObjIn ); - - // Init the event handler queue if we're the first - if ( !( handlers = events[ type ] ) ) { - handlers = events[ type ] = []; - handlers.delegateCount = 0; - - // Only use addEventListener if the special events handler returns false - if ( !special.setup || - special.setup.call( elem, data, namespaces, eventHandle ) === false ) { - - if ( elem.addEventListener ) { - elem.addEventListener( type, eventHandle ); - } - } - } - - if ( special.add ) { - special.add.call( elem, handleObj ); - - if ( !handleObj.handler.guid ) { - handleObj.handler.guid = handler.guid; - } - } - - // Add to the element's handler list, delegates in front - if ( selector ) { - handlers.splice( handlers.delegateCount++, 0, handleObj ); - } else { - handlers.push( handleObj ); - } - - // Keep track of which events have ever been used, for event optimization - jQuery.event.global[ type ] = true; - } - - }, - - // Detach an event or set of events from an element - remove: function( elem, types, handler, selector, mappedTypes ) { - - var j, origCount, tmp, - events, t, handleObj, - special, handlers, type, namespaces, origType, - elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); - - if ( !elemData || !( events = elemData.events ) ) { - return; - } - - // Once for each type.namespace in types; type may be omitted - types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; - t = types.length; - while ( t-- ) { - tmp = rtypenamespace.exec( types[ t ] ) || []; - type = origType = tmp[ 1 ]; - namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); - - // Unbind all events (on this namespace, if provided) for the element - if ( !type ) { - for ( type in events ) { - jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); - } - continue; - } - - special = jQuery.event.special[ type ] || {}; - type = ( selector ? special.delegateType : special.bindType ) || type; - handlers = events[ type ] || []; - tmp = tmp[ 2 ] && - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); - - // Remove matching events - origCount = j = handlers.length; - while ( j-- ) { - handleObj = handlers[ j ]; - - if ( ( mappedTypes || origType === handleObj.origType ) && - ( !handler || handler.guid === handleObj.guid ) && - ( !tmp || tmp.test( handleObj.namespace ) ) && - ( !selector || selector === handleObj.selector || - selector === "**" && handleObj.selector ) ) { - handlers.splice( j, 1 ); - - if ( handleObj.selector ) { - handlers.delegateCount--; - } - if ( special.remove ) { - special.remove.call( elem, handleObj ); - } - } - } - - // Remove generic event handler if we removed something and no more handlers exist - // (avoids potential for endless recursion during removal of special event handlers) - if ( origCount && !handlers.length ) { - if ( !special.teardown || - special.teardown.call( elem, namespaces, elemData.handle ) === false ) { - - jQuery.removeEvent( elem, type, elemData.handle ); - } - - delete events[ type ]; - } - } - - // Remove data and the expando if it's no longer used - if ( jQuery.isEmptyObject( events ) ) { - dataPriv.remove( elem, "handle events" ); - } - }, - - dispatch: function( nativeEvent ) { - - var i, j, ret, matched, handleObj, handlerQueue, - args = new Array( arguments.length ), - - // Make a writable jQuery.Event from the native event object - event = jQuery.event.fix( nativeEvent ), - - handlers = ( - dataPriv.get( this, "events" ) || Object.create( null ) - )[ event.type ] || [], - special = jQuery.event.special[ event.type ] || {}; - - // Use the fix-ed jQuery.Event rather than the (read-only) native event - args[ 0 ] = event; - - for ( i = 1; i < arguments.length; i++ ) { - args[ i ] = arguments[ i ]; - } - - event.delegateTarget = this; - - // Call the preDispatch hook for the mapped type, and let it bail if desired - if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { - return; - } - - // Determine handlers - handlerQueue = jQuery.event.handlers.call( this, event, handlers ); - - // Run delegates first; they may want to stop propagation beneath us - i = 0; - while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { - event.currentTarget = matched.elem; - - j = 0; - while ( ( handleObj = matched.handlers[ j++ ] ) && - !event.isImmediatePropagationStopped() ) { - - // If the event is namespaced, then each handler is only invoked if it is - // specially universal or its namespaces are a superset of the event's. - if ( !event.rnamespace || handleObj.namespace === false || - event.rnamespace.test( handleObj.namespace ) ) { - - event.handleObj = handleObj; - event.data = handleObj.data; - - ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || - handleObj.handler ).apply( matched.elem, args ); - - if ( ret !== undefined ) { - if ( ( event.result = ret ) === false ) { - event.preventDefault(); - event.stopPropagation(); - } - } - } - } - } - - // Call the postDispatch hook for the mapped type - if ( special.postDispatch ) { - special.postDispatch.call( this, event ); - } - - return event.result; - }, - - handlers: function( event, handlers ) { - var i, handleObj, sel, matchedHandlers, matchedSelectors, - handlerQueue = [], - delegateCount = handlers.delegateCount, - cur = event.target; - - // Find delegate handlers - if ( delegateCount && - - // Support: IE <=9 - // Black-hole SVG instance trees (trac-13180) - cur.nodeType && - - // Support: Firefox <=42 - // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) - // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click - // Support: IE 11 only - // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) - !( event.type === "click" && event.button >= 1 ) ) { - - for ( ; cur !== this; cur = cur.parentNode || this ) { - - // Don't check non-elements (#13208) - // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) - if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { - matchedHandlers = []; - matchedSelectors = {}; - for ( i = 0; i < delegateCount; i++ ) { - handleObj = handlers[ i ]; - - // Don't conflict with Object.prototype properties (#13203) - sel = handleObj.selector + " "; - - if ( matchedSelectors[ sel ] === undefined ) { - matchedSelectors[ sel ] = handleObj.needsContext ? - jQuery( sel, this ).index( cur ) > -1 : - jQuery.find( sel, this, null, [ cur ] ).length; - } - if ( matchedSelectors[ sel ] ) { - matchedHandlers.push( handleObj ); - } - } - if ( matchedHandlers.length ) { - handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); - } - } - } - } - - // Add the remaining (directly-bound) handlers - cur = this; - if ( delegateCount < handlers.length ) { - handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); - } - - return handlerQueue; - }, - - addProp: function( name, hook ) { - Object.defineProperty( jQuery.Event.prototype, name, { - enumerable: true, - configurable: true, - - get: isFunction( hook ) ? - function() { - if ( this.originalEvent ) { - return hook( this.originalEvent ); - } - } : - function() { - if ( this.originalEvent ) { - return this.originalEvent[ name ]; - } - }, - - set: function( value ) { - Object.defineProperty( this, name, { - enumerable: true, - configurable: true, - writable: true, - value: value - } ); - } - } ); - }, - - fix: function( originalEvent ) { - return originalEvent[ jQuery.expando ] ? - originalEvent : - new jQuery.Event( originalEvent ); - }, - - special: { - load: { - - // Prevent triggered image.load events from bubbling to window.load - noBubble: true - }, - click: { - - // Utilize native event to ensure correct state for checkable inputs - setup: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Claim the first handler - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - // dataPriv.set( el, "click", ... ) - leverageNative( el, "click", returnTrue ); - } - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function( data ) { - - // For mutual compressibility with _default, replace `this` access with a local var. - // `|| data` is dead code meant only to preserve the variable through minification. - var el = this || data; - - // Force setup before triggering a click - if ( rcheckableType.test( el.type ) && - el.click && nodeName( el, "input" ) ) { - - leverageNative( el, "click" ); - } - - // Return non-false to allow normal event-path propagation - return true; - }, - - // For cross-browser consistency, suppress native .click() on links - // Also prevent it if we're currently inside a leveraged native-event stack - _default: function( event ) { - var target = event.target; - return rcheckableType.test( target.type ) && - target.click && nodeName( target, "input" ) && - dataPriv.get( target, "click" ) || - nodeName( target, "a" ); - } - }, - - beforeunload: { - postDispatch: function( event ) { - - // Support: Firefox 20+ - // Firefox doesn't alert if the returnValue field is not set. - if ( event.result !== undefined && event.originalEvent ) { - event.originalEvent.returnValue = event.result; - } - } - } - } -}; - -// Ensure the presence of an event listener that handles manually-triggered -// synthetic events by interrupting progress until reinvoked in response to -// *native* events that it fires directly, ensuring that state changes have -// already occurred before other listeners are invoked. -function leverageNative( el, type, expectSync ) { - - // Missing expectSync indicates a trigger call, which must force setup through jQuery.event.add - if ( !expectSync ) { - if ( dataPriv.get( el, type ) === undefined ) { - jQuery.event.add( el, type, returnTrue ); - } - return; - } - - // Register the controller as a special universal handler for all event namespaces - dataPriv.set( el, type, false ); - jQuery.event.add( el, type, { - namespace: false, - handler: function( event ) { - var notAsync, result, - saved = dataPriv.get( this, type ); - - if ( ( event.isTrigger & 1 ) && this[ type ] ) { - - // Interrupt processing of the outer synthetic .trigger()ed event - // Saved data should be false in such cases, but might be a leftover capture object - // from an async native handler (gh-4350) - if ( !saved.length ) { - - // Store arguments for use when handling the inner native event - // There will always be at least one argument (an event object), so this array - // will not be confused with a leftover capture object. - saved = slice.call( arguments ); - dataPriv.set( this, type, saved ); - - // Trigger the native event and capture its result - // Support: IE <=9 - 11+ - // focus() and blur() are asynchronous - notAsync = expectSync( this, type ); - this[ type ](); - result = dataPriv.get( this, type ); - if ( saved !== result || notAsync ) { - dataPriv.set( this, type, false ); - } else { - result = {}; - } - if ( saved !== result ) { - - // Cancel the outer synthetic event - event.stopImmediatePropagation(); - event.preventDefault(); - return result.value; - } - - // If this is an inner synthetic event for an event with a bubbling surrogate - // (focus or blur), assume that the surrogate already propagated from triggering the - // native event and prevent that from happening again here. - // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the - // bubbling surrogate propagates *after* the non-bubbling base), but that seems - // less bad than duplication. - } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { - event.stopPropagation(); - } - - // If this is a native event triggered above, everything is now in order - // Fire an inner synthetic event with the original arguments - } else if ( saved.length ) { - - // ...and capture the result - dataPriv.set( this, type, { - value: jQuery.event.trigger( - - // Support: IE <=9 - 11+ - // Extend with the prototype to reset the above stopImmediatePropagation() - jQuery.extend( saved[ 0 ], jQuery.Event.prototype ), - saved.slice( 1 ), - this - ) - } ); - - // Abort handling of the native event - event.stopImmediatePropagation(); - } - } - } ); -} - -jQuery.removeEvent = function( elem, type, handle ) { - - // This "if" is needed for plain objects - if ( elem.removeEventListener ) { - elem.removeEventListener( type, handle ); - } -}; - -jQuery.Event = function( src, props ) { - - // Allow instantiation without the 'new' keyword - if ( !( this instanceof jQuery.Event ) ) { - return new jQuery.Event( src, props ); - } - - // Event object - if ( src && src.type ) { - this.originalEvent = src; - this.type = src.type; - - // Events bubbling up the document may have been marked as prevented - // by a handler lower down the tree; reflect the correct value. - this.isDefaultPrevented = src.defaultPrevented || - src.defaultPrevented === undefined && - - // Support: Android <=2.3 only - src.returnValue === false ? - returnTrue : - returnFalse; - - // Create target properties - // Support: Safari <=6 - 7 only - // Target should not be a text node (#504, #13143) - this.target = ( src.target && src.target.nodeType === 3 ) ? - src.target.parentNode : - src.target; - - this.currentTarget = src.currentTarget; - this.relatedTarget = src.relatedTarget; - - // Event type - } else { - this.type = src; - } - - // Put explicitly provided properties onto the event object - if ( props ) { - jQuery.extend( this, props ); - } - - // Create a timestamp if incoming event doesn't have one - this.timeStamp = src && src.timeStamp || Date.now(); - - // Mark it as fixed - this[ jQuery.expando ] = true; -}; - -// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding -// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html -jQuery.Event.prototype = { - constructor: jQuery.Event, - isDefaultPrevented: returnFalse, - isPropagationStopped: returnFalse, - isImmediatePropagationStopped: returnFalse, - isSimulated: false, - - preventDefault: function() { - var e = this.originalEvent; - - this.isDefaultPrevented = returnTrue; - - if ( e && !this.isSimulated ) { - e.preventDefault(); - } - }, - stopPropagation: function() { - var e = this.originalEvent; - - this.isPropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopPropagation(); - } - }, - stopImmediatePropagation: function() { - var e = this.originalEvent; - - this.isImmediatePropagationStopped = returnTrue; - - if ( e && !this.isSimulated ) { - e.stopImmediatePropagation(); - } - - this.stopPropagation(); - } -}; - -// Includes all common event props including KeyEvent and MouseEvent specific props -jQuery.each( { - altKey: true, - bubbles: true, - cancelable: true, - changedTouches: true, - ctrlKey: true, - detail: true, - eventPhase: true, - metaKey: true, - pageX: true, - pageY: true, - shiftKey: true, - view: true, - "char": true, - code: true, - charCode: true, - key: true, - keyCode: true, - button: true, - buttons: true, - clientX: true, - clientY: true, - offsetX: true, - offsetY: true, - pointerId: true, - pointerType: true, - screenX: true, - screenY: true, - targetTouches: true, - toElement: true, - touches: true, - - which: function( event ) { - var button = event.button; - - // Add which for key events - if ( event.which == null && rkeyEvent.test( event.type ) ) { - return event.charCode != null ? event.charCode : event.keyCode; - } - - // Add which for click: 1 === left; 2 === middle; 3 === right - if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) { - if ( button & 1 ) { - return 1; - } - - if ( button & 2 ) { - return 3; - } - - if ( button & 4 ) { - return 2; - } - - return 0; - } - - return event.which; - } -}, jQuery.event.addProp ); - -jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { - jQuery.event.special[ type ] = { - - // Utilize native event if possible so blur/focus sequence is correct - setup: function() { - - // Claim the first handler - // dataPriv.set( this, "focus", ... ) - // dataPriv.set( this, "blur", ... ) - leverageNative( this, type, expectSync ); - - // Return false to allow normal processing in the caller - return false; - }, - trigger: function() { - - // Force setup before trigger - leverageNative( this, type ); - - // Return non-false to allow normal event-path propagation - return true; - }, - - delegateType: delegateType - }; -} ); - -// Create mouseenter/leave events using mouseover/out and event-time checks -// so that event delegation works in jQuery. -// Do the same for pointerenter/pointerleave and pointerover/pointerout -// -// Support: Safari 7 only -// Safari sends mouseenter too often; see: -// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 -// for the description of the bug (it existed in older Chrome versions as well). -jQuery.each( { - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" -}, function( orig, fix ) { - jQuery.event.special[ orig ] = { - delegateType: fix, - bindType: fix, - - handle: function( event ) { - var ret, - target = this, - related = event.relatedTarget, - handleObj = event.handleObj; - - // For mouseenter/leave call the handler if related is outside the target. - // NB: No relatedTarget if the mouse left/entered the browser window - if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { - event.type = handleObj.origType; - ret = handleObj.handler.apply( this, arguments ); - event.type = fix; - } - return ret; - } - }; -} ); - -jQuery.fn.extend( { - - on: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn ); - }, - one: function( types, selector, data, fn ) { - return on( this, types, selector, data, fn, 1 ); - }, - off: function( types, selector, fn ) { - var handleObj, type; - if ( types && types.preventDefault && types.handleObj ) { - - // ( event ) dispatched jQuery.Event - handleObj = types.handleObj; - jQuery( types.delegateTarget ).off( - handleObj.namespace ? - handleObj.origType + "." + handleObj.namespace : - handleObj.origType, - handleObj.selector, - handleObj.handler - ); - return this; - } - if ( typeof types === "object" ) { - - // ( types-object [, selector] ) - for ( type in types ) { - this.off( type, selector, types[ type ] ); - } - return this; - } - if ( selector === false || typeof selector === "function" ) { - - // ( types [, fn] ) - fn = selector; - selector = undefined; - } - if ( fn === false ) { - fn = returnFalse; - } - return this.each( function() { - jQuery.event.remove( this, types, fn, selector ); - } ); - } -} ); - - -var - - // Support: IE <=10 - 11, Edge 12 - 13 only - // In IE/Edge using regex groups here causes severe slowdowns. - // See https://connect.microsoft.com/IE/feedback/details/1736512/ - rnoInnerhtml = /\s*$/g; - -// Prefer a tbody over its parent table for containing new rows -function manipulationTarget( elem, content ) { - if ( nodeName( elem, "table" ) && - nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { - - return jQuery( elem ).children( "tbody" )[ 0 ] || elem; - } - - return elem; -} - -// Replace/restore the type attribute of script elements for safe DOM manipulation -function disableScript( elem ) { - elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; - return elem; -} -function restoreScript( elem ) { - if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { - elem.type = elem.type.slice( 5 ); - } else { - elem.removeAttribute( "type" ); - } - - return elem; -} - -function cloneCopyEvent( src, dest ) { - var i, l, type, pdataOld, udataOld, udataCur, events; - - if ( dest.nodeType !== 1 ) { - return; - } - - // 1. Copy private data: events, handlers, etc. - if ( dataPriv.hasData( src ) ) { - pdataOld = dataPriv.get( src ); - events = pdataOld.events; - - if ( events ) { - dataPriv.remove( dest, "handle events" ); - - for ( type in events ) { - for ( i = 0, l = events[ type ].length; i < l; i++ ) { - jQuery.event.add( dest, type, events[ type ][ i ] ); - } - } - } - } - - // 2. Copy user data - if ( dataUser.hasData( src ) ) { - udataOld = dataUser.access( src ); - udataCur = jQuery.extend( {}, udataOld ); - - dataUser.set( dest, udataCur ); - } -} - -// Fix IE bugs, see support tests -function fixInput( src, dest ) { - var nodeName = dest.nodeName.toLowerCase(); - - // Fails to persist the checked state of a cloned checkbox or radio button. - if ( nodeName === "input" && rcheckableType.test( src.type ) ) { - dest.checked = src.checked; - - // Fails to return the selected option to the default selected state when cloning options - } else if ( nodeName === "input" || nodeName === "textarea" ) { - dest.defaultValue = src.defaultValue; - } -} - -function domManip( collection, args, callback, ignored ) { - - // Flatten any nested arrays - args = flat( args ); - - var fragment, first, scripts, hasScripts, node, doc, - i = 0, - l = collection.length, - iNoClone = l - 1, - value = args[ 0 ], - valueIsFunction = isFunction( value ); - - // We can't cloneNode fragments that contain checked, in WebKit - if ( valueIsFunction || - ( l > 1 && typeof value === "string" && - !support.checkClone && rchecked.test( value ) ) ) { - return collection.each( function( index ) { - var self = collection.eq( index ); - if ( valueIsFunction ) { - args[ 0 ] = value.call( this, index, self.html() ); - } - domManip( self, args, callback, ignored ); - } ); - } - - if ( l ) { - fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); - first = fragment.firstChild; - - if ( fragment.childNodes.length === 1 ) { - fragment = first; - } - - // Require either new content or an interest in ignored elements to invoke the callback - if ( first || ignored ) { - scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); - hasScripts = scripts.length; - - // Use the original fragment for the last item - // instead of the first because it can end up - // being emptied incorrectly in certain situations (#8070). - for ( ; i < l; i++ ) { - node = fragment; - - if ( i !== iNoClone ) { - node = jQuery.clone( node, true, true ); - - // Keep references to cloned scripts for later restoration - if ( hasScripts ) { - - // Support: Android <=4.0 only, PhantomJS 1 only - // push.apply(_, arraylike) throws on ancient WebKit - jQuery.merge( scripts, getAll( node, "script" ) ); - } - } - - callback.call( collection[ i ], node, i ); - } - - if ( hasScripts ) { - doc = scripts[ scripts.length - 1 ].ownerDocument; - - // Reenable scripts - jQuery.map( scripts, restoreScript ); - - // Evaluate executable scripts on first document insertion - for ( i = 0; i < hasScripts; i++ ) { - node = scripts[ i ]; - if ( rscriptType.test( node.type || "" ) && - !dataPriv.access( node, "globalEval" ) && - jQuery.contains( doc, node ) ) { - - if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { - - // Optional AJAX dependency, but won't run scripts if not present - if ( jQuery._evalUrl && !node.noModule ) { - jQuery._evalUrl( node.src, { - nonce: node.nonce || node.getAttribute( "nonce" ) - }, doc ); - } - } else { - DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); - } - } - } - } - } - } - - return collection; -} - -function remove( elem, selector, keepData ) { - var node, - nodes = selector ? jQuery.filter( selector, elem ) : elem, - i = 0; - - for ( ; ( node = nodes[ i ] ) != null; i++ ) { - if ( !keepData && node.nodeType === 1 ) { - jQuery.cleanData( getAll( node ) ); - } - - if ( node.parentNode ) { - if ( keepData && isAttached( node ) ) { - setGlobalEval( getAll( node, "script" ) ); - } - node.parentNode.removeChild( node ); - } - } - - return elem; -} - -jQuery.extend( { - htmlPrefilter: function( html ) { - return html; - }, - - clone: function( elem, dataAndEvents, deepDataAndEvents ) { - var i, l, srcElements, destElements, - clone = elem.cloneNode( true ), - inPage = isAttached( elem ); - - // Fix IE cloning issues - if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && - !jQuery.isXMLDoc( elem ) ) { - - // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2 - destElements = getAll( clone ); - srcElements = getAll( elem ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - fixInput( srcElements[ i ], destElements[ i ] ); - } - } - - // Copy the events from the original to the clone - if ( dataAndEvents ) { - if ( deepDataAndEvents ) { - srcElements = srcElements || getAll( elem ); - destElements = destElements || getAll( clone ); - - for ( i = 0, l = srcElements.length; i < l; i++ ) { - cloneCopyEvent( srcElements[ i ], destElements[ i ] ); - } - } else { - cloneCopyEvent( elem, clone ); - } - } - - // Preserve script evaluation history - destElements = getAll( clone, "script" ); - if ( destElements.length > 0 ) { - setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); - } - - // Return the cloned set - return clone; - }, - - cleanData: function( elems ) { - var data, elem, type, - special = jQuery.event.special, - i = 0; - - for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { - if ( acceptData( elem ) ) { - if ( ( data = elem[ dataPriv.expando ] ) ) { - if ( data.events ) { - for ( type in data.events ) { - if ( special[ type ] ) { - jQuery.event.remove( elem, type ); - - // This is a shortcut to avoid jQuery.event.remove's overhead - } else { - jQuery.removeEvent( elem, type, data.handle ); - } - } - } - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataPriv.expando ] = undefined; - } - if ( elem[ dataUser.expando ] ) { - - // Support: Chrome <=35 - 45+ - // Assign undefined instead of using delete, see Data#remove - elem[ dataUser.expando ] = undefined; - } - } - } - } -} ); - -jQuery.fn.extend( { - detach: function( selector ) { - return remove( this, selector, true ); - }, - - remove: function( selector ) { - return remove( this, selector ); - }, - - text: function( value ) { - return access( this, function( value ) { - return value === undefined ? - jQuery.text( this ) : - this.empty().each( function() { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - this.textContent = value; - } - } ); - }, null, value, arguments.length ); - }, - - append: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.appendChild( elem ); - } - } ); - }, - - prepend: function() { - return domManip( this, arguments, function( elem ) { - if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { - var target = manipulationTarget( this, elem ); - target.insertBefore( elem, target.firstChild ); - } - } ); - }, - - before: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this ); - } - } ); - }, - - after: function() { - return domManip( this, arguments, function( elem ) { - if ( this.parentNode ) { - this.parentNode.insertBefore( elem, this.nextSibling ); - } - } ); - }, - - empty: function() { - var elem, - i = 0; - - for ( ; ( elem = this[ i ] ) != null; i++ ) { - if ( elem.nodeType === 1 ) { - - // Prevent memory leaks - jQuery.cleanData( getAll( elem, false ) ); - - // Remove any remaining nodes - elem.textContent = ""; - } - } - - return this; - }, - - clone: function( dataAndEvents, deepDataAndEvents ) { - dataAndEvents = dataAndEvents == null ? false : dataAndEvents; - deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; - - return this.map( function() { - return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); - } ); - }, - - html: function( value ) { - return access( this, function( value ) { - var elem = this[ 0 ] || {}, - i = 0, - l = this.length; - - if ( value === undefined && elem.nodeType === 1 ) { - return elem.innerHTML; - } - - // See if we can take a shortcut and just use innerHTML - if ( typeof value === "string" && !rnoInnerhtml.test( value ) && - !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { - - value = jQuery.htmlPrefilter( value ); - - try { - for ( ; i < l; i++ ) { - elem = this[ i ] || {}; - - // Remove element nodes and prevent memory leaks - if ( elem.nodeType === 1 ) { - jQuery.cleanData( getAll( elem, false ) ); - elem.innerHTML = value; - } - } - - elem = 0; - - // If using innerHTML throws an exception, use the fallback method - } catch ( e ) {} - } - - if ( elem ) { - this.empty().append( value ); - } - }, null, value, arguments.length ); - }, - - replaceWith: function() { - var ignored = []; - - // Make the changes, replacing each non-ignored context element with the new content - return domManip( this, arguments, function( elem ) { - var parent = this.parentNode; - - if ( jQuery.inArray( this, ignored ) < 0 ) { - jQuery.cleanData( getAll( this ) ); - if ( parent ) { - parent.replaceChild( elem, this ); - } - } - - // Force callback invocation - }, ignored ); - } -} ); - -jQuery.each( { - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" -}, function( name, original ) { - jQuery.fn[ name ] = function( selector ) { - var elems, - ret = [], - insert = jQuery( selector ), - last = insert.length - 1, - i = 0; - - for ( ; i <= last; i++ ) { - elems = i === last ? this : this.clone( true ); - jQuery( insert[ i ] )[ original ]( elems ); - - // Support: Android <=4.0 only, PhantomJS 1 only - // .get() because push.apply(_, arraylike) throws on ancient WebKit - push.apply( ret, elems.get() ); - } - - return this.pushStack( ret ); - }; -} ); -var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); - -var getStyles = function( elem ) { - - // Support: IE <=11 only, Firefox <=30 (#15098, #14150) - // IE throws on elements created in popups - // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" - var view = elem.ownerDocument.defaultView; - - if ( !view || !view.opener ) { - view = window; - } - - return view.getComputedStyle( elem ); - }; - -var swap = function( elem, options, callback ) { - var ret, name, - old = {}; - - // Remember the old values, and insert the new ones - for ( name in options ) { - old[ name ] = elem.style[ name ]; - elem.style[ name ] = options[ name ]; - } - - ret = callback.call( elem ); - - // Revert the old values - for ( name in options ) { - elem.style[ name ] = old[ name ]; - } - - return ret; -}; - - -var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); - - - -( function() { - - // Executing both pixelPosition & boxSizingReliable tests require only one layout - // so they're executed at the same time to save the second computation. - function computeStyleTests() { - - // This is a singleton, we need to execute it only once - if ( !div ) { - return; - } - - container.style.cssText = "position:absolute;left:-11111px;width:60px;" + - "margin-top:1px;padding:0;border:0"; - div.style.cssText = - "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + - "margin:auto;border:1px;padding:1px;" + - "width:60%;top:1%"; - documentElement.appendChild( container ).appendChild( div ); - - var divStyle = window.getComputedStyle( div ); - pixelPositionVal = divStyle.top !== "1%"; - - // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 - reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; - - // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 - // Some styles come back with percentage values, even though they shouldn't - div.style.right = "60%"; - pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; - - // Support: IE 9 - 11 only - // Detect misreporting of content dimensions for box-sizing:border-box elements - boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; - - // Support: IE 9 only - // Detect overflow:scroll screwiness (gh-3699) - // Support: Chrome <=64 - // Don't get tricked when zoom affects offsetWidth (gh-4029) - div.style.position = "absolute"; - scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; - - documentElement.removeChild( container ); - - // Nullify the div so it wouldn't be stored in the memory and - // it will also be a sign that checks already performed - div = null; - } - - function roundPixelMeasures( measure ) { - return Math.round( parseFloat( measure ) ); - } - - var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, - reliableTrDimensionsVal, reliableMarginLeftVal, - container = document.createElement( "div" ), - div = document.createElement( "div" ); - - // Finish early in limited (non-browser) environments - if ( !div.style ) { - return; - } - - // Support: IE <=9 - 11 only - // Style of cloned element affects source element cloned (#8908) - div.style.backgroundClip = "content-box"; - div.cloneNode( true ).style.backgroundClip = ""; - support.clearCloneStyle = div.style.backgroundClip === "content-box"; - - jQuery.extend( support, { - boxSizingReliable: function() { - computeStyleTests(); - return boxSizingReliableVal; - }, - pixelBoxStyles: function() { - computeStyleTests(); - return pixelBoxStylesVal; - }, - pixelPosition: function() { - computeStyleTests(); - return pixelPositionVal; - }, - reliableMarginLeft: function() { - computeStyleTests(); - return reliableMarginLeftVal; - }, - scrollboxSize: function() { - computeStyleTests(); - return scrollboxSizeVal; - }, - - // Support: IE 9 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Behavior in IE 9 is more subtle than in newer versions & it passes - // some versions of this test; make sure not to make it pass there! - reliableTrDimensions: function() { - var table, tr, trChild, trStyle; - if ( reliableTrDimensionsVal == null ) { - table = document.createElement( "table" ); - tr = document.createElement( "tr" ); - trChild = document.createElement( "div" ); - - table.style.cssText = "position:absolute;left:-11111px"; - tr.style.height = "1px"; - trChild.style.height = "9px"; - - documentElement - .appendChild( table ) - .appendChild( tr ) - .appendChild( trChild ); - - trStyle = window.getComputedStyle( tr ); - reliableTrDimensionsVal = parseInt( trStyle.height ) > 3; - - documentElement.removeChild( table ); - } - return reliableTrDimensionsVal; - } - } ); -} )(); - - -function curCSS( elem, name, computed ) { - var width, minWidth, maxWidth, ret, - - // Support: Firefox 51+ - // Retrieving style before computed somehow - // fixes an issue with getting wrong values - // on detached elements - style = elem.style; - - computed = computed || getStyles( elem ); - - // getPropertyValue is needed for: - // .css('filter') (IE 9 only, #12537) - // .css('--customProperty) (#3144) - if ( computed ) { - ret = computed.getPropertyValue( name ) || computed[ name ]; - - if ( ret === "" && !isAttached( elem ) ) { - ret = jQuery.style( elem, name ); - } - - // A tribute to the "awesome hack by Dean Edwards" - // Android Browser returns percentage for some values, - // but width seems to be reliably pixels. - // This is against the CSSOM draft spec: - // https://drafts.csswg.org/cssom/#resolved-values - if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { - - // Remember the original values - width = style.width; - minWidth = style.minWidth; - maxWidth = style.maxWidth; - - // Put in the new values to get a computed value out - style.minWidth = style.maxWidth = style.width = ret; - ret = computed.width; - - // Revert the changed values - style.width = width; - style.minWidth = minWidth; - style.maxWidth = maxWidth; - } - } - - return ret !== undefined ? - - // Support: IE <=9 - 11 only - // IE returns zIndex value as an integer. - ret + "" : - ret; -} - - -function addGetHookIf( conditionFn, hookFn ) { - - // Define the hook, we'll check on the first run if it's really needed. - return { - get: function() { - if ( conditionFn() ) { - - // Hook not needed (or it's not possible to use it due - // to missing dependency), remove it. - delete this.get; - return; - } - - // Hook needed; redefine it so that the support test is not executed again. - return ( this.get = hookFn ).apply( this, arguments ); - } - }; -} - - -var cssPrefixes = [ "Webkit", "Moz", "ms" ], - emptyStyle = document.createElement( "div" ).style, - vendorProps = {}; - -// Return a vendor-prefixed property or undefined -function vendorPropName( name ) { - - // Check for vendor prefixed names - var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), - i = cssPrefixes.length; - - while ( i-- ) { - name = cssPrefixes[ i ] + capName; - if ( name in emptyStyle ) { - return name; - } - } -} - -// Return a potentially-mapped jQuery.cssProps or vendor prefixed property -function finalPropName( name ) { - var final = jQuery.cssProps[ name ] || vendorProps[ name ]; - - if ( final ) { - return final; - } - if ( name in emptyStyle ) { - return name; - } - return vendorProps[ name ] = vendorPropName( name ) || name; -} - - -var - - // Swappable if display is none or starts with table - // except "table", "table-cell", or "table-caption" - // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display - rdisplayswap = /^(none|table(?!-c[ea]).+)/, - rcustomProp = /^--/, - cssShow = { position: "absolute", visibility: "hidden", display: "block" }, - cssNormalTransform = { - letterSpacing: "0", - fontWeight: "400" - }; - -function setPositiveNumber( _elem, value, subtract ) { - - // Any relative (+/-) values have already been - // normalized at this point - var matches = rcssNum.exec( value ); - return matches ? - - // Guard against undefined "subtract", e.g., when used as in cssHooks - Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : - value; -} - -function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { - var i = dimension === "width" ? 1 : 0, - extra = 0, - delta = 0; - - // Adjustment may not be necessary - if ( box === ( isBorderBox ? "border" : "content" ) ) { - return 0; - } - - for ( ; i < 4; i += 2 ) { - - // Both box models exclude margin - if ( box === "margin" ) { - delta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); - } - - // If we get here with a content-box, we're seeking "padding" or "border" or "margin" - if ( !isBorderBox ) { - - // Add padding - delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - - // For "border" or "margin", add border - if ( box !== "padding" ) { - delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - - // But still keep track of it otherwise - } else { - extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - - // If we get here with a border-box (content + padding + border), we're seeking "content" or - // "padding" or "margin" - } else { - - // For "content", subtract padding - if ( box === "content" ) { - delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); - } - - // For "content" or "padding", subtract border - if ( box !== "margin" ) { - delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); - } - } - } - - // Account for positive content-box scroll gutter when requested by providing computedVal - if ( !isBorderBox && computedVal >= 0 ) { - - // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border - // Assuming integer scroll gutter, subtract the rest and round down - delta += Math.max( 0, Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - computedVal - - delta - - extra - - 0.5 - - // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter - // Use an explicit zero to avoid NaN (gh-3964) - ) ) || 0; - } - - return delta; -} - -function getWidthOrHeight( elem, dimension, extra ) { - - // Start with computed style - var styles = getStyles( elem ), - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). - // Fake content-box until we know it's needed to know the true value. - boxSizingNeeded = !support.boxSizingReliable() || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - valueIsBorderBox = isBorderBox, - - val = curCSS( elem, dimension, styles ), - offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); - - // Support: Firefox <=54 - // Return a confounding non-pixel value or feign ignorance, as appropriate. - if ( rnumnonpx.test( val ) ) { - if ( !extra ) { - return val; - } - val = "auto"; - } - - - // Support: IE 9 - 11 only - // Use offsetWidth/offsetHeight for when box sizing is unreliable. - // In those cases, the computed value can be trusted to be border-box. - if ( ( !support.boxSizingReliable() && isBorderBox || - - // Support: IE 10 - 11+, Edge 15 - 18+ - // IE/Edge misreport `getComputedStyle` of table rows with width/height - // set in CSS while `offset*` properties report correct values. - // Interestingly, in some cases IE 9 doesn't suffer from this issue. - !support.reliableTrDimensions() && nodeName( elem, "tr" ) || - - // Fall back to offsetWidth/offsetHeight when value is "auto" - // This happens for inline elements with no explicit setting (gh-3571) - val === "auto" || - - // Support: Android <=4.1 - 4.3 only - // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) - !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && - - // Make sure the element is visible & connected - elem.getClientRects().length ) { - - isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; - - // Where available, offsetWidth/offsetHeight approximate border box dimensions. - // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the - // retrieved value as a content box dimension. - valueIsBorderBox = offsetProp in elem; - if ( valueIsBorderBox ) { - val = elem[ offsetProp ]; - } - } - - // Normalize "" and auto - val = parseFloat( val ) || 0; - - // Adjust for the element's box model - return ( val + - boxModelAdjustment( - elem, - dimension, - extra || ( isBorderBox ? "border" : "content" ), - valueIsBorderBox, - styles, - - // Provide the current computed size to request scroll gutter calculation (gh-3589) - val - ) - ) + "px"; -} - -jQuery.extend( { - - // Add in style property hooks for overriding the default - // behavior of getting and setting a style property - cssHooks: { - opacity: { - get: function( elem, computed ) { - if ( computed ) { - - // We should always get a number back from opacity - var ret = curCSS( elem, "opacity" ); - return ret === "" ? "1" : ret; - } - } - } - }, - - // Don't automatically add "px" to these possibly-unitless properties - cssNumber: { - "animationIterationCount": true, - "columnCount": true, - "fillOpacity": true, - "flexGrow": true, - "flexShrink": true, - "fontWeight": true, - "gridArea": true, - "gridColumn": true, - "gridColumnEnd": true, - "gridColumnStart": true, - "gridRow": true, - "gridRowEnd": true, - "gridRowStart": true, - "lineHeight": true, - "opacity": true, - "order": true, - "orphans": true, - "widows": true, - "zIndex": true, - "zoom": true - }, - - // Add in properties whose names you wish to fix before - // setting or getting the value - cssProps: {}, - - // Get and set the style property on a DOM Node - style: function( elem, name, value, extra ) { - - // Don't set styles on text and comment nodes - if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { - return; - } - - // Make sure that we're working with the right name - var ret, type, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ), - style = elem.style; - - // Make sure that we're working with the right name. We don't - // want to query the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Gets hook for the prefixed version, then unprefixed version - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // Check if we're setting a value - if ( value !== undefined ) { - type = typeof value; - - // Convert "+=" or "-=" to relative numbers (#7345) - if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { - value = adjustCSS( elem, name, ret ); - - // Fixes bug #9237 - type = "number"; - } - - // Make sure that null and NaN values aren't set (#7116) - if ( value == null || value !== value ) { - return; - } - - // If a number was passed in, add the unit (except for certain CSS properties) - // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append - // "px" to a few hardcoded values. - if ( type === "number" && !isCustomProp ) { - value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); - } - - // background-* props affect original clone's values - if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { - style[ name ] = "inherit"; - } - - // If a hook was provided, use that value, otherwise just set the specified value - if ( !hooks || !( "set" in hooks ) || - ( value = hooks.set( elem, value, extra ) ) !== undefined ) { - - if ( isCustomProp ) { - style.setProperty( name, value ); - } else { - style[ name ] = value; - } - } - - } else { - - // If a hook was provided get the non-computed value from there - if ( hooks && "get" in hooks && - ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { - - return ret; - } - - // Otherwise just get the value from the style object - return style[ name ]; - } - }, - - css: function( elem, name, extra, styles ) { - var val, num, hooks, - origName = camelCase( name ), - isCustomProp = rcustomProp.test( name ); - - // Make sure that we're working with the right name. We don't - // want to modify the value if it is a CSS custom property - // since they are user-defined. - if ( !isCustomProp ) { - name = finalPropName( origName ); - } - - // Try prefixed name followed by the unprefixed name - hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; - - // If a hook was provided get the computed value from there - if ( hooks && "get" in hooks ) { - val = hooks.get( elem, true, extra ); - } - - // Otherwise, if a way to get the computed value exists, use that - if ( val === undefined ) { - val = curCSS( elem, name, styles ); - } - - // Convert "normal" to computed value - if ( val === "normal" && name in cssNormalTransform ) { - val = cssNormalTransform[ name ]; - } - - // Make numeric if forced or a qualifier was provided and val looks numeric - if ( extra === "" || extra ) { - num = parseFloat( val ); - return extra === true || isFinite( num ) ? num || 0 : val; - } - - return val; - } -} ); - -jQuery.each( [ "height", "width" ], function( _i, dimension ) { - jQuery.cssHooks[ dimension ] = { - get: function( elem, computed, extra ) { - if ( computed ) { - - // Certain elements can have dimension info if we invisibly show them - // but it must have a current display style that would benefit - return rdisplayswap.test( jQuery.css( elem, "display" ) ) && - - // Support: Safari 8+ - // Table columns in Safari have non-zero offsetWidth & zero - // getBoundingClientRect().width unless display is changed. - // Support: IE <=11 only - // Running getBoundingClientRect on a disconnected node - // in IE throws an error. - ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? - swap( elem, cssShow, function() { - return getWidthOrHeight( elem, dimension, extra ); - } ) : - getWidthOrHeight( elem, dimension, extra ); - } - }, - - set: function( elem, value, extra ) { - var matches, - styles = getStyles( elem ), - - // Only read styles.position if the test has a chance to fail - // to avoid forcing a reflow. - scrollboxSizeBuggy = !support.scrollboxSize() && - styles.position === "absolute", - - // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) - boxSizingNeeded = scrollboxSizeBuggy || extra, - isBorderBox = boxSizingNeeded && - jQuery.css( elem, "boxSizing", false, styles ) === "border-box", - subtract = extra ? - boxModelAdjustment( - elem, - dimension, - extra, - isBorderBox, - styles - ) : - 0; - - // Account for unreliable border-box dimensions by comparing offset* to computed and - // faking a content-box to get border and padding (gh-3699) - if ( isBorderBox && scrollboxSizeBuggy ) { - subtract -= Math.ceil( - elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - - parseFloat( styles[ dimension ] ) - - boxModelAdjustment( elem, dimension, "border", false, styles ) - - 0.5 - ); - } - - // Convert to pixels if value adjustment is needed - if ( subtract && ( matches = rcssNum.exec( value ) ) && - ( matches[ 3 ] || "px" ) !== "px" ) { - - elem.style[ dimension ] = value; - value = jQuery.css( elem, dimension ); - } - - return setPositiveNumber( elem, value, subtract ); - } - }; -} ); - -jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, - function( elem, computed ) { - if ( computed ) { - return ( parseFloat( curCSS( elem, "marginLeft" ) ) || - elem.getBoundingClientRect().left - - swap( elem, { marginLeft: 0 }, function() { - return elem.getBoundingClientRect().left; - } ) - ) + "px"; - } - } -); - -// These hooks are used by animate to expand properties -jQuery.each( { - margin: "", - padding: "", - border: "Width" -}, function( prefix, suffix ) { - jQuery.cssHooks[ prefix + suffix ] = { - expand: function( value ) { - var i = 0, - expanded = {}, - - // Assumes a single number if not a string - parts = typeof value === "string" ? value.split( " " ) : [ value ]; - - for ( ; i < 4; i++ ) { - expanded[ prefix + cssExpand[ i ] + suffix ] = - parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; - } - - return expanded; - } - }; - - if ( prefix !== "margin" ) { - jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; - } -} ); - -jQuery.fn.extend( { - css: function( name, value ) { - return access( this, function( elem, name, value ) { - var styles, len, - map = {}, - i = 0; - - if ( Array.isArray( name ) ) { - styles = getStyles( elem ); - len = name.length; - - for ( ; i < len; i++ ) { - map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); - } - - return map; - } - - return value !== undefined ? - jQuery.style( elem, name, value ) : - jQuery.css( elem, name ); - }, name, value, arguments.length > 1 ); - } -} ); - - -function Tween( elem, options, prop, end, easing ) { - return new Tween.prototype.init( elem, options, prop, end, easing ); -} -jQuery.Tween = Tween; - -Tween.prototype = { - constructor: Tween, - init: function( elem, options, prop, end, easing, unit ) { - this.elem = elem; - this.prop = prop; - this.easing = easing || jQuery.easing._default; - this.options = options; - this.start = this.now = this.cur(); - this.end = end; - this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); - }, - cur: function() { - var hooks = Tween.propHooks[ this.prop ]; - - return hooks && hooks.get ? - hooks.get( this ) : - Tween.propHooks._default.get( this ); - }, - run: function( percent ) { - var eased, - hooks = Tween.propHooks[ this.prop ]; - - if ( this.options.duration ) { - this.pos = eased = jQuery.easing[ this.easing ]( - percent, this.options.duration * percent, 0, 1, this.options.duration - ); - } else { - this.pos = eased = percent; - } - this.now = ( this.end - this.start ) * eased + this.start; - - if ( this.options.step ) { - this.options.step.call( this.elem, this.now, this ); - } - - if ( hooks && hooks.set ) { - hooks.set( this ); - } else { - Tween.propHooks._default.set( this ); - } - return this; - } -}; - -Tween.prototype.init.prototype = Tween.prototype; - -Tween.propHooks = { - _default: { - get: function( tween ) { - var result; - - // Use a property on the element directly when it is not a DOM element, - // or when there is no matching style property that exists. - if ( tween.elem.nodeType !== 1 || - tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { - return tween.elem[ tween.prop ]; - } - - // Passing an empty string as a 3rd parameter to .css will automatically - // attempt a parseFloat and fallback to a string if the parse fails. - // Simple values such as "10px" are parsed to Float; - // complex values such as "rotate(1rad)" are returned as-is. - result = jQuery.css( tween.elem, tween.prop, "" ); - - // Empty strings, null, undefined and "auto" are converted to 0. - return !result || result === "auto" ? 0 : result; - }, - set: function( tween ) { - - // Use step hook for back compat. - // Use cssHook if its there. - // Use .style if available and use plain properties where available. - if ( jQuery.fx.step[ tween.prop ] ) { - jQuery.fx.step[ tween.prop ]( tween ); - } else if ( tween.elem.nodeType === 1 && ( - jQuery.cssHooks[ tween.prop ] || - tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { - jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); - } else { - tween.elem[ tween.prop ] = tween.now; - } - } - } -}; - -// Support: IE <=9 only -// Panic based approach to setting things on disconnected nodes -Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { - set: function( tween ) { - if ( tween.elem.nodeType && tween.elem.parentNode ) { - tween.elem[ tween.prop ] = tween.now; - } - } -}; - -jQuery.easing = { - linear: function( p ) { - return p; - }, - swing: function( p ) { - return 0.5 - Math.cos( p * Math.PI ) / 2; - }, - _default: "swing" -}; - -jQuery.fx = Tween.prototype.init; - -// Back compat <1.8 extension point -jQuery.fx.step = {}; - - - - -var - fxNow, inProgress, - rfxtypes = /^(?:toggle|show|hide)$/, - rrun = /queueHooks$/; - -function schedule() { - if ( inProgress ) { - if ( document.hidden === false && window.requestAnimationFrame ) { - window.requestAnimationFrame( schedule ); - } else { - window.setTimeout( schedule, jQuery.fx.interval ); - } - - jQuery.fx.tick(); - } -} - -// Animations created synchronously will run synchronously -function createFxNow() { - window.setTimeout( function() { - fxNow = undefined; - } ); - return ( fxNow = Date.now() ); -} - -// Generate parameters to create a standard animation -function genFx( type, includeWidth ) { - var which, - i = 0, - attrs = { height: type }; - - // If we include width, step value is 1 to do all cssExpand values, - // otherwise step value is 2 to skip over Left and Right - includeWidth = includeWidth ? 1 : 0; - for ( ; i < 4; i += 2 - includeWidth ) { - which = cssExpand[ i ]; - attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; - } - - if ( includeWidth ) { - attrs.opacity = attrs.width = type; - } - - return attrs; -} - -function createTween( value, prop, animation ) { - var tween, - collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), - index = 0, - length = collection.length; - for ( ; index < length; index++ ) { - if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { - - // We're done with this property - return tween; - } - } -} - -function defaultPrefilter( elem, props, opts ) { - var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, - isBox = "width" in props || "height" in props, - anim = this, - orig = {}, - style = elem.style, - hidden = elem.nodeType && isHiddenWithinTree( elem ), - dataShow = dataPriv.get( elem, "fxshow" ); - - // Queue-skipping animations hijack the fx hooks - if ( !opts.queue ) { - hooks = jQuery._queueHooks( elem, "fx" ); - if ( hooks.unqueued == null ) { - hooks.unqueued = 0; - oldfire = hooks.empty.fire; - hooks.empty.fire = function() { - if ( !hooks.unqueued ) { - oldfire(); - } - }; - } - hooks.unqueued++; - - anim.always( function() { - - // Ensure the complete handler is called before this completes - anim.always( function() { - hooks.unqueued--; - if ( !jQuery.queue( elem, "fx" ).length ) { - hooks.empty.fire(); - } - } ); - } ); - } - - // Detect show/hide animations - for ( prop in props ) { - value = props[ prop ]; - if ( rfxtypes.test( value ) ) { - delete props[ prop ]; - toggle = toggle || value === "toggle"; - if ( value === ( hidden ? "hide" : "show" ) ) { - - // Pretend to be hidden if this is a "show" and - // there is still data from a stopped show/hide - if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { - hidden = true; - - // Ignore all other no-op show/hide data - } else { - continue; - } - } - orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); - } - } - - // Bail out if this is a no-op like .hide().hide() - propTween = !jQuery.isEmptyObject( props ); - if ( !propTween && jQuery.isEmptyObject( orig ) ) { - return; - } - - // Restrict "overflow" and "display" styles during box animations - if ( isBox && elem.nodeType === 1 ) { - - // Support: IE <=9 - 11, Edge 12 - 15 - // Record all 3 overflow attributes because IE does not infer the shorthand - // from identically-valued overflowX and overflowY and Edge just mirrors - // the overflowX value there. - opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; - - // Identify a display type, preferring old show/hide data over the CSS cascade - restoreDisplay = dataShow && dataShow.display; - if ( restoreDisplay == null ) { - restoreDisplay = dataPriv.get( elem, "display" ); - } - display = jQuery.css( elem, "display" ); - if ( display === "none" ) { - if ( restoreDisplay ) { - display = restoreDisplay; - } else { - - // Get nonempty value(s) by temporarily forcing visibility - showHide( [ elem ], true ); - restoreDisplay = elem.style.display || restoreDisplay; - display = jQuery.css( elem, "display" ); - showHide( [ elem ] ); - } - } - - // Animate inline elements as inline-block - if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { - if ( jQuery.css( elem, "float" ) === "none" ) { - - // Restore the original display value at the end of pure show/hide animations - if ( !propTween ) { - anim.done( function() { - style.display = restoreDisplay; - } ); - if ( restoreDisplay == null ) { - display = style.display; - restoreDisplay = display === "none" ? "" : display; - } - } - style.display = "inline-block"; - } - } - } - - if ( opts.overflow ) { - style.overflow = "hidden"; - anim.always( function() { - style.overflow = opts.overflow[ 0 ]; - style.overflowX = opts.overflow[ 1 ]; - style.overflowY = opts.overflow[ 2 ]; - } ); - } - - // Implement show/hide animations - propTween = false; - for ( prop in orig ) { - - // General show/hide setup for this element animation - if ( !propTween ) { - if ( dataShow ) { - if ( "hidden" in dataShow ) { - hidden = dataShow.hidden; - } - } else { - dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); - } - - // Store hidden/visible for toggle so `.stop().toggle()` "reverses" - if ( toggle ) { - dataShow.hidden = !hidden; - } - - // Show elements before animating them - if ( hidden ) { - showHide( [ elem ], true ); - } - - /* eslint-disable no-loop-func */ - - anim.done( function() { - - /* eslint-enable no-loop-func */ - - // The final step of a "hide" animation is actually hiding the element - if ( !hidden ) { - showHide( [ elem ] ); - } - dataPriv.remove( elem, "fxshow" ); - for ( prop in orig ) { - jQuery.style( elem, prop, orig[ prop ] ); - } - } ); - } - - // Per-property setup - propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); - if ( !( prop in dataShow ) ) { - dataShow[ prop ] = propTween.start; - if ( hidden ) { - propTween.end = propTween.start; - propTween.start = 0; - } - } - } -} - -function propFilter( props, specialEasing ) { - var index, name, easing, value, hooks; - - // camelCase, specialEasing and expand cssHook pass - for ( index in props ) { - name = camelCase( index ); - easing = specialEasing[ name ]; - value = props[ index ]; - if ( Array.isArray( value ) ) { - easing = value[ 1 ]; - value = props[ index ] = value[ 0 ]; - } - - if ( index !== name ) { - props[ name ] = value; - delete props[ index ]; - } - - hooks = jQuery.cssHooks[ name ]; - if ( hooks && "expand" in hooks ) { - value = hooks.expand( value ); - delete props[ name ]; - - // Not quite $.extend, this won't overwrite existing keys. - // Reusing 'index' because we have the correct "name" - for ( index in value ) { - if ( !( index in props ) ) { - props[ index ] = value[ index ]; - specialEasing[ index ] = easing; - } - } - } else { - specialEasing[ name ] = easing; - } - } -} - -function Animation( elem, properties, options ) { - var result, - stopped, - index = 0, - length = Animation.prefilters.length, - deferred = jQuery.Deferred().always( function() { - - // Don't match elem in the :animated selector - delete tick.elem; - } ), - tick = function() { - if ( stopped ) { - return false; - } - var currentTime = fxNow || createFxNow(), - remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), - - // Support: Android 2.3 only - // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497) - temp = remaining / animation.duration || 0, - percent = 1 - temp, - index = 0, - length = animation.tweens.length; - - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( percent ); - } - - deferred.notifyWith( elem, [ animation, percent, remaining ] ); - - // If there's more to do, yield - if ( percent < 1 && length ) { - return remaining; - } - - // If this was an empty animation, synthesize a final progress notification - if ( !length ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - } - - // Resolve the animation and report its conclusion - deferred.resolveWith( elem, [ animation ] ); - return false; - }, - animation = deferred.promise( { - elem: elem, - props: jQuery.extend( {}, properties ), - opts: jQuery.extend( true, { - specialEasing: {}, - easing: jQuery.easing._default - }, options ), - originalProperties: properties, - originalOptions: options, - startTime: fxNow || createFxNow(), - duration: options.duration, - tweens: [], - createTween: function( prop, end ) { - var tween = jQuery.Tween( elem, animation.opts, prop, end, - animation.opts.specialEasing[ prop ] || animation.opts.easing ); - animation.tweens.push( tween ); - return tween; - }, - stop: function( gotoEnd ) { - var index = 0, - - // If we are going to the end, we want to run all the tweens - // otherwise we skip this part - length = gotoEnd ? animation.tweens.length : 0; - if ( stopped ) { - return this; - } - stopped = true; - for ( ; index < length; index++ ) { - animation.tweens[ index ].run( 1 ); - } - - // Resolve when we played the last frame; otherwise, reject - if ( gotoEnd ) { - deferred.notifyWith( elem, [ animation, 1, 0 ] ); - deferred.resolveWith( elem, [ animation, gotoEnd ] ); - } else { - deferred.rejectWith( elem, [ animation, gotoEnd ] ); - } - return this; - } - } ), - props = animation.props; - - propFilter( props, animation.opts.specialEasing ); - - for ( ; index < length; index++ ) { - result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); - if ( result ) { - if ( isFunction( result.stop ) ) { - jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = - result.stop.bind( result ); - } - return result; - } - } - - jQuery.map( props, createTween, animation ); - - if ( isFunction( animation.opts.start ) ) { - animation.opts.start.call( elem, animation ); - } - - // Attach callbacks from options - animation - .progress( animation.opts.progress ) - .done( animation.opts.done, animation.opts.complete ) - .fail( animation.opts.fail ) - .always( animation.opts.always ); - - jQuery.fx.timer( - jQuery.extend( tick, { - elem: elem, - anim: animation, - queue: animation.opts.queue - } ) - ); - - return animation; -} - -jQuery.Animation = jQuery.extend( Animation, { - - tweeners: { - "*": [ function( prop, value ) { - var tween = this.createTween( prop, value ); - adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); - return tween; - } ] - }, - - tweener: function( props, callback ) { - if ( isFunction( props ) ) { - callback = props; - props = [ "*" ]; - } else { - props = props.match( rnothtmlwhite ); - } - - var prop, - index = 0, - length = props.length; - - for ( ; index < length; index++ ) { - prop = props[ index ]; - Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; - Animation.tweeners[ prop ].unshift( callback ); - } - }, - - prefilters: [ defaultPrefilter ], - - prefilter: function( callback, prepend ) { - if ( prepend ) { - Animation.prefilters.unshift( callback ); - } else { - Animation.prefilters.push( callback ); - } - } -} ); - -jQuery.speed = function( speed, easing, fn ) { - var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { - complete: fn || !fn && easing || - isFunction( speed ) && speed, - duration: speed, - easing: fn && easing || easing && !isFunction( easing ) && easing - }; - - // Go to the end state if fx are off - if ( jQuery.fx.off ) { - opt.duration = 0; - - } else { - if ( typeof opt.duration !== "number" ) { - if ( opt.duration in jQuery.fx.speeds ) { - opt.duration = jQuery.fx.speeds[ opt.duration ]; - - } else { - opt.duration = jQuery.fx.speeds._default; - } - } - } - - // Normalize opt.queue - true/undefined/null -> "fx" - if ( opt.queue == null || opt.queue === true ) { - opt.queue = "fx"; - } - - // Queueing - opt.old = opt.complete; - - opt.complete = function() { - if ( isFunction( opt.old ) ) { - opt.old.call( this ); - } - - if ( opt.queue ) { - jQuery.dequeue( this, opt.queue ); - } - }; - - return opt; -}; - -jQuery.fn.extend( { - fadeTo: function( speed, to, easing, callback ) { - - // Show any hidden elements after setting opacity to 0 - return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() - - // Animate to the value specified - .end().animate( { opacity: to }, speed, easing, callback ); - }, - animate: function( prop, speed, easing, callback ) { - var empty = jQuery.isEmptyObject( prop ), - optall = jQuery.speed( speed, easing, callback ), - doAnimation = function() { - - // Operate on a copy of prop so per-property easing won't be lost - var anim = Animation( this, jQuery.extend( {}, prop ), optall ); - - // Empty animations, or finishing resolves immediately - if ( empty || dataPriv.get( this, "finish" ) ) { - anim.stop( true ); - } - }; - doAnimation.finish = doAnimation; - - return empty || optall.queue === false ? - this.each( doAnimation ) : - this.queue( optall.queue, doAnimation ); - }, - stop: function( type, clearQueue, gotoEnd ) { - var stopQueue = function( hooks ) { - var stop = hooks.stop; - delete hooks.stop; - stop( gotoEnd ); - }; - - if ( typeof type !== "string" ) { - gotoEnd = clearQueue; - clearQueue = type; - type = undefined; - } - if ( clearQueue ) { - this.queue( type || "fx", [] ); - } - - return this.each( function() { - var dequeue = true, - index = type != null && type + "queueHooks", - timers = jQuery.timers, - data = dataPriv.get( this ); - - if ( index ) { - if ( data[ index ] && data[ index ].stop ) { - stopQueue( data[ index ] ); - } - } else { - for ( index in data ) { - if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { - stopQueue( data[ index ] ); - } - } - } - - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && - ( type == null || timers[ index ].queue === type ) ) { - - timers[ index ].anim.stop( gotoEnd ); - dequeue = false; - timers.splice( index, 1 ); - } - } - - // Start the next in the queue if the last step wasn't forced. - // Timers currently will call their complete callbacks, which - // will dequeue but only if they were gotoEnd. - if ( dequeue || !gotoEnd ) { - jQuery.dequeue( this, type ); - } - } ); - }, - finish: function( type ) { - if ( type !== false ) { - type = type || "fx"; - } - return this.each( function() { - var index, - data = dataPriv.get( this ), - queue = data[ type + "queue" ], - hooks = data[ type + "queueHooks" ], - timers = jQuery.timers, - length = queue ? queue.length : 0; - - // Enable finishing flag on private data - data.finish = true; - - // Empty the queue first - jQuery.queue( this, type, [] ); - - if ( hooks && hooks.stop ) { - hooks.stop.call( this, true ); - } - - // Look for any active animations, and finish them - for ( index = timers.length; index--; ) { - if ( timers[ index ].elem === this && timers[ index ].queue === type ) { - timers[ index ].anim.stop( true ); - timers.splice( index, 1 ); - } - } - - // Look for any animations in the old queue and finish them - for ( index = 0; index < length; index++ ) { - if ( queue[ index ] && queue[ index ].finish ) { - queue[ index ].finish.call( this ); - } - } - - // Turn off finishing flag - delete data.finish; - } ); - } -} ); - -jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { - var cssFn = jQuery.fn[ name ]; - jQuery.fn[ name ] = function( speed, easing, callback ) { - return speed == null || typeof speed === "boolean" ? - cssFn.apply( this, arguments ) : - this.animate( genFx( name, true ), speed, easing, callback ); - }; -} ); - -// Generate shortcuts for custom animations -jQuery.each( { - slideDown: genFx( "show" ), - slideUp: genFx( "hide" ), - slideToggle: genFx( "toggle" ), - fadeIn: { opacity: "show" }, - fadeOut: { opacity: "hide" }, - fadeToggle: { opacity: "toggle" } -}, function( name, props ) { - jQuery.fn[ name ] = function( speed, easing, callback ) { - return this.animate( props, speed, easing, callback ); - }; -} ); - -jQuery.timers = []; -jQuery.fx.tick = function() { - var timer, - i = 0, - timers = jQuery.timers; - - fxNow = Date.now(); - - for ( ; i < timers.length; i++ ) { - timer = timers[ i ]; - - // Run the timer and safely remove it when done (allowing for external removal) - if ( !timer() && timers[ i ] === timer ) { - timers.splice( i--, 1 ); - } - } - - if ( !timers.length ) { - jQuery.fx.stop(); - } - fxNow = undefined; -}; - -jQuery.fx.timer = function( timer ) { - jQuery.timers.push( timer ); - jQuery.fx.start(); -}; - -jQuery.fx.interval = 13; -jQuery.fx.start = function() { - if ( inProgress ) { - return; - } - - inProgress = true; - schedule(); -}; - -jQuery.fx.stop = function() { - inProgress = null; -}; - -jQuery.fx.speeds = { - slow: 600, - fast: 200, - - // Default speed - _default: 400 -}; - - -// Based off of the plugin by Clint Helfers, with permission. -// https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/ -jQuery.fn.delay = function( time, type ) { - time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; - type = type || "fx"; - - return this.queue( type, function( next, hooks ) { - var timeout = window.setTimeout( next, time ); - hooks.stop = function() { - window.clearTimeout( timeout ); - }; - } ); -}; - - -( function() { - var input = document.createElement( "input" ), - select = document.createElement( "select" ), - opt = select.appendChild( document.createElement( "option" ) ); - - input.type = "checkbox"; - - // Support: Android <=4.3 only - // Default value for a checkbox should be "on" - support.checkOn = input.value !== ""; - - // Support: IE <=11 only - // Must access selectedIndex to make default options select - support.optSelected = opt.selected; - - // Support: IE <=11 only - // An input loses its value after becoming a radio - input = document.createElement( "input" ); - input.value = "t"; - input.type = "radio"; - support.radioValue = input.value === "t"; -} )(); - - -var boolHook, - attrHandle = jQuery.expr.attrHandle; - -jQuery.fn.extend( { - attr: function( name, value ) { - return access( this, jQuery.attr, name, value, arguments.length > 1 ); - }, - - removeAttr: function( name ) { - return this.each( function() { - jQuery.removeAttr( this, name ); - } ); - } -} ); - -jQuery.extend( { - attr: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set attributes on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - // Fallback to prop when attributes are not supported - if ( typeof elem.getAttribute === "undefined" ) { - return jQuery.prop( elem, name, value ); - } - - // Attribute hooks are determined by the lowercase version - // Grab necessary hook if one is defined - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - hooks = jQuery.attrHooks[ name.toLowerCase() ] || - ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); - } - - if ( value !== undefined ) { - if ( value === null ) { - jQuery.removeAttr( elem, name ); - return; - } - - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - elem.setAttribute( name, value + "" ); - return value; - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - ret = jQuery.find.attr( elem, name ); - - // Non-existent attributes return null, we normalize to undefined - return ret == null ? undefined : ret; - }, - - attrHooks: { - type: { - set: function( elem, value ) { - if ( !support.radioValue && value === "radio" && - nodeName( elem, "input" ) ) { - var val = elem.value; - elem.setAttribute( "type", value ); - if ( val ) { - elem.value = val; - } - return value; - } - } - } - }, - - removeAttr: function( elem, value ) { - var name, - i = 0, - - // Attribute names can contain non-HTML whitespace characters - // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 - attrNames = value && value.match( rnothtmlwhite ); - - if ( attrNames && elem.nodeType === 1 ) { - while ( ( name = attrNames[ i++ ] ) ) { - elem.removeAttribute( name ); - } - } - } -} ); - -// Hooks for boolean attributes -boolHook = { - set: function( elem, value, name ) { - if ( value === false ) { - - // Remove boolean attributes when set to false - jQuery.removeAttr( elem, name ); - } else { - elem.setAttribute( name, name ); - } - return name; - } -}; - -jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { - var getter = attrHandle[ name ] || jQuery.find.attr; - - attrHandle[ name ] = function( elem, name, isXML ) { - var ret, handle, - lowercaseName = name.toLowerCase(); - - if ( !isXML ) { - - // Avoid an infinite loop by temporarily removing this function from the getter - handle = attrHandle[ lowercaseName ]; - attrHandle[ lowercaseName ] = ret; - ret = getter( elem, name, isXML ) != null ? - lowercaseName : - null; - attrHandle[ lowercaseName ] = handle; - } - return ret; - }; -} ); - - - - -var rfocusable = /^(?:input|select|textarea|button)$/i, - rclickable = /^(?:a|area)$/i; - -jQuery.fn.extend( { - prop: function( name, value ) { - return access( this, jQuery.prop, name, value, arguments.length > 1 ); - }, - - removeProp: function( name ) { - return this.each( function() { - delete this[ jQuery.propFix[ name ] || name ]; - } ); - } -} ); - -jQuery.extend( { - prop: function( elem, name, value ) { - var ret, hooks, - nType = elem.nodeType; - - // Don't get/set properties on text, comment and attribute nodes - if ( nType === 3 || nType === 8 || nType === 2 ) { - return; - } - - if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { - - // Fix name and attach hooks - name = jQuery.propFix[ name ] || name; - hooks = jQuery.propHooks[ name ]; - } - - if ( value !== undefined ) { - if ( hooks && "set" in hooks && - ( ret = hooks.set( elem, value, name ) ) !== undefined ) { - return ret; - } - - return ( elem[ name ] = value ); - } - - if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { - return ret; - } - - return elem[ name ]; - }, - - propHooks: { - tabIndex: { - get: function( elem ) { - - // Support: IE <=9 - 11 only - // elem.tabIndex doesn't always return the - // correct value when it hasn't been explicitly set - // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ - // Use proper attribute retrieval(#12072) - var tabindex = jQuery.find.attr( elem, "tabindex" ); - - if ( tabindex ) { - return parseInt( tabindex, 10 ); - } - - if ( - rfocusable.test( elem.nodeName ) || - rclickable.test( elem.nodeName ) && - elem.href - ) { - return 0; - } - - return -1; - } - } - }, - - propFix: { - "for": "htmlFor", - "class": "className" - } -} ); - -// Support: IE <=11 only -// Accessing the selectedIndex property -// forces the browser to respect setting selected -// on the option -// The getter ensures a default option is selected -// when in an optgroup -// eslint rule "no-unused-expressions" is disabled for this code -// since it considers such accessions noop -if ( !support.optSelected ) { - jQuery.propHooks.selected = { - get: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent && parent.parentNode ) { - parent.parentNode.selectedIndex; - } - return null; - }, - set: function( elem ) { - - /* eslint no-unused-expressions: "off" */ - - var parent = elem.parentNode; - if ( parent ) { - parent.selectedIndex; - - if ( parent.parentNode ) { - parent.parentNode.selectedIndex; - } - } - } - }; -} - -jQuery.each( [ - "tabIndex", - "readOnly", - "maxLength", - "cellSpacing", - "cellPadding", - "rowSpan", - "colSpan", - "useMap", - "frameBorder", - "contentEditable" -], function() { - jQuery.propFix[ this.toLowerCase() ] = this; -} ); - - - - - // Strip and collapse whitespace according to HTML spec - // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace - function stripAndCollapse( value ) { - var tokens = value.match( rnothtmlwhite ) || []; - return tokens.join( " " ); - } - - -function getClass( elem ) { - return elem.getAttribute && elem.getAttribute( "class" ) || ""; -} - -function classesToArray( value ) { - if ( Array.isArray( value ) ) { - return value; - } - if ( typeof value === "string" ) { - return value.match( rnothtmlwhite ) || []; - } - return []; -} - -jQuery.fn.extend( { - addClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - if ( cur.indexOf( " " + clazz + " " ) < 0 ) { - cur += clazz + " "; - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - removeClass: function( value ) { - var classes, elem, cur, curValue, clazz, j, finalValue, - i = 0; - - if ( isFunction( value ) ) { - return this.each( function( j ) { - jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); - } ); - } - - if ( !arguments.length ) { - return this.attr( "class", "" ); - } - - classes = classesToArray( value ); - - if ( classes.length ) { - while ( ( elem = this[ i++ ] ) ) { - curValue = getClass( elem ); - - // This expression is here for better compressibility (see addClass) - cur = elem.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); - - if ( cur ) { - j = 0; - while ( ( clazz = classes[ j++ ] ) ) { - - // Remove *all* instances - while ( cur.indexOf( " " + clazz + " " ) > -1 ) { - cur = cur.replace( " " + clazz + " ", " " ); - } - } - - // Only assign if different to avoid unneeded rendering. - finalValue = stripAndCollapse( cur ); - if ( curValue !== finalValue ) { - elem.setAttribute( "class", finalValue ); - } - } - } - } - - return this; - }, - - toggleClass: function( value, stateVal ) { - var type = typeof value, - isValidValue = type === "string" || Array.isArray( value ); - - if ( typeof stateVal === "boolean" && isValidValue ) { - return stateVal ? this.addClass( value ) : this.removeClass( value ); - } - - if ( isFunction( value ) ) { - return this.each( function( i ) { - jQuery( this ).toggleClass( - value.call( this, i, getClass( this ), stateVal ), - stateVal - ); - } ); - } - - return this.each( function() { - var className, i, self, classNames; - - if ( isValidValue ) { - - // Toggle individual class names - i = 0; - self = jQuery( this ); - classNames = classesToArray( value ); - - while ( ( className = classNames[ i++ ] ) ) { - - // Check each className given, space separated list - if ( self.hasClass( className ) ) { - self.removeClass( className ); - } else { - self.addClass( className ); - } - } - - // Toggle whole class name - } else if ( value === undefined || type === "boolean" ) { - className = getClass( this ); - if ( className ) { - - // Store className if set - dataPriv.set( this, "__className__", className ); - } - - // If the element has a class name or if we're passed `false`, - // then remove the whole classname (if there was one, the above saved it). - // Otherwise bring back whatever was previously saved (if anything), - // falling back to the empty string if nothing was stored. - if ( this.setAttribute ) { - this.setAttribute( "class", - className || value === false ? - "" : - dataPriv.get( this, "__className__" ) || "" - ); - } - } - } ); - }, - - hasClass: function( selector ) { - var className, elem, - i = 0; - - className = " " + selector + " "; - while ( ( elem = this[ i++ ] ) ) { - if ( elem.nodeType === 1 && - ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { - return true; - } - } - - return false; - } -} ); - - - - -var rreturn = /\r/g; - -jQuery.fn.extend( { - val: function( value ) { - var hooks, ret, valueIsFunction, - elem = this[ 0 ]; - - if ( !arguments.length ) { - if ( elem ) { - hooks = jQuery.valHooks[ elem.type ] || - jQuery.valHooks[ elem.nodeName.toLowerCase() ]; - - if ( hooks && - "get" in hooks && - ( ret = hooks.get( elem, "value" ) ) !== undefined - ) { - return ret; - } - - ret = elem.value; - - // Handle most common string cases - if ( typeof ret === "string" ) { - return ret.replace( rreturn, "" ); - } - - // Handle cases where value is null/undef or number - return ret == null ? "" : ret; - } - - return; - } - - valueIsFunction = isFunction( value ); - - return this.each( function( i ) { - var val; - - if ( this.nodeType !== 1 ) { - return; - } - - if ( valueIsFunction ) { - val = value.call( this, i, jQuery( this ).val() ); - } else { - val = value; - } - - // Treat null/undefined as ""; convert numbers to string - if ( val == null ) { - val = ""; - - } else if ( typeof val === "number" ) { - val += ""; - - } else if ( Array.isArray( val ) ) { - val = jQuery.map( val, function( value ) { - return value == null ? "" : value + ""; - } ); - } - - hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; - - // If set returns undefined, fall back to normal setting - if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { - this.value = val; - } - } ); - } -} ); - -jQuery.extend( { - valHooks: { - option: { - get: function( elem ) { - - var val = jQuery.find.attr( elem, "value" ); - return val != null ? - val : - - // Support: IE <=10 - 11 only - // option.text throws exceptions (#14686, #14858) - // Strip and collapse whitespace - // https://html.spec.whatwg.org/#strip-and-collapse-whitespace - stripAndCollapse( jQuery.text( elem ) ); - } - }, - select: { - get: function( elem ) { - var value, option, i, - options = elem.options, - index = elem.selectedIndex, - one = elem.type === "select-one", - values = one ? null : [], - max = one ? index + 1 : options.length; - - if ( index < 0 ) { - i = max; - - } else { - i = one ? index : 0; - } - - // Loop through all the selected options - for ( ; i < max; i++ ) { - option = options[ i ]; - - // Support: IE <=9 only - // IE8-9 doesn't update selected after form reset (#2551) - if ( ( option.selected || i === index ) && - - // Don't return options that are disabled or in a disabled optgroup - !option.disabled && - ( !option.parentNode.disabled || - !nodeName( option.parentNode, "optgroup" ) ) ) { - - // Get the specific value for the option - value = jQuery( option ).val(); - - // We don't need an array for one selects - if ( one ) { - return value; - } - - // Multi-Selects return an array - values.push( value ); - } - } - - return values; - }, - - set: function( elem, value ) { - var optionSet, option, - options = elem.options, - values = jQuery.makeArray( value ), - i = options.length; - - while ( i-- ) { - option = options[ i ]; - - /* eslint-disable no-cond-assign */ - - if ( option.selected = - jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 - ) { - optionSet = true; - } - - /* eslint-enable no-cond-assign */ - } - - // Force browsers to behave consistently when non-matching value is set - if ( !optionSet ) { - elem.selectedIndex = -1; - } - return values; - } - } - } -} ); - -// Radios and checkboxes getter/setter -jQuery.each( [ "radio", "checkbox" ], function() { - jQuery.valHooks[ this ] = { - set: function( elem, value ) { - if ( Array.isArray( value ) ) { - return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); - } - } - }; - if ( !support.checkOn ) { - jQuery.valHooks[ this ].get = function( elem ) { - return elem.getAttribute( "value" ) === null ? "on" : elem.value; - }; - } -} ); - - - - -// Return jQuery for attributes-only inclusion - - -support.focusin = "onfocusin" in window; - - -var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, - stopPropagationCallback = function( e ) { - e.stopPropagation(); - }; - -jQuery.extend( jQuery.event, { - - trigger: function( event, data, elem, onlyHandlers ) { - - var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, - eventPath = [ elem || document ], - type = hasOwn.call( event, "type" ) ? event.type : event, - namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; - - cur = lastElement = tmp = elem = elem || document; - - // Don't do events on text and comment nodes - if ( elem.nodeType === 3 || elem.nodeType === 8 ) { - return; - } - - // focus/blur morphs to focusin/out; ensure we're not firing them right now - if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { - return; - } - - if ( type.indexOf( "." ) > -1 ) { - - // Namespaced trigger; create a regexp to match event type in handle() - namespaces = type.split( "." ); - type = namespaces.shift(); - namespaces.sort(); - } - ontype = type.indexOf( ":" ) < 0 && "on" + type; - - // Caller can pass in a jQuery.Event object, Object, or just an event type string - event = event[ jQuery.expando ] ? - event : - new jQuery.Event( type, typeof event === "object" && event ); - - // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) - event.isTrigger = onlyHandlers ? 2 : 3; - event.namespace = namespaces.join( "." ); - event.rnamespace = event.namespace ? - new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : - null; - - // Clean up the event in case it is being reused - event.result = undefined; - if ( !event.target ) { - event.target = elem; - } - - // Clone any incoming data and prepend the event, creating the handler arg list - data = data == null ? - [ event ] : - jQuery.makeArray( data, [ event ] ); - - // Allow special events to draw outside the lines - special = jQuery.event.special[ type ] || {}; - if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { - return; - } - - // Determine event propagation path in advance, per W3C events spec (#9951) - // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) - if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { - - bubbleType = special.delegateType || type; - if ( !rfocusMorph.test( bubbleType + type ) ) { - cur = cur.parentNode; - } - for ( ; cur; cur = cur.parentNode ) { - eventPath.push( cur ); - tmp = cur; - } - - // Only add window if we got to document (e.g., not plain obj or detached DOM) - if ( tmp === ( elem.ownerDocument || document ) ) { - eventPath.push( tmp.defaultView || tmp.parentWindow || window ); - } - } - - // Fire handlers on the event path - i = 0; - while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { - lastElement = cur; - event.type = i > 1 ? - bubbleType : - special.bindType || type; - - // jQuery handler - handle = ( - dataPriv.get( cur, "events" ) || Object.create( null ) - )[ event.type ] && - dataPriv.get( cur, "handle" ); - if ( handle ) { - handle.apply( cur, data ); - } - - // Native handler - handle = ontype && cur[ ontype ]; - if ( handle && handle.apply && acceptData( cur ) ) { - event.result = handle.apply( cur, data ); - if ( event.result === false ) { - event.preventDefault(); - } - } - } - event.type = type; - - // If nobody prevented the default action, do it now - if ( !onlyHandlers && !event.isDefaultPrevented() ) { - - if ( ( !special._default || - special._default.apply( eventPath.pop(), data ) === false ) && - acceptData( elem ) ) { - - // Call a native DOM method on the target with the same name as the event. - // Don't do default actions on window, that's where global variables be (#6170) - if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { - - // Don't re-trigger an onFOO event when we call its FOO() method - tmp = elem[ ontype ]; - - if ( tmp ) { - elem[ ontype ] = null; - } - - // Prevent re-triggering of the same event, since we already bubbled it above - jQuery.event.triggered = type; - - if ( event.isPropagationStopped() ) { - lastElement.addEventListener( type, stopPropagationCallback ); - } - - elem[ type ](); - - if ( event.isPropagationStopped() ) { - lastElement.removeEventListener( type, stopPropagationCallback ); - } - - jQuery.event.triggered = undefined; - - if ( tmp ) { - elem[ ontype ] = tmp; - } - } - } - } - - return event.result; - }, - - // Piggyback on a donor event to simulate a different one - // Used only for `focus(in | out)` events - simulate: function( type, elem, event ) { - var e = jQuery.extend( - new jQuery.Event(), - event, - { - type: type, - isSimulated: true - } - ); - - jQuery.event.trigger( e, null, elem ); - } - -} ); - -jQuery.fn.extend( { - - trigger: function( type, data ) { - return this.each( function() { - jQuery.event.trigger( type, data, this ); - } ); - }, - triggerHandler: function( type, data ) { - var elem = this[ 0 ]; - if ( elem ) { - return jQuery.event.trigger( type, data, elem, true ); - } - } -} ); - - -// Support: Firefox <=44 -// Firefox doesn't have focus(in | out) events -// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 -// -// Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 -// focus(in | out) events fire after focus & blur events, -// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order -// Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 -if ( !support.focusin ) { - jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { - - // Attach a single capturing handler on the document while someone wants focusin/focusout - var handler = function( event ) { - jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); - }; - - jQuery.event.special[ fix ] = { - setup: function() { - - // Handle: regular nodes (via `this.ownerDocument`), window - // (via `this.document`) & document (via `this`). - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ); - - if ( !attaches ) { - doc.addEventListener( orig, handler, true ); - } - dataPriv.access( doc, fix, ( attaches || 0 ) + 1 ); - }, - teardown: function() { - var doc = this.ownerDocument || this.document || this, - attaches = dataPriv.access( doc, fix ) - 1; - - if ( !attaches ) { - doc.removeEventListener( orig, handler, true ); - dataPriv.remove( doc, fix ); - - } else { - dataPriv.access( doc, fix, attaches ); - } - } - }; - } ); -} -var location = window.location; - -var nonce = { guid: Date.now() }; - -var rquery = ( /\?/ ); - - - -// Cross-browser xml parsing -jQuery.parseXML = function( data ) { - var xml; - if ( !data || typeof data !== "string" ) { - return null; - } - - // Support: IE 9 - 11 only - // IE throws on parseFromString with invalid input. - try { - xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); - } catch ( e ) { - xml = undefined; - } - - if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) { - jQuery.error( "Invalid XML: " + data ); - } - return xml; -}; - - -var - rbracket = /\[\]$/, - rCRLF = /\r?\n/g, - rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, - rsubmittable = /^(?:input|select|textarea|keygen)/i; - -function buildParams( prefix, obj, traditional, add ) { - var name; - - if ( Array.isArray( obj ) ) { - - // Serialize array item. - jQuery.each( obj, function( i, v ) { - if ( traditional || rbracket.test( prefix ) ) { - - // Treat each array item as a scalar. - add( prefix, v ); - - } else { - - // Item is non-scalar (array or object), encode its numeric index. - buildParams( - prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", - v, - traditional, - add - ); - } - } ); - - } else if ( !traditional && toType( obj ) === "object" ) { - - // Serialize object item. - for ( name in obj ) { - buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); - } - - } else { - - // Serialize scalar item. - add( prefix, obj ); - } -} - -// Serialize an array of form elements or a set of -// key/values into a query string -jQuery.param = function( a, traditional ) { - var prefix, - s = [], - add = function( key, valueOrFunction ) { - - // If value is a function, invoke it and use its return value - var value = isFunction( valueOrFunction ) ? - valueOrFunction() : - valueOrFunction; - - s[ s.length ] = encodeURIComponent( key ) + "=" + - encodeURIComponent( value == null ? "" : value ); - }; - - if ( a == null ) { - return ""; - } - - // If an array was passed in, assume that it is an array of form elements. - if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { - - // Serialize the form elements - jQuery.each( a, function() { - add( this.name, this.value ); - } ); - - } else { - - // If traditional, encode the "old" way (the way 1.3.2 or older - // did it), otherwise encode params recursively. - for ( prefix in a ) { - buildParams( prefix, a[ prefix ], traditional, add ); - } - } - - // Return the resulting serialization - return s.join( "&" ); -}; - -jQuery.fn.extend( { - serialize: function() { - return jQuery.param( this.serializeArray() ); - }, - serializeArray: function() { - return this.map( function() { - - // Can add propHook for "elements" to filter or add form elements - var elements = jQuery.prop( this, "elements" ); - return elements ? jQuery.makeArray( elements ) : this; - } ) - .filter( function() { - var type = this.type; - - // Use .is( ":disabled" ) so that fieldset[disabled] works - return this.name && !jQuery( this ).is( ":disabled" ) && - rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && - ( this.checked || !rcheckableType.test( type ) ); - } ) - .map( function( _i, elem ) { - var val = jQuery( this ).val(); - - if ( val == null ) { - return null; - } - - if ( Array.isArray( val ) ) { - return jQuery.map( val, function( val ) { - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ); - } - - return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; - } ).get(); - } -} ); - - -var - r20 = /%20/g, - rhash = /#.*$/, - rantiCache = /([?&])_=[^&]*/, - rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, - - // #7653, #8125, #8152: local protocol detection - rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - rnoContent = /^(?:GET|HEAD)$/, - rprotocol = /^\/\//, - - /* Prefilters - * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) - * 2) These are called: - * - BEFORE asking for a transport - * - AFTER param serialization (s.data is a string if s.processData is true) - * 3) key is the dataType - * 4) the catchall symbol "*" can be used - * 5) execution will start with transport dataType and THEN continue down to "*" if needed - */ - prefilters = {}, - - /* Transports bindings - * 1) key is the dataType - * 2) the catchall symbol "*" can be used - * 3) selection will start with transport dataType and THEN go to "*" if needed - */ - transports = {}, - - // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression - allTypes = "*/".concat( "*" ), - - // Anchor tag for parsing the document origin - originAnchor = document.createElement( "a" ); - originAnchor.href = location.href; - -// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport -function addToPrefiltersOrTransports( structure ) { - - // dataTypeExpression is optional and defaults to "*" - return function( dataTypeExpression, func ) { - - if ( typeof dataTypeExpression !== "string" ) { - func = dataTypeExpression; - dataTypeExpression = "*"; - } - - var dataType, - i = 0, - dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; - - if ( isFunction( func ) ) { - - // For each dataType in the dataTypeExpression - while ( ( dataType = dataTypes[ i++ ] ) ) { - - // Prepend if requested - if ( dataType[ 0 ] === "+" ) { - dataType = dataType.slice( 1 ) || "*"; - ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); - - // Otherwise append - } else { - ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); - } - } - } - }; -} - -// Base inspection function for prefilters and transports -function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { - - var inspected = {}, - seekingTransport = ( structure === transports ); - - function inspect( dataType ) { - var selected; - inspected[ dataType ] = true; - jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { - var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); - if ( typeof dataTypeOrTransport === "string" && - !seekingTransport && !inspected[ dataTypeOrTransport ] ) { - - options.dataTypes.unshift( dataTypeOrTransport ); - inspect( dataTypeOrTransport ); - return false; - } else if ( seekingTransport ) { - return !( selected = dataTypeOrTransport ); - } - } ); - return selected; - } - - return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); -} - -// A special extend for ajax options -// that takes "flat" options (not to be deep extended) -// Fixes #9887 -function ajaxExtend( target, src ) { - var key, deep, - flatOptions = jQuery.ajaxSettings.flatOptions || {}; - - for ( key in src ) { - if ( src[ key ] !== undefined ) { - ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; - } - } - if ( deep ) { - jQuery.extend( true, target, deep ); - } - - return target; -} - -/* Handles responses to an ajax request: - * - finds the right dataType (mediates between content-type and expected dataType) - * - returns the corresponding response - */ -function ajaxHandleResponses( s, jqXHR, responses ) { - - var ct, type, finalDataType, firstDataType, - contents = s.contents, - dataTypes = s.dataTypes; - - // Remove auto dataType and get content-type in the process - while ( dataTypes[ 0 ] === "*" ) { - dataTypes.shift(); - if ( ct === undefined ) { - ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); - } - } - - // Check if we're dealing with a known content-type - if ( ct ) { - for ( type in contents ) { - if ( contents[ type ] && contents[ type ].test( ct ) ) { - dataTypes.unshift( type ); - break; - } - } - } - - // Check to see if we have a response for the expected dataType - if ( dataTypes[ 0 ] in responses ) { - finalDataType = dataTypes[ 0 ]; - } else { - - // Try convertible dataTypes - for ( type in responses ) { - if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { - finalDataType = type; - break; - } - if ( !firstDataType ) { - firstDataType = type; - } - } - - // Or just use first one - finalDataType = finalDataType || firstDataType; - } - - // If we found a dataType - // We add the dataType to the list if needed - // and return the corresponding response - if ( finalDataType ) { - if ( finalDataType !== dataTypes[ 0 ] ) { - dataTypes.unshift( finalDataType ); - } - return responses[ finalDataType ]; - } -} - -/* Chain conversions given the request and the original response - * Also sets the responseXXX fields on the jqXHR instance - */ -function ajaxConvert( s, response, jqXHR, isSuccess ) { - var conv2, current, conv, tmp, prev, - converters = {}, - - // Work with a copy of dataTypes in case we need to modify it for conversion - dataTypes = s.dataTypes.slice(); - - // Create converters map with lowercased keys - if ( dataTypes[ 1 ] ) { - for ( conv in s.converters ) { - converters[ conv.toLowerCase() ] = s.converters[ conv ]; - } - } - - current = dataTypes.shift(); - - // Convert to each sequential dataType - while ( current ) { - - if ( s.responseFields[ current ] ) { - jqXHR[ s.responseFields[ current ] ] = response; - } - - // Apply the dataFilter if provided - if ( !prev && isSuccess && s.dataFilter ) { - response = s.dataFilter( response, s.dataType ); - } - - prev = current; - current = dataTypes.shift(); - - if ( current ) { - - // There's only work to do if current dataType is non-auto - if ( current === "*" ) { - - current = prev; - - // Convert response if prev dataType is non-auto and differs from current - } else if ( prev !== "*" && prev !== current ) { - - // Seek a direct converter - conv = converters[ prev + " " + current ] || converters[ "* " + current ]; - - // If none found, seek a pair - if ( !conv ) { - for ( conv2 in converters ) { - - // If conv2 outputs current - tmp = conv2.split( " " ); - if ( tmp[ 1 ] === current ) { - - // If prev can be converted to accepted input - conv = converters[ prev + " " + tmp[ 0 ] ] || - converters[ "* " + tmp[ 0 ] ]; - if ( conv ) { - - // Condense equivalence converters - if ( conv === true ) { - conv = converters[ conv2 ]; - - // Otherwise, insert the intermediate dataType - } else if ( converters[ conv2 ] !== true ) { - current = tmp[ 0 ]; - dataTypes.unshift( tmp[ 1 ] ); - } - break; - } - } - } - } - - // Apply converter (if not an equivalence) - if ( conv !== true ) { - - // Unless errors are allowed to bubble, catch and return them - if ( conv && s.throws ) { - response = conv( response ); - } else { - try { - response = conv( response ); - } catch ( e ) { - return { - state: "parsererror", - error: conv ? e : "No conversion from " + prev + " to " + current - }; - } - } - } - } - } - } - - return { state: "success", data: response }; -} - -jQuery.extend( { - - // Counter for holding the number of active queries - active: 0, - - // Last-Modified header cache for next request - lastModified: {}, - etag: {}, - - ajaxSettings: { - url: location.href, - type: "GET", - isLocal: rlocalProtocol.test( location.protocol ), - global: true, - processData: true, - async: true, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - - /* - timeout: 0, - data: null, - dataType: null, - username: null, - password: null, - cache: null, - throws: false, - traditional: false, - headers: {}, - */ - - accepts: { - "*": allTypes, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - - // Data converters - // Keys separate source (or catchall "*") and destination types with a single space - converters: { - - // Convert anything to text - "* text": String, - - // Text to html (true = no transformation) - "text html": true, - - // Evaluate text as a json expression - "text json": JSON.parse, - - // Parse text as xml - "text xml": jQuery.parseXML - }, - - // For options that shouldn't be deep extended: - // you can add your own custom options here if - // and when you create one that shouldn't be - // deep extended (see ajaxExtend) - flatOptions: { - url: true, - context: true - } - }, - - // Creates a full fledged settings object into target - // with both ajaxSettings and settings fields. - // If target is omitted, writes into ajaxSettings. - ajaxSetup: function( target, settings ) { - return settings ? - - // Building a settings object - ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : - - // Extending ajaxSettings - ajaxExtend( jQuery.ajaxSettings, target ); - }, - - ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), - ajaxTransport: addToPrefiltersOrTransports( transports ), - - // Main method - ajax: function( url, options ) { - - // If url is an object, simulate pre-1.5 signature - if ( typeof url === "object" ) { - options = url; - url = undefined; - } - - // Force options to be an object - options = options || {}; - - var transport, - - // URL without anti-cache param - cacheURL, - - // Response headers - responseHeadersString, - responseHeaders, - - // timeout handle - timeoutTimer, - - // Url cleanup var - urlAnchor, - - // Request state (becomes false upon send and true upon completion) - completed, - - // To know if global events are to be dispatched - fireGlobals, - - // Loop variable - i, - - // uncached part of the url - uncached, - - // Create the final options object - s = jQuery.ajaxSetup( {}, options ), - - // Callbacks context - callbackContext = s.context || s, - - // Context for global events is callbackContext if it is a DOM node or jQuery collection - globalEventContext = s.context && - ( callbackContext.nodeType || callbackContext.jquery ) ? - jQuery( callbackContext ) : - jQuery.event, - - // Deferreds - deferred = jQuery.Deferred(), - completeDeferred = jQuery.Callbacks( "once memory" ), - - // Status-dependent callbacks - statusCode = s.statusCode || {}, - - // Headers (they are sent all at once) - requestHeaders = {}, - requestHeadersNames = {}, - - // Default abort message - strAbort = "canceled", - - // Fake xhr - jqXHR = { - readyState: 0, - - // Builds headers hashtable if needed - getResponseHeader: function( key ) { - var match; - if ( completed ) { - if ( !responseHeaders ) { - responseHeaders = {}; - while ( ( match = rheaders.exec( responseHeadersString ) ) ) { - responseHeaders[ match[ 1 ].toLowerCase() + " " ] = - ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) - .concat( match[ 2 ] ); - } - } - match = responseHeaders[ key.toLowerCase() + " " ]; - } - return match == null ? null : match.join( ", " ); - }, - - // Raw string - getAllResponseHeaders: function() { - return completed ? responseHeadersString : null; - }, - - // Caches the header - setRequestHeader: function( name, value ) { - if ( completed == null ) { - name = requestHeadersNames[ name.toLowerCase() ] = - requestHeadersNames[ name.toLowerCase() ] || name; - requestHeaders[ name ] = value; - } - return this; - }, - - // Overrides response content-type header - overrideMimeType: function( type ) { - if ( completed == null ) { - s.mimeType = type; - } - return this; - }, - - // Status-dependent callbacks - statusCode: function( map ) { - var code; - if ( map ) { - if ( completed ) { - - // Execute the appropriate callbacks - jqXHR.always( map[ jqXHR.status ] ); - } else { - - // Lazy-add the new callbacks in a way that preserves old ones - for ( code in map ) { - statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; - } - } - } - return this; - }, - - // Cancel the request - abort: function( statusText ) { - var finalText = statusText || strAbort; - if ( transport ) { - transport.abort( finalText ); - } - done( 0, finalText ); - return this; - } - }; - - // Attach deferreds - deferred.promise( jqXHR ); - - // Add protocol if not provided (prefilters might expect it) - // Handle falsy url in the settings object (#10093: consistency with old signature) - // We also use the url parameter if available - s.url = ( ( url || s.url || location.href ) + "" ) - .replace( rprotocol, location.protocol + "//" ); - - // Alias method option to type as per ticket #12004 - s.type = options.method || options.type || s.method || s.type; - - // Extract dataTypes list - s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; - - // A cross-domain request is in order when the origin doesn't match the current origin. - if ( s.crossDomain == null ) { - urlAnchor = document.createElement( "a" ); - - // Support: IE <=8 - 11, Edge 12 - 15 - // IE throws exception on accessing the href property if url is malformed, - // e.g. http://example.com:80x/ - try { - urlAnchor.href = s.url; - - // Support: IE <=8 - 11 only - // Anchor's host property isn't correctly set when s.url is relative - urlAnchor.href = urlAnchor.href; - s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== - urlAnchor.protocol + "//" + urlAnchor.host; - } catch ( e ) { - - // If there is an error parsing the URL, assume it is crossDomain, - // it can be rejected by the transport if it is invalid - s.crossDomain = true; - } - } - - // Convert data if not already a string - if ( s.data && s.processData && typeof s.data !== "string" ) { - s.data = jQuery.param( s.data, s.traditional ); - } - - // Apply prefilters - inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); - - // If request was aborted inside a prefilter, stop there - if ( completed ) { - return jqXHR; - } - - // We can fire global events as of now if asked to - // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118) - fireGlobals = jQuery.event && s.global; - - // Watch for a new set of requests - if ( fireGlobals && jQuery.active++ === 0 ) { - jQuery.event.trigger( "ajaxStart" ); - } - - // Uppercase the type - s.type = s.type.toUpperCase(); - - // Determine if request has content - s.hasContent = !rnoContent.test( s.type ); - - // Save the URL in case we're toying with the If-Modified-Since - // and/or If-None-Match header later on - // Remove hash to simplify url manipulation - cacheURL = s.url.replace( rhash, "" ); - - // More options handling for requests with no content - if ( !s.hasContent ) { - - // Remember the hash so we can put it back - uncached = s.url.slice( cacheURL.length ); - - // If data is available and should be processed, append data to url - if ( s.data && ( s.processData || typeof s.data === "string" ) ) { - cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; - - // #9682: remove data so that it's not used in an eventual retry - delete s.data; - } - - // Add or update anti-cache param if needed - if ( s.cache === false ) { - cacheURL = cacheURL.replace( rantiCache, "$1" ); - uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + - uncached; - } - - // Put hash and anti-cache on the URL that will be requested (gh-1732) - s.url = cacheURL + uncached; - - // Change '%20' to '+' if this is encoded form body content (gh-2658) - } else if ( s.data && s.processData && - ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { - s.data = s.data.replace( r20, "+" ); - } - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - if ( jQuery.lastModified[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); - } - if ( jQuery.etag[ cacheURL ] ) { - jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); - } - } - - // Set the correct header, if data is being sent - if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { - jqXHR.setRequestHeader( "Content-Type", s.contentType ); - } - - // Set the Accepts header for the server, depending on the dataType - jqXHR.setRequestHeader( - "Accept", - s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? - s.accepts[ s.dataTypes[ 0 ] ] + - ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : - s.accepts[ "*" ] - ); - - // Check for headers option - for ( i in s.headers ) { - jqXHR.setRequestHeader( i, s.headers[ i ] ); - } - - // Allow custom headers/mimetypes and early abort - if ( s.beforeSend && - ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { - - // Abort if not done already and return - return jqXHR.abort(); - } - - // Aborting is no longer a cancellation - strAbort = "abort"; - - // Install callbacks on deferreds - completeDeferred.add( s.complete ); - jqXHR.done( s.success ); - jqXHR.fail( s.error ); - - // Get transport - transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); - - // If no transport, we auto-abort - if ( !transport ) { - done( -1, "No Transport" ); - } else { - jqXHR.readyState = 1; - - // Send global event - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); - } - - // If request was aborted inside ajaxSend, stop there - if ( completed ) { - return jqXHR; - } - - // Timeout - if ( s.async && s.timeout > 0 ) { - timeoutTimer = window.setTimeout( function() { - jqXHR.abort( "timeout" ); - }, s.timeout ); - } - - try { - completed = false; - transport.send( requestHeaders, done ); - } catch ( e ) { - - // Rethrow post-completion exceptions - if ( completed ) { - throw e; - } - - // Propagate others as results - done( -1, e ); - } - } - - // Callback for when everything is done - function done( status, nativeStatusText, responses, headers ) { - var isSuccess, success, error, response, modified, - statusText = nativeStatusText; - - // Ignore repeat invocations - if ( completed ) { - return; - } - - completed = true; - - // Clear timeout if it exists - if ( timeoutTimer ) { - window.clearTimeout( timeoutTimer ); - } - - // Dereference transport for early garbage collection - // (no matter how long the jqXHR object will be used) - transport = undefined; - - // Cache response headers - responseHeadersString = headers || ""; - - // Set readyState - jqXHR.readyState = status > 0 ? 4 : 0; - - // Determine if successful - isSuccess = status >= 200 && status < 300 || status === 304; - - // Get response data - if ( responses ) { - response = ajaxHandleResponses( s, jqXHR, responses ); - } - - // Use a noop converter for missing script - if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) { - s.converters[ "text script" ] = function() {}; - } - - // Convert no matter what (that way responseXXX fields are always set) - response = ajaxConvert( s, response, jqXHR, isSuccess ); - - // If successful, handle type chaining - if ( isSuccess ) { - - // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. - if ( s.ifModified ) { - modified = jqXHR.getResponseHeader( "Last-Modified" ); - if ( modified ) { - jQuery.lastModified[ cacheURL ] = modified; - } - modified = jqXHR.getResponseHeader( "etag" ); - if ( modified ) { - jQuery.etag[ cacheURL ] = modified; - } - } - - // if no content - if ( status === 204 || s.type === "HEAD" ) { - statusText = "nocontent"; - - // if not modified - } else if ( status === 304 ) { - statusText = "notmodified"; - - // If we have data, let's convert it - } else { - statusText = response.state; - success = response.data; - error = response.error; - isSuccess = !error; - } - } else { - - // Extract error from statusText and normalize for non-aborts - error = statusText; - if ( status || !statusText ) { - statusText = "error"; - if ( status < 0 ) { - status = 0; - } - } - } - - // Set data for the fake xhr object - jqXHR.status = status; - jqXHR.statusText = ( nativeStatusText || statusText ) + ""; - - // Success/Error - if ( isSuccess ) { - deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); - } else { - deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); - } - - // Status-dependent callbacks - jqXHR.statusCode( statusCode ); - statusCode = undefined; - - if ( fireGlobals ) { - globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", - [ jqXHR, s, isSuccess ? success : error ] ); - } - - // Complete - completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); - - if ( fireGlobals ) { - globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); - - // Handle the global AJAX counter - if ( !( --jQuery.active ) ) { - jQuery.event.trigger( "ajaxStop" ); - } - } - } - - return jqXHR; - }, - - getJSON: function( url, data, callback ) { - return jQuery.get( url, data, callback, "json" ); - }, - - getScript: function( url, callback ) { - return jQuery.get( url, undefined, callback, "script" ); - } -} ); - -jQuery.each( [ "get", "post" ], function( _i, method ) { - jQuery[ method ] = function( url, data, callback, type ) { - - // Shift arguments if data argument was omitted - if ( isFunction( data ) ) { - type = type || callback; - callback = data; - data = undefined; - } - - // The url can be an options object (which then must have .url) - return jQuery.ajax( jQuery.extend( { - url: url, - type: method, - dataType: type, - data: data, - success: callback - }, jQuery.isPlainObject( url ) && url ) ); - }; -} ); - -jQuery.ajaxPrefilter( function( s ) { - var i; - for ( i in s.headers ) { - if ( i.toLowerCase() === "content-type" ) { - s.contentType = s.headers[ i ] || ""; - } - } -} ); - - -jQuery._evalUrl = function( url, options, doc ) { - return jQuery.ajax( { - url: url, - - // Make this explicit, since user can override this through ajaxSetup (#11264) - type: "GET", - dataType: "script", - cache: true, - async: false, - global: false, - - // Only evaluate the response if it is successful (gh-4126) - // dataFilter is not invoked for failure responses, so using it instead - // of the default converter is kludgy but it works. - converters: { - "text script": function() {} - }, - dataFilter: function( response ) { - jQuery.globalEval( response, options, doc ); - } - } ); -}; - - -jQuery.fn.extend( { - wrapAll: function( html ) { - var wrap; - - if ( this[ 0 ] ) { - if ( isFunction( html ) ) { - html = html.call( this[ 0 ] ); - } - - // The elements to wrap the target around - wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); - - if ( this[ 0 ].parentNode ) { - wrap.insertBefore( this[ 0 ] ); - } - - wrap.map( function() { - var elem = this; - - while ( elem.firstElementChild ) { - elem = elem.firstElementChild; - } - - return elem; - } ).append( this ); - } - - return this; - }, - - wrapInner: function( html ) { - if ( isFunction( html ) ) { - return this.each( function( i ) { - jQuery( this ).wrapInner( html.call( this, i ) ); - } ); - } - - return this.each( function() { - var self = jQuery( this ), - contents = self.contents(); - - if ( contents.length ) { - contents.wrapAll( html ); - - } else { - self.append( html ); - } - } ); - }, - - wrap: function( html ) { - var htmlIsFunction = isFunction( html ); - - return this.each( function( i ) { - jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); - } ); - }, - - unwrap: function( selector ) { - this.parent( selector ).not( "body" ).each( function() { - jQuery( this ).replaceWith( this.childNodes ); - } ); - return this; - } -} ); - - -jQuery.expr.pseudos.hidden = function( elem ) { - return !jQuery.expr.pseudos.visible( elem ); -}; -jQuery.expr.pseudos.visible = function( elem ) { - return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); -}; - - - - -jQuery.ajaxSettings.xhr = function() { - try { - return new window.XMLHttpRequest(); - } catch ( e ) {} -}; - -var xhrSuccessStatus = { - - // File protocol always yields status code 0, assume 200 - 0: 200, - - // Support: IE <=9 only - // #1450: sometimes IE returns 1223 when it should be 204 - 1223: 204 - }, - xhrSupported = jQuery.ajaxSettings.xhr(); - -support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); -support.ajax = xhrSupported = !!xhrSupported; - -jQuery.ajaxTransport( function( options ) { - var callback, errorCallback; - - // Cross domain only allowed if supported through XMLHttpRequest - if ( support.cors || xhrSupported && !options.crossDomain ) { - return { - send: function( headers, complete ) { - var i, - xhr = options.xhr(); - - xhr.open( - options.type, - options.url, - options.async, - options.username, - options.password - ); - - // Apply custom fields if provided - if ( options.xhrFields ) { - for ( i in options.xhrFields ) { - xhr[ i ] = options.xhrFields[ i ]; - } - } - - // Override mime type if needed - if ( options.mimeType && xhr.overrideMimeType ) { - xhr.overrideMimeType( options.mimeType ); - } - - // X-Requested-With header - // For cross-domain requests, seeing as conditions for a preflight are - // akin to a jigsaw puzzle, we simply never set it to be sure. - // (it can always be set on a per-request basis or even using ajaxSetup) - // For same-domain requests, won't change header if already provided. - if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { - headers[ "X-Requested-With" ] = "XMLHttpRequest"; - } - - // Set headers - for ( i in headers ) { - xhr.setRequestHeader( i, headers[ i ] ); - } - - // Callback - callback = function( type ) { - return function() { - if ( callback ) { - callback = errorCallback = xhr.onload = - xhr.onerror = xhr.onabort = xhr.ontimeout = - xhr.onreadystatechange = null; - - if ( type === "abort" ) { - xhr.abort(); - } else if ( type === "error" ) { - - // Support: IE <=9 only - // On a manual native abort, IE9 throws - // errors on any property access that is not readyState - if ( typeof xhr.status !== "number" ) { - complete( 0, "error" ); - } else { - complete( - - // File: protocol always yields status 0; see #8605, #14207 - xhr.status, - xhr.statusText - ); - } - } else { - complete( - xhrSuccessStatus[ xhr.status ] || xhr.status, - xhr.statusText, - - // Support: IE <=9 only - // IE9 has no XHR2 but throws on binary (trac-11426) - // For XHR2 non-text, let the caller handle it (gh-2498) - ( xhr.responseType || "text" ) !== "text" || - typeof xhr.responseText !== "string" ? - { binary: xhr.response } : - { text: xhr.responseText }, - xhr.getAllResponseHeaders() - ); - } - } - }; - }; - - // Listen to events - xhr.onload = callback(); - errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); - - // Support: IE 9 only - // Use onreadystatechange to replace onabort - // to handle uncaught aborts - if ( xhr.onabort !== undefined ) { - xhr.onabort = errorCallback; - } else { - xhr.onreadystatechange = function() { - - // Check readyState before timeout as it changes - if ( xhr.readyState === 4 ) { - - // Allow onerror to be called first, - // but that will not handle a native abort - // Also, save errorCallback to a variable - // as xhr.onerror cannot be accessed - window.setTimeout( function() { - if ( callback ) { - errorCallback(); - } - } ); - } - }; - } - - // Create the abort callback - callback = callback( "abort" ); - - try { - - // Do send the request (this may raise an exception) - xhr.send( options.hasContent && options.data || null ); - } catch ( e ) { - - // #14683: Only rethrow if this hasn't been notified as an error yet - if ( callback ) { - throw e; - } - } - }, - - abort: function() { - if ( callback ) { - callback(); - } - } - }; - } -} ); - - - - -// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) -jQuery.ajaxPrefilter( function( s ) { - if ( s.crossDomain ) { - s.contents.script = false; - } -} ); - -// Install script dataType -jQuery.ajaxSetup( { - accepts: { - script: "text/javascript, application/javascript, " + - "application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function( text ) { - jQuery.globalEval( text ); - return text; - } - } -} ); - -// Handle cache's special case and crossDomain -jQuery.ajaxPrefilter( "script", function( s ) { - if ( s.cache === undefined ) { - s.cache = false; - } - if ( s.crossDomain ) { - s.type = "GET"; - } -} ); - -// Bind script tag hack transport -jQuery.ajaxTransport( "script", function( s ) { - - // This transport only deals with cross domain or forced-by-attrs requests - if ( s.crossDomain || s.scriptAttrs ) { - var script, callback; - return { - send: function( _, complete ) { - script = jQuery( " - - - + + + Alignments — pycortex 1.2.8 documentation + + + + + + + + + @@ -24,8 +22,9 @@ + + - @@ -38,7 +37,7 @@
-

Alignments

+

Alignments

The cortex.align module.

Aligning functional data, or finding where the brain is.

To correctly visualise cortical activity, we need to know where cortical surface is in the functional data. @@ -49,7 +48,7 @@

AlignmentsS1, you are making a transform named example-transform, and the reference image is ref-image.nii.gz.

-

Automatic Alignment

+

Automatic Alignment

Pycortex can automatically align the brain using FSL. This step creates a new transform folder in your pycortex store, and should be the first step for any alignment.

To have pycortex automagically align the brain, simply call

@@ -72,7 +71,7 @@

Automatic Alignmentnoclean to false will keep those files there, which is useful for debugging.

-

Automatically Tweaking Alignments

+

Automatically Tweaking Alignments

In theory, a pre-existing alignment can be tweaked automatically. Like the automatic alignment, this is done via FSL. However, in practice, the search range is too big to be practically useful, and tweaking should be done using manual alignment instead.

@@ -81,7 +80,7 @@

Automatically Tweaking Alignments -

Manual Alignment

+

Manual Alignment

Note

Currently the manual aligner only works on Ubuntu 14.04. The manual @@ -98,50 +97,62 @@

Manual Alignment_images/snapshot1.png +_images/snapshot1.png +

There’s weird gray blobs - click anywhere to get rid of them.

-_images/snapshot2.png -

Here you see 4 different views, showing the saggital, coronal, and transverse slices, and also the three slices in 3D. +_images/snapshot2.png + +

Here you see 4 different views, showing the sagittal, coronal, and transverse slices, and also the three slices in 3D. The background image is the reference image, and the mesh that you see is the surface that you will be aligning. You’ll be moving the mesh until it’s aligned as much as possible with the reference.

To make things easier to see, the aligner offers different color options.

-

Changing the views

+

Changing the views

You can change the color scale for the images with the color map option:

-_images/colormap.png +_images/colormap.png +

Here, we’ve set it to the red-blue color map.

-_images/snapshot4.png +_images/snapshot4.png +

Fliplut can be used to reverse the color map.

-_images/flipcolor.png +_images/flipcolor.png +

You can also use the contrast and brightness sliders to adjust the colors.

-_images/contrast.png +_images/contrast.png +

The Outline color and Outline rep can be used to change the surface color, and the surface from a mesh (the default), to points only, to a solid surface. -Also, the sliders can be used to chane line and point weights. +Also, the sliders can be used to change line and point weights. Here, we changed it to a green points only representation, with smaller points.

-_images/surface.png +_images/surface.png +

You will notice two black lines in each view. You can click anywhere in a view to select a different voxel. Selecting another voxel will update all the other views to show the slices that particular voxel belongs to.

-_images/lines1.png -_images/snapshot13.png +_images/lines1.png + +_images/snapshot13.png +

Use these views to change the slices of the brain that you’re looking at, to line things up.

-

Manually aligning the brain

+

Manually aligning the brain

On each view, there is a ball surrounded by a ring. These can be used to adjust the brain using the mouse. Click and drag the center ball to translate in each view, and use the ball on the ring to rotate and scale. It will take a few seconds for the aligner to update the mesh position.

-_images/adjring.png +_images/adjring.png +

Note: you should not use the ring to make adjustments. There is no way to fix the scaling, and the ring will screw the scaling up.

You can also use the keyboard to make adjustments. Holding down the shift key allows you to make fine adjustments. The aligner will apply the transformation in whatever view currently under your mouse cursor.

-_images/key-controls.png +_images/key-controls.png +

Note: you shouldn’t touch the keys outlined in red. There is no reason to stretch the brain.

To save the alignment, just click the Save Transform button and close the window.

-_images/save.png +_images/save.png +
-

Tips for aligning the brain

+

Tips for aligning the brain

  • Holding down the shift key while using the keyboard controls will let you move the brain in fine-tuned, smaller increments.

  • The really deep sulci work great as landmarks to align stuff up.

  • @@ -206,7 +217,7 @@

    Related Topics

- - + + @@ -229,11 +240,11 @@

Quick search

- - + + @@ -151,11 +164,11 @@

Quick search

- - + + @@ -170,11 +178,11 @@

Quick search

- - + + @@ -190,11 +183,11 @@

Quick search

-plot dropout

Out:

-
Failed to get connection
-** (inkscape:5219): CRITICAL **: 01:27:52.316: dbus_g_proxy_new_for_name: assertion 'connection != NULL' failed
-** (inkscape:5219): CRITICAL **: 01:27:52.317: dbus_g_proxy_call: assertion 'DBUS_IS_G_PROXY (proxy)' failed
-** (inkscape:5219): CRITICAL **: 01:27:52.317: dbus_g_connection_register_g_object: assertion 'connection != NULL' failed
+plot dropout
Background RRGGBBAA: ffffff00
+Area 0:0:1960.5:1024 exported to 1960 x 1024 pixels (96 dpi)
 

-
import cortex
+
import cortex
 import numpy as np
 np.random.seed(1234)
 
@@ -84,14 +80,14 @@
                                  with_dropout=True)
 
-

Total running time of the script: ( 0 minutes 3.200 seconds)

- - - + + @@ -193,11 +188,11 @@

Quick search

- - + + @@ -244,11 +231,11 @@

Quick search

- - + + @@ -228,11 +211,11 @@

Quick search

- - + + @@ -195,11 +188,11 @@

Quick search

- - + + @@ -195,11 +188,11 @@

Quick search

- - + + @@ -200,11 +193,11 @@

Quick search

- - + + @@ -188,11 +179,11 @@

Quick search

- - + + @@ -209,11 +202,11 @@

Quick search

- - + + @@ -212,11 +205,11 @@

Quick search

- - + + @@ -167,11 +180,11 @@

Quick search

- - + + @@ -200,11 +200,11 @@

Quick search

- - + + @@ -169,11 +174,11 @@

Quick search

- - + + @@ -131,11 +144,11 @@

Quick search

- - + + @@ -176,11 +182,11 @@

Quick search

- - + + @@ -228,11 +227,11 @@

Quick search

- - + + @@ -216,11 +213,11 @@

Quick search

- - + + @@ -198,11 +199,11 @@

Quick search

- - + + @@ -210,11 +206,11 @@

Quick search

- - + + @@ -268,11 +248,11 @@

Quick search

- - + + @@ -331,11 +330,11 @@

Quick search

- - + + @@ -143,11 +156,11 @@

Quick search

- - + + @@ -188,11 +189,11 @@

Quick search

- - + + @@ -219,11 +220,11 @@

Quick search

- - + + @@ -180,11 +179,11 @@

Quick search

- - + + @@ -195,11 +186,11 @@

Quick search

- - + + @@ -260,11 +269,11 @@

Quick search

- - + + @@ -201,11 +200,11 @@

Quick search

- - + + @@ -177,11 +178,11 @@

Quick search

- - + + @@ -151,11 +164,11 @@

Quick search

- - + + @@ -182,11 +183,11 @@

Quick search

-
import cortex
+
import cortex
 
 import numpy as np
 np.random.seed(1234)
@@ -111,14 +110,13 @@
 # the viewer will display the modifications specified in the template
 
-

Total running time of the script: ( 0 minutes 0.000 seconds)

- - - + + @@ -213,11 +217,11 @@

Quick search

- - + + @@ -173,11 +177,11 @@

Quick search

- - + + @@ -162,11 +166,11 @@

Quick search

- - + + @@ -166,11 +170,11 @@

Quick search

-
-

One of the fundamental reasons for carefully aligning surfaces is to allow the creation and use of cortical masks. This limits the number of voxels you need to model. Traditionally, these masks are created by selecting the set of nearest neighbor voxels for each vertex on the transformed surface. Unfortunately, pycortex’s advanced per-pixel mapping precludes the use of this simple mask, since faces could potentially intersect with voxel corners which are not in this simple mask. Thus, the default masks in pycortex use a distance metric to compute mask membership.

+

One of the fundamental reasons for carefully aligning surfaces is to allow the creation and use of cortical masks. This limits the number of voxels you need to model. Traditionally, these masks are created by selecting the set of nearest neighbor voxels for each vertex on the transformed surface. Unfortunately, pycortex’s advanced per-pixel mapping precludes the use of this simple mask, since faces could potentially intersect with voxel corners which are not in this simple mask. Thus, the default masks in pycortex use a distance metric to compute mask membership.

Masks were added into pycortex in May 2013, due to previous issues with masked data and the addition of the per-pixel mapping. Masked datasets are further discussed in the datasets page.

A mask is specified by three variables: subject, transform, and mask type. pycortex defines two named masks for each transform by default. These are the 'thick' and the 'thin' masks. They correspond to a distance of 8 mm and 2 mm, respectively, from any given cortical vertex. Additionally, masks corresponding to known mapper types (such as 'nearest' and 'trilinear') are available. If the subject has both pial and white matter surfaces, all voxels of exactly the cortical thickness distance from each vertex are selected from the fiducial surface. To retrieve the thick mask for S1 using the fullhead transform:

import cortex
@@ -179,11 +178,11 @@ 

Transforms -

Surface info

+

Surface info

The filestore also manages several important quantifications about the surfaces. These include Tissot’s Indicatrix and the flatmap surface distortion. There are stored in the /surface_info directory.

-

Views

+

Views

It is often useful to be able to store, recall, and share specific perspectives onto a 3D model of the brain. The filestore stores these “views” as JSON files containing parameters such as altitude, radius, target, and azimuth. After opening a webgl viewer and manipulating the brain using the browser GUI, a view can be stored by calling:

viewer = cortex.webgl.show(volume)
 viewer.save_view(subject, name)
@@ -195,46 +194,46 @@ 

Views

-

overlays.svg

+

overlays.svg

Overlays are stored as SVG’s. This is where surface ROIs are defined. Since these surface ROIs are invariant to transform, only one ROI map is needed for each subject. These SVGs are automatically created for a subject if you call cortex.add_roi. ROI overlays are created and edited in Inkscape. For more information, see :module:`svgroi.py`.

-

rois.svg

+

rois.svg

-

Example subject database entry

+

Example subject database entry

Here is an example entry into the filestore…

filestore/db
-└── S1
-    ├── anatomicals
-    │   └── raw.nii.gz
-    ├── cache
-    │   ├── flatmask_1024.npz
-    │   ├── flatpixel_fullhead_1024_nearest_l32.npz
-    │   ├── flatverts_1024.npz
-    │   └── fullhead_linenn.npz
-    ├── overlays.svg
-    ├── rois.svg
-    ├── surface-info
-    │   ├── distortion[dist_type=areal].npz
-    │   └── distortion[dist_type=metric].npz
-    ├── surfaces
-    │   ├── flat_lh.gii
-    │   ├── flat_rh.gii
-    │   ├── inflated_lh.gii
-    │   ├── inflated_rh.gii
-    │   ├── pia_lh.gii
-    │   ├── pia_rh.gii
-    │   ├── wm_lh.gii
-    │   └── wm_rh.gii
-    ├── transforms
-    │   ├── fullhead
-    │   │   ├── matrices.xfm
-    │   │   └── reference.nii.gz
-    │   └── retinotopy
-    │       ├── matrices.xfm
-    │       └── reference.nii.gz
-    └── views
+└── S1
+    ├── anatomicals
+       └── raw.nii.gz
+    ├── cache
+       ├── flatmask_1024.npz
+       ├── flatpixel_fullhead_1024_nearest_l32.npz
+       ├── flatverts_1024.npz
+       └── fullhead_linenn.npz
+    ├── overlays.svg
+    ├── rois.svg
+    ├── surface-info
+       ├── distortion[dist_type=areal].npz
+       └── distortion[dist_type=metric].npz
+    ├── surfaces
+       ├── flat_lh.gii
+       ├── flat_rh.gii
+       ├── inflated_lh.gii
+       ├── inflated_rh.gii
+       ├── pia_lh.gii
+       ├── pia_rh.gii
+       ├── wm_lh.gii
+       └── wm_rh.gii
+    ├── transforms
+       ├── fullhead
+          ├── matrices.xfm
+          └── reference.nii.gz
+       └── retinotopy
+           ├── matrices.xfm
+           └── reference.nii.gz
+    └── views
 
@@ -300,7 +299,7 @@

Related Topics

- - + + @@ -323,11 +322,11 @@

Quick search