OSBModelValidation 0.2.18__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- OSBModelValidation-0.2.18.dist-info/METADATA +184 -0
- OSBModelValidation-0.2.18.dist-info/RECORD +98 -0
- OSBModelValidation-0.2.18.dist-info/WHEEL +5 -0
- OSBModelValidation-0.2.18.dist-info/entry_points.txt +2 -0
- OSBModelValidation-0.2.18.dist-info/top_level.txt +1 -0
- omv/__init__.py +8 -0
- omv/analyzers/__init__.py +21 -0
- omv/analyzers/activation.py +24 -0
- omv/analyzers/analyzer.py +80 -0
- omv/analyzers/dryrun.py +13 -0
- omv/analyzers/input_resistance.py +47 -0
- omv/analyzers/morphology.py +16 -0
- omv/analyzers/rates.py +97 -0
- omv/analyzers/resting.py +37 -0
- omv/analyzers/spikes.py +113 -0
- omv/analyzers/temperature.py +12 -0
- omv/analyzers/timeseries.py +57 -0
- omv/analyzers/utils/__init__.py +0 -0
- omv/analyzers/utils/filenode.py +73 -0
- omv/analyzers/utils/timeseries.py +293 -0
- omv/autogen.py +106 -0
- omv/common/__init__.py +0 -0
- omv/common/inout.py +154 -0
- omv/engines/__init__.py +53 -0
- omv/engines/arbor_.py +57 -0
- omv/engines/brian1.py +59 -0
- omv/engines/brian2_.py +57 -0
- omv/engines/eden_.py +63 -0
- omv/engines/engine.py +111 -0
- omv/engines/genesis.py +86 -0
- omv/engines/getarbor.py +15 -0
- omv/engines/getbrian1.py +42 -0
- omv/engines/getbrian2.py +17 -0
- omv/engines/geteden.py +17 -0
- omv/engines/getgenesis.py +56 -0
- omv/engines/getjlems.py +20 -0
- omv/engines/getjnml.py +48 -0
- omv/engines/getlibsbml.py +13 -0
- omv/engines/getmoose.py +15 -0
- omv/engines/getnest.py +62 -0
- omv/engines/getnetpyne.py +52 -0
- omv/engines/getneuroconstruct.py +31 -0
- omv/engines/getnml2.py +26 -0
- omv/engines/getnrn.py +60 -0
- omv/engines/getoctave.py +11 -0
- omv/engines/getpylems.py +13 -0
- omv/engines/getpyneuroml.py +14 -0
- omv/engines/getpynn.py +40 -0
- omv/engines/jlems.py +48 -0
- omv/engines/jneuroml.py +101 -0
- omv/engines/jneuromlbrian.py +65 -0
- omv/engines/jneuromlbrian2.py +61 -0
- omv/engines/jneuromleden.py +61 -0
- omv/engines/jneuromlmoose.py +63 -0
- omv/engines/jneuromlnetpyne.py +73 -0
- omv/engines/jneuromlnetpyne_np2.py +45 -0
- omv/engines/jneuromlnetpyne_np4.py +45 -0
- omv/engines/jneuromlnrn.py +78 -0
- omv/engines/jneuromlpynnnrn.py +75 -0
- omv/engines/jneuromlvalidate.py +62 -0
- omv/engines/jneuromlvalidatev1.py +58 -0
- omv/engines/moose_.py +86 -0
- omv/engines/nestsli.py +84 -0
- omv/engines/netpyne_.py +120 -0
- omv/engines/netpyne__np2.py +47 -0
- omv/engines/netpyne__np4.py +47 -0
- omv/engines/neuron_.py +205 -0
- omv/engines/octave.py +51 -0
- omv/engines/pylems.py +57 -0
- omv/engines/pylemsnml2.py +59 -0
- omv/engines/pynest.py +111 -0
- omv/engines/pyneuroconstruct.py +67 -0
- omv/engines/pyneuroml_.py +55 -0
- omv/engines/pyneuromlvalidatesbml.py +83 -0
- omv/engines/pyneuron.py +94 -0
- omv/engines/pynn.py +63 -0
- omv/engines/pynnbrian1.py +59 -0
- omv/engines/pynnbrian2.py +60 -0
- omv/engines/pynnnest.py +56 -0
- omv/engines/pynnneuroml.py +57 -0
- omv/engines/pynnneuron.py +94 -0
- omv/engines/utils/__init__.py +21 -0
- omv/engines/utils/genesis_utils.g +26 -0
- omv/engines/utils/wdir.py +15 -0
- omv/experiment.py +18 -0
- omv/find_tests.py +126 -0
- omv/omt_mep_parser.py +59 -0
- omv/omv_util.py +439 -0
- omv/parse_omt.py +118 -0
- omv/tally.py +112 -0
- omv/test/__init__.py +0 -0
- omv/test/test_rates.py +38 -0
- omv/test/test_types.py +29 -0
- omv/validation/__init__.py +0 -0
- omv/validation/rx_validator.py +35 -0
- omv/validation/utils.py +51 -0
- omv/validation/validate.py +53 -0
- omv/validation/validate_mep.py +15 -0
omv/engines/pyneuron.py
ADDED
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import subprocess as sp
|
|
2
|
+
from textwrap import dedent
|
|
3
|
+
from omv.engines.utils.wdir import working_dir
|
|
4
|
+
from os.path import dirname
|
|
5
|
+
import sys
|
|
6
|
+
|
|
7
|
+
from omv.engines.neuron_ import NeuronEngine
|
|
8
|
+
|
|
9
|
+
from omv.common.inout import inform, is_verbose, check_output
|
|
10
|
+
from omv.engines.engine import EngineExecutionError
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class PyNRNEngine(NeuronEngine):
|
|
14
|
+
name = "PyNEURON"
|
|
15
|
+
|
|
16
|
+
@staticmethod
|
|
17
|
+
def is_installed():
|
|
18
|
+
ret = True
|
|
19
|
+
try:
|
|
20
|
+
inform(
|
|
21
|
+
"Checking whether %s is installed..." % PyNRNEngine.name,
|
|
22
|
+
indent=1,
|
|
23
|
+
verbosity=2,
|
|
24
|
+
)
|
|
25
|
+
|
|
26
|
+
### Prints to stderr!!
|
|
27
|
+
# ret_str = check_output(['python -c "import neuron; print(neuron.h.nrnversion())"'], shell=True, verbosity=2)
|
|
28
|
+
import neuron
|
|
29
|
+
|
|
30
|
+
ret_str = neuron.h.nrnversion()
|
|
31
|
+
|
|
32
|
+
ret = "v%s" % ret_str.split()[3]
|
|
33
|
+
if is_verbose():
|
|
34
|
+
inform("PyNEURON version %s is correctly installed..." % ret, indent=2)
|
|
35
|
+
|
|
36
|
+
except Exception as err:
|
|
37
|
+
if is_verbose():
|
|
38
|
+
inform("Couldn't import NEURON into Python: ", err, indent=1)
|
|
39
|
+
ret = False
|
|
40
|
+
return ret
|
|
41
|
+
|
|
42
|
+
@staticmethod
|
|
43
|
+
def install(version):
|
|
44
|
+
if not NeuronEngine.is_installed():
|
|
45
|
+
NeuronEngine.install(version) # interpret version as version of NEURON!
|
|
46
|
+
inform("%s installed NEURON..." % PyNRNEngine.name, indent=2, verbosity=1)
|
|
47
|
+
|
|
48
|
+
environment_vars_nrn, path_nrn = NeuronEngine.get_nrn_environment()
|
|
49
|
+
|
|
50
|
+
PyNRNEngine.path = path_nrn
|
|
51
|
+
PyNRNEngine.environment_vars = {}
|
|
52
|
+
PyNRNEngine.environment_vars.update(environment_vars_nrn)
|
|
53
|
+
|
|
54
|
+
inform("PATH: " + PyNRNEngine.path, indent=2, verbosity=1)
|
|
55
|
+
inform("Env vars: %s" % PyNRNEngine.environment_vars, indent=2, verbosity=1)
|
|
56
|
+
|
|
57
|
+
def run(self):
|
|
58
|
+
try:
|
|
59
|
+
self.stdout = NeuronEngine.compile_modfiles(self.modelpath)
|
|
60
|
+
except sp.CalledProcessError as err:
|
|
61
|
+
self.stderr = err.output
|
|
62
|
+
self.returncode = err.returncode
|
|
63
|
+
inform("Error compiling modfiles:", self.stderr, indent=2)
|
|
64
|
+
|
|
65
|
+
with working_dir(dirname(self.modelpath)):
|
|
66
|
+
inform("Running %s on %s..." % (self.name, self.modelpath), indent=1)
|
|
67
|
+
p = sp.Popen(
|
|
68
|
+
["nrniv", "-python", self.modelpath, "-nogui"],
|
|
69
|
+
stdin=sp.PIPE,
|
|
70
|
+
stdout=sp.PIPE,
|
|
71
|
+
stderr=sp.PIPE,
|
|
72
|
+
)
|
|
73
|
+
cmd = """\
|
|
74
|
+
%s
|
|
75
|
+
""" % (
|
|
76
|
+
"\n".join(self.extra_pars)
|
|
77
|
+
)
|
|
78
|
+
if sys.version_info[0] == 3:
|
|
79
|
+
c = dedent(cmd).encode()
|
|
80
|
+
else:
|
|
81
|
+
c = dedent(cmd)
|
|
82
|
+
stdout, stderr = p.communicate(c)
|
|
83
|
+
# with open('/tmp/omv_test.nrn.stdout', 'w') as f:
|
|
84
|
+
# f.write(stdout)
|
|
85
|
+
self.stdout = str(stdout.decode())
|
|
86
|
+
self.stderr = str(stderr.decode())
|
|
87
|
+
|
|
88
|
+
inform("OUT: %s" % self.stdout, verbosity=1, indent=2)
|
|
89
|
+
inform("ERR: %s" % self.stderr, verbosity=1, indent=2)
|
|
90
|
+
inform("returncode: [%s]" % p.returncode, verbosity=1, indent=2)
|
|
91
|
+
|
|
92
|
+
self.returncode = p.returncode
|
|
93
|
+
if self.returncode != 0:
|
|
94
|
+
raise EngineExecutionError
|
omv/engines/pynn.py
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.common.inout import inform, trim_path, check_output, is_verbose
|
|
5
|
+
from omv.engines.engine import OMVEngine, EngineExecutionError
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PyNNEngine(OMVEngine):
|
|
9
|
+
name = "PyNN"
|
|
10
|
+
|
|
11
|
+
@staticmethod
|
|
12
|
+
def is_installed():
|
|
13
|
+
ret = True
|
|
14
|
+
|
|
15
|
+
inform(
|
|
16
|
+
"Checking whether %s is already installed..." % (PyNNEngine.name),
|
|
17
|
+
indent=1,
|
|
18
|
+
verbosity=1,
|
|
19
|
+
)
|
|
20
|
+
try:
|
|
21
|
+
# ret_str = sp.check_output(['python -c "import pyNN; print(pyNN.__version__)"'], shell=True,stderr=sp.STDOUT)
|
|
22
|
+
import pyNN
|
|
23
|
+
|
|
24
|
+
inform(
|
|
25
|
+
"pyNN version %s is correctly installed..." % pyNN.__version__,
|
|
26
|
+
indent=2,
|
|
27
|
+
verbosity=2,
|
|
28
|
+
)
|
|
29
|
+
|
|
30
|
+
ret = "v%s" % pyNN.__version__
|
|
31
|
+
|
|
32
|
+
except Exception as err:
|
|
33
|
+
inform("Couldn't import pyNN into Python: ", err, indent=1, verbosity=1)
|
|
34
|
+
ret = False
|
|
35
|
+
return ret
|
|
36
|
+
|
|
37
|
+
@staticmethod
|
|
38
|
+
def install(version=None):
|
|
39
|
+
from omv.engines.getpynn import install_pynn
|
|
40
|
+
|
|
41
|
+
home = os.environ["HOME"]
|
|
42
|
+
inform("Will fetch and install pyNN (version info: %s)" % version, indent=2)
|
|
43
|
+
install_pynn(version)
|
|
44
|
+
inform("Done, PyNN is correctly installed...", indent=2)
|
|
45
|
+
|
|
46
|
+
def run(self):
|
|
47
|
+
try:
|
|
48
|
+
inform(
|
|
49
|
+
"Running file %s with %s" % (trim_path(self.modelpath), self.name),
|
|
50
|
+
indent=1,
|
|
51
|
+
)
|
|
52
|
+
self.stdout = check_output(
|
|
53
|
+
["python", self.modelpath], cwd=os.path.dirname(self.modelpath)
|
|
54
|
+
)
|
|
55
|
+
self.returncode = 0
|
|
56
|
+
except sp.CalledProcessError as err:
|
|
57
|
+
self.returncode = err.returncode
|
|
58
|
+
self.stdout = err.output
|
|
59
|
+
raise EngineExecutionError
|
|
60
|
+
except Exception as err:
|
|
61
|
+
inform("Another error with running %s: " % self.name, err, indent=1)
|
|
62
|
+
self.returncode = -1
|
|
63
|
+
self.stdout = "???"
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.engines.brian1 import Brian1Engine
|
|
5
|
+
from omv.engines.pynn import PyNNEngine
|
|
6
|
+
|
|
7
|
+
from omv.common.inout import inform, trim_path, check_output, is_verbose
|
|
8
|
+
from omv.engines.engine import EngineExecutionError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PyNNBrian1Engine(PyNNEngine):
|
|
12
|
+
name = "PyNN_Brian1"
|
|
13
|
+
python3_compatible = Brian1Engine.python3_compatible
|
|
14
|
+
|
|
15
|
+
@staticmethod
|
|
16
|
+
def is_installed():
|
|
17
|
+
if is_verbose():
|
|
18
|
+
inform(
|
|
19
|
+
"Checking whether %s is installed..." % PyNNBrian1Engine.name, indent=1
|
|
20
|
+
)
|
|
21
|
+
return PyNNEngine.is_installed() and Brian1Engine.is_installed()
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def install(version):
|
|
25
|
+
if not Brian1Engine.is_installed():
|
|
26
|
+
Brian1Engine.install(version) # interpret version as version of Brian!
|
|
27
|
+
inform(
|
|
28
|
+
"%s installed Brian..." % PyNNBrian1Engine.name, indent=2, verbosity=1
|
|
29
|
+
)
|
|
30
|
+
if not PyNNEngine.is_installed():
|
|
31
|
+
PyNNEngine.install(None)
|
|
32
|
+
inform(
|
|
33
|
+
"%s installed PyNN..." % PyNNBrian1Engine.name, indent=2, verbosity=1
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
PyNNBrian1Engine.path = PyNNEngine.path + ":" + Brian1Engine.path
|
|
37
|
+
PyNNBrian1Engine.environment_vars = {}
|
|
38
|
+
PyNNBrian1Engine.environment_vars.update(PyNNEngine.environment_vars)
|
|
39
|
+
PyNNBrian1Engine.environment_vars.update(Brian1Engine.environment_vars)
|
|
40
|
+
inform("PATH: " + PyNNBrian1Engine.path)
|
|
41
|
+
|
|
42
|
+
def run(self):
|
|
43
|
+
try:
|
|
44
|
+
inform(
|
|
45
|
+
"Running file %s with %s" % (trim_path(self.modelpath), self.name),
|
|
46
|
+
indent=1,
|
|
47
|
+
)
|
|
48
|
+
self.stdout = check_output(
|
|
49
|
+
["python", self.modelpath, "brian"], cwd=os.path.dirname(self.modelpath)
|
|
50
|
+
)
|
|
51
|
+
self.returncode = 0
|
|
52
|
+
except sp.CalledProcessError as err:
|
|
53
|
+
self.returncode = err.returncode
|
|
54
|
+
self.stdout = err.output
|
|
55
|
+
raise EngineExecutionError
|
|
56
|
+
except Exception as err:
|
|
57
|
+
inform("Another error with running %s: " % self.name, err, indent=1)
|
|
58
|
+
self.returncode = -1
|
|
59
|
+
self.stdout = "???"
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.engines.brian2_ import Brian2Engine
|
|
5
|
+
from omv.engines.pynn import PyNNEngine
|
|
6
|
+
|
|
7
|
+
from omv.common.inout import inform, trim_path, check_output, is_verbose
|
|
8
|
+
from omv.engines.engine import EngineExecutionError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PyNNBrian2Engine(PyNNEngine):
|
|
12
|
+
name = "PyNN_Brian2"
|
|
13
|
+
python3_compatible = Brian2Engine.python3_compatible
|
|
14
|
+
|
|
15
|
+
@staticmethod
|
|
16
|
+
def is_installed():
|
|
17
|
+
if is_verbose():
|
|
18
|
+
inform(
|
|
19
|
+
"Checking whether %s is installed..." % PyNNBrian2Engine.name, indent=1
|
|
20
|
+
)
|
|
21
|
+
return PyNNEngine.is_installed() and Brian2Engine.is_installed()
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def install(version):
|
|
25
|
+
if not Brian2Engine.is_installed():
|
|
26
|
+
Brian2Engine.install(version) # interpret version as version of Brian!
|
|
27
|
+
inform(
|
|
28
|
+
"%s installed Brian..." % PyNNBrian2Engine.name, indent=2, verbosity=1
|
|
29
|
+
)
|
|
30
|
+
if not PyNNEngine.is_installed():
|
|
31
|
+
PyNNEngine.install(None)
|
|
32
|
+
inform(
|
|
33
|
+
"%s installed PyNN..." % PyNNBrian2Engine.name, indent=2, verbosity=1
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
PyNNBrian2Engine.path = PyNNEngine.path + ":" + Brian2Engine.path
|
|
37
|
+
PyNNBrian2Engine.environment_vars = {}
|
|
38
|
+
PyNNBrian2Engine.environment_vars.update(PyNNEngine.environment_vars)
|
|
39
|
+
PyNNBrian2Engine.environment_vars.update(Brian2Engine.environment_vars)
|
|
40
|
+
inform("PATH: " + PyNNBrian2Engine.path)
|
|
41
|
+
|
|
42
|
+
def run(self):
|
|
43
|
+
try:
|
|
44
|
+
inform(
|
|
45
|
+
"Running file %s with %s" % (trim_path(self.modelpath), self.name),
|
|
46
|
+
indent=1,
|
|
47
|
+
)
|
|
48
|
+
self.stdout = check_output(
|
|
49
|
+
["python", self.modelpath, "brian2"],
|
|
50
|
+
cwd=os.path.dirname(self.modelpath),
|
|
51
|
+
)
|
|
52
|
+
self.returncode = 0
|
|
53
|
+
except sp.CalledProcessError as err:
|
|
54
|
+
self.returncode = err.returncode
|
|
55
|
+
self.stdout = err.output
|
|
56
|
+
raise EngineExecutionError
|
|
57
|
+
except Exception as err:
|
|
58
|
+
inform("Another error with running %s: " % self.name, err, indent=1)
|
|
59
|
+
self.returncode = -1
|
|
60
|
+
self.stdout = "???"
|
omv/engines/pynnnest.py
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.engines.nestsli import NestEngine
|
|
5
|
+
from omv.engines.pynest import PyNestEngine
|
|
6
|
+
from omv.engines.pynn import PyNNEngine
|
|
7
|
+
|
|
8
|
+
from omv.common.inout import inform, trim_path, check_output, is_verbose
|
|
9
|
+
from omv.engines.engine import EngineExecutionError
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class PyNNNestEngine(PyNNEngine):
|
|
13
|
+
name = "PyNN_Nest"
|
|
14
|
+
|
|
15
|
+
@staticmethod
|
|
16
|
+
def is_installed():
|
|
17
|
+
if is_verbose():
|
|
18
|
+
inform(
|
|
19
|
+
"Checking whether %s is installed..." % PyNNNestEngine.name, indent=1
|
|
20
|
+
)
|
|
21
|
+
return PyNNEngine.is_installed() and PyNestEngine.is_installed()
|
|
22
|
+
|
|
23
|
+
@staticmethod
|
|
24
|
+
def install(version):
|
|
25
|
+
if not PyNestEngine.is_installed():
|
|
26
|
+
PyNestEngine.install(version) # interpret version as version of NEST!
|
|
27
|
+
inform(
|
|
28
|
+
"%s installed PyNest..." % PyNNNestEngine.name, indent=2, verbosity=1
|
|
29
|
+
)
|
|
30
|
+
if not PyNNEngine.is_installed():
|
|
31
|
+
PyNNEngine.install(None)
|
|
32
|
+
inform("%s installed PyNN..." % PyNNNestEngine.name, indent=2, verbosity=1)
|
|
33
|
+
|
|
34
|
+
def run(self):
|
|
35
|
+
try:
|
|
36
|
+
self.environment_vars = NestEngine.get_nest_environment()
|
|
37
|
+
self.set_environment()
|
|
38
|
+
|
|
39
|
+
inform("Env vars: %s" % self.environment_vars, indent=2)
|
|
40
|
+
|
|
41
|
+
inform(
|
|
42
|
+
"Running a file %s with %s" % (trim_path(self.modelpath), self.name),
|
|
43
|
+
indent=1,
|
|
44
|
+
)
|
|
45
|
+
self.stdout = check_output(
|
|
46
|
+
["python", self.modelpath, "nest"], cwd=os.path.dirname(self.modelpath)
|
|
47
|
+
)
|
|
48
|
+
self.returncode = 0
|
|
49
|
+
except sp.CalledProcessError as err:
|
|
50
|
+
self.returncode = err.returncode
|
|
51
|
+
self.stdout = err.output
|
|
52
|
+
raise EngineExecutionError
|
|
53
|
+
except Exception as err:
|
|
54
|
+
inform("Another error with running %s: " % self.name, err, indent=1)
|
|
55
|
+
self.returncode = -1
|
|
56
|
+
self.stdout = "???"
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.engines.pyneuroml_ import PyNeuroMLEngine
|
|
5
|
+
from omv.engines.pynn import PyNNEngine
|
|
6
|
+
|
|
7
|
+
from omv.common.inout import inform, trim_path, check_output, is_verbose
|
|
8
|
+
from omv.engines.engine import EngineExecutionError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PyNNNeuroMLEngine(PyNNEngine):
|
|
12
|
+
name = "PyNN_NeuroML"
|
|
13
|
+
|
|
14
|
+
@staticmethod
|
|
15
|
+
def is_installed():
|
|
16
|
+
if is_verbose():
|
|
17
|
+
inform(
|
|
18
|
+
"Checking whether %s is installed..." % PyNNNeuroMLEngine.name, indent=1
|
|
19
|
+
)
|
|
20
|
+
return PyNNEngine.is_installed() and PyNeuroMLEngine.is_installed()
|
|
21
|
+
|
|
22
|
+
@staticmethod
|
|
23
|
+
def install(version):
|
|
24
|
+
if not PyNeuroMLEngine.is_installed():
|
|
25
|
+
PyNeuroMLEngine.install(None)
|
|
26
|
+
inform(
|
|
27
|
+
"%s installed PyNeuroML..." % PyNNNeuroMLEngine.name,
|
|
28
|
+
indent=2,
|
|
29
|
+
verbosity=1,
|
|
30
|
+
)
|
|
31
|
+
if not PyNNEngine.is_installed():
|
|
32
|
+
PyNNEngine.install(None)
|
|
33
|
+
inform(
|
|
34
|
+
"%s installed PyNN..." % PyNNNeuroMLEngine.name, indent=2, verbosity=1
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
def run(self):
|
|
38
|
+
try:
|
|
39
|
+
inform("Env vars: %s" % self.environment_vars, indent=2)
|
|
40
|
+
|
|
41
|
+
inform(
|
|
42
|
+
"Running file %s with %s" % (trim_path(self.modelpath), self.name),
|
|
43
|
+
indent=1,
|
|
44
|
+
)
|
|
45
|
+
self.stdout = check_output(
|
|
46
|
+
["python", self.modelpath, "neuroml"],
|
|
47
|
+
cwd=os.path.dirname(self.modelpath),
|
|
48
|
+
)
|
|
49
|
+
self.returncode = 0
|
|
50
|
+
except sp.CalledProcessError as err:
|
|
51
|
+
self.returncode = err.returncode
|
|
52
|
+
self.stdout = err.output
|
|
53
|
+
raise EngineExecutionError
|
|
54
|
+
except Exception as err:
|
|
55
|
+
inform("Another error with running %s: " % self.name, err, indent=1)
|
|
56
|
+
self.returncode = -1
|
|
57
|
+
self.stdout = "???"
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.engines.neuron_ import NeuronEngine
|
|
5
|
+
from omv.engines.pynn import PyNNEngine
|
|
6
|
+
|
|
7
|
+
from omv.common.inout import inform, trim_path, check_output, is_verbose
|
|
8
|
+
from omv.engines.engine import EngineExecutionError
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class PyNNNRNEngine(PyNNEngine):
|
|
12
|
+
name = "PyNN_NEURON"
|
|
13
|
+
|
|
14
|
+
@staticmethod
|
|
15
|
+
def is_installed():
|
|
16
|
+
if is_verbose():
|
|
17
|
+
inform(
|
|
18
|
+
"Checking whether %s is installed correctly..." % PyNNNRNEngine.name,
|
|
19
|
+
indent=1,
|
|
20
|
+
)
|
|
21
|
+
installed = PyNNEngine.is_installed() and NeuronEngine.is_installed()
|
|
22
|
+
|
|
23
|
+
return installed
|
|
24
|
+
|
|
25
|
+
@staticmethod
|
|
26
|
+
def install(version=None):
|
|
27
|
+
if not NeuronEngine.is_installed():
|
|
28
|
+
NeuronEngine.install(None)
|
|
29
|
+
inform("%s installed NEURON..." % PyNNNRNEngine.name, indent=2, verbosity=1)
|
|
30
|
+
if not PyNNEngine.is_installed():
|
|
31
|
+
PyNNEngine.install(None)
|
|
32
|
+
inform("%s installed PyNN..." % PyNNNRNEngine.name, indent=2, verbosity=1)
|
|
33
|
+
|
|
34
|
+
import pyNN
|
|
35
|
+
|
|
36
|
+
PyNNNRNEngine.path = PyNNEngine.path + ":" + NeuronEngine.path
|
|
37
|
+
PyNNNRNEngine.environment_vars = {}
|
|
38
|
+
PyNNNRNEngine.environment_vars.update(PyNNEngine.environment_vars)
|
|
39
|
+
PyNNNRNEngine.environment_vars.update(NeuronEngine.environment_vars)
|
|
40
|
+
inform("PATH: " + PyNNNRNEngine.path, indent=2, verbosity=1)
|
|
41
|
+
inform("Env vars: %s" % PyNNNRNEngine.environment_vars, indent=2, verbosity=1)
|
|
42
|
+
|
|
43
|
+
# pynn_loc = sp.check_output(['python -c "import pyNN,os; print(os.path.dirname(pyNN.__file__))"'], shell=True,stderr=sp.STDOUT).strip()
|
|
44
|
+
pynn_loc = pyNN.__file__[:-12] # remove /__init__.py
|
|
45
|
+
pynn_mod_dir = "%s/neuron/nmodl/" % pynn_loc
|
|
46
|
+
|
|
47
|
+
inform(
|
|
48
|
+
"Attempting to compile PyNN mod files for standard models in %s..."
|
|
49
|
+
% pynn_mod_dir,
|
|
50
|
+
indent=2,
|
|
51
|
+
verbosity=1,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
print(check_output(["ls", pynn_mod_dir], cwd=pynn_mod_dir))
|
|
55
|
+
|
|
56
|
+
environment_vars, path = NeuronEngine.get_nrn_environment()
|
|
57
|
+
inform(
|
|
58
|
+
"Using NEURON with env %s at %s..." % (environment_vars, path),
|
|
59
|
+
indent=2,
|
|
60
|
+
verbosity=1,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
print(
|
|
64
|
+
check_output(
|
|
65
|
+
[environment_vars["NEURON_HOME"] + "/bin/nrnivmodl"], cwd=pynn_mod_dir
|
|
66
|
+
)
|
|
67
|
+
)
|
|
68
|
+
|
|
69
|
+
def run(self):
|
|
70
|
+
try:
|
|
71
|
+
self.stdout = NeuronEngine.compile_modfiles(self.modelpath)
|
|
72
|
+
except sp.CalledProcessError as err:
|
|
73
|
+
self.stderr = err.output
|
|
74
|
+
self.returncode = err.returncode
|
|
75
|
+
inform("Error compiling modfiles:", self.stderr, indent=2)
|
|
76
|
+
|
|
77
|
+
try:
|
|
78
|
+
inform(
|
|
79
|
+
"Running file %s with %s" % (trim_path(self.modelpath), self.name),
|
|
80
|
+
indent=1,
|
|
81
|
+
)
|
|
82
|
+
self.stdout = check_output(
|
|
83
|
+
["python", self.modelpath, "neuron"],
|
|
84
|
+
cwd=os.path.dirname(self.modelpath),
|
|
85
|
+
)
|
|
86
|
+
self.returncode = 0
|
|
87
|
+
except sp.CalledProcessError as err:
|
|
88
|
+
self.returncode = err.returncode
|
|
89
|
+
self.stdout = err.output
|
|
90
|
+
raise EngineExecutionError
|
|
91
|
+
except Exception as err:
|
|
92
|
+
inform("Another error with running %s: " % self.name, err, indent=1)
|
|
93
|
+
self.returncode = -1
|
|
94
|
+
self.stdout = "???"
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
from omv.engines.engine import PATH_DELIMITER
|
|
2
|
+
|
|
3
|
+
def resolve_paths(path_s):
|
|
4
|
+
'''
|
|
5
|
+
Make explicit list from: '*.nml myfile.xml' etc.
|
|
6
|
+
'''
|
|
7
|
+
|
|
8
|
+
if "*" in path_s:
|
|
9
|
+
import glob
|
|
10
|
+
|
|
11
|
+
if PATH_DELIMITER in path_s:
|
|
12
|
+
all = []
|
|
13
|
+
for p in path_s.split(PATH_DELIMITER):
|
|
14
|
+
for g in glob.glob(p):
|
|
15
|
+
all.append(g)
|
|
16
|
+
path_s = all
|
|
17
|
+
else:
|
|
18
|
+
path_s = glob.glob(path_s)
|
|
19
|
+
|
|
20
|
+
return path_s
|
|
21
|
+
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
function total_membrane_area(cell)
|
|
2
|
+
|
|
3
|
+
float totalarea = 0
|
|
4
|
+
float totallength = 0
|
|
5
|
+
|
|
6
|
+
str name
|
|
7
|
+
float area
|
|
8
|
+
float PI = 3.14159265359
|
|
9
|
+
|
|
10
|
+
foreach name ({el {cell}/##[][TYPE=compartment],{cell}/##[][TYPE=symcompartment]})
|
|
11
|
+
|
|
12
|
+
float length = {getfield {name} len}
|
|
13
|
+
|
|
14
|
+
if (length == 0)
|
|
15
|
+
area = {PI}*{getfield {name} dia}*{getfield {name} dia}
|
|
16
|
+
else
|
|
17
|
+
area = {PI}*{getfield {name} dia}*{getfield {name} len}
|
|
18
|
+
totallength = totallength + length
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
totalarea = totalarea + area
|
|
22
|
+
//echo "Compartment: " {name} ", area: " {area} ", length: " {length}", diam: " {getfield {name} dia}
|
|
23
|
+
|
|
24
|
+
end
|
|
25
|
+
return {totalarea}
|
|
26
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import os
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class working_dir(object):
|
|
5
|
+
"""Context manager for changing the current working directory"""
|
|
6
|
+
|
|
7
|
+
def __init__(self, newPath):
|
|
8
|
+
self.newPath = newPath
|
|
9
|
+
|
|
10
|
+
def __enter__(self):
|
|
11
|
+
self.savedPath = os.getcwd()
|
|
12
|
+
os.chdir(self.newPath)
|
|
13
|
+
|
|
14
|
+
def __exit__(self, etype, value, traceback):
|
|
15
|
+
os.chdir(self.savedPath)
|
omv/experiment.py
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
from omv.analyzers import OMVAnalyzers
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class OMVExperiment(object):
|
|
5
|
+
def __init__(self, name, experiment, observables, engine, omt_root, mep_root):
|
|
6
|
+
self.name = name
|
|
7
|
+
self.checks = {}
|
|
8
|
+
self.results = None
|
|
9
|
+
|
|
10
|
+
for obsname, observable in observables.items():
|
|
11
|
+
# an experiment can have multiple observables
|
|
12
|
+
expected = experiment["expected"].get(obsname)
|
|
13
|
+
self.checks[obsname] = OMVAnalyzers[obsname](
|
|
14
|
+
observable, expected, engine, omt_root, mep_root
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
def check_all(self):
|
|
18
|
+
return {n: c() for n, c in self.checks.items()}
|