Skip to content

Commit 40c1b24

Browse files
authored
Merge pull request #100 from openworm/ow_test_cect3
Refactor to use versions of SpreadsheetDataReader etc. in cect (ConnectomeToolbox) & move to CellW2D
2 parents 649ad93 + 8cab0d6 commit 40c1b24

File tree

137 files changed

+768
-193
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

137 files changed

+768
-193
lines changed

.github/workflows/ci.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,20 +11,24 @@ jobs:
1111

1212
runs-on: ubuntu-latest
1313
strategy:
14+
fail-fast: false
1415
matrix:
15-
python-version: [ 3.8, 3.9 ]
16+
python-version: [ 3.9, "3.11" ]
1617
engine: [ jNeuroML, jNeuroML_NEURON, jNeuroML_validate ] #, NON_OMV_TESTS ]
1718

1819
steps:
1920
- uses: actions/checkout@v4
21+
2022
- name: Set up Python ${{ matrix.python-version }}
2123
uses: actions/setup-python@v5
2224
with:
2325
python-version: ${{ matrix.python-version }}
26+
2427
- name: Install OMV
2528
run: |
2629
pip install git+https://github.com/OpenSourceBrain/osb-model-validation
2730
pip install scipy sympy matplotlib cython pandas tables
31+
2832
- name: Run OMV tests on engine ${{ matrix.engine }}
2933
run: |
3034
omv all -V --engine=${{ matrix.engine }}; export OMV_SUCCESS=$?; echo $OMV_SUCCESS

c302/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -496,7 +496,7 @@ def get_cell_muscle_names_and_connection(data_reader, test=False):
496496

497497
all_known_muscles = sorted(all_known_muscles)
498498

499-
print(" --- Using for muscles: %s" % all_known_muscles)
499+
print_(" - Using for muscles: %s" % all_known_muscles)
500500

501501
return mneurons, all_known_muscles, muscle_conns
502502

c302/bioparameters.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,11 @@ def bioparameter_info(self, indent=""):
106106
return info
107107

108108

