From 976b5c67a9058ad81644e347880f1096e514ef50 Mon Sep 17 00:00:00 2001 From: "Ankur Sinha (Ankur Sinha Gmail)" Date: Fri, 26 Apr 2024 15:17:40 +0100 Subject: [PATCH 1/4] feat(pynml-modchananalysis): add labels and fix file name To ensure that the graphs from modchananalysis and pynml-chananalysis are identical. --- pyneuroml/analysis/NML2ChannelAnalysis.py | 6 +++--- pyneuroml/neuron/analysis/HHanalyse.py | 4 ++++ 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/pyneuroml/analysis/NML2ChannelAnalysis.py b/pyneuroml/analysis/NML2ChannelAnalysis.py index 7bb3c03c..9ae4efd8 100644 --- a/pyneuroml/analysis/NML2ChannelAnalysis.py +++ b/pyneuroml/analysis/NML2ChannelAnalysis.py @@ -447,7 +447,7 @@ def process_channel_file(channel_file: str, a) -> typing.List[typing.Any]: def get_channel_gates( - channel: typing.Union[neuroml.IonChannel, neuroml.IonChannelHH] + channel: typing.Union[neuroml.IonChannel, neuroml.IonChannelHH], ) -> typing.List[ typing.Union[ neuroml.GateHHUndetermined, @@ -476,7 +476,7 @@ def get_channel_gates( def get_conductance_expression( - channel: typing.Union[neuroml.IonChannel, neuroml.IonChannelHH] + channel: typing.Union[neuroml.IonChannel, neuroml.IonChannelHH], ) -> str: """Get expression of conductance in channel. @@ -549,7 +549,7 @@ def plot_channel(channel, a, results, iv_data=None, grid=True): def plot_kinetics(channel, a, results, grid=True): fig = plt.figure() plt.get_current_fig_manager().set_window_title( - ("Time Course(s) of activation variables of " "%s from %s at %s degC") + ("Time course(s) of activation variables of " "%s from %s at %s degC") % (channel.id, channel.file, a.temperature) ) diff --git a/pyneuroml/neuron/analysis/HHanalyse.py b/pyneuroml/neuron/analysis/HHanalyse.py index cc70313c..1c7b959b 100644 --- a/pyneuroml/neuron/analysis/HHanalyse.py +++ b/pyneuroml/neuron/analysis/HHanalyse.py @@ -482,6 +482,8 @@ def main(): "Steady state(s) of activation variables in %s at %s degC" % (chanToTest, h.celsius) ) + plRates.xlabel("Membrane potential (mV)") + plRates.ylabel("Steady state - inf") pylab.grid("on") figTau = pylab.figure() @@ -490,6 +492,8 @@ def main(): % (chanToTest, h.celsius) ) plTau = figTau.add_subplot(111, autoscale_on=True) + plTau.xlabel("Membrane potential (mV)") + plTau.ylabel("Time Course - tau (ms)") pylab.grid("on") for s in states: From dd0d0082a5e4c2521bf32dd8a56b9307154ebcb4 Mon Sep 17 00:00:00 2001 From: "Ankur Sinha (Ankur Sinha Gmail)" Date: Fri, 26 Apr 2024 15:39:17 +0100 Subject: [PATCH 2/4] fix(modchananalysis): correct axis label setting functions --- pyneuroml/neuron/analysis/HHanalyse.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pyneuroml/neuron/analysis/HHanalyse.py b/pyneuroml/neuron/analysis/HHanalyse.py index 1c7b959b..080af01a 100644 --- a/pyneuroml/neuron/analysis/HHanalyse.py +++ b/pyneuroml/neuron/analysis/HHanalyse.py @@ -482,8 +482,8 @@ def main(): "Steady state(s) of activation variables in %s at %s degC" % (chanToTest, h.celsius) ) - plRates.xlabel("Membrane potential (mV)") - plRates.ylabel("Steady state - inf") + plRates.set_xlabel("Membrane potential (mV)") + plRates.set_ylabel("Steady state - inf") pylab.grid("on") figTau = pylab.figure() @@ -492,8 +492,8 @@ def main(): % (chanToTest, h.celsius) ) plTau = figTau.add_subplot(111, autoscale_on=True) - plTau.xlabel("Membrane potential (mV)") - plTau.ylabel("Time Course - tau (ms)") + plTau.set_xlabel("Membrane potential (mV)") + plTau.set_ylabel("Time Course - tau (ms)") pylab.grid("on") for s in states: From 232611582a20bc280c677f80363e95e101b03773 Mon Sep 17 00:00:00 2001 From: "Ankur Sinha (Ankur Sinha Gmail)" Date: Mon, 13 May 2024 15:15:04 +0100 Subject: [PATCH 3/4] refactor(hhanalysis): add docstrings, minor clean up Use logging, ensure all non recognised gates get unique colours too. --- pyneuroml/neuron/analysis/HHanalyse.py | 300 ++++++++++++++----------- pyneuroml/utils/__init__.py | 37 +-- 2 files changed, 191 insertions(+), 146 deletions(-) diff --git a/pyneuroml/neuron/analysis/HHanalyse.py b/pyneuroml/neuron/analysis/HHanalyse.py index 080af01a..2e5acbc2 100644 --- a/pyneuroml/neuron/analysis/HHanalyse.py +++ b/pyneuroml/neuron/analysis/HHanalyse.py @@ -4,20 +4,35 @@ Implementation of the pynml-modchananalysis command """ -# TODO: clean up and refactor to allow usage from Python API - +import typing import argparse +import logging import re import subprocess import sys from math import log -import neuron + import matplotlib.pyplot as pylab +import neuron from pylab import * -from pyneuroml.analysis.NML2ChannelAnalysis import get_state_color +from pyneuroml.utils import get_state_color +from pyneuroml.utils.cli import build_namespace + +logger = logging.getLogger(__name__) +logger.setLevel(logging.INFO) -print("\n\n") +DEFAULTS = { + "v": False, + "nogui": False, + "minV": -100, + "maxV": 100, + "temperature": 6.3, + "duration": 10000, + "caConc": 5e-5, + "dt": 0.01, + "stepV": 10, +} def process_args(): @@ -40,7 +55,7 @@ def process_args(): parser.add_argument( "-nogui", action="store_true", - default=False, + default=DEFAULTS["nogui"], help="Supress plotting of variables and only save to file", ) @@ -55,7 +70,7 @@ def process_args(): "-minV", type=int, metavar="", - default=-100, + default=DEFAULTS["minV"], help="Minimum voltage to test (integer, mV)", ) @@ -63,7 +78,7 @@ def process_args(): "-maxV", type=int, metavar="", - default=100, + default=DEFAULTS["maxV"], help="Maximum voltage to test (integer, mV)", ) @@ -71,7 +86,7 @@ def process_args(): "-stepV", type=int, metavar="", - default=10, + default=DEFAULTS["stepV"], help="Voltage step to use (integer, mV)", ) @@ -79,7 +94,7 @@ def process_args(): "-dt", type=float, metavar="