Git Product home page Git Product logo

efel's Introduction

eFEL banner

Latest Release latest release
Documentation latest documentation
License license
Build Status actions build status
Coverage coverage
Gitter
Citation DOI

Introduction

The Electrophys Feature Extraction Library (eFEL) allows neuroscientists to automatically extract features from time series data recorded from neurons (both in vitro and in silico). Examples are the action potential width and amplitude in voltage traces recorded during whole-cell patch clamp experiments. The user of the library provides a set of traces and selects the features to be calculated. The library will then extract the requested features and return the values to the user.

The core of the library is written in C++, and a Python wrapper is included. At the moment we provide a way to automatically compile and install the library as a Python module. Instructions on how to compile the eFEL as a standalone C++ library can be found here.

How to cite

When you use this eFEL software for your research, we ask you to cite it (this includes poster presentations) by referring to the "Cite this repository" button at the top of the repository page to get various citation formats, including APA and BibTeX.

For detailed citation information, please refer to the CITATION.cff file.

Requirements

  • Python 3.9+
  • Pip (installed by default in newer versions of Python)
  • C++ compiler that can be used by pip
  • Numpy (will be installed automatically by pip)
  • The instruction below are written assuming you have access to a command shell on Linux / UNIX / MacOSX / Cygwin

Installation

The easiest way to install eFEL is to use pip

pip install efel

In case you don't have administrator access this command might fail with a permission error. In that case you could install eFEL in your home directory

pip install efel --user

Or you could use a python virtual environment

virtualenv pythonenv
. ./pythonenv/bin/activate
# If you use csh or tcsh, you should use:
# source ./pythonenv/bin/activate.csh
pip install efel

If you want to install straight from the github repository you can use

pip install git+git://github.com/BlueBrain/eFEL

Quick Start

First you need to import the module

import efel

To get a list with all the available feature names

efel.get_feature_names()

To change the spike detection threshold setting (default is -20 mV)

efel.set_setting('Threshold', -30)

For a full list of available settings, please refer to the Setting class

The python function to extract features is get_feature_values(...). Below is a short example on how to use this function. The code and example trace are available here

"""Basic example 1 for eFEL"""

import efel
import numpy

def main():
    """Main"""

    # Use numpy to read the trace data from the txt file
    data = numpy.loadtxt('example_trace1.txt')

    # Time is the first column
    time = data[:, 0]
    # Voltage is the second column
    voltage = data[:, 1]

    # Now we will construct the datastructure that will be passed to eFEL

    # A 'trace' is a dictionary
    trace1 = {}

    # Set the 'T' (=time) key of the trace
    trace1['T'] = time

    # Set the 'V' (=voltage) key of the trace
    trace1['V'] = voltage

    # Set the 'stim_start' (time at which a stimulus starts, in ms)
    # key of the trace
    # Warning: this need to be a list (with one element)
    trace1['stim_start'] = [700]

    # Set the 'stim_end' (time at which a stimulus end) key of the trace
    # Warning: this need to be a list (with one element)
    trace1['stim_end'] = [2700]

    # Multiple traces can be passed to the eFEL at the same time, so the
    # argument should be a list
    traces = [trace1]

    # set the threshold for spike detection to -20 mV
    efel.set_setting('Threshold', -20)

    # Now we pass 'traces' to the efel and ask it to calculate the feature
    # values
    traces_results = efel.get_feature_values(traces,
                                           ['AP_amplitude', 'voltage_base'])

    # The return value is a list of trace_results, every trace_results
    # corresponds to one trace in the 'traces' list above (in same order)
    for trace_results in traces_results:
        # trace_result is a dictionary, with as keys the requested features
        for feature_name, feature_values in trace_results.items():
            print("Feature %s has the following values: %s" %
                (feature_name, ', '.join([str(x) for x in feature_values])))


if __name__ == '__main__':
    main()

The output of this example is

Feature AP_amplitude has the following values: 72.5782441262, 46.3672552618, 41.1546679158, 39.7631750953, 36.1614653031, 37.8489295737
Feature voltage_base has the following values: -75.446665721

This means that the eFEL found 5 action potentials in the voltage trace. The amplitudes of these APs are the result of the 'AP_amplitude' feature. The voltage before the start of the stimulus is measured by 'voltage_base'. Results are in mV.

Full documentation

The full documentation can be found here

Funding

This work has been partially funded by the European Union Seventh Framework Program (FP7/2007­2013) under grant agreement no. 604102 (HBP), the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 720270, 785907 (Human Brain Project SGA1/SGA2) and by the EBRAINS research infrastructure, funded from the European Union’s Horizon 2020 Framework Programme for Research and Innovation under the Specific Grant Agreement No. 945539 (Human Brain Project SGA3). This project/research was supported by funding to the Blue Brain Project, a research center of the École polytechnique fédérale de Lausanne (EPFL), from the Swiss government’s ETH Board of the Swiss Federal Institutes of Technology.

Copyright (c) 2009-2024 Blue Brain Project/EPFL

efel's People

Contributors

alex4200 avatar anilbey avatar anirban6908 avatar apdavison avatar arnaudon avatar aurelienjaquier avatar croessert avatar darshanmandge avatar dependabot[bot] avatar drtada avatar gitter-badger avatar ilkilic avatar jdcourcol avatar joffreygonin avatar liesbethvanherpe avatar luis-rr avatar mariarv avatar mgeplf avatar orena1 avatar penguinpee avatar pitmonticone avatar wvangeit avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

efel's Issues

Failed building on Windows

It seems running the pip install efel command on Windows (10) fails for both python 2.7.11 using standalone Visual C++ Compiler for Python 2.7 (Visual C++ 9.0) installed as well as python 3.5.1 using Visual Studio 14.0

Here is the log file when trying to build for python 3.5.1
pip install efel output.txt