109+
class NonNeuroMLCustomType:
110+
def __init__(self, id):
111+
self.id = id
112+
113+
109114
class c302ModelPrototype(ParameterisedModelPrototype):
110115
def __init__(self):
111116
super(c302ModelPrototype, self).__init__()
@@ -184,6 +189,8 @@ def create_n_connection_synapse(self, prototype_syn, n, nml_doc, existing_synaps
184189
nml_doc.gap_junctions.append(prototype_syn)
185190
elif isinstance(prototype_syn, GradedSynapse):
186191
nml_doc.graded_synapses.append(prototype_syn)
192+
elif isinstance(prototype_syn, NonNeuroMLCustomType):
193+
pass
187194
else:
188195
info = "%s conns; %s" % (n, existing_synapses)
189196
del existing_synapses[prototype_syn.id]
@@ -192,7 +199,7 @@ def create_n_connection_synapse(self, prototype_syn, n, nml_doc, existing_synaps
192199
return prototype_syn
193200

194201
def is_analog_conn(self, syn):
195-
return isinstance(syn, GradedSynapse)
202+
return isinstance(syn, GradedSynapse) or isinstance(syn, NonNeuroMLCustomType)
196203

197204
def is_elec_conn(self, syn):
198205
return isinstance(syn, GapJunction)

c302/c302_utils.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212

1313
default_figsize = (6.4, 4.8)
1414

15+
paramsets_no_calcium = ["A", "W2D"]
16+
1517

1618
def plots(a_n, info, cells, dt):
1719
c302.print_("Generating plots for: %s" % info)
@@ -267,7 +269,7 @@ def plot_c302_results(
267269
################################################
268270
## Plot activity/[Ca2+] in cells
269271

270-
if plot_ca and parameter_set != "A" and len(cells) > 0:
272+
if plot_ca and parameter_set not in paramsets_no_calcium and len(cells) > 0:
271273
c302.print_("Plotting neuron activities ([Ca2+])")
272274
variable = "activity"
273275
description = "Activity"
@@ -321,7 +323,7 @@ def plot_c302_results(
321323
################################################
322324
## Plot activity/[Ca2+] in muscles
323325

324-
if plot_ca and parameter_set != "A" and len(muscles) > 0:
326+
if plot_ca and parameter_set not in paramsets_no_calcium and len(muscles) > 0:
325327
c302.print_("Plotting muscle activities ([Ca2+])")
326328
variable = "activity"
327329
description = "Activity"

c302/cell_W2D.xml

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
<Lems>
2+
3+
<ComponentType name="cellW2D"
4+
extends="baseCellMembPot"
5+
description="Cell based on Worm2D model">
6+
7+
<Parameter name="bias" dimension="none" description="..."/>
8+
<Parameter name="gain" dimension="none" description="..."/>
9+
<Parameter name="tau" dimension="time"/>
10+
11+
<Constant name="COND_SCALE" dimension="conductance" value="1nS"/>
12+
<DerivedParameter name="C" dimension="capacitance" value="tau*COND_SCALE"/>
13+
14+
<!--
15+
Defined in baseCellMembPotCap:
16+
<Parameter name="C" dimension="capacitance"/>
17+
-->
18+
19+
<!-- Initial Conditions -->
20+
<Parameter name="state0" dimension="none"/>
21+
22+
<Attachments name="synapses" type="basePointCurrent"/>
23+
24+
<Constant name="MVOLT" dimension="voltage" value="1mV"/>
25+
<Constant name="PAMP" dimension="current" value="1pA"/>
26+
27+
<!-- <Exposure name="v" dimension="none"/> --> <!-- Already exposed from baseCellMembPotDL -->
28+
<Exposure name="spiking" dimension="none"/>
29+
<Exposure name="state" dimension="none"/>
30+
<Exposure name="output" dimension="none"/>
31+
32+
<Exposure name="iSyn" dimension="current" description="Total current due to synaptic inputs"/>
33+
<Exposure name="iMemb" dimension="current" description="Total current crossing the cell membrane"/>
34+
35+
<Dynamics>
36+
37+
<StateVariable name="v" dimension="voltage" exposure="v" description="Membrane potential state variable"/>
38+
<StateVariable name="spiking" dimension="none" exposure="spiking"/>
39+
<!--<StateVariable name="state" dimension="none" exposure="state"/>-->
40+
41+
<DerivedVariable name="iSyn" dimension="current" exposure="iSyn" select="synapses[*]/i" reduce="add" />
42+
<DerivedVariable name="state" dimension="none" exposure="state" value="v/MVOLT" />
43+
<DerivedVariable name="output" dimension="none" exposure="output" value="1/(1 + exp(-1 * gain * (state+bias)))" />
44+
45+
46+
<DerivedVariable name="iMemb" dimension="current" exposure="iMemb" value="((0-state)*PAMP + iSyn)"/>
47+
48+
<TimeDerivative variable="v" value="iMemb / C"/>
49+
50+
<OnStart>
51+
<StateAssignment variable="v" value="state0*MVOLT"/>
52+
</OnStart>
53+
54+
<OnCondition test="v .gt. 0 .and. spiking .lt. 0.5">
55+
<StateAssignment variable="spiking" value="1"/>
56+
<EventOut port="spike"/>
57+
</OnCondition>
58+
59+
<OnCondition test="v .lt. 0">
60+
<StateAssignment variable="spiking" value="0"/>
61+
</OnCondition>
62+
63+
64+
</Dynamics>
65+
66+
</ComponentType>
67+
68+
<cellW2D id="GenericNeuronCell" tau="1s" bias="1" gain="1" state0=".5"/>
69+
<cellW2D id="GenericMuscleCell" tau="1s" bias="1" gain="1" state0=".5"/>
70+
71+
<outputSynapse id="neuron_to_neuron_w2d"/>
72+
<outputSynapse id="neuron_to_muscle_w2d"/>
73+
74+
</Lems>
75+

c302/parameters_W2D.py

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
"""
2+
3+
Parameters W2D:
4+
Cells: Simple cell with just bias and gain from Worm2D
5+
Chem Synapses: Continuous transmission of output of one cell to next
6+
Gap junctions: Electrical connection; current linearly depends on difference in voltages
7+
8+
ASSESSMENT:
9+
Useful as tested in a number of 2D worm body models & very few parameters
10+
11+
"""
12+
13+
from neuroml import PulseGenerator
14+
15+
from neuroml import GapJunction
16+
17+
from c302.bioparameters import c302ModelPrototype
18+
19+
20+
class ParameterisedModel(c302ModelPrototype):
21+
def __init__(self):
22+
super(ParameterisedModel, self).__init__()
23+
self.level = "W2D"
24+
self.custom_component_types_definitions = [
25+
"cell_W2D.xml",
26+
"custom_synapses.xml",
27+
]
28+
29+
self.set_default_bioparameters()
30+
self.print_("Set default parameters for %s" % self.level)
31+
32+
def set_default_bioparameters(self):
33+
self.add_bioparameter("initial_memb_pot", "-45 mV", "BlindGuess", "0.1")
34+
35+
self.add_bioparameter(
36+
"neuron_to_neuron_elec_syn_gbase", "1 nS", "BlindGuess", "0.1"
37+
)
38+
self.add_bioparameter(
39+
"neuron_to_muscle_elec_syn_gbase", "1 nS", "BlindGuess", "0.1"
40+
)
41+
42+
self.add_bioparameter(
43+
"unphysiological_offset_current", "0 pA", "KnownError", "0"
44+
) # Can be activated later
45+
self.add_bioparameter(
46+
"unphysiological_offset_current_del", "0 ms", "KnownError", "0"
47+
)
48+
self.add_bioparameter(
49+
"unphysiological_offset_current_dur", "2000 ms", "KnownError", "0"
50+
)
51+
52+
def create_models(self):
53+
self.create_generic_muscle_cell()
54+
self.create_generic_neuron_cell()
55+
self.create_offsetcurrent()
56+
self.create_neuron_to_neuron_syn()
57+
self.create_neuron_to_muscle_syn()
58+
59+
def create_generic_muscle_cell(self):
60+
self.generic_muscle_cell = CellW2D(id="GenericMuscleCell")
61+
62+
def create_generic_neuron_cell(self):
63+
self.generic_neuron_cell = CellW2D(id="GenericNeuronCell")
64+
65+
def create_offsetcurrent(self):
66+
self.offset_current = PulseGenerator(
67+
id="offset_current",
68+
delay=self.get_bioparameter("unphysiological_offset_current_del").value,
69+
duration=self.get_bioparameter("unphysiological_offset_current_dur").value,
70+
amplitude=self.get_bioparameter("unphysiological_offset_current").value,
71+
)
72+
73+
def create_neuron_to_neuron_syn(self):
74+
self.neuron_to_neuron_exc_syn = OutputSynapse(id="neuron_to_neuron_w2d")
75+
76+
self.neuron_to_neuron_elec_syn = GapJunction(
77+
id="neuron_to_neuron_elec_syn",
78+
conductance=self.get_bioparameter("neuron_to_neuron_elec_syn_gbase").value,
79+
)
80+
81+
def create_neuron_to_muscle_syn(self):
82+
self.neuron_to_muscle_exc_syn = OutputSynapse(id="neuron_to_muscle_w2d")
83+
84+
self.neuron_to_muscle_elec_syn = GapJunction(
85+
id="neuron_to_muscle_elec_syn",
86+
conductance=self.get_bioparameter("neuron_to_muscle_elec_syn_gbase").value,
87+
)
88+
89+
def get_elec_syn(self, pre_cell, post_cell, type):
90+
if type == "neuron_to_neuron":
91+
gbase = self.get_bioparameter("neuron_to_neuron_elec_syn_gbase").value
92+
conn_id = "neuron_to_neuron_elec_syn"
93+
94+
elif type == "neuron_to_muscle":
95+
gbase = self.get_bioparameter("neuron_to_muscle_elec_syn_gbase").value
96+
conn_id = "neuron_to_muscle_elec_syn"
97+
98+
return GapJunction(id=conn_id, conductance=gbase)
99+
100+
def get_exc_syn(self, pre_cell, post_cell, type):
101+
return self.neuron_to_neuron_exc_syn
102+
103+
def get_inh_syn(self, pre_cell, post_cell, type):
104+
return self.neuron_to_neuron_exc_syn
105+
106+
107+
from c302.bioparameters import NonNeuroMLCustomType
108+
109+
110+
class CellW2D(NonNeuroMLCustomType):
111+
def __init__(self, id):
112+
self.id = id
113+
114+
115+
class OutputSynapse(NonNeuroMLCustomType):
116+
def __init__(self, id):
117+
self.id = id

c302/runAndPlot.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,9 @@ def run_c302(
265265
elif "-synsD1" in sys.argv:
266266
run_c302("Syns", "D1", "", 500, 0.05, "jNeuroML_NEURON")
267267

268+
elif "-synsW2D" in sys.argv:
269+
run_c302("Syns", "W2D", "", 500, 0.05, "jNeuroML_NEURON")
270+
268271
elif "-socialA" in sys.argv:
269272
run_c302("Social", "A", "", 2500, 0.05, "jNeuroML_NEURON")
270273

@@ -346,6 +349,9 @@ def run_c302(
346349
elif "-iD1" in sys.argv:
347350
run_c302("IClamp", "D1", "", 6000, 0.05, "jNeuroML_NEURON", save=True)
348351

352+
elif "-iw2d" in sys.argv:
353+
run_c302("IClamp", "W2D", "", 6000, 0.05, "jNeuroML", save=True)
354+
349355
elif "-all" in sys.argv:
350356
print("Generating all plots")
351357
html = "<table>\n"

0 commit comments

Comments
 (0)