diff --git a/Makefile b/Makefile index bf3a6d6..c988ba6 100644 --- a/Makefile +++ b/Makefile @@ -33,7 +33,6 @@ test: install pip install nose coverage --upgrade cd efel/tests; nosetests -s -v -x --with-coverage --cover-xml \ --cover-package efel - # Reenabled this if you want log output on crash || (cat log/fllog.txt; exit 1;) test3: install3 pip3 install nose coverage --upgrade cd efel/tests; nosetests-3.4 -s -v -x --with-coverage --cover-xml \ diff --git a/efel/cppcore/LibV5.cpp b/efel/cppcore/LibV5.cpp index 33331b6..ca53c32 100644 --- a/efel/cppcore/LibV5.cpp +++ b/efel/cppcore/LibV5.cpp @@ -2483,9 +2483,11 @@ static int __peak_indices(double threshold, vector& V, return 0; } - if (dnVec.size() != upVec.size()) { - GErrorStr += "\nVoltage never goes below threshold after last spike.\n"; - return 0; + if (upVec.size() > dnVec.size()) { + unsigned size_diff = upVec.size() - dnVec.size(); + for (unsigned i = 0; i < size_diff; i++) { + upVec.pop_back(); + } } PeakIndex.clear(); @@ -2493,6 +2495,7 @@ static int __peak_indices(double threshold, vector& V, for (unsigned i = 0; i < upVec.size(); i++) { dtmp = -1e9; itmp = -1; + EFEL_ASSERT(i < dnVec.size(), "dnVec array too small"); for (j = upVec[i]; j <= dnVec[i]; j++) { if (dtmp < V[j]) { dtmp = V[j]; diff --git a/efel/tests/test_basic.py b/efel/tests/test_basic.py index 331eb95..173dec9 100644 --- a/efel/tests/test_basic.py +++ b/efel/tests/test_basic.py @@ -1517,3 +1517,37 @@ def test_mean_AP_amplitude(): nt.assert_equal(numpy.mean(feature_values[0]['AP_amplitude']), feature_values[0]['mean_AP_amplitude']) + + +def test_unfinished_peak(): + """basic: Test if unfinished peak doesn't break Spikecount""" + import numpy + + import efel + efel.setIntSetting('strict_stiminterval', True) + + dt = 0.1 + v = numpy.zeros(int(100 / dt)) - 70.0 + v[int(20 / dt):int(25 / dt)] = 20. + v[int(40 / dt):int(45 / dt)] = 20. + v[int(60 / dt):int(65 / dt)] = 20. + + trace = {} + trace['T'] = numpy.arange(len(v)) * dt + trace['V'] = v + trace['stim_start'] = [10] + trace['stim_end'] = [70] + + traces_results = efel.getFeatureValues([trace], ['Spikecount']) + spikecount = traces_results[0]['Spikecount'][0] + + nt.assert_equal(spikecount, 3) + + # When the signal at the end of the trace is larger than the threshold, + # Spikecount and possibly other features cannont be estimated. + v[int(80 / dt):] = -19 + + traces_results = efel.getFeatureValues([trace], ['Spikecount']) + spikecount = traces_results[0]['Spikecount'][0] + + nt.assert_equal(spikecount, 3)