From db4d60a8f6c2d3a55f6a86bde39b3c82525e3d17 Mon Sep 17 00:00:00 2001 From: CoprDistGit Date: Mon, 29 May 2023 10:20:43 +0000 Subject: automatic import of python-lfpykit --- python-lfpykit.spec | 1035 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1035 insertions(+) create mode 100644 python-lfpykit.spec (limited to 'python-lfpykit.spec') 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 - 0.5.1-1 +- Package Spec generated -- cgit v1.2.3