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.
Files changed (98) hide show
  1. OSBModelValidation-0.2.18.dist-info/METADATA +184 -0
  2. OSBModelValidation-0.2.18.dist-info/RECORD +98 -0
  3. OSBModelValidation-0.2.18.dist-info/WHEEL +5 -0
  4. OSBModelValidation-0.2.18.dist-info/entry_points.txt +2 -0
  5. OSBModelValidation-0.2.18.dist-info/top_level.txt +1 -0
  6. omv/__init__.py +8 -0
  7. omv/analyzers/__init__.py +21 -0
  8. omv/analyzers/activation.py +24 -0
  9. omv/analyzers/analyzer.py +80 -0
  10. omv/analyzers/dryrun.py +13 -0
  11. omv/analyzers/input_resistance.py +47 -0
  12. omv/analyzers/morphology.py +16 -0
  13. omv/analyzers/rates.py +97 -0
  14. omv/analyzers/resting.py +37 -0
  15. omv/analyzers/spikes.py +113 -0
  16. omv/analyzers/temperature.py +12 -0
  17. omv/analyzers/timeseries.py +57 -0
  18. omv/analyzers/utils/__init__.py +0 -0
  19. omv/analyzers/utils/filenode.py +73 -0
  20. omv/analyzers/utils/timeseries.py +293 -0
  21. omv/autogen.py +106 -0
  22. omv/common/__init__.py +0 -0
  23. omv/common/inout.py +154 -0
  24. omv/engines/__init__.py +53 -0
  25. omv/engines/arbor_.py +57 -0
  26. omv/engines/brian1.py +59 -0
  27. omv/engines/brian2_.py +57 -0
  28. omv/engines/eden_.py +63 -0
  29. omv/engines/engine.py +111 -0
  30. omv/engines/genesis.py +86 -0
  31. omv/engines/getarbor.py +15 -0
  32. omv/engines/getbrian1.py +42 -0
  33. omv/engines/getbrian2.py +17 -0
  34. omv/engines/geteden.py +17 -0
  35. omv/engines/getgenesis.py +56 -0
  36. omv/engines/getjlems.py +20 -0
  37. omv/engines/getjnml.py +48 -0
  38. omv/engines/getlibsbml.py +13 -0
  39. omv/engines/getmoose.py +15 -0
  40. omv/engines/getnest.py +62 -0
  41. omv/engines/getnetpyne.py +52 -0
  42. omv/engines/getneuroconstruct.py +31 -0
  43. omv/engines/getnml2.py +26 -0
  44. omv/engines/getnrn.py +60 -0
  45. omv/engines/getoctave.py +11 -0
  46. omv/engines/getpylems.py +13 -0
  47. omv/engines/getpyneuroml.py +14 -0
  48. omv/engines/getpynn.py +40 -0
  49. omv/engines/jlems.py +48 -0
  50. omv/engines/jneuroml.py +101 -0
  51. omv/engines/jneuromlbrian.py +65 -0
  52. omv/engines/jneuromlbrian2.py +61 -0
  53. omv/engines/jneuromleden.py +61 -0
  54. omv/engines/jneuromlmoose.py +63 -0
  55. omv/engines/jneuromlnetpyne.py +73 -0
  56. omv/engines/jneuromlnetpyne_np2.py +45 -0
  57. omv/engines/jneuromlnetpyne_np4.py +45 -0
  58. omv/engines/jneuromlnrn.py +78 -0
  59. omv/engines/jneuromlpynnnrn.py +75 -0
  60. omv/engines/jneuromlvalidate.py +62 -0
  61. omv/engines/jneuromlvalidatev1.py +58 -0
  62. omv/engines/moose_.py +86 -0
  63. omv/engines/nestsli.py +84 -0
  64. omv/engines/netpyne_.py +120 -0
  65. omv/engines/netpyne__np2.py +47 -0
  66. omv/engines/netpyne__np4.py +47 -0
  67. omv/engines/neuron_.py +205 -0
  68. omv/engines/octave.py +51 -0
  69. omv/engines/pylems.py +57 -0
  70. omv/engines/pylemsnml2.py +59 -0
  71. omv/engines/pynest.py +111 -0
  72. omv/engines/pyneuroconstruct.py +67 -0
  73. omv/engines/pyneuroml_.py +55 -0
  74. omv/engines/pyneuromlvalidatesbml.py +83 -0
  75. omv/engines/pyneuron.py +94 -0
  76. omv/engines/pynn.py +63 -0
  77. omv/engines/pynnbrian1.py +59 -0
  78. omv/engines/pynnbrian2.py +60 -0
  79. omv/engines/pynnnest.py +56 -0
  80. omv/engines/pynnneuroml.py +57 -0
  81. omv/engines/pynnneuron.py +94 -0
  82. omv/engines/utils/__init__.py +21 -0
  83. omv/engines/utils/genesis_utils.g +26 -0
  84. omv/engines/utils/wdir.py +15 -0
  85. omv/experiment.py +18 -0
  86. omv/find_tests.py +126 -0
  87. omv/omt_mep_parser.py +59 -0
  88. omv/omv_util.py +439 -0
  89. omv/parse_omt.py +118 -0
  90. omv/tally.py +112 -0
  91. omv/test/__init__.py +0 -0
  92. omv/test/test_rates.py +38 -0
  93. omv/test/test_types.py +29 -0
  94. omv/validation/__init__.py +0 -0
  95. omv/validation/rx_validator.py +35 -0
  96. omv/validation/utils.py +51 -0
  97. omv/validation/validate.py +53 -0
  98. 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))
@@ -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")
@@ -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)