Mistake in documentation for peak indices (2nd) efeature

Hello

I was checking the pseudo-code for peak indices (2nd) in the efeature documentation PDF, and I think there is a mistake.

Where it says:

h1 = V[max_i] - min_i
h2 = V[max_i] - min_i+1

it should read:

h1 = V[max_i] - V[min_i]
h2 = V[max_i] - V[min_i+1]

because min_i and min_i+1 are just indices, right?

Also, it lists T in the required trace data, but it's never used in the pseudocode.

Cheers!

installation on virtual env does not work

I am trying to install eFEL as a prerequisite for sonata-network-reduction with:
pip install git+git://github.com/BlueBrain/eFEL

however, the installation is terminated with

... gcc -Wno-unused-result -Wsign-compare -Wunreachable-code -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -I/Users/MustafaKeremKurban/anaconda3/include -arch x86_64 -I/Users/MustafaKeremKurban/anaconda3/include -arch x86_64 -Iefel/cppcore/ -I/Users/MustafaKeremKurban/anaconda3/include/python3.7m -c efel/cppcore/cppcore.cpp -o build/temp.macosx-10.7-x86_64-3.7/efel/cppcore/cppcore.o
warning: include path for stdlibc++ headers not found; pass '-stdlib=libc++' on the command line to use the libc++ standard library instead [-Wstdlibcxx-not-found]
efel/cppcore/cppcore.cpp:39:10: fatal error: 'cstddef' file not found
#include
^~~~~~~~~
1 warning and 1 error generated.
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Command errored out with exit status 1: /Users/MustafaKeremKurban/Desktop/BBP_internship/sonata-network-reduction/tests/data/CA1.O1/sonata/mypython/bin/python -u -c 'import sys, setuptools, tokenize; sys.argv[0] = '"'"'/private/var/folders/yh/cnjh7mlx0ylc6ns89scsqjmw0000gp/T/pip-req-build-3y53ds4w/setup.py'"'"'; file='"'"'/private/var/folders/yh/cnjh7mlx0ylc6ns89scsqjmw0000gp/T/pip-req-build-3y53ds4w/setup.py'"'"';f=getattr(tokenize, '"'"'open'"'"', open)(file);code=f.read().replace('"'"'\r\n'"'"', '"'"'\n'"'"');f.close();exec(compile(code, file, '"'"'exec'"'"'))' install --record /private/var/folders/yh/cnjh7mlx0ylc6ns89scsqjmw0000gp/T/pip-record-tcc0tcir/install-record.txt --single-version-externally-managed --compile --install-headers /Users/MustafaKeremKurban/Desktop/BBP_internship/sonata-network-reduction/tests/data/CA1.O1/sonata/mypython/include/site/python3.7/efel Check the logs for full command output.

Is this an access issue or is there a prerequisite for eFEL as well?

fatal error: 'cstddef' file not found

Should efel return spike height for spikes that are not between stim_start and stim_end?

Hi,
I have this example trace:
image

stim_start = 700
stim_end = 2700

I assume the results of AP_height and time_to_first_spike will be calculated only in the time of the stimulus, but I get these results:

[{'time_to_first_spike': array([-693.2]),
  'AP_height': array([ 10.27113993, -12.94247327])}]

This is the full code:

import efel
import pandas as pd
df = pd.read_pickle('temp_v.pkl')
trace1 = {'T': df['time'], 'V':df['voltage']}
trace1['stim_start'] = [700]
trace1['stim_end'] = [2700]
traces_results = efel.getFeatureValues([trace1],
                                ['time_to_first_spike','AP_height'])

df.plot(x='time',y='voltage')

Thanks

temp_v.zip

Make ahp indices fall within strict stim interval

Reported by @basjanzandt

eFEL detects the repolarization after the end of a stimulus as an AHP if the stimulus ends after an AP when Vm is still decreasing (see attached screenshot; three traces, the orange one has an AHP detected after the stimulus ends).
The AHP features also ignore the stimulus starts / ends.

screen shot 2017-01-31 at 14 33 10

AP_Begin_Indices not returned

import scipy.io
import efel
import numpy as np

mat = np.loadtxt('2019-11-19_001.csv', delimiter = ',')
efel.setDoubleSetting('interp_step',0.05)
efel.setDoubleSetting('voltage_base_start_perc',0.2)
efel.setDoubleSetting('voltage_base_end_perc',0.7)


trace1 = {}
trace1['T'] = mat['Cell2Data'][:,0]
trace1['V'] = mat['Cell2Data'][:,8]
trace1['stim_start'] = [4001]
trace1['stim_end'] = [14000]

traces = [trace1]
traces_results = efel.getFeatureValues(traces,[
                'Spikecount','spike_width2','ISI_values','peak_time','peak_indices','min_AHP_indices','min_AHP_values','AP_begin_indices'])

for trace_results in traces_results:
    for feature_name, feature_values in trace_results.items():
        print('Feature %s has the following values: %s \n' % \
            (feature_name, ', '.join([str(x) for x in feature_values])))


Feature Spikecount has the following values: 16 

Feature spike_width2 has the following values: 1.3199992023340599, 1.3681604853483122, 1.4038389448111275, 1.3759173549383377, 1.4692812948353549, 1.4395556875952025, 1.4724118153143309, 1.403828264758772, 1.392087929915931, 1.4707707707693771, 1.4399167398839836, 1.45901901901766, 1.4153947289773896, 1.4531464368715206, 1.4011604536254936 

Feature ISI_values has the following values: 28.45000000000644, 30.500000000006935, 30.850000000007014, 27.950000000006355, 32.350000000007356, 31.80000000000723, 32.000000000007276, 33.55000000000763, 32.80000000000052, 34.79999999996835, 31.49999999997135, 34.89999999996826, 34.89999999996826, 32.34999999997058 

