summaryrefslogtreecommitdiff
path: root/python-lfpykit.spec
diff options
context:
space:
mode:
Diffstat (limited to 'python-lfpykit.spec')
-rw-r--r--python-lfpykit.spec1035
1 files changed, 1035 insertions, 0 deletions
diff --git a/python-lfpykit.spec b/python-lfpykit.spec
new file mode 100644
index 0000000..d344994
--- /dev/null
+++ b/python-lfpykit.spec
@@ -0,0 +1,1035 @@
+%global _empty_manifest_terminate_build 0
+Name: python-LFPykit
+Version: 0.5.1
+Release: 1
+Summary: Electrostatic models for multicompartment neuron models
+License: GNU General Public License (GPL)
+URL: https://github.com/LFPy/LFPykit
+Source0: https://mirrors.nju.edu.cn/pypi/web/packages/b4/e0/b5935801a38839b177267f53cf6781941e36d8f832e06612773fdf89504e/LFPykit-0.5.1.tar.gz
+BuildArch: noarch
+
+Requires: python3-numpy
+Requires: python3-scipy
+Requires: python3-meautility
+Requires: python3-sphinx
+Requires: python3-numpydoc
+Requires: python3-sphinx-rtd-theme
+Requires: python3-recommonmark
+Requires: python3-pytest
+Requires: python3-sympy
+
+%description
+# LFPykit
+
+This Python module contain freestanding implementations of electrostatic
+forward models incorporated in LFPy
+(https://github.com/LFPy/LFPy, https://LFPy.readthedocs.io).
+
+The aim of the `LFPykit` module is to provide electrostatic models
+in a manner that facilitates forward-model predictions of extracellular
+potentials and related measures from multicompartment neuron models, but
+without explicit dependencies on neural simulation software such as
+NEURON (https://neuron.yale.edu, https://github.com/neuronsimulator/nrn),
+Arbor (https://arbor.readthedocs.io, https://github.com/arbor-sim/arbor),
+or even LFPy.
+The `LFPykit` module can then be more easily incorporated with
+these simulators, or in various projects that utilize them such as
+LFPy (https://LFPy.rtfd.io, https://github.com/LFPy/LFPy).
+BMTK (https://alleninstitute.github.io/bmtk/, https://github.com/AllenInstitute/bmtk),
+etc.
+
+Its main functionality is providing class methods that return two-dimensional
+linear transformation matrices **M**
+between transmembrane currents
+**I** of multicompartment neuron models and some
+measurement **Y** given by **Y**=**MI**.
+
+The presently incorporated volume conductor models have been incorporated in
+LFPy (https://LFPy.rtfd.io, https://github.com/LFPy/LFPy),
+as described in various papers and books:
+
+1. Linden H, Hagen E, Leski S, Norheim ES, Pettersen KH, Einevoll GT
+ (2014) LFPy: a tool for biophysical simulation of extracellular
+ potentials generated by detailed model neurons. Front.
+ Neuroinform. 7:41. doi: 10.3389/fninf.2013.00041
+
+2. Hagen E, Næss S, Ness TV and Einevoll GT (2018) Multimodal Modeling of Neural
+ Network Activity: Computing LFP, ECoG, EEG, and MEG
+ Signals With LFPy 2.0. Front. Neuroinform. 12:92.
+ doi: 10.3389/fninf.2018.00092
+
+3. Ness, T. V., Chintaluri, C., Potworowski, J., Leski, S., Glabska,
+ H., Wójcik, D. K., et al. (2015). Modelling and analysis of electrical
+ potentials recorded in microelectrode arrays (MEAs).
+ Neuroinformatics 13:403–426. doi: 10.1007/s12021-015-9265-6
+
+4. Nunez and Srinivasan, Oxford University Press, 2006
+
+5. Næss S, Chintaluri C, Ness TV, Dale AM, Einevoll GT and Wójcik DK
+ (2017). Corrected Four-sphere Head Model for EEG Signals. Front. Hum.
+ Neurosci. 11:490. doi: 10.3389/fnhum.2017.00490
+
+
+## Build Status
+
+[![DOI](https://zenodo.org/badge/288660131.svg)](https://zenodo.org/badge/latestdoi/288660131)
+[![Coverage Status](https://coveralls.io/repos/github/LFPy/LFPykit/badge.svg?branch=master)](https://coveralls.io/github/LFPy/LFPykit?branch=master)
+[![Documentation Status](https://readthedocs.org/projects/lfpykit/badge/?version=latest)](https://lfpykit.readthedocs.io/en/latest/?badge=latest)
+[![flake8 lint](https://github.com/LFPy/LFPykit/actions/workflows/flake8.yml/badge.svg)](https://github.com/LFPy/LFPykit/actions/workflows/flake8.yml)
+[![Python application](https://github.com/LFPy/LFPykit/workflows/Python%20application/badge.svg)](https://github.com/LFPy/LFPykit/actions?query=workflow%3A%22Python+application%22)
+[![Upload Python Package](https://github.com/LFPy/LFPykit/workflows/Upload%20Python%20Package/badge.svg)](https://pypi.org/project/LFPykit)
+[![Conda Recipe](https://img.shields.io/badge/recipe-lfpykit-green.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Version](https://img.shields.io/conda/vn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Platforms](https://img.shields.io/conda/pn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/LFPy/LFPykit.git/master)
+[![License](http://img.shields.io/:license-GPLv3+-green.svg)](http://www.gnu.org/licenses/gpl-3.0.html)
+
+
+## Features
+
+`LFPykit` presently incorporates different electrostatic forward models for extracellular potentials
+and magnetic signals that has been derived using volume conductor theory.
+In volume-conductor theory the extracellular potentials can be calculated from a distance-weighted sum of contributions from transmembrane currents of neurons.
+Given the same transmembrane currents, the contributions to the magnetic field recorded both inside and outside the brain can also be computed.
+
+The module presently incorporates different classes.
+To represent the geometry of a multicompartment neuron model we have:
+
+* `CellGeometry`:
+ Base class representing a multicompartment neuron geometry in terms
+ of segment x-, y-, z-coordinates and diameter.
+
+Different classes built to map transmembrane currents of `CellGeometry` like instances
+to different measurement modalities:
+
+* `LinearModel`:
+ Base class representing a generic forward model
+ for subclassing
+* `CurrentDipoleMoment`:
+ Class for predicting current dipole moments
+* `PointSourcePotential`:
+ Class for predicting extracellular potentials
+ assuming point sources and point contacts
+* `LineSourcePotential`:
+ Class for predicting extracellular potentials assuming
+ line sourcers and point contacts
+* `RecExtElectrode`:
+ Class for simulations of extracellular potentials
+* `RecMEAElectrode`:
+ Class for simulations of in vitro (slice) extracellular
+ potentials
+* `OneSphereVolumeConductor`:
+ For computing extracellular potentials within
+ sand outside a homogeneous sphere
+* `LaminarCurrentSourceDensity`:
+ For computing the 'ground truth' current source density across
+ cylindrical volumes aligned with the z-axis
+* `VolumetricCurrentSourceDensity`:
+ For computing the 'ground truth' current source density on regularly
+ spaced 3D grid
+
+Different classes built to map current dipole moments (i.e., computed using `CurrentDipoleMoment`)
+to extracellular measurements:
+
+* `eegmegcalc.FourSphereVolumeConductor`:
+ For computing extracellular potentials in
+ 4-sphere head model (brain, CSF, skull, scalp)
+ from current dipole moment
+* `eegmegcalc.InfiniteVolumeConductor`:
+ To compute extracellular potentials in infinite volume conductor
+ from current dipole moment
+* `eegmegcalc.InfiniteHomogeneousVolCondMEG`:
+ Class for computing magnetic field from current dipole moments under the assumption
+ of infinite homogeneous volume conductor model
+* `eegmegcalc.SphericallySymmetricVolCondMEG`:
+ Class for computing magnetic field from current dipole moments under the assumption
+ of a spherically symmetric volume conductor model
+* `eegmegcalc.NYHeadModel`:
+ Class for computing extracellular potentials in detailed head volume
+ conductor model (https://www.parralab.org/nyhead)
+
+Each class (except `CellGeometry`) should have a public method `get_transformation_matrix()`
+that returns the linear map between the transmembrane currents or current dipole moment
+and corresponding measurements (see Usage below)
+
+
+## Usage
+
+A basic usage example using a mock 3-segment stick-like neuron,
+treating each segment as a point source in a linear, isotropic and homogeneous volume conductor,
+computing the extracellular potential in ten different locations
+alongside the cell geometry:
+
+ >>> # imports
+ >>> import numpy as np
+ >>> from lfpykit import CellGeometry, PointSourcePotential
+ >>> n_seg = 3
+ >>> # instantiate class `CellGeometry`:
+ >>> cell = CellGeometry(x=np.array([[0.] * 2] * n_seg), # (µm)
+ y=np.array([[0.] * 2] * n_seg), # (µm)
+ z=np.array([[10. * x, 10. * (x + 1)]
+ for x in range(n_seg)]), # (µm)
+ d=np.array([1.] * n_seg)) # (µm)
+ >>> # instantiate class `PointSourcePotential`:
+ >>> psp = PointSourcePotential(cell,
+ x=np.ones(10) * 10,
+ y=np.zeros(10),
+ z=np.arange(10) * 10,
+ sigma=0.3)
+ >>> # get linear response matrix mapping currents to measurements
+ >>> M = psp.get_transformation_matrix()
+ >>> # transmembrane currents (nA):
+ >>> imem = np.array([[-1., 1.],
+ [0., 0.],
+ [1., -1.]])
+ >>> # compute extracellular potentials (mV)
+ >>> V_ex = M @ imem
+ >>> V_ex
+ array([[-0.01387397, 0.01387397],
+ [-0.00901154, 0.00901154],
+ [ 0.00901154, -0.00901154],
+ [ 0.01387397, -0.01387397],
+ [ 0.00742668, -0.00742668],
+ [ 0.00409718, -0.00409718],
+ [ 0.00254212, -0.00254212],
+ [ 0.00172082, -0.00172082],
+ [ 0.00123933, -0.00123933],
+ [ 0.00093413, -0.00093413]])
+
+
+A basic usage example using a mock 3-segment stick-like neuron,
+treating each segment as a point source,
+computing the current dipole moment and computing the potential in ten different
+remote locations away from the cell geometry:
+
+ >>> # imports
+ >>> import numpy as np
+ >>> from lfpykit import CellGeometry, CurrentDipoleMoment, \
+ >>> eegmegcalc
+ >>> n_seg = 3
+ >>> # instantiate class `CellGeometry`:
+ >>> cell = CellGeometry(x=np.array([[0.] * 2] * n_seg), # (µm)
+ y=np.array([[0.] * 2] * n_seg), # (µm)
+ z=np.array([[10. * x, 10. * (x + 1)]
+ for x in range(n_seg)]), # (µm)
+ d=np.array([1.] * n_seg)) # (µm)
+ >>> # instantiate class `CurrentDipoleMoment`:
+ >>> cdp = CurrentDipoleMoment(cell)
+ >>> M_I_to_P = cdp.get_transformation_matrix()
+ >>> # instantiate class `eegmegcalc.InfiniteVolumeConductor` and map dipole moment to
+ >>> # extracellular potential at measurement sites
+ >>> ivc = eegmegcalc.InfiniteVolumeConductor(sigma=0.3)
+ >>> # compute linear response matrix between dipole moment and
+ >>> # extracellular potential
+ >>> M_P_to_V = ivc.get_transformation_matrix(np.c_[np.ones(10) * 1000,
+ np.zeros(10),
+ np.arange(10) * 100])
+ >>> # transmembrane currents (nA):
+ >>> imem = np.array([[-1., 1.],
+ [0., 0.],
+ [1., -1.]])
+ >>> # compute extracellular potentials (mV)
+ >>> V_ex = M_P_to_V @ M_I_to_P @ imem
+ >>> V_ex
+ array([[ 0.00000000e+00, 0.00000000e+00],
+ [ 5.22657054e-07, -5.22657054e-07],
+ [ 1.00041193e-06, -1.00041193e-06],
+ [ 1.39855769e-06, -1.39855769e-06],
+ [ 1.69852477e-06, -1.69852477e-06],
+ [ 1.89803345e-06, -1.89803345e-06],
+ [ 2.00697409e-06, -2.00697409e-06],
+ [ 2.04182029e-06, -2.04182029e-06],
+ [ 2.02079888e-06, -2.02079888e-06],
+ [ 1.96075587e-06, -1.96075587e-06]])
+
+
+## Physical units
+
+Notes on physical units used in `LFPykit`:
+
+- There are no explicit checks for physical units
+
+- Transmembrane currents are assumed to be in units of (nA)
+
+- Spatial information is assumed to be in units of (µm)
+
+- Voltages are assumed to be in units of (mV)
+
+- Extracellular conductivities are assumed to be in units of (S/m)
+
+- current dipole moments are assumed to be in units of (nA µm)
+
+- Magnetic fields are assumed to be in units of (nA/µm)
+
+
+## Dimensionality
+
+- Transmembrane currents are represented by arrays with shape `(n_seg, n_timesteps)`
+ where `n_seg` is the number of segments of the neuron model.
+
+- Current dipole moments are represented by arrays with shape `(3, n_timesteps)`
+
+- Response matrices **M** have shape `(n_points, input.shape[0])` where `n_points` is
+ for instance the number of extracellular recording sites and `input.shape[0]`
+ the first dimension of the input; that is, the number of segments in case of
+ transmembrane currents or 3 in case of current dipole moments.
+
+- predicted signals (except magnetic fields using `eegmegcalc.InfiniteHomogeneousVolCondMEG` or
+ `eegmegcalc.SphericallySymmetricVolCondMEG`) have shape `(n_points, n_timesteps)`
+
+
+## Documentation
+
+The online Documentation of `LFPykit` can be found here:
+https://lfpykit.readthedocs.io/en/latest
+
+
+## Dependencies
+
+`LFPykit` is implemented in Python and is written (and continuously tested) for `Python >= 3.7`.
+The main `LFPykit` module depends on `numpy`, `scipy` and `MEAutility` (https://github.com/alejoe91/MEAutility, https://meautility.readthedocs.io/en/latest/).
+
+Running all unit tests and example files may in addition require `py.test`, `matplotlib`,
+`neuron` (https://www.neuron.yale.edu),
+(`arbor` coming) and
+`LFPy` (https://github.com/LFPy/LFPy, https://LFPy.readthedocs.io).
+
+
+## Installation
+
+### From development sources (https://github.com/LFPy/LFPykit)
+
+Install the current development version on https://GitHub.com using `git` (https://git-scm.com):
+
+ $ git clone https://github.com/LFPy/LFPykit.git
+ $ cd LFPykit
+ $ python setup.py install # --user optional
+
+or using `pip`:
+
+ $ pip install . # --user optional
+
+For active development, link the repository location
+
+ $ python setup.py develop # --user optional
+
+### Installation of stable releases on PyPI.org (https://www.pypi.org)
+
+Installing from the Python Package Index (https://www.pypi.org/project/lfpykit):
+
+ $ pip install lfpykit # --user optional
+
+To upgrade the installation using pip:
+
+ $ pip install --upgrade --no-deps lfpykit
+
+### Installation of stable releases on conda-forge (https://conda-forge.org)
+
+Installing `lfpykit` from the `conda-forge` channel can be achieved by adding `conda-forge` to your channels with:
+
+ $ conda config --add channels conda-forge
+
+Once the `conda-forge` channel has been enabled, `lfpykit` can be installed with:
+
+ $ conda install lfpykit
+
+It is possible to list all of the versions of `lfpykit` available on your platform with:
+
+ $ conda search lfpykit --channel conda-forge
+
+
+%package -n python3-LFPykit
+Summary: Electrostatic models for multicompartment neuron models
+Provides: python-LFPykit
+BuildRequires: python3-devel
+BuildRequires: python3-setuptools
+BuildRequires: python3-pip
+%description -n python3-LFPykit
+# LFPykit
+
+This Python module contain freestanding implementations of electrostatic
+forward models incorporated in LFPy
+(https://github.com/LFPy/LFPy, https://LFPy.readthedocs.io).
+
+The aim of the `LFPykit` module is to provide electrostatic models
+in a manner that facilitates forward-model predictions of extracellular
+potentials and related measures from multicompartment neuron models, but
+without explicit dependencies on neural simulation software such as
+NEURON (https://neuron.yale.edu, https://github.com/neuronsimulator/nrn),
+Arbor (https://arbor.readthedocs.io, https://github.com/arbor-sim/arbor),
+or even LFPy.
+The `LFPykit` module can then be more easily incorporated with
+these simulators, or in various projects that utilize them such as
+LFPy (https://LFPy.rtfd.io, https://github.com/LFPy/LFPy).
+BMTK (https://alleninstitute.github.io/bmtk/, https://github.com/AllenInstitute/bmtk),
+etc.
+
+Its main functionality is providing class methods that return two-dimensional
+linear transformation matrices **M**
+between transmembrane currents
+**I** of multicompartment neuron models and some
+measurement **Y** given by **Y**=**MI**.
+
+The presently incorporated volume conductor models have been incorporated in
+LFPy (https://LFPy.rtfd.io, https://github.com/LFPy/LFPy),
+as described in various papers and books:
+
+1. Linden H, Hagen E, Leski S, Norheim ES, Pettersen KH, Einevoll GT
+ (2014) LFPy: a tool for biophysical simulation of extracellular
+ potentials generated by detailed model neurons. Front.
+ Neuroinform. 7:41. doi: 10.3389/fninf.2013.00041
+
+2. Hagen E, Næss S, Ness TV and Einevoll GT (2018) Multimodal Modeling of Neural
+ Network Activity: Computing LFP, ECoG, EEG, and MEG
+ Signals With LFPy 2.0. Front. Neuroinform. 12:92.
+ doi: 10.3389/fninf.2018.00092
+
+3. Ness, T. V., Chintaluri, C., Potworowski, J., Leski, S., Glabska,
+ H., Wójcik, D. K., et al. (2015). Modelling and analysis of electrical
+ potentials recorded in microelectrode arrays (MEAs).
+ Neuroinformatics 13:403–426. doi: 10.1007/s12021-015-9265-6
+
+4. Nunez and Srinivasan, Oxford University Press, 2006
+
+5. Næss S, Chintaluri C, Ness TV, Dale AM, Einevoll GT and Wójcik DK
+ (2017). Corrected Four-sphere Head Model for EEG Signals. Front. Hum.
+ Neurosci. 11:490. doi: 10.3389/fnhum.2017.00490
+
+
+## Build Status
+
+[![DOI](https://zenodo.org/badge/288660131.svg)](https://zenodo.org/badge/latestdoi/288660131)
+[![Coverage Status](https://coveralls.io/repos/github/LFPy/LFPykit/badge.svg?branch=master)](https://coveralls.io/github/LFPy/LFPykit?branch=master)
+[![Documentation Status](https://readthedocs.org/projects/lfpykit/badge/?version=latest)](https://lfpykit.readthedocs.io/en/latest/?badge=latest)
+[![flake8 lint](https://github.com/LFPy/LFPykit/actions/workflows/flake8.yml/badge.svg)](https://github.com/LFPy/LFPykit/actions/workflows/flake8.yml)
+[![Python application](https://github.com/LFPy/LFPykit/workflows/Python%20application/badge.svg)](https://github.com/LFPy/LFPykit/actions?query=workflow%3A%22Python+application%22)
+[![Upload Python Package](https://github.com/LFPy/LFPykit/workflows/Upload%20Python%20Package/badge.svg)](https://pypi.org/project/LFPykit)
+[![Conda Recipe](https://img.shields.io/badge/recipe-lfpykit-green.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Version](https://img.shields.io/conda/vn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Platforms](https://img.shields.io/conda/pn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/LFPy/LFPykit.git/master)
+[![License](http://img.shields.io/:license-GPLv3+-green.svg)](http://www.gnu.org/licenses/gpl-3.0.html)
+
+
+## Features
+
+`LFPykit` presently incorporates different electrostatic forward models for extracellular potentials
+and magnetic signals that has been derived using volume conductor theory.
+In volume-conductor theory the extracellular potentials can be calculated from a distance-weighted sum of contributions from transmembrane currents of neurons.
+Given the same transmembrane currents, the contributions to the magnetic field recorded both inside and outside the brain can also be computed.
+
+The module presently incorporates different classes.
+To represent the geometry of a multicompartment neuron model we have:
+
+* `CellGeometry`:
+ Base class representing a multicompartment neuron geometry in terms
+ of segment x-, y-, z-coordinates and diameter.
+
+Different classes built to map transmembrane currents of `CellGeometry` like instances
+to different measurement modalities:
+
+* `LinearModel`:
+ Base class representing a generic forward model
+ for subclassing
+* `CurrentDipoleMoment`:
+ Class for predicting current dipole moments
+* `PointSourcePotential`:
+ Class for predicting extracellular potentials
+ assuming point sources and point contacts
+* `LineSourcePotential`:
+ Class for predicting extracellular potentials assuming
+ line sourcers and point contacts
+* `RecExtElectrode`:
+ Class for simulations of extracellular potentials
+* `RecMEAElectrode`:
+ Class for simulations of in vitro (slice) extracellular
+ potentials
+* `OneSphereVolumeConductor`:
+ For computing extracellular potentials within
+ sand outside a homogeneous sphere
+* `LaminarCurrentSourceDensity`:
+ For computing the 'ground truth' current source density across
+ cylindrical volumes aligned with the z-axis
+* `VolumetricCurrentSourceDensity`:
+ For computing the 'ground truth' current source density on regularly
+ spaced 3D grid
+
+Different classes built to map current dipole moments (i.e., computed using `CurrentDipoleMoment`)
+to extracellular measurements:
+
+* `eegmegcalc.FourSphereVolumeConductor`:
+ For computing extracellular potentials in
+ 4-sphere head model (brain, CSF, skull, scalp)
+ from current dipole moment
+* `eegmegcalc.InfiniteVolumeConductor`:
+ To compute extracellular potentials in infinite volume conductor
+ from current dipole moment
+* `eegmegcalc.InfiniteHomogeneousVolCondMEG`:
+ Class for computing magnetic field from current dipole moments under the assumption
+ of infinite homogeneous volume conductor model
+* `eegmegcalc.SphericallySymmetricVolCondMEG`:
+ Class for computing magnetic field from current dipole moments under the assumption
+ of a spherically symmetric volume conductor model
+* `eegmegcalc.NYHeadModel`:
+ Class for computing extracellular potentials in detailed head volume
+ conductor model (https://www.parralab.org/nyhead)
+
+Each class (except `CellGeometry`) should have a public method `get_transformation_matrix()`
+that returns the linear map between the transmembrane currents or current dipole moment
+and corresponding measurements (see Usage below)
+
+
+## Usage
+
+A basic usage example using a mock 3-segment stick-like neuron,
+treating each segment as a point source in a linear, isotropic and homogeneous volume conductor,
+computing the extracellular potential in ten different locations
+alongside the cell geometry:
+
+ >>> # imports
+ >>> import numpy as np
+ >>> from lfpykit import CellGeometry, PointSourcePotential
+ >>> n_seg = 3
+ >>> # instantiate class `CellGeometry`:
+ >>> cell = CellGeometry(x=np.array([[0.] * 2] * n_seg), # (µm)
+ y=np.array([[0.] * 2] * n_seg), # (µm)
+ z=np.array([[10. * x, 10. * (x + 1)]
+ for x in range(n_seg)]), # (µm)
+ d=np.array([1.] * n_seg)) # (µm)
+ >>> # instantiate class `PointSourcePotential`:
+ >>> psp = PointSourcePotential(cell,
+ x=np.ones(10) * 10,
+ y=np.zeros(10),
+ z=np.arange(10) * 10,
+ sigma=0.3)
+ >>> # get linear response matrix mapping currents to measurements
+ >>> M = psp.get_transformation_matrix()
+ >>> # transmembrane currents (nA):
+ >>> imem = np.array([[-1., 1.],
+ [0., 0.],
+ [1., -1.]])
+ >>> # compute extracellular potentials (mV)
+ >>> V_ex = M @ imem
+ >>> V_ex
+ array([[-0.01387397, 0.01387397],
+ [-0.00901154, 0.00901154],
+ [ 0.00901154, -0.00901154],
+ [ 0.01387397, -0.01387397],
+ [ 0.00742668, -0.00742668],
+ [ 0.00409718, -0.00409718],
+ [ 0.00254212, -0.00254212],
+ [ 0.00172082, -0.00172082],
+ [ 0.00123933, -0.00123933],
+ [ 0.00093413, -0.00093413]])
+
+
+A basic usage example using a mock 3-segment stick-like neuron,
+treating each segment as a point source,
+computing the current dipole moment and computing the potential in ten different
+remote locations away from the cell geometry:
+
+ >>> # imports
+ >>> import numpy as np
+ >>> from lfpykit import CellGeometry, CurrentDipoleMoment, \
+ >>> eegmegcalc
+ >>> n_seg = 3
+ >>> # instantiate class `CellGeometry`:
+ >>> cell = CellGeometry(x=np.array([[0.] * 2] * n_seg), # (µm)
+ y=np.array([[0.] * 2] * n_seg), # (µm)
+ z=np.array([[10. * x, 10. * (x + 1)]
+ for x in range(n_seg)]), # (µm)
+ d=np.array([1.] * n_seg)) # (µm)
+ >>> # instantiate class `CurrentDipoleMoment`:
+ >>> cdp = CurrentDipoleMoment(cell)
+ >>> M_I_to_P = cdp.get_transformation_matrix()
+ >>> # instantiate class `eegmegcalc.InfiniteVolumeConductor` and map dipole moment to
+ >>> # extracellular potential at measurement sites
+ >>> ivc = eegmegcalc.InfiniteVolumeConductor(sigma=0.3)
+ >>> # compute linear response matrix between dipole moment and
+ >>> # extracellular potential
+ >>> M_P_to_V = ivc.get_transformation_matrix(np.c_[np.ones(10) * 1000,
+ np.zeros(10),
+ np.arange(10) * 100])
+ >>> # transmembrane currents (nA):
+ >>> imem = np.array([[-1., 1.],
+ [0., 0.],
+ [1., -1.]])
+ >>> # compute extracellular potentials (mV)
+ >>> V_ex = M_P_to_V @ M_I_to_P @ imem
+ >>> V_ex
+ array([[ 0.00000000e+00, 0.00000000e+00],
+ [ 5.22657054e-07, -5.22657054e-07],
+ [ 1.00041193e-06, -1.00041193e-06],
+ [ 1.39855769e-06, -1.39855769e-06],
+ [ 1.69852477e-06, -1.69852477e-06],
+ [ 1.89803345e-06, -1.89803345e-06],
+ [ 2.00697409e-06, -2.00697409e-06],
+ [ 2.04182029e-06, -2.04182029e-06],
+ [ 2.02079888e-06, -2.02079888e-06],
+ [ 1.96075587e-06, -1.96075587e-06]])
+
+
+## Physical units
+
+Notes on physical units used in `LFPykit`:
+
+- There are no explicit checks for physical units
+
+- Transmembrane currents are assumed to be in units of (nA)
+
+- Spatial information is assumed to be in units of (µm)
+
+- Voltages are assumed to be in units of (mV)
+
+- Extracellular conductivities are assumed to be in units of (S/m)
+
+- current dipole moments are assumed to be in units of (nA µm)
+
+- Magnetic fields are assumed to be in units of (nA/µm)
+
+
+## Dimensionality
+
+- Transmembrane currents are represented by arrays with shape `(n_seg, n_timesteps)`
+ where `n_seg` is the number of segments of the neuron model.
+
+- Current dipole moments are represented by arrays with shape `(3, n_timesteps)`
+
+- Response matrices **M** have shape `(n_points, input.shape[0])` where `n_points` is
+ for instance the number of extracellular recording sites and `input.shape[0]`
+ the first dimension of the input; that is, the number of segments in case of
+ transmembrane currents or 3 in case of current dipole moments.
+
+- predicted signals (except magnetic fields using `eegmegcalc.InfiniteHomogeneousVolCondMEG` or
+ `eegmegcalc.SphericallySymmetricVolCondMEG`) have shape `(n_points, n_timesteps)`
+
+
+## Documentation
+
+The online Documentation of `LFPykit` can be found here:
+https://lfpykit.readthedocs.io/en/latest
+
+
+## Dependencies
+
+`LFPykit` is implemented in Python and is written (and continuously tested) for `Python >= 3.7`.
+The main `LFPykit` module depends on `numpy`, `scipy` and `MEAutility` (https://github.com/alejoe91/MEAutility, https://meautility.readthedocs.io/en/latest/).
+
+Running all unit tests and example files may in addition require `py.test`, `matplotlib`,
+`neuron` (https://www.neuron.yale.edu),
+(`arbor` coming) and
+`LFPy` (https://github.com/LFPy/LFPy, https://LFPy.readthedocs.io).
+
+
+## Installation
+
+### From development sources (https://github.com/LFPy/LFPykit)
+
+Install the current development version on https://GitHub.com using `git` (https://git-scm.com):
+
+ $ git clone https://github.com/LFPy/LFPykit.git
+ $ cd LFPykit
+ $ python setup.py install # --user optional
+
+or using `pip`:
+
+ $ pip install . # --user optional
+
+For active development, link the repository location
+
+ $ python setup.py develop # --user optional
+
+### Installation of stable releases on PyPI.org (https://www.pypi.org)
+
+Installing from the Python Package Index (https://www.pypi.org/project/lfpykit):
+
+ $ pip install lfpykit # --user optional
+
+To upgrade the installation using pip:
+
+ $ pip install --upgrade --no-deps lfpykit
+
+### Installation of stable releases on conda-forge (https://conda-forge.org)
+
+Installing `lfpykit` from the `conda-forge` channel can be achieved by adding `conda-forge` to your channels with:
+
+ $ conda config --add channels conda-forge
+
+Once the `conda-forge` channel has been enabled, `lfpykit` can be installed with:
+
+ $ conda install lfpykit
+
+It is possible to list all of the versions of `lfpykit` available on your platform with:
+
+ $ conda search lfpykit --channel conda-forge
+
+
+%package help
+Summary: Development documents and examples for LFPykit
+Provides: python3-LFPykit-doc
+%description help
+# LFPykit
+
+This Python module contain freestanding implementations of electrostatic
+forward models incorporated in LFPy
+(https://github.com/LFPy/LFPy, https://LFPy.readthedocs.io).
+
+The aim of the `LFPykit` module is to provide electrostatic models
+in a manner that facilitates forward-model predictions of extracellular
+potentials and related measures from multicompartment neuron models, but
+without explicit dependencies on neural simulation software such as
+NEURON (https://neuron.yale.edu, https://github.com/neuronsimulator/nrn),
+Arbor (https://arbor.readthedocs.io, https://github.com/arbor-sim/arbor),
+or even LFPy.
+The `LFPykit` module can then be more easily incorporated with
+these simulators, or in various projects that utilize them such as
+LFPy (https://LFPy.rtfd.io, https://github.com/LFPy/LFPy).
+BMTK (https://alleninstitute.github.io/bmtk/, https://github.com/AllenInstitute/bmtk),
+etc.
+
+Its main functionality is providing class methods that return two-dimensional
+linear transformation matrices **M**
+between transmembrane currents
+**I** of multicompartment neuron models and some
+measurement **Y** given by **Y**=**MI**.
+
+The presently incorporated volume conductor models have been incorporated in
+LFPy (https://LFPy.rtfd.io, https://github.com/LFPy/LFPy),
+as described in various papers and books:
+
+1. Linden H, Hagen E, Leski S, Norheim ES, Pettersen KH, Einevoll GT
+ (2014) LFPy: a tool for biophysical simulation of extracellular
+ potentials generated by detailed model neurons. Front.
+ Neuroinform. 7:41. doi: 10.3389/fninf.2013.00041
+
+2. Hagen E, Næss S, Ness TV and Einevoll GT (2018) Multimodal Modeling of Neural
+ Network Activity: Computing LFP, ECoG, EEG, and MEG
+ Signals With LFPy 2.0. Front. Neuroinform. 12:92.
+ doi: 10.3389/fninf.2018.00092
+
+3. Ness, T. V., Chintaluri, C., Potworowski, J., Leski, S., Glabska,
+ H., Wójcik, D. K., et al. (2015). Modelling and analysis of electrical
+ potentials recorded in microelectrode arrays (MEAs).
+ Neuroinformatics 13:403–426. doi: 10.1007/s12021-015-9265-6
+
+4. Nunez and Srinivasan, Oxford University Press, 2006
+
+5. Næss S, Chintaluri C, Ness TV, Dale AM, Einevoll GT and Wójcik DK
+ (2017). Corrected Four-sphere Head Model for EEG Signals. Front. Hum.
+ Neurosci. 11:490. doi: 10.3389/fnhum.2017.00490
+
+
+## Build Status
+
+[![DOI](https://zenodo.org/badge/288660131.svg)](https://zenodo.org/badge/latestdoi/288660131)
+[![Coverage Status](https://coveralls.io/repos/github/LFPy/LFPykit/badge.svg?branch=master)](https://coveralls.io/github/LFPy/LFPykit?branch=master)
+[![Documentation Status](https://readthedocs.org/projects/lfpykit/badge/?version=latest)](https://lfpykit.readthedocs.io/en/latest/?badge=latest)
+[![flake8 lint](https://github.com/LFPy/LFPykit/actions/workflows/flake8.yml/badge.svg)](https://github.com/LFPy/LFPykit/actions/workflows/flake8.yml)
+[![Python application](https://github.com/LFPy/LFPykit/workflows/Python%20application/badge.svg)](https://github.com/LFPy/LFPykit/actions?query=workflow%3A%22Python+application%22)
+[![Upload Python Package](https://github.com/LFPy/LFPykit/workflows/Upload%20Python%20Package/badge.svg)](https://pypi.org/project/LFPykit)
+[![Conda Recipe](https://img.shields.io/badge/recipe-lfpykit-green.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Version](https://img.shields.io/conda/vn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Conda Platforms](https://img.shields.io/conda/pn/conda-forge/lfpykit.svg)](https://anaconda.org/conda-forge/lfpykit)
+[![Binder](https://mybinder.org/badge_logo.svg)](https://mybinder.org/v2/gh/LFPy/LFPykit.git/master)
+[![License](http://img.shields.io/:license-GPLv3+-green.svg)](http://www.gnu.org/licenses/gpl-3.0.html)
+
+
+## Features
+
+`LFPykit` presently incorporates different electrostatic forward models for extracellular potentials
+and magnetic signals that has been derived using volume conductor theory.
+In volume-conductor theory the extracellular potentials can be calculated from a distance-weighted sum of contributions from transmembrane currents of neurons.
+Given the same transmembrane currents, the contributions to the magnetic field recorded both inside and outside the brain can also be computed.
+
+The module presently incorporates different classes.
+To represent the geometry of a multicompartment neuron model we have:
+
+* `CellGeometry`:
+ Base class representing a multicompartment neuron geometry in terms
+ of segment x-, y-, z-coordinates and diameter.
+
+Different classes built to map transmembrane currents of `CellGeometry` like instances
+to different measurement modalities:
+
+* `LinearModel`:
+ Base class representing a generic forward model
+ for subclassing
+* `CurrentDipoleMoment`:
+ Class for predicting current dipole moments
+* `PointSourcePotential`:
+ Class for predicting extracellular potentials
+ assuming point sources and point contacts
+* `LineSourcePotential`:
+ Class for predicting extracellular potentials assuming
+ line sourcers and point contacts
+* `RecExtElectrode`:
+ Class for simulations of extracellular potentials
+* `RecMEAElectrode`:
+ Class for simulations of in vitro (slice) extracellular
+ potentials
+* `OneSphereVolumeConductor`:
+ For computing extracellular potentials within
+ sand outside a homogeneous sphere
+* `LaminarCurrentSourceDensity`:
+ For computing the 'ground truth' current source density across
+ cylindrical volumes aligned with the z-axis
+* `VolumetricCurrentSourceDensity`:
+ For computing the 'ground truth' current source density on regularly
+ spaced 3D grid
+
+Different classes built to map current dipole moments (i.e., computed using `CurrentDipoleMoment`)
+to extracellular measurements:
+
+* `eegmegcalc.FourSphereVolumeConductor`:
+ For computing extracellular potentials in
+ 4-sphere head model (brain, CSF, skull, scalp)
+ from current dipole moment
+* `eegmegcalc.InfiniteVolumeConductor`:
+ To compute extracellular potentials in infinite volume conductor
+ from current dipole moment
+* `eegmegcalc.InfiniteHomogeneousVolCondMEG`:
+ Class for computing magnetic field from current dipole moments under the assumption
+ of infinite homogeneous volume conductor model
+* `eegmegcalc.SphericallySymmetricVolCondMEG`:
+ Class for computing magnetic field from current dipole moments under the assumption
+ of a spherically symmetric volume conductor model
+* `eegmegcalc.NYHeadModel`:
+ Class for computing extracellular potentials in detailed head volume
+ conductor model (https://www.parralab.org/nyhead)
+
+Each class (except `CellGeometry`) should have a public method `get_transformation_matrix()`
+that returns the linear map between the transmembrane currents or current dipole moment
+and corresponding measurements (see Usage below)
+
+
+## Usage
+
+A basic usage example using a mock 3-segment stick-like neuron,
+treating each segment as a point source in a linear, isotropic and homogeneous volume conductor,
+computing the extracellular potential in ten different locations
+alongside the cell geometry:
+
+ >>> # imports
+ >>> import numpy as np
+ >>> from lfpykit import CellGeometry, PointSourcePotential
+ >>> n_seg = 3
+ >>> # instantiate class `CellGeometry`:
+ >>> cell = CellGeometry(x=np.array([[0.] * 2] * n_seg), # (µm)
+ y=np.array([[0.] * 2] * n_seg), # (µm)
+ z=np.array([[10. * x, 10. * (x + 1)]
+ for x in range(n_seg)]), # (µm)
+ d=np.array([1.] * n_seg)) # (µm)
+ >>> # instantiate class `PointSourcePotential`:
+ >>> psp = PointSourcePotential(cell,
+ x=np.ones(10) * 10,
+ y=np.zeros(10),
+ z=np.arange(10) * 10,
+ sigma=0.3)
+ >>> # get linear response matrix mapping currents to measurements
+ >>> M = psp.get_transformation_matrix()
+ >>> # transmembrane currents (nA):
+ >>> imem = np.array([[-1., 1.],
+ [0., 0.],
+ [1., -1.]])
+ >>> # compute extracellular potentials (mV)
+ >>> V_ex = M @ imem
+ >>> V_ex
+ array([[-0.01387397, 0.01387397],
+ [-0.00901154, 0.00901154],
+ [ 0.00901154, -0.00901154],
+ [ 0.01387397, -0.01387397],
+ [ 0.00742668, -0.00742668],
+ [ 0.00409718, -0.00409718],
+ [ 0.00254212, -0.00254212],
+ [ 0.00172082, -0.00172082],
+ [ 0.00123933, -0.00123933],
+ [ 0.00093413, -0.00093413]])
+
+
+A basic usage example using a mock 3-segment stick-like neuron,
+treating each segment as a point source,
+computing the current dipole moment and computing the potential in ten different
+remote locations away from the cell geometry:
+
+ >>> # imports
+ >>> import numpy as np
+ >>> from lfpykit import CellGeometry, CurrentDipoleMoment, \
+ >>> eegmegcalc
+ >>> n_seg = 3
+ >>> # instantiate class `CellGeometry`:
+ >>> cell = CellGeometry(x=np.array([[0.] * 2] * n_seg), # (µm)
+ y=np.array([[0.] * 2] * n_seg), # (µm)
+ z=np.array([[10. * x, 10. * (x + 1)]
+ for x in range(n_seg)]), # (µm)
+ d=np.array([1.] * n_seg)) # (µm)
+ >>> # instantiate class `CurrentDipoleMoment`:
+ >>> cdp = CurrentDipoleMoment(cell)
+ >>> M_I_to_P = cdp.get_transformation_matrix()
+ >>> # instantiate class `eegmegcalc.InfiniteVolumeConductor` and map dipole moment to
+ >>> # extracellular potential at measurement sites
+ >>> ivc = eegmegcalc.InfiniteVolumeConductor(sigma=0.3)
+ >>> # compute linear response matrix between dipole moment and
+ >>> # extracellular potential
+ >>> M_P_to_V = ivc.get_transformation_matrix(np.c_[np.ones(10) * 1000,
+ np.zeros(10),
+ np.arange(10) * 100])
+ >>> # transmembrane currents (nA):
+ >>> imem = np.array([[-1., 1.],
+ [0., 0.],
+ [1., -1.]])
+ >>> # compute extracellular potentials (mV)
+ >>> V_ex = M_P_to_V @ M_I_to_P @ imem
+ >>> V_ex
+ array([[ 0.00000000e+00, 0.00000000e+00],
+ [ 5.22657054e-07, -5.22657054e-07],
+ [ 1.00041193e-06, -1.00041193e-06],
+ [ 1.39855769e-06, -1.39855769e-06],
+ [ 1.69852477e-06, -1.69852477e-06],
+ [ 1.89803345e-06, -1.89803345e-06],
+ [ 2.00697409e-06, -2.00697409e-06],
+ [ 2.04182029e-06, -2.04182029e-06],
+ [ 2.02079888e-06, -2.02079888e-06],
+ [ 1.96075587e-06, -1.96075587e-06]])
+
+
+## Physical units
+
+Notes on physical units used in `LFPykit`:
+
+- There are no explicit checks for physical units
+
+- Transmembrane currents are assumed to be in units of (nA)
+
+- Spatial information is assumed to be in units of (µm)
+
+- Voltages are assumed to be in units of (mV)
+
+- Extracellular conductivities are assumed to be in units of (S/m)
+
+- current dipole moments are assumed to be in units of (nA µm)
+
+- Magnetic fields are assumed to be in units of (nA/µm)
+
+
+## Dimensionality
+
+- Transmembrane currents are represented by arrays with shape `(n_seg, n_timesteps)`
+ where `n_seg` is the number of segments of the neuron model.
+
+- Current dipole moments are represented by arrays with shape `(3, n_timesteps)`
+
+- Response matrices **M** have shape `(n_points, input.shape[0])` where `n_points` is
+ for instance the number of extracellular recording sites and `input.shape[0]`
+ the first dimension of the input; that is, the number of segments in case of
+ transmembrane currents or 3 in case of current dipole moments.
+
+- predicted signals (except magnetic fields using `eegmegcalc.InfiniteHomogeneousVolCondMEG` or
+ `eegmegcalc.SphericallySymmetricVolCondMEG`) have shape `(n_points, n_timesteps)`
+
+
+## Documentation
+
+The online Documentation of `LFPykit` can be found here:
+https://lfpykit.readthedocs.io/en/latest
+
+
+## Dependencies
+
+`LFPykit` is implemented in Python and is written (and continuously tested) for `Python >= 3.7`.
+The main `LFPykit` module depends on `numpy`, `scipy` and `MEAutility` (https://github.com/alejoe91/MEAutility, https://meautility.readthedocs.io/en/latest/).
+
+Running all unit tests and example files may in addition require `py.test`, `matplotlib`,
+`neuron` (https://www.neuron.yale.edu),
+(`arbor` coming) and
+`LFPy` (https://github.com/LFPy/LFPy, https://LFPy.readthedocs.io).
+
+
+## Installation
+
+### From development sources (https://github.com/LFPy/LFPykit)
+
+Install the current development version on https://GitHub.com using `git` (https://git-scm.com):
+
+ $ git clone https://github.com/LFPy/LFPykit.git
+ $ cd LFPykit
+ $ python setup.py install # --user optional
+
+or using `pip`:
+
+ $ pip install . # --user optional
+
+For active development, link the repository location
+
+ $ python setup.py develop # --user optional
+
+### Installation of stable releases on PyPI.org (https://www.pypi.org)
+
+Installing from the Python Package Index (https://www.pypi.org/project/lfpykit):
+
+ $ pip install lfpykit # --user optional
+
+To upgrade the installation using pip:
+
+ $ pip install --upgrade --no-deps lfpykit
+
+### Installation of stable releases on conda-forge (https://conda-forge.org)
+
+Installing `lfpykit` from the `conda-forge` channel can be achieved by adding `conda-forge` to your channels with:
+
+ $ conda config --add channels conda-forge
+
+Once the `conda-forge` channel has been enabled, `lfpykit` can be installed with:
+
+ $ conda install lfpykit
+
+It is possible to list all of the versions of `lfpykit` available on your platform with:
+
+ $ conda search lfpykit --channel conda-forge
+
+
+%prep
+%autosetup -n LFPykit-0.5.1
+
+%build
+%py3_build
+
+%install
+%py3_install
+install -d -m755 %{buildroot}/%{_pkgdocdir}
+if [ -d doc ]; then cp -arf doc %{buildroot}/%{_pkgdocdir}; fi
+if [ -d docs ]; then cp -arf docs %{buildroot}/%{_pkgdocdir}; fi
+if [ -d example ]; then cp -arf example %{buildroot}/%{_pkgdocdir}; fi
+if [ -d examples ]; then cp -arf examples %{buildroot}/%{_pkgdocdir}; fi
+pushd %{buildroot}
+if [ -d usr/lib ]; then
+ find usr/lib -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/lib64 ]; then
+ find usr/lib64 -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/bin ]; then
+ find usr/bin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+if [ -d usr/sbin ]; then
+ find usr/sbin -type f -printf "/%h/%f\n" >> filelist.lst
+fi
+touch doclist.lst
+if [ -d usr/share/man ]; then
+ find usr/share/man -type f -printf "/%h/%f.gz\n" >> doclist.lst
+fi
+popd
+mv %{buildroot}/filelist.lst .
+mv %{buildroot}/doclist.lst .
+
+%files -n python3-LFPykit -f filelist.lst
+%dir %{python3_sitelib}/*
+
+%files help -f doclist.lst
+%{_docdir}/*
+
+%changelog
+* Mon May 29 2023 Python_Bot <Python_Bot@openeuler.org> - 0.5.1-1
+- Package Spec generated