Basic connectivity analyses

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 API.

In this example, we will focus on fetching and visualising basic connectivity data. Check out the advanced tutorial for e.g. compartmentalizing connectivity.

[1]:
import pymaid

# Initialize connection
rm = pymaid.connect_catmaid()
INFO  : Global CATMAID instance set. Caching is ON. (pymaid)

Let’s start by fetching a connectivity table for some olfactory projection neurons:

[2]:
pns = pymaid.get_skids_by_annotation('glomerulus DA1 right excitatory')

cn_table = pymaid.get_partners(pns)
cn_table.head()
INFO  : Fetching connectivity table for 8 neurons (pymaid)
INFO  : Done. Found 134 pre-, 710 postsynaptic and 0 gap junction-connected neurons (pymaid)
[2]:
neuron_name skeleton_id num_nodes relation 2863104 57381 61221 57353 57323 755022 27295 57311 total
0 AV4 [LH.R] 1803749 CH RJVR Vegito - check 1803748 6394 upstream 10 3 8 4 21 17 7 8 78.0
1 LHAV4a4#2 1853424 Accursed RJVR - check FML 1853423 10266 upstream 7 6 6 4 12 18 6 8 67.0
2 AV4 [LH.R] 1095415 ARH RJVR Static 1095414 3983 upstream 5 2 9 1 9 16 12 9 63.0
3 LHAV4a4#1 1911125 FML PS RJVR 1911124 6969 upstream 8 0 4 2 4 4 7 3 32.0
4 APL 203841 MR JSL 203840 144725 upstream 4 0 6 2 2 3 2 4 23.0

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.

Since this is a pandas DataFrame, we can work pandas magic to subset it:

[3]:
downstream_only = cn_table[cn_table.relation == 'downstream']

strong_only = cn_table[cn_table.total >= 10]

large_only = cn_table[cn_table.num_nodes >= 2000]

connected_to_all = cn_table[cn_table[['755022', '2863104', '27295', '61221', '57353', '57323', '57381', '57311']].min(axis=1) != 0]

Make sure to also check out pymaid.get_partners() documenation too.

Quick visualizations

As example for a quick visualization, we will use the excellent library seaborn to plot a heatmap of an adjacency matrix.

First, get the adjacency matrix between our projection neurons and their strong downstream partners:

[4]:
adj_mat = pymaid.adjacency_matrix(pns, downstream_only[downstream_only.total >= 10])
adj_mat.head()
[4]:
targets 1811442 1911124 1870230 1803748 488055 1853423 6762450 1812558 1095414 1796364 ... 1812057 9719560 60445 1415926 9271871 424553 3828811 10331589 4205169 55153
sources
2863104 30.0 23.0 5.0 15.0 15.0 12.0 18.0 6.0 8.0 0.0 ... 1.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 10.0 10.0
57381 4.0 9.0 28.0 7.0 0.0 3.0 0.0 3.0 1.0 36.0 ... 1.0 0.0 1.0 0.0 0.0 0.0 0.0 10.0 0.0 0.0
61221 26.0 13.0 7.0 13.0 15.0 15.0 4.0 4.0 16.0 0.0 ... 1.0 0.0 1.0 1.0 0.0 0.0 0.0 0.0 0.0 0.0
57353 3.0 6.0 23.0 3.0 3.0 5.0 4.0 5.0 5.0 0.0 ... 0.0 0.0 5.0 0.0 10.0 10.0 10.0 0.0 0.0 0.0
57323 20.0 15.0 7.0 22.0 11.0 19.0 15.0 18.0 9.0 26.0 ... 3.0 0.0 0.0 2.0 0.0 0.0 0.0 0.0 0.0 0.0

5 rows × 176 columns

Now we will use seaborn’s clustermap to visualize this adjacency matrix:

[5]:
import seaborn as sns
import matplotlib.pyplot as plt

cm = sns.clustermap(adj_mat,
                    cmap='Greys')

plt.show()
../_images/source_connectivity_basics_9_0.png

Network analyses

pymaid and navis come with a few tools to analyse connectivity, like navis:navis.cluster_by_connectivity() or 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.

[6]:
import networkx as nx
import navis

# Turn the adjacency matrix into a networkX Graph
g = navis.network2nx(adj_mat)

# As example: get the degree centrality for each node
dc = nx.degree_centrality(g)
print('Node centrality for some of the nodes in the network:', dc[755022], dc[2863104], dc[27295])
Node centrality for some of the nodes in the network: 0.9617486338797814 0.9617486338797814 0.9617486338797814

Have a look at the available algorithms in networkX.

Exporting connectivity

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.

We can use g, the networkX Graph we created above, to export the graph to all kinds of different formats.

For demonstration, let’s export to the GraphML format which is widely used.

[7]:
nx.write_graphml(g, 'graph.graphml')