Feature peak_time has the following values: 211.05000000001374, 237.80000000001982, 266.25000000002626, 296.7500000000332, 327.6000000000402, 355.55000000004657, 387.9000000000539, 419.70000000006115, 451.7000000000684, 485.25000000007606, 518.0500000000766, 552.8500000000449, 584.3500000000163, 619.2499999999845, 654.1499999999528, 686.4999999999234 

Feature peak_indices has the following values: 4221, 4756, 5325, 5935, 6552, 7111, 7758, 8394, 9034, 9705, 10361, 11057, 11687, 12385, 13083, 13730 

Feature min_AHP_indices has the following values: 4276, 4813, 5384, 5999, 6614, 7173, 7817, 8464, 9106, 9767, 10421, 11119, 11749, 12449, 13147, 13796 

Feature min_AHP_values has the following values: -48.52588388566235, -42.93635157193366, -40.93785957149463, -41.218897509056745, -40.59436875891978, -39.5951227586999, -39.6888020712203, -40.656821633933454, -41.1564446340431, -40.56314232141274, -39.626349196206185, -40.188425071330286, -39.72002850872746, -40.68804807144005, -40.81295382146781, -40.34455725886475 

Feature AP_begin_indices has the following values:  

2019-11-19_001.xlsx
Sorry, can't attach CSV.

Per code and output above, we can extract a number of parameters. However, AP_begin_indices does not return anything. I've run the example_trace1.txt code and I am able to extract AP_begin_indices there. Any insight into this issue is appreciated.

Decay Time Constant

I am also not sure how to get the decay time constant to compute. For example, here I was trying to use it to calculate the sag time constant, but it is returning nan when I run it. (This is the same file that returns the negative of the input resistance, in case the one I attached to the reply on the other issue didn't make it to you.)

MWE3.txt

MWE.zip

Problems detecting the onset of the first spike

Hey, I've managed to extract almost all desired spike features except for the latency of the onset of the first spike. I played around with

efel.setDerivativeThreshold(n)

using values between 1 and 20, but none of them shifted the onset. I will attach screenshots of my trials using n=1, n=10, n=20. Do you have any idea what else I could do to successfully find the beginning of the first spike? The red dots display what is found by AP_begin_time and AP_begin_voltage.

stim_2 5_1
stim_2 5_10
stim_2 5_20

New features for AHP after burst

image

This feature should calculate the voltage (absolute value) at the points marked with "x".

Possible steps are:

  • identify peaks that belong to bursts (set of spike with frequency > 150 Hz in this case). The trace 'burst_1' should have 2 bursts, while the others just one.
  • calculate the slow AHPs (absolute value) after the last spike in the burst ("sAHP_after_burst_abs") . This could be the minimum during a certain time range after the last peak in the burst (e.g. between 10 and 50 ms after the last peak, to be discussed). However, I'm not sure this would be the best way for trace "burst_2".
  • Calculate additional features for:
    • sAHP amplitude from voltage base
    • sAHP from steady_state_voltage_stimend
    • amplitude of the first sAHP
    • amplitude of the second sAHP

I hope it's clear, feel free to add any comments.

Below the 3 traces used to produce the figure.
burst_1.txt
burst_2.txt
burst_3.txt

AP_end_indices needs some attention

As a followup on an issue encountered by @a1eko, we should look deeper into the AP_end_indices feature. AP_begin_indices was reimplemented in LibV5, but we also need a clean up version of AP_end_indices.

Add instructions for developers on how to add a new eFeature

Add a step-by-step guide that explains users how to add a feature.
Should include:

  • Add it to efel/DependencyV5.txt
  • Add reference in efel/cppcore/FillFptrTable.cpp
  • Add type in efel/cppcore/cfeature.cpp:cFeature::fillfeaturetypes
  • Add declaration to efel/cppcore/LibV5.h
  • Implement it in efel/cppcore/LibV5.cpp
  • Add documentation

fixing tests:

  • Add it to tests/testdata/allfeatures/expectedresults.json
  • Add it to tests/featuresnames.json
  • Add a simple test in tests/test_basic.py

ambiguous burst number and wrong location

I have a couple of possible related issues.

  1. The burst_number can be 1 even if there are no burst in the traces.
    Than, how should I interpret the burst_number = 1? 1 or 2 bursts?
  2. burst_ISI_indices seems not to work properly. In one of the traces I am working on, I expect 1 or 2 bursts occur at the very beginning on the trace, but I obtained burst_ISI_indices = 5.

Error with stim_start or stim_end

Hello,

This may be a basic error on my part as I am new to python, but I have defined stim_start and stim_end but they are not being recognized.

A little bit about my dataset -- I extracted data from an .nwb file, where it had been stored in volts and seconds. Must the units be in mV and ms? I also had to calculate the time array from the parameters stored in the .nwb file because the timestamps attribute was empty and only the start time and sampling rate was stored by my acquisition system. I defined stim_start and stim_end as the third and third to last values in the time array because I wanted all of the spikes to be included in the results.

This is the code I used and the resulting error:
n = nwbfile.acquisition['continuous_signals']
v = n.data[:, 6]
timesamples = np.linspace(0.0, stop = len(v)*(1/30000), num = len(v))
trace1 = {}
trace1['T'] = timesamples
trace1['V'] = v
trace1['stim_start'] = [6.66667520e-05]
trace1['stim_end'] = [2.60564667e+01]
traces_results = efel.getFeatureValues(trace1, ['AP_amplitude', 'AHP_depth_abs', 'AP_duration_half_widwth', 'AP_width'])

Exception Traceback (most recent call last)
in
----> 1 traces_results = efel.getFeatureValues(trace1, ['AP_amplitude', 'AHP_depth_abs', 'AP_duration_half_widwth', 'AP_width'])
~\anaconda3\lib\site-packages\efel\api.py in getFeatureValues(traces, featureNames, parallel_map, return_list, raise_warnings)
430
431 if return_list:
--> 432 return list(map_result)
433 else:
434 return map_result

~\anaconda3\lib\site-packages\efel\api.py in _get_feature_values_serial(trace_featurenames)
468
469 else:
--> 470 raise Exception('stim_start or stim_end missing from trace')
471
472 _initialise()

Exception: stim_start or stim_end missing from trace

Building wheel

@anilbey , @wizmer offered to help building wheels for eFEL. Can you work with him on that.

Extra points for a Windows wheel ;-)

