{ "cells": [ { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ ".. _cn_tut:\n", "\n", "Basic connectivity analyses\n", "+++++++++++++++++++++++++++\n", "\n", "Getting connectivity information for a set of neurons is pretty straight forward. You can get connectivity tables, edges between neurons, connectors between neurons. Make sure to check out the :ref:`API `.\n", "\n", "In this example, we will focus on fetching and visualising basic connectivity data. Check out the advanced tutorial for e.g. compartmentalizing connectivity." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "text/html": [ " \n", " " ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "INFO : Global CATMAID instance set. Caching is ON. (pymaid)\n" ] } ], "source": [ "import pymaid\n", "\n", "# Initialize connection\n", "rm = pymaid.connect_catmaid()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Let's start by fetching a connectivity table for some olfactory projection neurons:" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "INFO : Fetching connectivity table for 8 neurons (pymaid)\n", "INFO : Done. Found 134 pre-, 710 postsynaptic and 0 gap junction-connected neurons (pymaid)\n" ] }, { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
neuron_nameskeleton_idnum_nodesrelation2863104573816122157353573237550222729557311total
0AV4 [LH.R] 1803749 CH RJVR Vegito - check18037486394upstream1038421177878.0
1LHAV4a4#2 1853424 Accursed RJVR - check FML185342310266upstream766412186867.0
2AV4 [LH.R] 1095415 ARH RJVR Static10954143983upstream529191612963.0
3LHAV4a4#1 1911125 FML PS RJVR19111246969upstream8042447332.0
4APL 203841 MR JSL203840144725upstream4062232423.0
\n", "
" ], "text/plain": [ " neuron_name skeleton_id num_nodes \\\n", "0 AV4 [LH.R] 1803749 CH RJVR Vegito - check 1803748 6394 \n", "1 LHAV4a4#2 1853424 Accursed RJVR - check FML 1853423 10266 \n", "2 AV4 [LH.R] 1095415 ARH RJVR Static 1095414 3983 \n", "3 LHAV4a4#1 1911125 FML PS RJVR 1911124 6969 \n", "4 APL 203841 MR JSL 203840 144725 \n", "\n", " relation 2863104 57381 61221 57353 57323 755022 27295 57311 total \n", "0 upstream 10 3 8 4 21 17 7 8 78.0 \n", "1 upstream 7 6 6 4 12 18 6 8 67.0 \n", "2 upstream 5 2 9 1 9 16 12 9 63.0 \n", "3 upstream 8 0 4 2 4 4 7 3 32.0 \n", "4 upstream 4 0 6 2 2 3 2 4 23.0 " ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "pns = pymaid.get_skids_by_annotation('glomerulus DA1 right excitatory')\n", "\n", "cn_table = pymaid.get_partners(pns)\n", "cn_table.head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "This table is similar to the connectivity table in CATMAID: each number-column (e.g. ``755022``) represents connections from/to the neuron with that skeleton ID.\n", "\n", "Since this is a pandas DataFrame, we can work pandas magic to subset it:" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "downstream_only = cn_table[cn_table.relation == 'downstream']\n", "\n", "strong_only = cn_table[cn_table.total >= 10]\n", "\n", "large_only = cn_table[cn_table.num_nodes >= 2000]\n", "\n", "connected_to_all = cn_table[cn_table[['755022', '2863104', '27295', '61221', '57353', '57323', '57381', '57311']].min(axis=1) != 0]" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Make sure to also check out :func:`pymaid.get_partners` documenation too.\n", "\n", "Quick visualizations\n", "====================\n", "\n", "As example for a quick visualization, we will use the excellent library `seaborn `_ to plot a heatmap of an adjacency matrix.\n", "\n", "First, get the adjacency matrix between our projection neurons and their strong downstream partners:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
targets181144219111241870230180374848805518534236762450181255810954141796364...181205797195606044514159269271871424553382881110331589420516955153
sources
286310430.023.05.015.015.012.018.06.08.00.0...1.00.02.00.00.00.00.00.010.010.0
573814.09.028.07.00.03.00.03.01.036.0...1.00.01.00.00.00.00.010.00.00.0
6122126.013.07.013.015.015.04.04.016.00.0...1.00.01.01.00.00.00.00.00.00.0
573533.06.023.03.03.05.04.05.05.00.0...0.00.05.00.010.010.010.00.00.00.0
5732320.015.07.022.011.019.015.018.09.026.0...3.00.00.02.00.00.00.00.00.00.0
\n", "

5 rows \u00d7 176 columns

\n", "
" ], "text/plain": [ "targets 1811442 1911124 1870230 1803748 488055 1853423 6762450 \\\n", "sources \n", "2863104 30.0 23.0 5.0 15.0 15.0 12.0 18.0 \n", "57381 4.0 9.0 28.0 7.0 0.0 3.0 0.0 \n", "61221 26.0 13.0 7.0 13.0 15.0 15.0 4.0 \n", "57353 3.0 6.0 23.0 3.0 3.0 5.0 4.0 \n", "57323 20.0 15.0 7.0 22.0 11.0 19.0 15.0 \n", "\n", "targets 1812558 1095414 1796364 ... 1812057 9719560 60445 \\\n", "sources ... \n", "2863104 6.0 8.0 0.0 ... 1.0 0.0 2.0 \n", "57381 3.0 1.0 36.0 ... 1.0 0.0 1.0 \n", "61221 4.0 16.0 0.0 ... 1.0 0.0 1.0 \n", "57353 5.0 5.0 0.0 ... 0.0 0.0 5.0 \n", "57323 18.0 9.0 26.0 ... 3.0 0.0 0.0 \n", "\n", "targets 1415926 9271871 424553 3828811 10331589 4205169 55153 \n", "sources \n", "2863104 0.0 0.0 0.0 0.0 0.0 10.0 10.0 \n", "57381 0.0 0.0 0.0 0.0 10.0 0.0 0.0 \n", "61221 1.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "57353 0.0 10.0 10.0 10.0 0.0 0.0 0.0 \n", "57323 2.0 0.0 0.0 0.0 0.0 0.0 0.0 \n", "\n", "[5 rows x 176 columns]" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "adj_mat = pymaid.adjacency_matrix(pns, downstream_only[downstream_only.total >= 10])\n", "adj_mat.head()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Now we will use seaborn's `clustermap `_ to visualize this adjacency matrix:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import seaborn as sns\n", "import matplotlib.pyplot as plt\n", "\n", "cm = sns.clustermap(adj_mat,\n", " cmap='Greys')\n", "\n", "plt.show()" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Network analyses\n", "================\n", "``pymaid`` and ``navis`` come with a few tools to analyse connectivity, like :func:`navis:navis.cluster_by_connectivity` or :func:`pymaid.predict_connectivity`. If you are looking to run some proper network analyses, there is no need to reinvent the wheel though: `networkX `_ will most likely do the trick." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Node centrality for some of the nodes in the network: 0.9617486338797814 0.9617486338797814 0.9617486338797814\n" ] } ], "source": [ "import networkx as nx\n", "import navis\n", "\n", "# Turn the adjacency matrix into a networkX Graph\n", "g = navis.network2nx(adj_mat)\n", "\n", "# As example: get the degree centrality for each node\n", "dc = nx.degree_centrality(g)\n", "print('Node centrality for some of the nodes in the network:', dc[755022], dc[2863104], dc[27295])" ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "Have a look at the available `algorithms `_ in networkX.\n", "\n", "Exporting connectivity\n", "======================\n", "\n", "There are several excellent tools out there to visualize and analyze connectivity graphs outside of the Python ecosystem. Here, we will demonstrate how to export connectivity to formats that you can import somewhere else." ] }, { "cell_type": "raw", "metadata": { "raw_mimetype": "text/restructuredtext" }, "source": [ "We can use ``g``, the networkX Graph we created above, to export the graph to all kinds of different `formats `_. \n", "\n", "For demonstration, let's export to the GraphML format which is widely used." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "nx.write_graphml(g, 'graph.graphml')" ] } ], "metadata": { "celltoolbar": "Raw Cell Format", "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.7.5" } }, "nbformat": 4, "nbformat_minor": 2 }