Skip to content

Commit

Permalink
WhiteDataReader
Browse files Browse the repository at this point in the history
  • Loading branch information
yasinthanvickneswaran committed Feb 20, 2024
1 parent e5a61c4 commit 180dad5
Showing 1 changed file with 180 additions and 0 deletions.
180 changes: 180 additions & 0 deletions c302/WhiteDataReader.py
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()

0 comments on commit 180dad5

Please sign in to comment.