New version of voltage_base

The LibV1 voltage_base feature calculate the mean voltage between 25% - 75% before the stimulus.
However, during this time there is a high chance the cell is still stabilising it's voltage.
A new version (LibV5) version of this feature is necessary to calculate the mean voltage between 90% - 100%. The DependencyV5.txt would then be changed to let all the dependent features use this voltage_base instead.

AP_duration_half_width rounded of to nearest 0.1 ms?

Hi,
I'm trying out the library so possible that I have done something wrong, but seems like spike durations are rounded of to closest 0.1 ms (have run ~200 traces that all belongs to discrete values 0.9, 1.0 or 1.1). Is this the intended behavior?

Here's the function I use:

def extract_features(t,y):
    # extracts electrical features from trace using bbp efel library
    
    import efel
    
    # code based on example example code from: https://github.com/BlueBrain/eFEL --------------------
    
    # A 'trace' is a dictionary
    trace1 = {}

    # Set the 'T' (=time) key of the trace
    trace1['T'] = t

    # Set the 'V' (=voltage) key of the trace
    trace1['V'] = y

    # Set the 'stim_start' (time at which a stimulus starts, in ms)
    # key of the trace
    # Warning: this need to be a list (with one element)
    trace1['stim_start'] = [100]

    # Set the 'stim_end' (time at which a stimulus end) key of the trace
    # Warning: this need to be a list (with one element)
    trace1['stim_end'] = [1000]

    # Multiple traces can be passed to the eFEL at the same time, so the
    # argument should be a list
    traces = [trace1]

    # Now we pass 'traces' to the efel and ask it to calculate the feature
    # values
    traces_results = efel.getFeatureValues(traces,
                                           ['AP_begin_voltage', \
                                            'AP_amplitude', \
                                            'AP_duration_half_width', \
                                            'voltage_base']
                                          )

Calculate features after stim_end (e.g. rebound spikes)

I would like to calculate features in certain (configurable) time window after stim_end. I am attaching an example trace, where there are five spike after the end of the stimulus (stimulus ends at 3250 ms).
rebound.txt

image

One obvious way would be to set stim_start and stim_end to 3250 and 3500 ms for the trace above for calculating the features. However, I don't think this would work during optimization, because stim_start and stim_end are used to create the stimulus (and in this case they should be 250 and 3250 ms).

What would be the best approach here? Should we just create new features, e.g. "Spikecount_rebound", "time_to_first_spike_rebound", etc...? Or maybe add an option to detect features between stim_end and stim_end + user_defined_time_after_stim_end?

New feature to measure voltage "sag".

Would it be possible to implement a feature called "sag_ratio? A common definition according to NeuroElectro.org, could be: "Ratio between the steady state decrease in the voltage and the largest decrease in voltage following a hyperpolarizing current step"

I think we can assume to have a hyperpolarizing current step.
For the implementation, I see two potential ways:

  1. Use the features "voltage_deflection", "minimum_voltage", "voltage_base" which already exist, then:
    sag_ratio = (minimum_voltage - voltage_deflection)/(minimum_voltage - voltage_base). From the source code, it seems that "minimum_voltage" computes the absolute minimum between stim_start and stim_end.

  2. Instead of using the absolute minimum, using a (time) window to get more robust estimate of the peak, similar to the "estimate_sag" function in the AllenSDK. For example they compute the mean voltage between t[peak_index] - peak_width / 2. and t[peak_index] + peak_width / 2. with peak_index = 0.005 sec.

This issue actually started from here. I have incorrectly thought that the "voltage_deflection_begin" was giving the value of ("minimum_voltage" - "voltage_base").

Interpolate for all features

E.g. voltage_base doesn't trigger the interpolation of the trace.
Ideally interpolation of the trace should be triggered for all the features

Where can one find the changelog?

Hello,

I maintain efel in Fedora as part of the NeuroFedora team. Where can we find the changelog to see what has changed between releases? When we update the package, it is very useful to given some information on what new releases brings. Here, for example:

https://bodhi.fedoraproject.org/updates/FEDORA-2019-df28546c8e

Additionally, would be possible to keep the releases/tags on github and pypi in sync? That just makes it easier for us to find the commit for a release and get some information on the commit history/changes.

please include tests in pypi source tars

Hello,

Would it please be possible to include the tests in the pypi tars so that downstream users (like us Linux distributions) can run the tests too?

