From fa85d8caf970d6600224667fcdc1a6cb5890b049 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20Jaquier?= <72930209+AurelienJaquier@users.noreply.github.com> Date: Tue, 25 Jun 2024 16:55:48 +0200 Subject: [PATCH] AP_phaseslope_range (#400) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add AP_phaseslope_range to efel settings with a default value of 2 * add AP_phaseslope default value in documentation * fix tests * added change to changelog * let range be an int --------- Co-authored-by: Jaquier Aurélien Tristan --- CHANGELOG.rst | 7 ++++++- docs/source/eFeatures.rst | 2 +- efel/cppcore/SpikeShape.cpp | 14 ++++++++------ efel/settings.py | 1 + tests/test_settings.py | 3 ++- tests/testdata/allfeatures/expectedresults.json | 9 ++++++++- 6 files changed, 26 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.rst b/CHANGELOG.rst index 8af2a86a..9f3f8e00 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -5,10 +5,15 @@ All notable changes to this project will be documented in this file. The format is based on `Keep a Changelog `_, and this project adheres to `Semantic Versioning `_. +5.6.29 - 2024-06 +---------------- + +- Added AP_phaseslope_range to efel.settings as int with default value of 2 + 5.6.27 - 2024-05 ---------------- -- FIxed edge case (1 spike and no min_AHP_indices dependency) in AP_begin_indices +- Fixed edge case (1 spike and no min_AHP_indices dependency) in AP_begin_indices 5.6.20 - 2024-05 ---------------- diff --git a/docs/source/eFeatures.rst b/docs/source/eFeatures.rst index 39f00d26..d9f31a32 100644 --- a/docs/source/eFeatures.rst +++ b/docs/source/eFeatures.rst @@ -1549,7 +1549,7 @@ AP_phaseslope (at the point where the derivative crosses the DerivativeThreshold) - **Required features**: AP_begin_indices -- **Parameters**: AP_phaseslope_range +- **Parameters**: AP_phaseslope_range (default=2) - **Units**: 1/(ms) - **Pseudocode**: :: diff --git a/efel/cppcore/SpikeShape.cpp b/efel/cppcore/SpikeShape.cpp index 3b7605b4..06102aa5 100644 --- a/efel/cppcore/SpikeShape.cpp +++ b/efel/cppcore/SpikeShape.cpp @@ -2279,7 +2279,7 @@ int SpikeShape::AP_fall_rate_change(mapStr2intVec& IntFeatureData, static int __AP_phaseslope(const vector& v, const vector& t, double stimStart, double stimEnd, vector& ap_phaseslopes, vector apbi, - double range) { + int range) { vector dvdt(v.size()); vector dv; vector dt; @@ -2292,8 +2292,8 @@ static int __AP_phaseslope(const vector& v, const vector& t, for (size_t i = 0; i < apbi.size(); i++) { apbegin_index = apbi[i]; - range_min_index = apbegin_index - int(range); - range_max_index = apbegin_index + int(range); + range_min_index = apbegin_index - range; + range_max_index = apbegin_index + range; if (range_min_index < 0 || range_max_index < 0) return -1; if (range_min_index > (int)t.size() || range_max_index > (int)t.size()) return -1; @@ -2316,14 +2316,16 @@ int SpikeShape::AP_phaseslope(mapStr2intVec& IntFeatureData, mapStr2Str& StringData) { const auto& doubleFeatures = getFeatures(DoubleFeatureData, - {"V", "T", "stim_start", "stim_end", "AP_phaseslope_range"}); - const auto& intFeatures = getFeatures(IntFeatureData, {"AP_begin_indices"}); + {"V", "T", "stim_start", "stim_end"}); + const auto& intFeatures = + getFeatures(IntFeatureData, + {"AP_begin_indices", "AP_phaseslope_range"}); vector ap_phaseslopes; int retVal = __AP_phaseslope(doubleFeatures.at("V"), doubleFeatures.at("T"), doubleFeatures.at("stim_start")[0], doubleFeatures.at("stim_end")[0], ap_phaseslopes, intFeatures.at("AP_begin_indices"), - doubleFeatures.at("AP_phaseslope_range")[0]); + intFeatures.at("AP_phaseslope_range")[0]); if (retVal > 0) { setVec(DoubleFeatureData, StringData, "AP_phaseslope", ap_phaseslopes); diff --git a/efel/settings.py b/efel/settings.py index 295f5275..7751f347 100644 --- a/efel/settings.py +++ b/efel/settings.py @@ -98,6 +98,7 @@ class Settings: sahp_start: float = 5.0 ignore_first_ISI: bool = True impedance_max_freq: float = 50.0 + AP_phaseslope_range: int = 2 def set_setting(self, setting_name: str, diff --git a/tests/test_settings.py b/tests/test_settings.py index d4d71037..8c8626ab 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -161,6 +161,7 @@ def test_str_method(): "precision_threshold: 1e-10\n" "sahp_start: 5.0\n" "ignore_first_ISI: True\n" - "impedance_max_freq: 50.0" + "impedance_max_freq: 50.0\n" + "AP_phaseslope_range: 2" ) assert str(settings) == expected_output diff --git a/tests/testdata/allfeatures/expectedresults.json b/tests/testdata/allfeatures/expectedresults.json index bb6e0145..69a0f2b8 100644 --- a/tests/testdata/allfeatures/expectedresults.json +++ b/tests/testdata/allfeatures/expectedresults.json @@ -280,7 +280,14 @@ 40.51507371451861, 40.98143755958056 ], - "AP_phaseslope": null, + "AP_phaseslope": [ + 8.368063428797635, + 8.205484762938424, + 5.729511888356036, + 5.224282360605566, + 3.887601463053442, + 4.872345425348057 + ], "AP_rise_indices": [ 7074, 9104,