Skip to content

Commit

Permalink
Adding 2 more readers
Browse files Browse the repository at this point in the history
  • Loading branch information
pgleeson committed Jun 3, 2024
1 parent d61ff8d commit 6ee0e49
Show file tree
Hide file tree
Showing 7 changed files with 15,147 additions and 5 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/non_omv.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ name: Non-OMV-tests

on:
push:
branches: [ master, development, experimental, ow* ]
branches: [ main, development, experimental, ow* ]
pull_request:
branches: [ master, development, experimental, ow* ]
branches: [ main, development, experimental, ow* ]

jobs:
build:
Expand Down
3 changes: 2 additions & 1 deletion cect/SpreadsheetDataReader.py
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@
def read_data(include_nonconnected_cells=False, neuron_connect=False):



# reading the NeuronConnectFormatted.xls file if neuron_connect = True
if neuron_connect:
conns = []
Expand Down Expand Up @@ -116,6 +115,8 @@ def main():

analyse_connections(cells, neuron_conns, neurons2muscles, muscles, muscle_conns)

print_(' -- Finished analysing connections using: %s'%os.path.basename(__file__))

if __name__ == '__main__':

main()
182 changes: 182 additions & 0 deletions cect/UpdatedSpreadsheetDataReader.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
# -*- 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 cect.ConnectomeReader import ConnectionInfo
from cect.ConnectomeReader import analyse_connections
import os

from cect import print_

spreadsheet_location = os.path.dirname(os.path.abspath(__file__))+"/data/"
filename = "%sherm_full_edgelist.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[5:])
if index < 10:
index = "0%s" % index
if muscle.startswith("vBWML"):
return "MVL%s" % index
elif muscle.startswith("vBWMR"):
return "MVR%s" % index
elif muscle.startswith("dBWML"):
return "MDL%s" % index
elif muscle.startswith("dBWMR"):
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)

print_(' -- Finished analysing connections using: %s'%os.path.basename(__file__))

if __name__ == '__main__':
main()
184 changes: 184 additions & 0 deletions cect/UpdatedSpreadsheetDataReader2.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,184 @@
# -*- 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 cect.ConnectomeReader import ConnectionInfo
from cect.ConnectomeReader import analyse_connections
import os

from cect import print_

spreadsheet_location = os.path.dirname(os.path.abspath(__file__))+"/data/"
filename = "%sherm_full_edgelist_MODIFIED.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[5:])
if index < 10:
index = "0%s" % index
if muscle.startswith("vBWML"):
return "MVL%s" % index
elif muscle.startswith("vBWMR"):
return "MVR%s" % index
elif muscle.startswith("dBWML"):
return "MDL%s" % index
elif muscle.startswith("dBWMR"):
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) and not is_body_wall_muscle(pre)) or not is_body_wall_muscle(post):
# Don't add connections unless pre=neuron and post=body_wall_muscle
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))
#print 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)

print_(' -- Finished analysing connections using: %s'%os.path.basename(__file__))

if __name__ == '__main__':
main()
Loading

0 comments on commit 6ee0e49

Please sign in to comment.