Because versioneer is used here, a few issues crop up:

  • it is non-trivial to match pypi releases to untagged github commits,
  • if one does manage to locate the matching commit, versioneer cannot generate version information from github generated archives (see python-versioneer/python-versioneer#140 (comment))

So, including the tests in the pypi tars will simplify things quite a bit for those of us who rely on the pypi tar.

Cheers,

voltage_base calc is wrong

Calculation for voltage_base is wrong. There is a clue to this in the documentation, which claims that stim_end is required to calculate the value, when it should not be necessary.

Calculating this on my own code, where the stimulus starts at 530 ms and ends at 1530 ms, I find the mean voltage from 477 to 530 ms is -68 mV. If I calculate the mean voltage for the last 10% of the time DURING stimulation, from 1377 to 1530 ms, I get -39 mV which is what eFEL reports for the voltage_base property.


LibV5 : voltage_base

The average voltage during the last 10% of time before the stimulus.

Required features: t, V, stim_start, stim_end
Parameters: voltage_base_start_perc (default = 0.9)
voltage_base_end_perc (default = 1.0)

Units: mV
Pseudocode:

voltage_base = numpy.mean(voltage[numpy.where(
(t >= voltage_base_start_perc * stim_start) &
(t <= voltage_base_end_perc * stim_start))])

eFEL fails to import

eFEL fails to import regardless of whether it is installed via pip, or if it is git cloned and then
$ipython setup.py install

import efel

ImportError Traceback (most recent call last)
in ()
----> 1 import efel

/Users/kappa/git/DEAP_applied/efel/init.py in ()
21
22 from efel.settings import Settings
---> 23 from efel.api import *
24 import efel.io
25

/Users/kappa/git/DEAP_applied/efel/api.py in ()
32
33 import efel
---> 34 import efel.cppcore as cppcore
35
36 _settings = efel.Settings()

ImportError: No module named cppcore

Autogenerate package.json

There is at the moment a hardcoded internal BBP related file in the repo: 'package.json'.
This file should be automatically generated.
Related to: #118

Spikes are counted outside the stimulus

Not sure if this should be reported as a bug or as a request for enhancement, depending on whether the behavior I'm reporting is intended or not. I used a snippet of code inspired from the GitHub main page:

        trace = {}
	trace['T'] = copy(t_vec)
	trace['V'] = copy(v_vec)
	trace['stim_start'] = [h.stim.delay]
	trace['stim_end'] = [h.stim.delay + h.stim.dur]
	traces.append(trace)
	traces_results = efel.getFeatureValues(traces, ['Spikecount'])

and it took me quite a while to realize that Spikecount (an many other features I guess) is actually not taken into account the stim_start and stim_end and will include in its count any spikes in the trace, regardless of the stimulus window. Is that intended? If not, it should definitely be corrected. If yes, I would suggest adding some boolean parameter allowing the users to specify if they want the features to be computed on the full trace or on the stimulus window only.

NameError: global name 'exit' is not defined

When I use efel, it seems that when I use a Feature that does not exist, I get the following error.
I used 'min_voltage_between_spike' instead of 'min_voltage_between_spikes'
but I assume this is not the correct error handling

python 2.7.10
efel.version 2.3.73

NameError                                 Traceback (most recent call last)
<ipython-input-9-36d61bc18c9d> in <module>()
      2                                    ['number_initial_spikes', 'AP_amplitude','ISI_log_slope_skip','burst_number'
      3                                     ,'voltage_base','mean_frequency','AP2_AP1_peak_diff','min_voltage_between_spike'
----> 4                                     ,'time_to_second_spike'])

/home/users/oren.amsalem/anaconda/lib/python2.7/site-packages/efel/api.pyc in getFeatureValues(traces, featureNames)
    260                 print "Feature %s has an unknown type: %s" % \
    261                     (featureName, featureType)
--> 262                 exit(1)
    263             if exitCode < 0:
    264                 import warnings

NameError: global name 'exit' is not defined

Thanks.

What do certain settings do - where to look it up?

Hey,

thanks for this amazing toolbox! If it works it will save me so much work. I have intracellular recordings of leech neurons. We injected different electrical current during recording, which elicited action potentials. I try to detect certain spike train characteristics, yet for some stimulus values the toolbox doesn't detect action potentials correctly, yet. I already found out that I can change certain setting using

setDoubleSetting('spike_skipf', 0.1) setIntSetting('max_spike_skip', 2) setDoubleSetting('Threshold', _settings.threshold) setDoubleSetting('DerivativeThreshold', _settings.derivative_threshold) setDoubleSetting('interp_step', 0.1) setDoubleSetting('burst_factor', 1.5) setDoubleSetting('voltage_base_start_perc', 0.9) setDoubleSetting('voltage_base_end_perc', 1.0) setDoubleSetting("initial_perc", 0.1) setDoubleSetting("min_spike_height", 20.0) setIntSetting("strict_stiminterval", 0)

However, instead of randomly changing those values until my peaks are detected correctly, I would like to look up what these settings actually mean. I only found documentation for Threshold and DerivativeThreshold. Is there documentation for all setting somewhere? I will upload two plots showing trials in which spikes are detected wrongly or not at all.

stim_1 0
stim_1 75

Calculating input resistance - how to provide stimulus info?

When I try to access the input resistance feature, I am getting this error message:
/Library/Python/2.7/site-packages/efel/api.py:367: RuntimeWarning: Error while calculating feature ohmic_input_resistance:
Feature [stimulus_current] is missing

But I don't see a stimulus current feature anywhere, and if I try to request it from the list of features to calculate, I get this error:
Traceback (most recent call last):
File "MWE.py", line 42, in
depol_results = efel.getFeatureValues(depoltraces, ['stimulus_current','voltage_base','voltage_deflection','ohmic_input_resistance'])
File "/Library/Python/2.7/site-packages/efel/api.py", line 314, in getFeatureValues
map_result = parallel_map(_get_feature_values_serial, traces_featurenames)
File "/Library/Python/2.7/site-packages/efel/api.py", line 359, in _get_feature_values_serial
exitCode = cppcore.getFeature(featureName, cppcoreFeatureValues)
TypeError: Unknown feature name

This happened in both versions of efel that I've tried: u'2.11.31' and u'2.11.41'.

More generally, I couldn't see where to provide the stimulus information in the first place. I had thought the trace dict would make sense, but it seems to only expect a time vector, a voltage vector, and the start and end times of the stimulus but not the amplitude of the stimulus that would be needed to calculate the input resistance. Thanks.

