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/common/inout.py
ADDED
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import yaml
|
|
2
|
+
from collections import deque
|
|
3
|
+
import os
|
|
4
|
+
import sys
|
|
5
|
+
|
|
6
|
+
# import textwrap
|
|
7
|
+
import subprocess as sp
|
|
8
|
+
|
|
9
|
+
LINEWIDTH = 70
|
|
10
|
+
__PROMPT__ = "[omv] "
|
|
11
|
+
__INDENT__ = " "
|
|
12
|
+
__VERBOSITY__ = 0
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
def set_verbosity(v):
|
|
16
|
+
global __VERBOSITY__
|
|
17
|
+
__VERBOSITY__ = v
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
def omvify(x):
|
|
21
|
+
# return textwrap.TextWrapper(initial_indent=__PROMPT__,
|
|
22
|
+
# subsequent_indent=len(__PROMPT__) * ' ',
|
|
23
|
+
# replace_whitespace=False).fill(x)
|
|
24
|
+
return __PROMPT__ + x
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def check(b):
|
|
28
|
+
if sys.version_info >= (3, 0):
|
|
29
|
+
tick = "\u2714" if b else "\u2718"
|
|
30
|
+
else:
|
|
31
|
+
tick = "\u2714" if b else "\u2718"
|
|
32
|
+
return tick
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def centralize(string):
|
|
36
|
+
fmt = "{{:^{}}}".format(LINEWIDTH)
|
|
37
|
+
return fmt.format(string)
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
def rule(string, char="-"):
|
|
41
|
+
return len(string.lstrip()) * char
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
def is_verbose(level=1):
|
|
45
|
+
return __VERBOSITY__ >= level
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def inform(
|
|
49
|
+
msg, pars=None, indent=0, underline=False, overline=False, center=False, verbosity=0
|
|
50
|
+
):
|
|
51
|
+
if verbosity > __VERBOSITY__:
|
|
52
|
+
return
|
|
53
|
+
|
|
54
|
+
if isinstance(msg, list):
|
|
55
|
+
block = deque(msg)
|
|
56
|
+
infostr = max(msg, key=len)
|
|
57
|
+
else:
|
|
58
|
+
p = pars if pars else ""
|
|
59
|
+
# print("msg is %s"%msg.__class__)
|
|
60
|
+
msgstr = (
|
|
61
|
+
msg.encode("utf-8")
|
|
62
|
+
if sys.version_info[0] == 2 and isinstance(msg, unicode)
|
|
63
|
+
else str(msg)
|
|
64
|
+
)
|
|
65
|
+
infostr = msgstr + str(p)
|
|
66
|
+
block = deque([infostr])
|
|
67
|
+
|
|
68
|
+
if underline:
|
|
69
|
+
block.append(rule(infostr, underline))
|
|
70
|
+
if overline:
|
|
71
|
+
block.appendleft(rule(infostr, overline))
|
|
72
|
+
|
|
73
|
+
if center:
|
|
74
|
+
block = map(centralize, block)
|
|
75
|
+
if indent:
|
|
76
|
+
block = map(lambda l: __INDENT__ * indent + l, block)
|
|
77
|
+
|
|
78
|
+
print("\n".join(map(omvify, block)))
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def load_yaml(fname):
|
|
82
|
+
with open(fname) as f:
|
|
83
|
+
y = yaml.safe_load(f)
|
|
84
|
+
return y
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
def trim_path(fname):
|
|
88
|
+
cwd = os.getcwd()
|
|
89
|
+
if fname.startswith(cwd):
|
|
90
|
+
return "." + fname[len(cwd) :]
|
|
91
|
+
else:
|
|
92
|
+
return fname
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def check_output(cmds, cwd=".", shell=False, verbosity=0, env=None):
|
|
96
|
+
inform(
|
|
97
|
+
"Running the commands: [%s] in (%s; cwd=%s; shell=%s; env=%s)"
|
|
98
|
+
% (" ".join(cmds), cwd, os.getcwd(), shell, env),
|
|
99
|
+
indent=2,
|
|
100
|
+
verbosity=verbosity,
|
|
101
|
+
)
|
|
102
|
+
joint_env = {}
|
|
103
|
+
if env:
|
|
104
|
+
joint_env.update(env)
|
|
105
|
+
for k in os.environ:
|
|
106
|
+
if not k in joint_env:
|
|
107
|
+
joint_env[k] = os.environ[k]
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
ret_string = sp.check_output(
|
|
111
|
+
cmds, cwd=cwd, shell=shell, env=joint_env, stderr=sp.STDOUT
|
|
112
|
+
)
|
|
113
|
+
inform(
|
|
114
|
+
"Commands: %s completed successfully" % (cmds),
|
|
115
|
+
indent=2,
|
|
116
|
+
verbosity=verbosity,
|
|
117
|
+
)
|
|
118
|
+
if isinstance(ret_string, bytes):
|
|
119
|
+
ret_string = ret_string.decode("utf-8") # For Python 3...
|
|
120
|
+
return ret_string
|
|
121
|
+
|
|
122
|
+
except sp.CalledProcessError as err:
|
|
123
|
+
inform(
|
|
124
|
+
"Error running commands: %s in %s (return code: %s)"
|
|
125
|
+
% (cmds, cwd, err.returncode),
|
|
126
|
+
indent=2,
|
|
127
|
+
verbosity=verbosity,
|
|
128
|
+
)
|
|
129
|
+
inform("Error: %s" % (err), indent=2, verbosity=verbosity)
|
|
130
|
+
raise err
|
|
131
|
+
except Exception as err:
|
|
132
|
+
inform(
|
|
133
|
+
"Error running commands: %s in (%s)!" % (cmds, cwd),
|
|
134
|
+
indent=2,
|
|
135
|
+
verbosity=verbosity,
|
|
136
|
+
)
|
|
137
|
+
inform("Error: %s" % (err), indent=2, verbosity=verbosity)
|
|
138
|
+
raise err
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def pip_install(packages, version=None):
|
|
142
|
+
pip = "pip3" if sys.version_info.major == 3 else "pip"
|
|
143
|
+
cmds = [pip, "install"]
|
|
144
|
+
if type(packages) == str:
|
|
145
|
+
if version == None:
|
|
146
|
+
cmds.append(packages)
|
|
147
|
+
else:
|
|
148
|
+
cmds.append("%s==%s" % (packages, version))
|
|
149
|
+
else:
|
|
150
|
+
raise Exception("pip_install will only install single packages...")
|
|
151
|
+
"""
|
|
152
|
+
for p in packages:
|
|
153
|
+
cmds.append(p)"""
|
|
154
|
+
print(check_output(cmds))
|
omv/engines/__init__.py
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import inspect
|
|
2
|
+
|
|
3
|
+
from omv.engines.engine import OMVEngine
|
|
4
|
+
from omv.engines.neuron_ import NeuronEngine
|
|
5
|
+
from omv.engines.jneuroml import JNeuroMLEngine
|
|
6
|
+
from omv.engines.jneuromlnrn import JNeuroMLNRNEngine
|
|
7
|
+
from omv.engines.jneuromlpynnnrn import JNeuroMLPyNNNRNEngine
|
|
8
|
+
from omv.engines.jneuromlnetpyne import JNeuroMLNetPyNEEngine
|
|
9
|
+
from omv.engines.jneuromlnetpyne_np4 import JNeuroMLNetPyNENP4Engine
|
|
10
|
+
from omv.engines.jneuromlnetpyne_np2 import JNeuroMLNetPyNENP2Engine
|
|
11
|
+
|
|
12
|
+
# from omv.engines.jneuromlbrian import JNeuroMLBrianEngine
|
|
13
|
+
from omv.engines.jneuromleden import JNeuroMLEdenEngine
|
|
14
|
+
from omv.engines.jneuromlbrian2 import JNeuroMLBrian2Engine
|
|
15
|
+
from omv.engines.jneuromlmoose import JNeuroMLMooseEngine
|
|
16
|
+
from omv.engines.jneuromlvalidate import JNeuroMLValidateEngine
|
|
17
|
+
from omv.engines.jneuromlvalidatev1 import JNeuroMLValidateV1Engine
|
|
18
|
+
from omv.engines.jlems import JLemsEngine
|
|
19
|
+
from omv.engines.pylems import PyLemsEngine
|
|
20
|
+
from omv.engines.pylemsnml2 import PyLemsNeuroML2Engine
|
|
21
|
+
from omv.engines.genesis import GenesisEngine
|
|
22
|
+
|
|
23
|
+
# from omv.engines.brian1 import Brian1Engine
|
|
24
|
+
from omv.engines.brian2_ import Brian2Engine
|
|
25
|
+
from omv.engines.arbor_ import ArborEngine
|
|
26
|
+
from omv.engines.eden_ import EdenEngine
|
|
27
|
+
from omv.engines.nestsli import NestEngine
|
|
28
|
+
from omv.engines.pynest import PyNestEngine
|
|
29
|
+
from omv.engines.moose_ import MooseEngine
|
|
30
|
+
from omv.engines.pynn import PyNNEngine
|
|
31
|
+
from omv.engines.pynnneuron import PyNNNRNEngine
|
|
32
|
+
from omv.engines.pyneuron import PyNRNEngine
|
|
33
|
+
|
|
34
|
+
# from omv.engines.pynnbrian1 import PyNNBrian1Engine
|
|
35
|
+
from omv.engines.pynnbrian2 import PyNNBrian2Engine
|
|
36
|
+
from omv.engines.pynnnest import PyNNNestEngine
|
|
37
|
+
from omv.engines.pynnneuroml import PyNNNeuroMLEngine
|
|
38
|
+
from omv.engines.octave import OctaveEngine
|
|
39
|
+
from omv.engines.netpyne_ import NetPyNEEngine
|
|
40
|
+
from omv.engines.netpyne__np4 import NetPyNENP4Engine
|
|
41
|
+
from omv.engines.netpyne__np2 import NetPyNENP2Engine
|
|
42
|
+
from omv.engines.pyneuroconstruct import PyneuroConstructEngine
|
|
43
|
+
from omv.engines.pyneuroml_ import PyNeuroMLEngine
|
|
44
|
+
from omv.engines.pyneuromlvalidatesbml import PyNeuroMLValidateSBMLEngine
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
OMVEngines = {
|
|
48
|
+
be.name: be
|
|
49
|
+
for be in locals().values()
|
|
50
|
+
if inspect.isclass(be)
|
|
51
|
+
and issubclass(be, OMVEngine)
|
|
52
|
+
and not be.name == "Name not yet set!"
|
|
53
|
+
}
|
omv/engines/arbor_.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.common.inout import inform, trim_path, check_output
|
|
5
|
+
from omv.engines.engine import OMVEngine, EngineExecutionError
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ArborEngine(OMVEngine):
|
|
9
|
+
name = "Arbor"
|
|
10
|
+
|
|
11
|
+
@staticmethod
|
|
12
|
+
def is_installed():
|
|
13
|
+
ret = True
|
|
14
|
+
try:
|
|
15
|
+
import arbor
|
|
16
|
+
|
|
17
|
+
inform(
|
|
18
|
+
"Arbor version %s is correctly installed..." % arbor.__version__,
|
|
19
|
+
indent=2,
|
|
20
|
+
verbosity=2,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
ret = "v%s" % arbor.__version__
|
|
24
|
+
|
|
25
|
+
except Exception as err:
|
|
26
|
+
inform("Couldn't import Arbor into Python: ", err, indent=1, verbosity=1)
|
|
27
|
+
ret = False
|
|
28
|
+
return ret
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
def install(version):
|
|
32
|
+
from omv.engines.getarbor import install_arbor
|
|
33
|
+
|
|
34
|
+
home = os.environ["HOME"]
|
|
35
|
+
inform("Will fetch and install the latest Arbor", indent=2)
|
|
36
|
+
install_arbor(version)
|
|
37
|
+
inform("Done...", indent=2)
|
|
38
|
+
|
|
39
|
+
def run(self):
|
|
40
|
+
try:
|
|
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, "-nogui"],
|
|
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 = "???"
|
omv/engines/brian1.py
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
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 Brian1Engine(OMVEngine):
|
|
9
|
+
name = "Brian"
|
|
10
|
+
|
|
11
|
+
python3_compatible = False
|
|
12
|
+
|
|
13
|
+
@staticmethod
|
|
14
|
+
def is_installed():
|
|
15
|
+
ret = False
|
|
16
|
+
try:
|
|
17
|
+
import brian
|
|
18
|
+
|
|
19
|
+
if is_verbose():
|
|
20
|
+
inform(
|
|
21
|
+
"Brian version %s is correctly installed..." % brian.__version__,
|
|
22
|
+
indent=2,
|
|
23
|
+
)
|
|
24
|
+
|
|
25
|
+
ret = "v%s" % brian.__version__
|
|
26
|
+
|
|
27
|
+
except Exception as err:
|
|
28
|
+
inform("Couldn't import Brian into Python: ", err, indent=1)
|
|
29
|
+
ret = False
|
|
30
|
+
return ret
|
|
31
|
+
|
|
32
|
+
@staticmethod
|
|
33
|
+
def install(version):
|
|
34
|
+
from omv.engines.getbrian1 import install_brian
|
|
35
|
+
|
|
36
|
+
home = os.environ["HOME"]
|
|
37
|
+
inform("Will fetch and install the latest Brian (version 1.x)", indent=2)
|
|
38
|
+
install_brian()
|
|
39
|
+
inform("Done...", indent=2)
|
|
40
|
+
|
|
41
|
+
def run(self):
|
|
42
|
+
try:
|
|
43
|
+
inform(
|
|
44
|
+
"Running file %s with %s" % (trim_path(self.modelpath), self.name),
|
|
45
|
+
indent=1,
|
|
46
|
+
)
|
|
47
|
+
self.stdout = check_output(
|
|
48
|
+
["python", self.modelpath, "-nogui"],
|
|
49
|
+
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 = "???"
|
omv/engines/brian2_.py
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import os
|
|
2
|
+
import subprocess as sp
|
|
3
|
+
|
|
4
|
+
from omv.common.inout import inform, trim_path, check_output
|
|
5
|
+
from omv.engines.engine import OMVEngine, EngineExecutionError
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Brian2Engine(OMVEngine):
|
|
9
|
+
name = "Brian2"
|
|
10
|
+
|
|
11
|
+
@staticmethod
|
|
12
|
+
def is_installed():
|
|
13
|
+
ret = True
|
|
14
|
+
try:
|
|
15
|
+
import brian2
|
|
16
|
+
|
|
17
|
+
inform(
|
|
18
|
+
"Brian2 version %s is correctly installed..." % brian2.__version__,
|
|
19
|
+
indent=2,
|
|
20
|
+
verbosity=2,
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
ret = "v%s" % brian2.__version__
|
|
24
|
+
|
|
25
|
+
except Exception as err:
|
|
26
|
+
inform("Couldn't import Brian2 into Python: ", err, indent=1, verbosity=1)
|
|
27
|
+
ret = False
|
|
28
|
+
return ret
|
|
29
|
+
|
|
30
|
+
@staticmethod
|
|
31
|
+
def install(version):
|
|
32
|
+
from omv.engines.getbrian2 import install_brian2
|
|
33
|
+
|
|
34
|
+
home = os.environ["HOME"]
|
|
35
|
+
inform("Will fetch and install the latest Brian (version 2.x)", indent=2)
|
|
36
|
+
install_brian2(version)
|
|
37
|
+
inform("Done...", indent=2)
|
|
38
|
+
|
|
39
|
+
def run(self):
|
|
40
|
+
try:
|
|
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, "-nogui"],
|
|
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 = "???"
|
omv/engines/eden_.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
|
|
5
|
+
from omv.engines.engine import OMVEngine, EngineExecutionError
|
|
6
|
+
from omv.engines.geteden import DEFAULT_VERSION
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class EdenEngine(OMVEngine):
|
|
10
|
+
name = "EDEN"
|
|
11
|
+
|
|
12
|
+
@staticmethod
|
|
13
|
+
def is_installed():
|
|
14
|
+
ret = True
|
|
15
|
+
try:
|
|
16
|
+
import eden_simulator
|
|
17
|
+
|
|
18
|
+
ver = "v%s" % (
|
|
19
|
+
eden_simulator.__version__
|
|
20
|
+
if hasattr(eden_simulator, "__version__")
|
|
21
|
+
else "???"
|
|
22
|
+
)
|
|
23
|
+
inform(
|
|
24
|
+
"EDEN version %s is correctly installed..." % ver, indent=2, verbosity=2
|
|
25
|
+
)
|
|
26
|
+
|
|
27
|
+
ret = ver
|
|
28
|
+
|
|
29
|
+
except Exception as err:
|
|
30
|
+
inform("Couldn't import EDEN into Python: ", err, indent=1, verbosity=1)
|
|
31
|
+
ret = False
|
|
32
|
+
return ret
|
|
33
|
+
|
|
34
|
+
@staticmethod
|
|
35
|
+
def install(version):
|
|
36
|
+
from omv.engines.geteden import install_eden
|
|
37
|
+
|
|
38
|
+
home = os.environ["HOME"]
|
|
39
|
+
inform("Will fetch and install the latest EDEN", indent=2)
|
|
40
|
+
install_eden(version)
|
|
41
|
+
inform("Done...", indent=2)
|
|
42
|
+
|
|
43
|
+
def run(self):
|
|
44
|
+
try:
|
|
45
|
+
inform(
|
|
46
|
+
"Running a file %s with the simulator %s"
|
|
47
|
+
% (trim_path(self.modelpath), self.name),
|
|
48
|
+
indent=1,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
self.stdout = check_output(
|
|
52
|
+
["python", self.modelpath], cwd=os.path.dirname(self.modelpath)
|
|
53
|
+
)
|
|
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 = "???"
|
omv/engines/engine.py
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
from os.path import realpath
|
|
2
|
+
from os import environ
|
|
3
|
+
import sys
|
|
4
|
+
from omv.common.inout import inform
|
|
5
|
+
import platform
|
|
6
|
+
|
|
7
|
+
PATH_DELIMITER = ";"
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class EngineInstallationError(Exception):
|
|
11
|
+
pass
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class EngineExecutionError(Exception):
|
|
15
|
+
pass
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class OMVEngine(object):
|
|
19
|
+
name = "Name not yet set!"
|
|
20
|
+
environment_vars = {}
|
|
21
|
+
path = ""
|
|
22
|
+
|
|
23
|
+
python3_compatible = True # Most are so override only in those that aren't
|
|
24
|
+
|
|
25
|
+
def __init__(self, target, do_not_check_install, engine_version=None):
|
|
26
|
+
if not do_not_check_install:
|
|
27
|
+
inform(
|
|
28
|
+
"Checking whether OMVEngine: %s is already installed..." % (self.name),
|
|
29
|
+
indent=1,
|
|
30
|
+
verbosity=1,
|
|
31
|
+
)
|
|
32
|
+
if not self.is_installed():
|
|
33
|
+
try:
|
|
34
|
+
if (
|
|
35
|
+
platform.python_version_tuple()[0] == "3"
|
|
36
|
+
and not self.python3_compatible
|
|
37
|
+
):
|
|
38
|
+
inform(
|
|
39
|
+
"Not installing %s due to Python 3 incompatibility. Tests will throw error unless option --ignore-non-py3 specified"
|
|
40
|
+
% self.name
|
|
41
|
+
)
|
|
42
|
+
else:
|
|
43
|
+
self.install(engine_version)
|
|
44
|
+
self.set_environment()
|
|
45
|
+
self.set_path()
|
|
46
|
+
except Exception as e:
|
|
47
|
+
inform("Installation err: %s" % e)
|
|
48
|
+
raise (EngineInstallationError(e))
|
|
49
|
+
"""
|
|
50
|
+
if not self.is_installed(engine_version): # Still
|
|
51
|
+
inform("Fatal installation error for: %s"%self.name)
|
|
52
|
+
exit(1)"""
|
|
53
|
+
|
|
54
|
+
if " " in target:
|
|
55
|
+
all = ""
|
|
56
|
+
for mp in target.split():
|
|
57
|
+
all += realpath(mp) + PATH_DELIMITER
|
|
58
|
+
self.modelpath = all[:-1]
|
|
59
|
+
else:
|
|
60
|
+
self.modelpath = realpath(target)
|
|
61
|
+
self.extra_pars = []
|
|
62
|
+
|
|
63
|
+
def __str__(self):
|
|
64
|
+
return self.name
|
|
65
|
+
|
|
66
|
+
def is_installed(self):
|
|
67
|
+
raise NotImplementedError()
|
|
68
|
+
|
|
69
|
+
def run(self):
|
|
70
|
+
raise NotImplementedError()
|
|
71
|
+
|
|
72
|
+
def install(self, version):
|
|
73
|
+
raise NotImplementedError()
|
|
74
|
+
|
|
75
|
+
def build_query_string(self, name, cmd):
|
|
76
|
+
raise NotImplementedError()
|
|
77
|
+
|
|
78
|
+
def set_environment(self):
|
|
79
|
+
if self.environment_vars:
|
|
80
|
+
for name, val in self.environment_vars.items():
|
|
81
|
+
if name in environ and not "HOME" in name:
|
|
82
|
+
if not ":%s:" % val in environ[name]:
|
|
83
|
+
environ[name] = "%s:%s" % (environ[name], val)
|
|
84
|
+
else:
|
|
85
|
+
environ[name] = val
|
|
86
|
+
inform("Set env var %s: " % name, environ[name], indent=2, verbosity=1)
|
|
87
|
+
|
|
88
|
+
def set_path(self):
|
|
89
|
+
if self.path:
|
|
90
|
+
environ["PATH"] = ":".join((environ["PATH"], self.path))
|
|
91
|
+
inform("Setting PATH: ", environ["PATH"], indent=2, verbosity=1)
|
|
92
|
+
|
|
93
|
+
def register_query(self, name, cmd=""):
|
|
94
|
+
query = self.build_query_string(name, cmd)
|
|
95
|
+
inform("Registered engine query: ", query, indent=2, verbosity=1)
|
|
96
|
+
self.extra_pars.append(query)
|
|
97
|
+
return name
|
|
98
|
+
|
|
99
|
+
def fetch_query(self, key):
|
|
100
|
+
import re
|
|
101
|
+
|
|
102
|
+
match_float = "\s*([0-9]*\.?[0-9]+([eE][-+]?[0-9]+)?)\s*"
|
|
103
|
+
|
|
104
|
+
l = key + ":" + match_float
|
|
105
|
+
|
|
106
|
+
m = re.search(l, self.stdout)
|
|
107
|
+
if m:
|
|
108
|
+
return m.groups()[0]
|
|
109
|
+
else:
|
|
110
|
+
inform("Not found!")
|
|
111
|
+
raise KeyError
|
omv/engines/genesis.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import re
|
|
2
|
+
import os
|
|
3
|
+
import subprocess as sp
|
|
4
|
+
from tempfile import NamedTemporaryFile
|
|
5
|
+
|
|
6
|
+
from omv.engines.engine import OMVEngine, EngineExecutionError
|
|
7
|
+
from omv.engines.utils.wdir import working_dir
|
|
8
|
+
from omv.common.inout import inform
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class GenesisEngine(OMVEngine):
|
|
12
|
+
name = "genesis"
|
|
13
|
+
|
|
14
|
+
@classmethod
|
|
15
|
+
def is_installed(cls, version=None):
|
|
16
|
+
from tempfile import NamedTemporaryFile
|
|
17
|
+
|
|
18
|
+
ret = True
|
|
19
|
+
try:
|
|
20
|
+
temp = NamedTemporaryFile(suffix=".g")
|
|
21
|
+
temp.writelines([b'echo "version: "{version} \n', b"quit \n"])
|
|
22
|
+
temp.seek(0)
|
|
23
|
+
out = sp.check_output(["genesis", "-nox", "-batch", "-notty", temp.name])
|
|
24
|
+
m = re.search(b"version:\s*([0-9]*\.?[0-9]+)\s*", out)
|
|
25
|
+
if m:
|
|
26
|
+
ver = m.groups()[0]
|
|
27
|
+
|
|
28
|
+
if isinstance(ver, bytes):
|
|
29
|
+
ver = ver.decode("utf-8")
|
|
30
|
+
ret = "v%s" % ver
|
|
31
|
+
inform("Found GENESIS in path, version %s" % ret, verbosity=1, indent=2)
|
|
32
|
+
except OSError:
|
|
33
|
+
ret = False
|
|
34
|
+
finally:
|
|
35
|
+
temp.close()
|
|
36
|
+
|
|
37
|
+
return ret
|
|
38
|
+
|
|
39
|
+
@classmethod
|
|
40
|
+
def install(cls, engine_version):
|
|
41
|
+
from omv.engines.getgenesis import install_genesis
|
|
42
|
+
|
|
43
|
+
home = os.environ["HOME"]
|
|
44
|
+
cls.path = os.path.join(home, "genesis", "genesis2.4gamma-master", "src")
|
|
45
|
+
inform("Will fetch and install genesis-2.4", indent=1)
|
|
46
|
+
install_genesis()
|
|
47
|
+
|
|
48
|
+
def run(self):
|
|
49
|
+
from pkg_resources import resource_filename
|
|
50
|
+
|
|
51
|
+
with working_dir(os.path.dirname(self.modelpath)):
|
|
52
|
+
try:
|
|
53
|
+
temp = NamedTemporaryFile(suffix=".g", mode="w")
|
|
54
|
+
temp.write("include %s\n" % self.modelpath)
|
|
55
|
+
temp.write(
|
|
56
|
+
"include %s\n"
|
|
57
|
+
% resource_filename("omv", "engines/utils/genesis_utils.g")
|
|
58
|
+
)
|
|
59
|
+
temp.write("\n".join(self.extra_pars) + "\n")
|
|
60
|
+
temp.seek(0)
|
|
61
|
+
|
|
62
|
+
with open("/tmp/omv.gen.err", "w+") as se:
|
|
63
|
+
self.stdout = sp.check_output(
|
|
64
|
+
["genesis", "-nox", "-batch", "-notty", temp.name], stderr=se
|
|
65
|
+
)
|
|
66
|
+
se.seek(0)
|
|
67
|
+
self.stderr = se.readlines()
|
|
68
|
+
self.returncode = 0
|
|
69
|
+
except sp.CalledProcessError as e:
|
|
70
|
+
self.returncode = e.returncode
|
|
71
|
+
raise EngineExecutionError
|
|
72
|
+
finally:
|
|
73
|
+
temp.close()
|
|
74
|
+
|
|
75
|
+
def build_query_string(self, name, cmd):
|
|
76
|
+
return "echo %s: {%s}" % (name, cmd)
|
|
77
|
+
|
|
78
|
+
def query_area(self, secname):
|
|
79
|
+
name = self.register_query(
|
|
80
|
+
"area_%s" % secname.translate(None, "/[]"),
|
|
81
|
+
"total_membrane_area %s" % secname,
|
|
82
|
+
)
|
|
83
|
+
return name
|
|
84
|
+
|
|
85
|
+
def query_temperature(self):
|
|
86
|
+
return self.register_query("temperature", "celsius")
|
omv/engines/getarbor.py
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from omv.common.inout import pip_install
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
def install_arbor(version=None):
|
|
5
|
+
if not version:
|
|
6
|
+
version = "0.9.0"
|
|
7
|
+
try:
|
|
8
|
+
pip_install("arbor==%s" % version)
|
|
9
|
+
import arbor
|
|
10
|
+
|
|
11
|
+
m = "Successfully installed Arbor..."
|
|
12
|
+
except Exception as e:
|
|
13
|
+
m = "ERROR installing Arbor: " + str(e)
|
|
14
|
+
finally:
|
|
15
|
+
print(m)
|