Menu

Module providing Consciousness Exploration Tools for PyTorch.

Create circo-like graphs

Credit: A Grigis

All the plots are perfomred with graph-tools embeded in a Singularity singularity container. Please install first Singularity.

# sphinx_gallery_thumbnail_path = '_static/carousel/circo.png'

import os
import numpy as np
import matplotlib.pyplot as plt
from nilearn import datasets
from nilearn.input_data import NiftiMapsMasker
from nilearn.connectome import ConnectivityMeasure
from consciousnet.plotting import plot_circo, plot_graph

Out:

/home/docs/checkouts/readthedocs.org/user_builds/consciousnet/envs/latest/lib/python3.6/site-packages/nilearn/datasets/__init__.py:89: FutureWarning: Fetchers from the nilearn.datasets module will be updated in version 0.9 to return python strings instead of bytes and Pandas dataframes instead of Numpy arrays.
  "Numpy arrays.", FutureWarning)

Connectivity dataset

First generate a connectivty matrix using the ROIs defined in the MSDL template.

def threshold_adj(adj, threshold):
    # Get number of connections to filter
    n_nodes = len(adj)
    n_conn_to_filter = int((threshold / 100.) * (n_nodes * (n_nodes - 1) / 2))

    # For threshold operations, zero out lower triangle (including diagonal)
    adj[np.tril_indices(n_nodes)] = 0

    # Following code is similar to bctpy
    indices = np.where(adj)
    sorted_indices = np.argsort(adj[indices])[::-1]
    adj[(indices[0][sorted_indices][n_conn_to_filter:],
         indices[1][sorted_indices][n_conn_to_filter:])] = 0

    # Just to get a symmetrical matrix
    adj = adj + adj.T

    # Diagonals need connection of 1 for graph operations
    adj[np.diag_indices(n_nodes)] = 1.0

    return adj


def imshow(image_file):
    image = plt.imread(image_file)
    fig, ax = plt.subplots()
    im = ax.imshow(image)
    ax.axis("off")


tmpdir = "/tmp/circo"
if not os.path.isdir(tmpdir):
    os.mkdir(tmpdir)
atlas = datasets.fetch_atlas_msdl(data_dir=tmpdir)
atlas_filename = atlas["maps"]
labels = atlas["labels"]
networks = atlas["networks"]
networks = [elem.decode("utf-8") for elem in networks]
data = datasets.fetch_development_fmri(n_subjects=1, data_dir=tmpdir)
fmri_filenames = data.func[0]
masker = NiftiMapsMasker(maps_img=atlas_filename, standardize=True,
                         verbose=5)
time_series = masker.fit_transform(fmri_filenames, confounds=data.confounds)
correlation_measure = ConnectivityMeasure(kind="correlation")
correlation_matrix = correlation_measure.fit_transform([time_series])[0]
correlation_matrix = threshold_adj(np.abs(correlation_matrix), 50)
np.fill_diagonal(correlation_matrix, 0)
correlation_matrix[correlation_matrix > 0.55] = (
    correlation_matrix[correlation_matrix > 0.55] * 1.1)
correlation_matrix[correlation_matrix > 0.85] = (
    correlation_matrix[correlation_matrix > 0.85] * 2.5)
correlation_matrix /= correlation_matrix.max()

Out:

Dataset created in /tmp/circo/msdl_atlas

Downloading data from https://team.inria.fr/parietal/files/2015/01/MSDL_rois.zip ...
 ...done. (1 seconds, 0 min)
Extracting data from /tmp/circo/msdl_atlas/5d25e157f36214b8ca9a12fd417aac1c/MSDL_rois.zip..... done.
/home/docs/checkouts/readthedocs.org/user_builds/consciousnet/envs/latest/lib/python3.6/site-packages/numpy/lib/npyio.py:2349: VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.
  output = genfromtxt(fname, **kwargs)

Dataset created in /tmp/circo/development_fmri


Dataset created in /tmp/circo/development_fmri/development_fmri

Downloading data from https://osf.io/yr3av/download ...
 ...done. (1 seconds, 0 min)
Downloading data from https://osf.io/download/5c8ff3df4712b400183b7092/ ...
 ...done. (1 seconds, 0 min)
Downloading data from https://osf.io/download/5c8ff3e04712b400193b5bdf/ ...
 ...done. (1 seconds, 0 min)
[NiftiMapsMasker.fit_transform] loading regions from /tmp/circo/msdl_atlas/MSDL_rois/msdl_rois.nii
/home/docs/checkouts/readthedocs.org/user_builds/consciousnet/envs/latest/lib/python3.6/site-packages/nilearn/image/image.py:1057: FutureWarning: The parameter "sessions" will be removed in 0.9.0 release of Nilearn. Please use the parameter "runs" instead.
  ensure_finite=ensure_finite)
Resampling maps
[NiftiMapsMasker.transform_single_imgs] Loading data from /tmp/circo/development_fmri/development_fmri/sub-pixar123_task-pixar_space-MNI152NLin2009cAsym_desc-preproc_bold.nii.gz
[NiftiMapsMasker.transform_single_imgs] Extracting region signals
[NiftiMapsMasker.transform_single_imgs] Cleaning extracted signals

Connectivity display

Now display the connectivity as a graph or a circular flow chart.

adj = correlation_matrix.tolist()
names = labels
hemi_map = {"R": 0, "L": 1}
hemi_groups = [hemi_map.get(elem[0], 2) for elem in names]
colors = [
    "#FFC020", "#64064", "#146432", "#3CDC3C", "#14DC3C", "#A08CB4",
    "#DC1414", "#DC3C14", "#DCB4DC", "#9696C8", "#B42878", "#234B32",
    "#141E8C", "#E18C8C", "#C8234B", "#50148C", "#B4DC8C", "#A06432",
    "#64190", "#196428", "#78643C", "#50A014", "#14B48C", "#4B327D",
    "#DC3CDC", "#7D64A0", "#8CDCDC", "#3C14DC", "#DCB48C", "#DC14A",
    "#14DCA0", "#8C148C", "#DC1464", "#464646"]
colors = [tuple(int(elem.lstrip("#")[i: i + 2], 16) / 255. for i in (0, 2, 4))
          for elem in colors]
color_map = dict((key, colors[cnt]) for cnt, key in enumerate(set(networks)))
group_names = networks
group_colors = [color_map[elem] for elem in group_names]
circo_file = plot_circo(
    adj=adj, names=names, hemi_groups=hemi_groups, group_names=group_names,
    group_colors=group_colors, outdir=tmpdir, with_labels=False)
print(circo_file)
circo_file = plot_circo(
    adj=adj, names=names, hemi_groups=hemi_groups, group_names=group_names,
    group_colors=group_colors, outdir=tmpdir, with_labels=True)
print(circo_file)
graph_file = plot_graph(
    adj=adj, names=names, hemi_groups=hemi_groups, outdir=tmpdir)
print(graph_file)

Out:

Executing:  singularity exec --no-home --cleanenv --bind /tmp/circo:/out /tmp/circo/graphtools-latest.simg python /out/generate_circo.py
/tmp/circo/circo.png
Executing:  singularity exec --no-home --cleanenv --bind /tmp/circo:/out /tmp/circo/graphtools-latest.simg python /out/generate_circo.py
/tmp/circo/circo.png
Executing:  singularity exec --no-home --cleanenv --bind /tmp/circo:/out /tmp/circo/graphtools-latest.simg python /out/generate_graph.py
/tmp/circo/graph.png

Total running time of the script: ( 1 minutes 27.988 seconds)

Gallery generated by Sphinx-Gallery

Follow us

© 2021, consciousnet developers