Peak Times Rounding Issue

I'm running the EFEL code in an anaconda environment in Ubuntu. I'm in the process of validating select features on an I/V curve. When comparing the EFEL Feature output (peak voltage/times) to the MATLAB findpeaks output, the outputs were not the same. Upon closer inspection, it seems that there is a peak time rounding issue (highlighted in the attached screenshot). EFEL seems to limit the peak time output to one decimal place, even though there is higher precision (20kHz sampling frequency and each sample is 0.05ms). In turn, this changes selected peak voltages, ISI values, etc.

validation_data.txt
peak_times_screenshot

run eFEL in 32 bit environment on Mac

Hi, I am using a tool named Optimizer, which both need wxpython2.8(only this version) and efel. Because wxpython2.8 could only run in 32-bit environment so I forcibly change my environment by this code:

defaults write com.apple.versioner.python Prefer-32-Bit -bool yes

then when I import efel

>>> import efel
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Library/Python/2.7/site-packages/efel/__init__.py", line 23, in <module>
    from efel.api import *
  File "/Library/Python/2.7/site-packages/efel/api.py", line 36, in <module>
    import efel.cppcore as cppcore
ImportError: dlopen(/Library/Python/2.7/site-packages/efel/cppcore.so, 2): no suitable image found.  Did find:
	/Library/Python/2.7/site-packages/efel/cppcore.so: mach-o, but wrong architecture
	/Library/Python/2.7/site-packages/efel/cppcore.so: mach-o, but wrong architecture

Is there any methods for me to run efel in 32 bit environment?

Spikecount cannot be estimated when signal at the end of the trace is larger than the threshold

This was reported by @sasaray.

First trace gives Spikecount 3 while second trace returns Spikecount 0.
When the signal at the end of the trace is larger than the threshold, Spikecount and possibly other features cannot be estimated. This seems to be independent of stim_end.

figure_1

import numpy
import matplotlib
import matplotlib.pyplot as plt
import efel

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.

traces = []
trace = {}
trace['T'] = numpy.arange(len(v))*dt
trace['V'] = v
trace['stim_start'] = [10]
trace['stim_end'] = [50]
traces.append(trace)

plt.subplot(2,1,1)
plt.plot(trace['T'], trace['V'])

traces_results = efel.getFeatureValues(traces,['Spikecount'])
print traces_results

# 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(traces,['Spikecount'])
print traces_results

plt.subplot(2,1,2)
plt.plot(trace['T'], trace['V'])
plt.show()

Precision loss in floating point numbers is distorting the feature results

Issue summary

The precision loss is falsifying the outcomes of multiple C++ features.
The two values below were supposed to be equal. The comparison (>) operator was expected to evaluate false between these two numbers, however it evaluates as true.
___t[i]: 500.00000000004519052
endTime: 500.00000000000000000

Example C++ feature (voltage_base)

The voltage_base feature of LibV5 for example is computing a mean value of the vector within a defined start and ending index here:

eFEL/efel/cppcore/LibV5.cpp

Lines 2261 to 2279 in 3b09294

int nCount = 0;
double vSum = 0;
// calculte the mean of voltage between startTime and endTime
for (size_t i = 0; i < t.size(); i++) {
if (t[i] > endTime) break;
if (t[i] >= startTime) {
vSum = vSum + v[i];
nCount++;
}
}
if (nCount == 0) {
GErrorStr +=
"\nvoltage_base: no data points between startTime and endTime\n";
return -1;
}
vRest.push_back(vSum / nCount);

Having tested it multiple times, I can surely say there is nothing wrong in this code's logic.
I also implemented it in Python and tested.

In the test (written in Python) however, the results differ,

voltage_base = numpy.mean(interp_voltage[numpy.where(
(interp_time >= 0.9 * stim_start) & (interp_time <= stim_start))])
nt.assert_almost_equal(voltage_base, feature_values[0]['voltage_base'][0],
places=5)

The original data is a 1 dimensional vector of size 14001. The subvector within the start and end boundaries is of size 501.

  • In Python the mean operation above adds up 501 elements that result in -35844.15544
  • In C++ the mean operation above adds up 500 elements that result in -35772.609232

After performing the division in both C++ and Python the results get similar up to the first 5 digits of precision. However that difference is already greater than the difference in using median instead of mean.

Why is this happening?

The comparison operation in the line below evaluates true when both operands are equal to 500.000

if (t[i] > endTime) break;

They are both literally equal to 500.000
I had to increase the print precision using std::setprecision to see the difference.

I noticed this issue while I was implementing the current-base feature with median option here.
https://github.com/anilbey/eFEL/tree/current-voltage-bases.

There may be similar errors in other features due to precision. The voltage base feature alone is already used by many of the other features.

How to reproduce?

  1. Go to this test file
    voltage_base = numpy.mean(interp_voltage[numpy.where(
    (interp_time >= 0.9 * stim_start) & (interp_time <= stim_start))])
    nt.assert_almost_equal(voltage_base, feature_values[0]['voltage_base'][0],
    places=5)
  2. Delete the named parameter called places or set it to a big value such as 8.
  3. There will be an error. A simple mean operation on this test data shouldn't make that amount of difference between different programming languages. You can further debug and look into the sizes of vectors in C++ and Python and you will see that C++ container has one less element than the Python array.

check_AISInitiation documentation

Hi,
Could you add the documentation for efeature check_AISInitiation? From the code it looks like it returns None when there is no spike in soma, AIS or when the spike initiates in soma before AIS. What is the output when the check passes - the spikecount?

Thanks

Pip install failing

On my Arch system with gcc (GCC) 6.2.1 20160830, running

pip install efel 

fails. Log is below (same error when installing from git), any suggestions?

