forked from openworm/c302
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
e5a61c4
commit 180dad5
Showing
1 changed file
with
180 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,180 @@ | ||
# -*- coding: utf-8 -*- | ||
|
||
############################################################ | ||
|
||
# A simple script to read the values in herm_full_edgelist.csv. | ||
|
||
# This is on of a number of interchangeable "Readers" which can | ||
# be used to get connection data for c302 | ||
|
||
############################################################ | ||
|
||
import csv | ||
|
||
from c302.NeuroMLUtilities import ConnectionInfo | ||
from c302.NeuroMLUtilities import analyse_connections | ||
import os | ||
|
||
from c302 import print_ | ||
|
||
spreadsheet_location = os.path.dirname(os.path.abspath(__file__))+"/data/" | ||
filename = "%saconnectome_white_1986_A.csv" % spreadsheet_location | ||
|
||
def get_all_muscle_prefixes(): | ||
return ["pm", "vm", "um", "dBWM", "vBWM"] | ||
|
||
|
||
def get_body_wall_muscle_prefixes(): | ||
return ["dBWM", "vBWM"] | ||
|
||
|
||
def is_muscle(cell): | ||
known_muscle_prefixes = get_all_muscle_prefixes() | ||
return cell.startswith(tuple(known_muscle_prefixes)) | ||
|
||
|
||
def is_body_wall_muscle(cell): | ||
known_muscle_prefixes = get_body_wall_muscle_prefixes() | ||
return cell.startswith(tuple(known_muscle_prefixes)) | ||
|
||
|
||
def is_neuron(cell): | ||
return cell[0].isupper() | ||
|
||
|
||
def remove_leading_index_zero(cell): | ||
""" | ||
Returns neuron name with an index without leading zero. E.g. VB01 -> VB1. | ||
""" | ||
if is_neuron(cell) and cell[-2:].startswith("0"): | ||
return "%s%s" % (cell[:-2], cell[-1:]) | ||
return cell | ||
|
||
def get_old_muscle_name(muscle): | ||
index = int(muscle[6:]) | ||
if index < 10: | ||
index = "0%s" % index | ||
if muscle.startswith("BWM-VL"): | ||
return "MVL%s" % index | ||
elif muscle.startswith("BWM-DR"): | ||
return "MVR%s" % index | ||
elif muscle.startswith("BWM-DL"): | ||
return "MDL%s" % index | ||
elif muscle.startswith("BWM-DR"): | ||
return "MDR%s" % index | ||
|
||
def get_syntype(syntype): | ||
if syntype == "electrical": | ||
return "GapJunction" | ||
elif syntype == "chemical": | ||
return "Send" | ||
else: | ||
raise NotImplementedError("Cannot parse syntype '%s'" % syntype) | ||
|
||
def get_synclass(cell, syntype): | ||
#dirty hack | ||
if syntype == "GapJunction": | ||
return "Generic_GJ" | ||
else: | ||
if cell.startswith("DD") or cell.startswith("VD"): | ||
return "GABA" | ||
return "Acetylcholine" | ||
|
||
def parse_row(row): | ||
pre = str.strip(row["Source"]) | ||
post = str.strip(row["Target"]) | ||
num = int(row["Weight"]) | ||
syntype = get_syntype(str.strip(row["Type"])) | ||
synclass = get_synclass(pre, syntype) | ||
return pre, post, num, syntype, synclass | ||
|
||
def read_data(include_nonconnected_cells=False): | ||
""" | ||
Args: | ||
include_nonconnected_cells (bool): Also append neurons without known connections to other neurons to the 'cells' list. True if they should get appended, False otherwise. | ||
Returns: | ||
cells (:obj:`list` of :obj:`str`): List of neurons | ||
conns (:obj:`list` of :obj:`ConnectionInfo`): List of connections from neuron to neuron | ||
""" | ||
|
||
conns = [] | ||
cells = [] | ||
|
||
with open(filename, 'r') as f: | ||
reader = csv.DictReader(f) | ||
print_("Opened file: " + filename) | ||
|
||
known_nonconnected_cells = ['CANL', 'CANR'] | ||
|
||
for row in reader: | ||
pre, post, num, syntype, synclass = parse_row(row) | ||
|
||
if not is_neuron(pre) or not is_neuron(post): | ||
continue # pre or post is not a neuron | ||
|
||
pre = remove_leading_index_zero(pre) | ||
post = remove_leading_index_zero(post) | ||
|
||
conns.append(ConnectionInfo(pre, post, num, syntype, synclass)) | ||
#print ConnectionInfo(pre, post, num, syntype, synclass) | ||
if pre not in cells: | ||
cells.append(pre) | ||
if post not in cells: | ||
cells.append(post) | ||
|
||
if include_nonconnected_cells: | ||
for c in known_nonconnected_cells: | ||
if c not in cells: | ||
cells.append(c) | ||
|
||
return cells, conns | ||
|
||
|
||
def read_muscle_data(): | ||
""" | ||
Returns: | ||
neurons (:obj:`list` of :obj:`str`): List of motor neurons. Each neuron has at least one connection with a post-synaptic muscle cell. | ||
muscles (:obj:`list` of :obj:`str`): List of muscle cells. | ||
conns (:obj:`list` of :obj:`ConnectionInfo`): List of neuron-muscle connections. | ||
""" | ||
|
||
neurons = [] | ||
muscles = [] | ||
conns = [] | ||
|
||
with open(filename, 'r') as f: | ||
reader = csv.DictReader(f) | ||
print_("Opened file: " + filename) | ||
|
||
for row in reader: | ||
pre, post, num, syntype, synclass = parse_row(row) | ||
|
||
if not (is_neuron(pre) or is_body_wall_muscle(pre)) or not is_body_wall_muscle(post): | ||
continue | ||
|
||
if is_neuron(pre): | ||
pre = remove_leading_index_zero(pre) | ||
else: | ||
pre = get_old_muscle_name(pre) | ||
post = get_old_muscle_name(post) | ||
|
||
conns.append(ConnectionInfo(pre, post, num, syntype, synclass)) | ||
if is_neuron(pre) and pre not in neurons: | ||
neurons.append(pre) | ||
elif is_body_wall_muscle(pre) and pre not in muscles: | ||
muscles.append(pre) | ||
if post not in muscles: | ||
muscles.append(post) | ||
|
||
return neurons, muscles, conns | ||
|
||
|
||
def main(): | ||
|
||
cells, neuron_conns = read_data(include_nonconnected_cells=True) | ||
neurons2muscles, muscles, muscle_conns = read_muscle_data() | ||
|
||
analyse_connections(cells, neuron_conns, neurons2muscles, muscles, muscle_conns) | ||
|
||
if __name__ == '__main__': | ||
main() |