Skip to content

Commit 7c6cc8c

Browse files
committed
Merge branch 'master' into test_mac
2 parents 5e2a697 + a68b56a commit 7c6cc8c

File tree

105 files changed

+2595
-2131
lines changed

Some content is hidden

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

105 files changed

+2595
-2131
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ jobs:
3838
- PyLEMS_NeuroML2
3939
- jLEMS
4040
- jNeuroML
41+
- "jNeuroML:v0.12.3"
4142
- jNeuroML_Brian2
4243
- jNeuroML_EDEN
4344
- "jNeuroML_NEURON:8.2.1"

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,4 @@ report*.txt
122122
/utilities/tests/*.gen.c
123123
/utilities/tests/*_eden.py
124124
arm64
125+
/*ken.sh

omv/__init__.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
1-
__version__ = '0.2.6'
1+
try:
2+
import importlib.metadata
3+
4+
__version__ = importlib.metadata.version("OSBModelValidation")
5+
except ImportError:
6+
import importlib_metadata
7+
8+
__version__ = importlib_metadata.version("OSBModelValidation")

omv/analyzers/__init__.py

Lines changed: 9 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -9,30 +9,13 @@
99
from omv.analyzers.timeseries import TimeSeriesAnalyzer
1010

1111
OMVAnalyzers = {
12-
'spike times' : SpikeAnalyzer,
13-
'spike rate' : RateAnalyzer,
14-
'dry': DryRunAnalyzer,
15-
'resting': RestingAnalyzer,
16-
'morphology': MorphologyAnalyzer,
17-
'temperature': TemperatureAnalyzer,
18-
'activation variables': ActivationVariableAnalyzer,
19-
'input resistance': InputResAnalyzer,
20-
'timeseries': TimeSeriesAnalyzer
12+
"spike times": SpikeAnalyzer,
13+
"spike rate": RateAnalyzer,
14+
"dry": DryRunAnalyzer,
15+
"resting": RestingAnalyzer,
16+
"morphology": MorphologyAnalyzer,
17+
"temperature": TemperatureAnalyzer,
18+
"activation variables": ActivationVariableAnalyzer,
19+
"input resistance": InputResAnalyzer,
20+
"timeseries": TimeSeriesAnalyzer,
2121
}
22-
23-
24-
25-
26-
27-
28-
29-
30-
31-
32-
33-
34-
35-
36-
37-
38-

omv/analyzers/activation.py

Lines changed: 10 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,38 +5,20 @@
55

66

77
class ActivationVariableAnalyzer(OMVAnalyzer):
8-
98
def parse_observable(self):
10-
if 'file' in self.observable:
11-
f = fn.FileNodeHelper(self.observable['file'], self.omt_root)
12-
inform('Activation variable from file',
13-
self.observable['file'], indent=1, verbosity=1)
9+
if "file" in self.observable:
10+
f = fn.FileNodeHelper(self.observable["file"], self.omt_root)
11+
inform(
12+
"Activation variable from file",
13+
self.observable["file"],
14+
indent=1,
15+
verbosity=1,
16+
)
1417
return f.get_timeseries()
15-
18+
1619
def __call__(self):
1720
obs = self.parse_observable()
1821
allin = ts.all_within_bounds(obs, (0, 1))
1922
if not allin:
20-
inform('Activation variable outside of (0,1) interval: ',
21-
obs, indent=1)
23+
inform("Activation variable outside of (0,1) interval: ", obs, indent=1)
2224
return allin
23-
24-
25-
26-
27-
28-
29-
30-
31-
32-
33-
34-
35-
36-
37-
38-
39-
40-
41-
42-

omv/analyzers/analyzer.py

Lines changed: 25 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,51 +21,60 @@ def parse_observable(self):
2121
pass
2222

2323
def __call__(self):
24-
2524
try:
2625
obs = self.parse_observable()
2726
if obs is None:
28-
inform("Could not determine observed values")
29-
return False
27+
inform("Could not determine observed values")
28+
return False
3029
if isinstance(obs, list):
3130
for o in obs:
3231
if not o:
3332
inform("Could not determine observed values")
3433
return False
35-
34+
3635
exp = self.parse_expected()
37-
36+
3837
if exp is None:
39-
inform("Could not determine expected values, value None")
40-
return False
38+
inform("Could not determine expected values, value None")
39+
return False
4140
if isinstance(exp, list):
4241
for e in exp:
4342
if not e:
4443
inform("Could not determine expected values")
4544
return False
4645
except IOError as e:
47-
inform("Input/output error when\
48-
checking for observable data: %s" % e)
46+
inform(
47+
"Input/output error when\
48+
checking for observable data: %s"
49+
% e
50+
)
4951
return False
50-
52+
5153
try:
52-
tolerance = float(self.observable['tolerance'])
54+
tolerance = float(self.observable["tolerance"])
5355
except (TypeError, KeyError): # observable can be None
5456
tolerance = 1e-1
5557

5658
are_close, best_tol = compare_arrays((obs, exp), tolerance)
5759

5860
if not are_close:
59-
pretty_obs, pretty_exp = pretty_print_copypaste(obs,exp)
60-
inform("Comparison of \n\
61+
pretty_obs, pretty_exp = pretty_print_copypaste(obs, exp)
62+
inform(
63+
"Comparison of \n\
6164
(observed data): %s\n\
6265
and\n\
6366
(expected data): %s\n\
64-
failed against tolerance %g" %
65-
(pretty_obs, pretty_exp, tolerance))
67+
failed against tolerance %g"
68+
% (pretty_obs, pretty_exp, tolerance)
69+
)
6670
if best_tol:
6771
inform("A better tolerance to try is: ", best_tol, indent=1)
6872
else:
6973
if best_tol and best_tol < tolerance:
70-
inform("Passed, but an even better tolerance might be: %s, as opposed to: %s (diff: %s)" % (best_tol, tolerance,(tolerance-best_tol)), indent=3, verbosity=1)
74+
inform(
75+
"Passed, but an even better tolerance might be: %s, as opposed to: %s (diff: %s)"
76+
% (best_tol, tolerance, (tolerance - best_tol)),
77+
indent=3,
78+
verbosity=1,
79+
)
7180
return are_close

omv/analyzers/dryrun.py

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,11 @@
33

44

55
class DryRunAnalyzer(OMVAnalyzer):
6-
76
def __init__(self, ost, expected, engine, omt_root, mep_root):
8-
inform('No mep file specified. Will only run simulation using: ',
9-
engine, indent=1)
7+
inform(
8+
"No mep file specified. Will only run simulation using: ", engine, indent=1
9+
)
1010
self.engine = engine
1111

1212
def __call__(self):
1313
return not self.engine.returncode
14-
15-
16-
17-
18-
19-
20-
21-
22-
23-
24-
25-
26-

omv/analyzers/input_resistance.py

Lines changed: 26 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -9,46 +9,39 @@ class InputResAnalyzer(OMVAnalyzer):
99
Input resistance
1010
"""
1111

12-
1312
def parseOMT(self, to_parse):
14-
f = fn.FileNodeHelper(to_parse['file_Vm'], self.omt_root)
15-
f_i = fn.FileNodeHelper(to_parse['file_VC_i'], self.omt_root)
16-
inform('Calculating input resistance from files:',
17-
(f.filename,f_i.filename), indent=1, verbosity=1)
18-
h_voltage = to_parse.get('holding voltage', -70.)
19-
cmd_voltage = to_parse.get('command voltage', -80.)
20-
h_window = to_parse.get('holding window', [0., 0.])
21-
cmd_window = to_parse.get('command window', [0., 0.])
13+
f = fn.FileNodeHelper(to_parse["file_Vm"], self.omt_root)
14+
f_i = fn.FileNodeHelper(to_parse["file_VC_i"], self.omt_root)
15+
inform(
16+
"Calculating input resistance from files:",
17+
(f.filename, f_i.filename),
18+
indent=1,
19+
verbosity=1,
20+
)
21+
h_voltage = to_parse.get("holding voltage", -70.0)
22+
cmd_voltage = to_parse.get("command voltage", -80.0)
23+
h_window = to_parse.get("holding window", [0.0, 0.0])
24+
cmd_window = to_parse.get("command window", [0.0, 0.0])
2225

2326
# h_window = [float(t) for t in to_parse.get('holding window', [0., 0.])[0].split()]
2427
# cmd_window = [float(t) for t in to_parse.get('command window', [0., 0.])[0].split()]
25-
inform('Time wondow used for detection of current injections:',
26-
(h_window,cmd_window), indent=2, verbosity=1)
27-
input_resistance = ts.input_resistance(f.get_timeseries(), f_i.get_timeseries(), h_window, cmd_window, (h_voltage,cmd_voltage))
28+
inform(
29+
"Time wondow used for detection of current injections:",
30+
(h_window, cmd_window),
31+
indent=2,
32+
verbosity=1,
33+
)
34+
input_resistance = ts.input_resistance(
35+
f.get_timeseries(),
36+
f_i.get_timeseries(),
37+
h_window,
38+
cmd_window,
39+
(h_voltage, cmd_voltage),
40+
)
2841
return input_resistance
29-
42+
3043
def parse_expected(self):
3144
return self.expected
3245

3346
def parse_observable(self):
3447
return self.parseOMT(self.observable)
35-
36-
37-
38-
39-
40-
41-
42-
43-
44-
45-
46-
47-
48-
49-
50-
51-
52-
53-
54-

omv/analyzers/morphology.py

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,16 @@
11
from omv.analyzers.analyzer import OMVAnalyzer
22

3+
34
class MorphologyAnalyzer(OMVAnalyzer):
4-
55
def before_running(self):
6-
if 'total area' in self.expected:
7-
base = self.observable.get('base section', 'cell[0]')
6+
if "total area" in self.expected:
7+
base = self.observable.get("base section", "cell[0]")
88
self.query = self.engine.query_area(base)
99

1010
def parse_expected(self):
11-
return self.expected['total area']
11+
return self.expected["total area"]
1212

1313
def parse_observable(self):
1414
area = float(self.engine.fetch_query(self.query))
15-
scale = float(self.observable.get('scaling', 1))
15+
scale = float(self.observable.get("scaling", 1))
1616
return scale * area
17-
18-
19-
20-
21-
22-
23-
24-
25-
26-
27-
28-
29-
30-
31-
32-
33-
34-

0 commit comments

Comments
 (0)