Collecting efel
  Using cached efel-2.10.115.tar.gz
Requirement already satisfied: numpy>=1.6 in ./.conda/envs/bluebrain/lib/python2.7/site-packages (from efel)
Requirement already satisfied: six in ./.conda/envs/bluebrain/lib/python2.7/site-packages (from efel)
Building wheels for collected packages: efel
  Running setup.py bdist_wheel for efel: started
  Running setup.py bdist_wheel for efel: finished with status 'error'
  Complete output from command /home/denis/.conda/envs/bluebrain/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-Xh83bq/efel/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" bdist_wheel -d /tmp/tmp2S2pJjpip-wheel- --python-tag cp27:
  running bdist_wheel
  running build
  running build_py
  creating build
  creating build/lib.linux-x86_64-2.7
  creating build/lib.linux-x86_64-2.7/efel
  copying efel/_version.py -> build/lib.linux-x86_64-2.7/efel
  copying efel/settings.py -> build/lib.linux-x86_64-2.7/efel
  copying efel/io.py -> build/lib.linux-x86_64-2.7/efel
  copying efel/api.py -> build/lib.linux-x86_64-2.7/efel
  copying efel/__init__.py -> build/lib.linux-x86_64-2.7/efel
  copying efel/DependencyV5.txt -> build/lib.linux-x86_64-2.7/efel
  creating build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/Utils.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/LibV1.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/LibV2.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/LibV3.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/LibV4.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/LibV5.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/FillFptrTable.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/DependencyTree.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/efel.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/cfeature.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/Global.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/mapoperations.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/types.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  copying efel/cppcore/eFELLogger.h -> build/lib.linux-x86_64-2.7/efel/cppcore
  UPDATING build/lib.linux-x86_64-2.7/efel/_version.py
  set build/lib.linux-x86_64-2.7/efel/_version.py to '2.10.115'
  running build_ext
  building 'efel.cppcore' extension
  creating build/temp.linux-x86_64-2.7
  creating build/temp.linux-x86_64-2.7/efel
  creating build/temp.linux-x86_64-2.7/efel/cppcore
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/cppcore.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/cppcore.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  efel/cppcore/cppcore.cpp: In function ‘PyObject* getDistance_wrapper(PyObject*, PyObject*, PyObject*)’:
  efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
     static char *kwlist[] = {"feature_name", "mean", "std", "trace_check", NULL};
                                                                                ^
  efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/Utils.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/Utils.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV1.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV1.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  efel/cppcore/LibV1.cpp: In function ‘int __maxmin_voltage(const std::vector<double>&, const std::vector<double>&, double, double, std::vector<double>&, std::vector<double>&)’:
  efel/cppcore/LibV1.cpp:1541:59: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             t[stimstartindex] < stimStart && stimstartindex <= t.size();
                                              ~~~~~~~~~~~~~~~^~~~~~~~~~~
  efel/cppcore/LibV1.cpp:1544:55: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             t[stimendindex] < stimEnd && stimstartindex <= t.size();
                                          ~~~~~~~~~~~~~~~^~~~~~~~~~~
  efel/cppcore/LibV1.cpp:1547:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (stimstartindex >= t.size()) {
         ~~~~~~~~~~~~~~~^~~~~~~~~~~
  efel/cppcore/LibV1.cpp:1552:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if (stimendindex >= t.size()) {
         ~~~~~~~~~~~~~^~~~~~~~~~~
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV2.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV2.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV3.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV3.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV4.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV4.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV5.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV5.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/FillFptrTable.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/FillFptrTable.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/DependencyTree.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/DependencyTree.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/efel.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/efel.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/cfeature.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/cfeature.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/mapoperations.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/mapoperations.o
  cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
  -std=c++98 -pthread -shared -L/home/denis/.conda/envs/bluebrain/lib -Wl,-rpath=/home/denis/.conda/envs/bluebrain/lib,--no-as-needed build/temp.linux-x86_64-2.7/efel/cppcore/cppcore.o build/temp.linux-x86_64-2.7/efel/cppcore/Utils.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV1.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV2.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV3.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV4.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV5.o build/temp.linux-x86_64-2.7/efel/cppcore/FillFptrTable.o build/temp.linux-x86_64-2.7/efel/cppcore/DependencyTree.o build/temp.linux-x86_64-2.7/efel/cppcore/efel.o build/temp.linux-x86_64-2.7/efel/cppcore/cfeature.o build/temp.linux-x86_64-2.7/efel/cppcore/mapoperations.o -L/home/denis/.conda/envs/bluebrain/lib -lpython2.7 -o build/lib.linux-x86_64-2.7/efel/cppcore.so
  unable to execute '-std=c++98': No such file or directory
  error: command '-std=c++98' failed with exit status 1
  
  ----------------------------------------
  Failed building wheel for efel
  Running setup.py clean for efel
Failed to build efel
Installing collected packages: efel
  Running setup.py install for efel: started
    Running setup.py install for efel: finished with status 'error'
    Complete output from command /home/denis/.conda/envs/bluebrain/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-Xh83bq/efel/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-wrsKfh-record/install-record.txt --single-version-externally-managed --compile:
    running install
    running build
    running build_py
    creating build
    creating build/lib.linux-x86_64-2.7
    creating build/lib.linux-x86_64-2.7/efel
    copying efel/_version.py -> build/lib.linux-x86_64-2.7/efel
    copying efel/settings.py -> build/lib.linux-x86_64-2.7/efel
    copying efel/io.py -> build/lib.linux-x86_64-2.7/efel
    copying efel/api.py -> build/lib.linux-x86_64-2.7/efel
    copying efel/__init__.py -> build/lib.linux-x86_64-2.7/efel
    copying efel/DependencyV5.txt -> build/lib.linux-x86_64-2.7/efel
    creating build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/Utils.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/LibV1.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/LibV2.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/LibV3.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/LibV4.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/LibV5.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/FillFptrTable.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/DependencyTree.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/efel.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/cfeature.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/Global.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/mapoperations.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/types.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    copying efel/cppcore/eFELLogger.h -> build/lib.linux-x86_64-2.7/efel/cppcore
    UPDATING build/lib.linux-x86_64-2.7/efel/_version.py
    set build/lib.linux-x86_64-2.7/efel/_version.py to '2.10.115'
    running build_ext
    building 'efel.cppcore' extension
    creating build/temp.linux-x86_64-2.7
    creating build/temp.linux-x86_64-2.7/efel
    creating build/temp.linux-x86_64-2.7/efel/cppcore
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/cppcore.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/cppcore.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    efel/cppcore/cppcore.cpp: In function ‘PyObject* getDistance_wrapper(PyObject*, PyObject*, PyObject*)’:
    efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
       static char *kwlist[] = {"feature_name", "mean", "std", "trace_check", NULL};
                                                                                  ^
    efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
    efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
    efel/cppcore/cppcore.cpp:212:78: warning: ISO C++ forbids converting a string constant to ‘char*’ [-Wwrite-strings]
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/Utils.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/Utils.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV1.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV1.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    efel/cppcore/LibV1.cpp: In function ‘int __maxmin_voltage(const std::vector<double>&, const std::vector<double>&, double, double, std::vector<double>&, std::vector<double>&)’:
    efel/cppcore/LibV1.cpp:1541:59: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
               t[stimstartindex] < stimStart && stimstartindex <= t.size();
                                                ~~~~~~~~~~~~~~~^~~~~~~~~~~
    efel/cppcore/LibV1.cpp:1544:55: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
               t[stimendindex] < stimEnd && stimstartindex <= t.size();
                                            ~~~~~~~~~~~~~~~^~~~~~~~~~~
    efel/cppcore/LibV1.cpp:1547:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if (stimstartindex >= t.size()) {
           ~~~~~~~~~~~~~~~^~~~~~~~~~~
    efel/cppcore/LibV1.cpp:1552:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       if (stimendindex >= t.size()) {
           ~~~~~~~~~~~~~^~~~~~~~~~~
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV2.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV2.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV3.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV3.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV4.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV4.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/LibV5.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/LibV5.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/FillFptrTable.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/FillFptrTable.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/DependencyTree.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/DependencyTree.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/efel.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/efel.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/cfeature.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/cfeature.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    gcc -pthread -fno-strict-aliasing -g -O2 -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes -fPIC -Iefel/cppcore/ -I/home/denis/.conda/envs/bluebrain/include/python2.7 -c efel/cppcore/mapoperations.cpp -o build/temp.linux-x86_64-2.7/efel/cppcore/mapoperations.o
    cc1plus: warning: command line option ‘-Wstrict-prototypes’ is valid for C/ObjC but not for C++
    -std=c++98 -pthread -shared -L/home/denis/.conda/envs/bluebrain/lib -Wl,-rpath=/home/denis/.conda/envs/bluebrain/lib,--no-as-needed build/temp.linux-x86_64-2.7/efel/cppcore/cppcore.o build/temp.linux-x86_64-2.7/efel/cppcore/Utils.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV1.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV2.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV3.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV4.o build/temp.linux-x86_64-2.7/efel/cppcore/LibV5.o build/temp.linux-x86_64-2.7/efel/cppcore/FillFptrTable.o build/temp.linux-x86_64-2.7/efel/cppcore/DependencyTree.o build/temp.linux-x86_64-2.7/efel/cppcore/efel.o build/temp.linux-x86_64-2.7/efel/cppcore/cfeature.o build/temp.linux-x86_64-2.7/efel/cppcore/mapoperations.o -L/home/denis/.conda/envs/bluebrain/lib -lpython2.7 -o build/lib.linux-x86_64-2.7/efel/cppcore.so
    unable to execute '-std=c++98': No such file or directory
    error: command '-std=c++98' failed with exit status 1
    
    ----------------------------------------
Command "/home/denis/.conda/envs/bluebrain/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-build-Xh83bq/efel/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-wrsKfh-record/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-build-Xh83bq/efel/

libstdc++.so.6: undefined symbol: libiconv on gcc.9.2.0

When I try to import cppcore inside Python while gcc version 9.2.0 is loaded it gives the following error.

Importing cppcore: import efel.cppcore as cppcore

Error: PATH_TO_GCC/linux-rhel7-x86_64/gcc-4.8.5/gcc-9.2.0-nz6rnuk53f/lib64/libstdc++.so.6: undefined symbol: libiconv

It works fine with gcc 8.3.0 or 4.5.0

Input Resistance calc

Hello, I upgraded to efel-2.11.45, but I still don't have the "E29" feature for calculating input resistance (though E2-E27, E39, E40 are available). The other feature "ohmic_input_resistance" is extremely off. It seems to be because it uses the "voltage_deflection" feature in the calculation, and that feature seems to be picking up a tiny noise blip at the beginning of the trace (3 mV) and ignoring the 24 mV offset produced by the stimulus later on.
voltage_deflection = 0.0038342857142978914
ohmic_input_resistance = 0.037602023420651907
image

How can I access the E29 feature or is there a way to fix the voltage_deflection calculation? Thanks.

Ability to change AP rise time parameters

I've looked through the documentation and I haven't found what I'm looking for specifically. I'm trying to change the rise time window from 0-100% (time difference between AP_begin_index to peak_index) to 10-90%. Is this a possibility with this algorithm?

Add feature "APlast_width"

Hi @wvangeit ,
would it be possible to add a new feature for the (time) width of the last spike? I guess it can be similar to AP1_width and AP2_width.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.