- 1Department of Mathematical Sciences and Technology, Norwegian University of Life Sciences, Ås, Norway
- 2Department of Computational Biology, School of Computer Science and Communication, Royal Institute of Technology (KTH), Stockholm, Sweden
- 3Department of Neurophysiology, Nencki Institute of Experimental Biology, Warsaw, Poland
- 4CIGENE, Norwegian University of Life Sciences, Ås, Norway
Electrical extracellular recordings, i.e., recordings of the electrical potentials in the extracellular medium between cells, have been a main work-horse in electrophysiology for almost a century. The high-frequency part of the signal (≳500 Hz), i.e., the multi-unit activity (MUA), contains information about the firing of action potentials in surrounding neurons, while the low-frequency part, the local field potential (LFP), contains information about how these neurons integrate synaptic inputs. As the recorded extracellular signals arise from multiple neural processes, their interpretation is typically ambiguous and difficult. Fortunately, a precise biophysical modeling scheme linking activity at the cellular level and the recorded signal has been established: the extracellular potential can be calculated as a weighted sum of all transmembrane currents in all cells located in the vicinity of the electrode. This computational scheme can considerably aid the modeling and analysis of MUA and LFP signals. Here, we describe LFPy, an open source Python package for numerical simulations of extracellular potentials. LFPy consists of a set of easy-to-use classes for defining cells, synapses and recording electrodes as Python objects, implementing this biophysical modeling scheme. It runs on top of the widely used NEURON simulation environment, which allows for flexible usage of both new and existing cell models. Further, calculation of extracellular potentials using the line-source-method is efficiently implemented. We describe the theoretical framework underlying the extracellular potential calculations and illustrate by examples how LFPy can be used both for simulating LFPs, i.e., synaptic contributions from single cells as well a populations of cells, and MUAs, i.e., extracellular signatures of action potentials.
1. Introduction
A host of experimental techniques are now available for studies of neural activity in cortex. In addition to intracellular and extracellular recordings with various types of single- or multi-contact electrodes, several imaging techniques (e.g., two-photon calcium, intrinsic optical, voltage-sensitive dye) have been developed and refined in the last decade. To take full advantage of these new powerful techniques, proper links between the underlying neural activity and what is recorded in the experiments, must be established. Such quantitatively accurate links generally require detailed understanding of the underlying physics of neural activity measurements, as well as efficient mathematical modeling schemes (Brette and Destexhe, 2012; Panzeri and Quian Quiroga, 2013). Computational neuroscience has until now largely focused on how neurons and neural networks may process information, while less attention has been given to the relationship between the neural activity and measurable quantities. As the ultimate test of candidate theories in all natural sciences is comparison with experiments, we believe more focus on the latter is needed to bring the field forward. Not only must precise mathematical links between activity in neural networks and the various measurements be forged, efficient and easy-to-use neuroinformatics tools must be developed to facilitate such comparisons.
The present paper describes a step toward this goal, that is, a new Python-based tool, LFPy
(compneuro.umb.no/LFPy, software.incf.org/software/lfpy), for modeling of extracellular potentials stemming from neural activity in brain tissue. While extracellular electrical recordings have been the main workhorse in electrophysiology for almost a century, the interpretation of such recordings is not trivial. The recorded extracellular potentials in general arise from a complicated sum of contributions from all transmembrane currents of the cells, predominantly neurons, in the vicinity of the electrode contact. The high-frequency part of the signal (≳500 Hz), the multi-unit activity (MUA), contains information about the firing of action potentials of neurons within a few tens of micrometers or so from the electrode contact (Buzsáki, 2004; Pettersen and Einevoll, 2008). The low-frequency part, the local field potential (LFP), contains information about the integration of synaptic inputs in populations of neurons within radii of hundreds of micrometers or more (Lindén et al., 2011; Łęski et al., 2013). Both the MUA and LFP are difficult signals to interpret (Pettersen et al., 2008; Buzsáki et al., 2012; Einevoll et al., 2012, 2013a,b; Reimann et al., 2013), and in order to take full advantage of the new generation of silicon-based multielectrodes recording from tens or hundreds of positions simultaneously, we need to develop and validate methods that can be used to infer information about the underlying neural network from these extracellular signals (Einevoll et al., 2013a).
A key advantage compared to other important measures of neural activity, such as fMRI, is that the ‘measurement physics’, i.e., the link between neural activity and what is measured, is well-understood. In fact, the last decade has seen the refinement of a well-founded biophysical forward-modeling scheme based on volume conduction theory (Rall and Shepherd, 1968; Holt and Koch, 1999) to incorporate detailed reconstructed neuronal morphologies in precise calculations of extracellular potentials — both spikes (Holt and Koch, 1999; Gold et al., 2006, 2007; Pettersen and Einevoll, 2008; Pettersen et al., 2008; Schomburg et al., 2012; Reimann et al., 2013), and LFPs (Einevoll et al., 2007; Pettersen et al., 2008; Lindén et al., 2010, 2011; Gratiy et al., 2011; Schomburg et al., 2012; Łęski et al., 2013; Reimann et al., 2013). The word ‘forward’ denotes that the extracellular potentials are modeled from known neural sources (as opposed to the ill-posed “inverse” problem of estimating the underlying sources from recorded potentials). According to the linear volume conduction theory, the extracellular potentials at the electrode contact can be calculated by adding contributions from the transmembrane currents (Nunez and Srinivasan, 2006). In a now frequently used two-step computational scheme, morphologically reconstructed neurons are first simulated with compartmental modeling using a simulation program such as NEURON (Carnevale and Hines, 2006; Carnevale, 2007) to provide transmembrane currents, and next the extracellular potentials are calculated based on these (Holt and Koch, 1999; Pettersen et al., 2012); (Einevoll et al., 2013a,b).
In LFPy
these two steps are performed in an integrated Python environment employing the NEURON simulator (Carnevale and Hines, 2006; Carnevale, 2007; Hines et al., 2009) under the hood, allowing full advantage of the plethora of packages available for the Python programming language. For example, existing multicompartmental neuron models, available from databases like ModelDB1 (Hines et al., 2004), can readily be adapted for use with the LFPy
-package. An example of such analysis made simple with LFPy
is shown in Figure 1, showing a spike, i.e., the extracellular signature of an action potential, from simulations using a recently published rat L5b model neuron by Hay et al. (2011) with LFPy
. While the first released version of LFPy
described here focuses on calculations of extracellular potentials around individual neurons, the tool is directly applicable also to populations of many such individual neurons, that is, model populations for which the synaptic input onto each neuron is described explicitly and do not necessarily follow from concurrent network simulations (Lindén et al., 2011; Łęski et al., 2013).
Figure 1. Calculated extracellular spike waveforms using LFPy
. (A) Position-dependent extracellular spike waveforms during an action potential in a rat L5b pyramidal-cell model (Hay et al., 2011) produced by executing example2.py
, see section 4.2. Black dots correspond to the positions of the (virtual) electrode contact points. Spike traces at each position are normalized and color coded according to the magnitude of the negative peak. (B) Corresponding somatic membrane potential during the action potential. Vertical dashed lines illustrate temporal alignment with the maximum magnitude Vsoma(t) and of an extracellular waveform (C) for the position denoted with an asterisk in (A). Corresponding alignment with the maximum positive extracellular peak is illustrated by vertical dotted lines.
The paper is organized as follows: In section 2 we briefly review the biophysics underlying the forward-modeling scheme used in LFPy
, in section 3 we give an overview over the different Python class-objects in LFPy
, in section 4 we show several examples of the use of LFPy
, more technical aspects of the package are described in section 5, while some concluding remarks are given in the final section 6.
2. Biophysics Behind LFPy
Extracellular potentials recorded inside the brain are generated by transmembrane currents from cells in the vicinity of electrode. To propagate from the membrane to the recording electrode, the signal has to pass through brain tissue consisting of a tightly packed matrix of neurons and glial cells embedded in a low-resistance extracellular medium filling less than one fifth of the total volume (Nunez and Srinivasan, 2006). The low resistance of the extracellular medium ensures that neighboring cells are typically electrically decoupled. Further, the difference between the extracellular potentials recorded at different positions will be small, typically much smaller than a millivolt, i.e., about two orders of magnitude smaller than the potential difference across the highly resistant cell membranes.
The biophysical origin of the recorded signals is fortunately quite well-understood, and a well-founded computational scheme has been developed for the forward modeling of the signals. This scheme naturally divides into two consecutive steps: calculation of transmembrane currents stemming from activity in neurons (and glia cells, if relevant) followed by calculation of the extracellular potentials generated by these transmembrane currents. The calculations of extracellular potentials as implemented in LFPy
are thus also organized in two steps:
1. Calculation of transmembrane currents of each neuron, using multicompartmental model neurons derived from detailed morphological reconstructions of neurons within NEURON simulation environment (Carnevale and Hines, 2006; Carnevale, 2007).
2. Calculation of the extracellular potential from the transmembrane currents using a biophysical forward-modeling formalism derived within so called volume-conductor theory (Hämäläinen et al., 1993; Nunez and Srinivasan, 2006).
2.1. Multicompartmental Modeling of Transmembrane Currents
In the first step, multicompartment neuron models are used to calculate transmembrane currents. Figure 2A illustrates the principle behind the construction of such multicompartmental models where the neuron is divided into compartments, each so small that the electrical potential can be assumed to be the same throughout the compartment (Segev et al., 1989; De Schutter, 2009). Every compartment is described as an equivalent electrical circuit where the key dynamical variable is the membrane potential V, and the equation describing the dynamics of this variable follows from Kirchhoff's current law stating that the currents going into a circuit node have to sum to zero. For the case where the extracellular potential is assumed constant, the mathematical equation describing the temporal development of the membrane potential Vn of compartment n in Figure 2A is given by
Figure 2. Illustration of biophysical modeling scheme and corresponding organization of LFPy
-package. (A) Principle of multicompartmental modeling where a piece of an apical dendritic branch, in this example assumed purely passive with only capacitive and leak membrane currents, is divided into a set of compartments indexed by n. The circuit diagram shows the equivalent electric circuit of the compartment where the dynamics is governed by an equation set consisting of equations of the type shown in Equation (1). The net transmembrane current In(t), in this case the sum over the capacitive and leak membrane currents in compartment n, is then used in the forward-modeling schemes in Equations (3–5) to calculate extracellular potentials. (B) LFPy
is a Python package, dependent on numpy
, Cython
and NEURON, implementing this combined modeling scheme. Its main features are object-oriented representations of biophysically detailed neurons (LFPy.Cell, LFPy.TemplateCell
), point-process mechanisms such as synapses or patch electrodes attached to different locations of the cell-objects (LFPy.Synapse, LFPy.StimIntElectrode
), and an extracellular recording device allowing calculation of extracellular potentials at arbitrary locations (LFPy.RecExtElectrode
).
The two terms on the left hand side of the equation represent intracellular ohmic currents between compartment n and the neighboring compartments n + 1 and n − 1. The first term on the right hand side represents currents due to capacitive properties of the cell membrane, while the second term represents currents due to various other membrane processes such as passive and active intrinsic ion channels and synaptic inputs. In the full multicompartmental model of a neuron there will be an equation of the type shown in Equation (1) for each compartment, and the equation set is solved numerically using dedicated simulation tools such as NEURON (Carnevale and Hines, 2006; Carnevale, 2007). The transmembrane current from each neuronal compartment n is then at each instant in time given by the right hand side of Equation (1), denoted by In in Figure 2A. There are different numerical strategies in terms of the spatial discretization of neuronal models, and in NEURON, the spatial discretization is equivalent to assuming that the transmembrane current density is uniformly distributed in each compartment so that second order accurate intracellular potentials between nodes can be found by linear interpolation (Hines and Carnevale, 2001; Carnevale and Hines, 2006).
Note that Kirchhoff's current law implies that the net transmembrane currents (including the capacitive current) coming out of a neuron at all times must equal zero. Thus with the neuron depicted in Figure 2A divided into N compartments, one must at all times have . Therefore a single-compartment neuron model cannot generate any extracellular potential since the net transmembrane current necessarily will be zero. The simplest model producing an extracellular potential is a two-compartment model where a transmembrane current entering the neuron at one compartment leaves at the other compartment. The simplest possible multipole configuration is thus the current dipole (Pettersen et al., 2012).
2.2. From Transmembrane Currents to Extracellular Potentials
Given the numerical value and spatial position of all transmembrane currents, the extracellular potentials can be computed on the basis of volume conductor theory. Here the system can be envisioned as a three-dimensional smooth extracellular continuum with the transmembrane currents represented as volume current sources (Nunez and Srinivasan, 2006). In this framework the fundamental relationship between an extracellular potential ϕ(t) recorded at position r due to a transmembrane current I0(t) at position r0 is given by (Hämäläinen et al., 1993; Nunez and Srinivasan, 2006):
Here the extracellular potential ϕ is set to be zero infinitely far away from the transmembrane current, and σ is the extracellular conductivity, assumed to be real, scalar (the same in all directions) and homogeneous (the same everywhere in an infinite volume conductor). Equation (2) relies on two key assumptions:
1. The quasistatic approximation of Maxwell's equations amounting to omitting terms with time derivatives of the electric (E) or magnetic fields (B) so that these field effectively decouple. For the frequencies inherent in neural activity, i.e., less than a few thousand hertz, this approximation seems to be well-justified [see, e.g., argument on p. 426 in Hämäläinen et al. (1993)].
2. The assumption of a linear, isotropic, homogeneous and ohmic extracellular medium, i.e., a linear relationship between the current density j and the electrical field E, j = σE, where σ is a real scalar. The absence of an imaginary part of the conductivity σ implies that the capacitive effects of the extracellular tissue are assumed to be negligible compared to resistive effects. This appears to be well-fulfilled for the relevant frequencies in extracellular recordings (Nunez and Srinivasan, 2006; Logothetis et al., 2007). The fact that σ is a scalar reflects the assumption of isotropic and homogeneous medium.
Note that while the present version of LFPy
is based on these assumptions, the forward model in Equation (2) can be generalized to account for, for example, different conductivities in different directions (Nicholson and Freeman, 1975; Logothetis et al., 2007), discontinuities in conductivity at interfaces between gray and white matter or between the gray matter and the cortical surface (Pettersen et al., 2006), or, if warranted, frequency-dependent and/or complex extracellular conductivities σ (Bédard et al., 2004; Bédard and Destexhe, 2012). For more discussion of the validity and possible generalizations of the present forward-modeling scheme, see Pettersen et al. (2012).
Equation (2) applies to the situation with a single current I0, but since contributions from several transmembrane current sources add linearly, the equation straightforwardly generalizes to a situation with many transmembrane current sources. With N point current sources the formula in Equation (2) generalizes to:
With a neuron divided into N compartments, the natural use of the formula in Equation (3) is to set rn at the “mean” position of compartment n, e.g., at the center of a spherical soma compartment or the mid-point of a cylindrical dendritic compartment. This scheme corresponds to the so called point-source approximation (Holt and Koch, 1999; Pettersen et al., 2008) since all transmembrane currents into the extracellular medium go through a single point. Another scheme, the line-source approximation, assumes the transmembrane currents from each cylindrical compartment to be evenly distributed along a line corresponding to the cylinder axis (Holt and Koch, 1999; Pettersen et al., 2008). The analogous formula for the line-source approximation is obtained by integrating Equation (3) along the center-line axis along each compartment (Holt and Koch, 1999; Pettersen et al., 2008):
Here Δsn denotes the length of the compartment, ρn the distance perpendicular to the line compartment, hn the longitudinal distance from the end of the compartment, and ln = Δsn + hn the longitudinal distance from the start of the compartment. In this and the above method, singularities are avoided by strictly preventing the denominators (i.e., |r − rn|) to be less than the radius of the relevant cylindrical compartment. Both the point-source and the line-source approximation schemes are implemented in LFPy
, together with a mixed method applicable for models with a single-compartment soma as the root section (defined to be compartment 1), effectively treating the soma as a sphere source:
The three methods described by Eqs. (3-5) are expected to give similar results in electrode positions far from the cell, while results may differ more for electrode positions close to the neuron's membrane (Holt and Koch, 1999).
Note that the modeling scheme as presented here is not fully self-consistent as the calculation of the transmembrane currents (Equation (1)) is done assuming constant potentials outside the neuron, which corresponds to assuming negligible resistivity in the extracellular medium. In contrast, a finite resistivity (~ 1/σ) is assumed in the forward models. This approximation ensures efficient forward modeling of extracellular potentials allowing, for example, for calculation of LFPs from populations of tens of thousands of neurons (Lindén et al., 2011; Łęski et al., 2013; Reimann et al., 2013).
The forward-modeling formulas in Eqs. (3-5) all predict potentials at points, while real recording electrodes of course have a physical extension. Finite-sized electrode appears to measure the average potential across the uninsulated electrode surface (Nelson and Pouget, 2010), and here we thus approximate the potential recorded by an ideal electrode contact as the average potential across its surface S as:
for m random locations r′i on the surface S, with surface area AS, of the electrode contact. The surface S is by LFPy
assumed to be flat and circular.
3. Overview of LFPy
In this section we give a brief overview over the different classes available in LFPy
as illustrated in Figure 2B.
3.1. Representing Cells in LFPy
The main class in LFPy
is LFPy.Cell
. It is used to create objects that represent individual model cells, and it serves as an interface with the NEURON simulation environment (Carnevale and Hines, 2006; Carnevale, 2007; Hines et al., 2009). It is also necessary for interactions with other LFPy
class-objects. Each LFPy.Cell
-object stores information about the neuron model, most importantly references to all sections (branches) of the neuron and their geometry, and some parameters of the simulation.
When creating a LFPy.Cell
object, one can set various properties of the neuron model and specify the simulation. During initialization it will:
- Load the neuron geometry file,
- Load additional model-specific files (e.g., defining active channels),
- Assign biophysical properties and insert channel densities,
- Split sections into appropriate numbers of compartments,
- Assign all compartments an index at the global cell level (see Sec. 5.7),
- Specify the position and orientation of the cell and its compartments in space, and
- Specify simulation duration and temporal resolution.
The standard way of creating a cell object is thus to call LFPy.Cell()
, as in the example in section 4.1 below. However, some NEURON models make use of templates (Carnevale and Hines, 2006), Ch. 13), and for such models one has to use the inherited class LFPy.TemplateCell
, as described in section 4.2. LFPy.Cell
will assign references to different sections in the top-level of the NEURON environment, while LFPy.TemplateCell
will assign them to a specific template
. Although several LFPy.Cell
objects may exist simultaneously in Python, only LFPy.TemplateCell
allows for multiple cell representations internally in NEURON. Nevertheless, simulations of networks of cells are currently not supported in LFPy
for reasons discussed in section 5.6.
After the cell object is created the user can interact with various methods and attributes implemented in the LFPy.Cell
(or LFPy.TemplateCell
) object. It is, for example, possible to position the cell, inspect properties of sections and compartments of the cell, and to specify which of the variables (membrane voltage, ionic currents) should be recorded during the simulation. Finally, the simulation is started by calling the simulate()
method which initializes and executes the model in NEURON.
3.2. Cell Stimulation
LFPy
provides two classes, LFPy.Synapse
and LFPy.StimIntElectrode
(cf. red dot in Figure 2B), which can be used to specify inputs to the cell. They manage synaptic currents triggered by input spike trains and intracellular patch-clamp electrodes, respectively, using NEURON point processes, such as ExpSyn
and IClamp
(but user-defined synapses or stimulation electrodes are possible through the use of .mod
-files specified using the NEURON model description language NMODL (Carnevale and Hines, 2006, Ch. 9)). One important difference between synapses and electrodes is that an electrode current is not a transmembrane current in that the current does not come from the extracellular space. This implies that the total current across the cell's membrane no longer will sum to zero, resulting in monopole contributions in the extracellular potential (as the injected current is not included when calculating the extracellular potential). Direct specification of inputs via NEURON is possible as in Hines et al. (2009), but the classes provided in LFPy
are usually more convenient: they allow for easy placement of stimulation mechanisms at specified dendritic positions and for easy recording of stimulation currents and membrane voltages in the compartments they are attached to.
3.3. Extracellular Recording Electrodes
Extracellular recording electrode contacts are in LFPy
represented by the LFPy.RecExtElectrode
class (blue dots, Figure 2B). Creating an electrode object allows specification of the extracellular conductivity and arbitrary configurations of electrode contact points in 3D-space, and choosing either point contacts [i.e., employing Equations (3), (4) or (5)] or finite-size electrode contacts [i.e., Equation (6)].
The RecExtElectrode
class provides three different methods for calculating the extracellular potential. These are (1) the point-source approximation [Equation (3), keyword argument method=“pointsource”
], (2) the line-source approximation [Equation (4), keyword argument method=“linesource”
], and (3) the mixed method where the soma section is treated as a point source and dendritic compartments are treated as line sources [Equation (5), keyword argument method=som_as_point
]. The last method should only be used if the soma is the root of the morphology and represented by a single compartment. If this is not the case, LFPy
erroneously assigns a point current-source to another compartment.
The extracellular potential can be calculated using RecExtElectrode
either after the simulation using stored recorded membrane currents, or at run time, i.e., each time the NEURON simulation advances one time step (see section 5.9). The latter approach avoids the need for storing recorded membrane currents. We illustrate both methods in Examples below.
As the methods for calculating the extracellular potential may be useful outside LFPy
, the low-level implementations of Eqs. (3–5) are not contained within RecExtElectrode
, but may be used directly by means of any of the functions LFPy.lfpcalc.calc_lfp*
. They take keyword arguments cell, x, y, z, sigma
, respectively a Cell
-like instance, extracellular coordinates and extracellular conductivity, and return the extracellular potentials calculated from recorded, transmembrane currents. In section 5.9 we discuss how to use LFPy
with other methods for calculating the extracellular potentials, i.e., other forward models, than the ones currently provided and described in section 2.2.
4. Examples
We next consider a few simple examples on how LFPy
can be used for calculations of extracellular potentials. (For installation instructions and other technical aspects please see section 5, and the online documentation2).
4.1. Single Synaptic Input into Passive Pyramidal Cell
We start with a minimal example (example1.py
), in which we set up a passive layer-5 pyramidal cell receiving input through a single synapse, run the simulation, and calculate the extracellular potential, similar to the setup used in Lindén et al. (2010).
First we import LFPy
and numpy
3 (Jones et al., 2001):
Then we define a dictionary with keyword arguments to be used with LFPy.Cell
:
The only mandatory entry is morphology
, here pointing to a reconstructed neuron morphology4 (Mainen and Sejnowski, 1996) defined with NEURON's HOC
-scripting language in a hoc
-file. We also specify the start and end times of the simulation (in milliseconds). Several other options are available (such as specifying passive and active parameters of the cell), but for now we leave them at default values.
We are now ready to create our cell instance using the LFPy.Cell
-class:
Here we use the cell.set_rotation
method to align the apical dendritic branch with the z-axis (cf. section 5.3), providing rotation angles in radians.
We next attach a synapse to our cell
. Again, we define the synapse parameters in a dictionary, and use a method of the cell object to find an appropriate synapse location:
We then create a Synapse
object that is connected to our cell by passing cell
as an argument, and activate it once at t = 20 ms by providing the set_spike_times
-method with a numpy
-array:
We are now ready to initialize and simulate the postsynaptic response of the cell:
Note the keyword arguments: rec_imem=True
sets up the recording of transmembrane current (these are needed later to calculate the extracellular potential), while rec_isyn=True
specifies that the synapse current(s) is recorded.
The final step is to set up the extracellular electrode object. Again, we start by defining the parameters,
which sets the positions of two extracellular electrode contacts at (x, y, z) = (−130, 0, 0) and (−220,0,700) μm, respectively. The number of electrode contact points is defined by the length of the passed arrays containing the contact positions; this allows the user to flexibly define an arbitrary number of recording positions.
By employing class LFPy.RecExtElectrode
, we create a Python object representing the extracellular recording devices:
Finally, we calculate the extracellular potential at the specified electrode locations:
The resulting two extracellular potentials are stored in the numpy
-array electrode.LFP
, and the results for this example are shown in the left panels of Figure 3. This figure also shows equipotential lines in the xz−plane for the maximum potential magnitude, obtained by setting up a second LFPy.RecExtElectrode
object representing a grid of recording positions.
Figure 3. Extracellular potential generated by a single synaptic input produced by executing example1.py
. Extracellular potentials (middle and bottom left panels) generated at positions marked by green and blue dot, respectively, by a synaptic input current (upper left panel) injected in the apical dendrite at the position marked by red dot. The pyramidal cell corresponds to a layer-5 pyramidal cell from cat visual cortex with passive membranes but without adjustment of the membrane area to compensate for spines (Mainen and Sejnowski, 1996). The contour plot shows equipotential lines for the maximum magnitude of the extracellular potential in the xz-plane.
4.2. Spiking Pyramidal Cell with Custom hoc
Code
In the next example the extracellular signature of an action potential generated by a layer-5 pyramidal cell model from Hay et al. (2011) is considered. This example (example2.py
), whose outcome is depicted in Figure 1, describes a somewhat more advanced scenario, and serves to illustrate the following features:
- Use of network-ready models with the
LFPy.TemplateCell
-class, - Use of models with active conductances,
- Use of NeuroLucida V3 morphology file format,
- Definition of non-zero electrode contact surface area,
- Calculation of extracellular potentials at run time.
This example requires model files that can be obtained from ModelDB (Hines et al., 2004) (model no. 1396535). By unzipping the downloaded model files, all necessary files should be available in the folder L5bPCmodelsEH
, including the morphology file and .mod
-files describing active membrane mechanisms using NMODL
-syntax in L5bPCmodelsEH/mod/
. The .mod
-files must be compiled with the shell script nrnivmodl
(or mknrndll
on Windows machines) provided with NEURON, and loaded:
We start by specifying the LFPy.TemplateCell
keyword arguments:
The following keyword arguments are specific to the TemplateCell
class:
templatefile
, a (list
of)HOC
-file(s), specifying thetemplate
-file(s) used for the cell object,templatename
, a string with the name thatLFPy.templateCell
uses to access the underlying NEURON object, andtemplateargs
(optional), that can be used to supply arguments to thetemplate
.
Here, we allow the template
-files to define the full set of membrane properties as well as the degree of cell compartmentalization [a brief description of template
usage are given in section 5.5, but see also (Carnevale and Hines, 2006, Ch. 13)]. The membrane potential is however set to v_init
in all sections when the model is initialized, and we override the default values for temporal resolution of the simulation. We are here starting the simulation at t = −159 ms to remove a start-up transient and a period of depolarization before the action potential is generated. Recordings of variables and estimations of extracellular potentials will however not occur until the time-step corresponding to t = 0 ms is reached.
Since the cell is now defined using a template
in NEURON, we employ LFPy.TemplateCell
instead of LFPy.Cell
to create the cell:
To invoke an action potential in the model, we override the default reversal potential of the passive leak channel originally specified in L5PCbiophys3.hoc
:
For the extracellular recording device, we simulate the extracellular potentials in a two-dimensional, 9×9 evenly spaced grid with a contact spacing of 20 μm, and specify parameters for contact-surface averaging, including each contact's surface normal vector, common radius and the number of points to include in the estimation of the average potential (cf. Equation 6):
This time we tell LFPy
to calculate the extracellular potentials at runtime, by passing the electrode
object to cell.simulate
:
instead of passing cell
to the electrode
object as we did in the first example above (section 4.1). This assures that the transmembrane currents are discarded after every simulation time step, allowing for more efficient memory usage. Simulation results are shown in Figure 1.
4.3. Using MPI for Distributed Simulations
The present version of LFPy
is primarily developed for the study of single cells, but under the present assumption that contributions to the extracellular potential from different cells add linearly (cf. section 2.2), it is straightforward to simulate large populations of cells and sum their contributions. While one option is to simulate cells one after the other, and subsequently sum their contributions, simulations on modern multi-core computers and supercomputers can facilitate greatly from parallelization, e.g., by running computations for different cells on different cores simultaneously. One common way of distributing such simulations is with the Message Passing Interface
6 (MPI). Below we describe a simple procedure for calculating the extracellular potential from a population of pyramidal cells receiving input from a common pool of presynaptic spike trains. Each neuron is simulated independently, and we rely on MPI to communicate the simulation results of each individual neuron to the root process. This example (example3.py
) illustrates how one can easily simulate extracellular potentials of large population of cells similar to the setup used in Lindén et al. (2011) and Łęski et al. (2013) with only a few additional lines of code added to the single cell simulation.
In Python, we will use mpi4py
7 to interact with the MPI environment:
Here, we set the number of cells in the population identical to the number of MPI processes (COMM.Get_size()
), and index each cell by the rank of the current process (COMM.Get_rank()
). The number of processes is given as an argument to the MPI executable using the -n
flag,
mpirun -n 6 python example3.py
which in this case will simulate extracellular potentials from a population of 6 cells, distributed over 6 different Python-processes. Each MPI process will execute the same script, but we can differentiate the instructions to different cells depending on their MPI rank, i.e., with the index returned by COMM.Get_rank(). Note that it is also straightforward to combine serial and parallel execution and to have a constant number of cells in the population, regardless of the number of MPI processes (not shown here).
In the present example we want all cells to share the same pool of presynaptic spike trains, albeit with a different selection of input spike trains for each cell. We first generate the random presynaptic spike trains on each rank, and ensure that the spike-trains are equal for each process by setting the random seed of the numpy
random number generator before creating the spike trains:
Once the presynaptic spike trains have been created we define the position and rotation for all cells as in previous examples. We then draw a number of presynaptic spike trains for each neuron from the common pool. By setting the number of synapses (each receiving one presynaptic spike train from the pool) for each neuron we can adjust the level of input correlation to the population (Lindén et al., 2011; Łęski et al., 2013). We here choose 100 spike trains for each cell from the pool of 1000 spike trains, giving an input correlation of 0.1 (Lindén et al., 2011). Since these random selections are now done for each cell independently, we assign unique random seeds on each rank:
We then create the cell, set up synapses with activation times from the pool of spike trains, and simulate each cell as in the previous example with a single synaptic input (but here with 100 distributed synapses instead of one). Different Python-processes do not yet see each others simulation results, but we may communicate these to the root process (rank zero) using the send
, receive
and reduce
commands provided by MPI:
We can also use MPI to sum arrays directly:
At this point, simulation results have been collected into numpy
-arrays on the root process, containing both single-cell and summed contributions to the extracellular potential of the population, as shown in Figure 4.
Figure 4. Simulation of extracellular potentials from a population of neurons using MPI. A population of pyramidal cells (Middle panel) receiving input spikes from a presynaptic pool of spike trains (Left panel) is simulated by distributing cells on different MPI processes and by collecting their individual contributions in the root MPI process. Summation of the individual contribution then gives the total population potential (Right panel). Results shown come from executing example3.py
.
4.4. More Examples
Full simulation scripts for reproducing Figure 1 (example2.py
) , Figure 3 (example1.py
), and Figure 4 (example3.py
) can be obtained together with the LFPy
source code (ref. section 5.2) in the folder /path/to/LFPy/examples/
, along with additional example scripts.
5. Technical Aspects
5.1. Requirements
LFPy
is a package for the Python programming language8 (Langtangen, 2009), and has primarily been developed and tested on Python 2.7.x, and checked for forward compatibility with Python 3.x. LFPy
should work on any common 32- or 64-bit platform. The main development and testing platforms have been Debian9 derivates and OS X, but LFPy
should work equally well on other Unix-like operating systems and Windows. LFPy
requires the Python packages NumPy
and Cython
10. Cython
allows building C-extensions from comparably slow Python code, which we employed to speed up time-consuming parts of the LFPy
codebase, such as the low-level calculations in the line-source method (Holt and Koch, 1999) and the while
-loop advancing the simulation time step by time step. The cProfile
module11 has been used to identify bottlenecks in the code, and the corresponding code was then rewritten using Cython
. If Cython
is not installed, LFPy
will fall back to equivalent but slower Python code. In order to enable all functionality and to run all the example scripts and IPython
notebooks successfully, the pylab
environment may be required [NumPy
, SciPy
12 (Jones et al., 2001), matplotlib
13 (Hunter, 2007)], and in addition h5py
14, mpi4py
15, IPython
16 (Pérez and Granger, 2007) version 0.13 or newer with IPython
notebook.
LFPy
requires the NEURON simulation environment17 (Hines and Carnevale, 2001; Carnevale and Hines, 2006) for calculation of the transmembrane currents from activity in multicompartment neuron models. Generic instructions on how to build NEURON as an extension to Python are found in Hines et al., (2009, Appendix), and we maintain some step-by-step instructions for Ubuntu Linux and OS X at the LFPy
homepage18. Availability of the neuron
-module can be checked by issuing:
python -c “import neuron”
NEURON -- VERSION 7.3 (736+:19ad148877ff+) 19ad148877ff
Duke, Yale, and the BlueBrain Project -- Copyright
1984-2012
See http://www.neuron.yale.edu/credits.html
While we normally recommend using the standard Python or the interactive IPython
interpreters with LFPy, it is in principle possible to use the Python-interpreter supplied with the standard release of NEURON19, cf. Section 5.2.3.
5.2. Installation and Testing
5.2.1. Easy install of LFPy
‘Official’ releases of LFPy
can be installed in one line from the Python Package index20, using either easy_install
or pip
, with or without administrative privileges:
$ pip install LFPy --user # or
$ sudo pip install LFPy
If LFPy
was previously installed, add the --upgrade
flag to force reinstall or upgrade.
5.2.2. Installation from source
The LFPy
sources can be obtained either by downloading official releases, or by checking out the latest development code from the repository with subversion
21 :
$ svn co \
http://bebiservice.umb.no/svn-public/LFPy-release/
trunk LFPy
LFPy
can then be installed by executing the supplied distutils
setup.py
script with or without administrative rights:
$ cd /path/to/LFPy/
$ python setup.py install --user # or
$ sudo python setup.py install
LFPy
can also be used from any folder containing the source code by either issuing or adding the following line to the $HOME/.bashrc
or similar file:
$ export PYTHONPATH=PYTHONPATH/:/path/to/LFPy/:
The Cython
extensions must then be built in-place by issuing:
$ python setup.py build_ext -i
5.2.3. Testing the installation
If the installation finished without error, and other Python requirements are met (see section 5.1), the importing of LFPy
using Python or NEURON as the interpreter, should print out some NEURON credits:
$ python -c “import LFPy” # or
$ nrngui -python -c “import LFPy”
NEURON – VERSION 7.3 (736+:19ad148877ff+)…
5.2.4. Unit tests
If the LFPy
source code has been obtained, a test suite built using the unittest
module can be run as:
$ cd /path/to/LFPy/unittest
$ python testLFPy.py
The script will execute a series of tests, and summarize the results:
…
Ran 25 tests in 28.735 s
OK
The test suite initially calculates the extracellular potentials from a stick neuron with sinusoidal synaptic input applied to one end, obtained by numerically solving the analytical expression for the extracellular potential (Pettersen and Einevoll, 2008), and subsequently compare with results obtained from equivalent LFPy
simulations. If the discrepancy between the extracellular potentials from the analytical expression and LFPy
simulations is sufficiently small (typically 3 running digits), tests will pass. Other tests check consistency at different time resolutions, and whether the outputs of the different calculation methods (Eqs. 3-5) converge in the far field, i.e., far away from the neuronal source.
5.3. Morphology Files
The morphology
keyword argument for LFPy.Cell
should be a .hoc
-file similar to those from the export dialog of the Import3D
tool or from the 3D Neuron Viewer
application at NeuroMorpho.org22 (Ascoli et al., 2007), with the full 3D-specification of the neuron. However, the Cell
class will also load SWC, NeuroLucida (v1 and v3), and NeuroML23 (Gleeson et al., 2010) files using the Import3D
tool internally if such files are detected. The procedure loading the morphology also attempt to load a .rot
-file alongside the morphology file itself, with default rotation angles typically applied to orient the apical dendritic tree along the positive z-axis pointing upwards (using the right-hand rule, the xy-plane is the horizontal plane). The morphology is rotated around the center of the soma. A .rot
file is a pure text file containing three lines, each telling the rotation angle in radians around each axis, similar to:
x = 4.729
y = -3.166
z = 0
i.e., as generated by the script /examples/create_
rot_file.py
.
With the cell
keyword argument pt3d=True
, rotating or repositioning of cell
is applied also to the pt3d information within NEURON.
5.3.1. Visualization
While LFPy
does not provide specific plotting functionality, a cell
may easily be visualized using, e.g., matplotlib
and the following code:
5.4. Setting the Biophysical Properties
The custom_code
argument of the Cell
-class can be used to pass additional biophysical properties of the model neuron. This argument should be used with HOC
-language or Python-statements in .hoc
or .py
files, respectively. The path to the file should either be provided as strings, or a list
pointing a set of files. The files typically contain procedures looping over the sections of the morphology, defining which membrane mechanisms and corresponding densities and properties are present on the section- or compartment level. Another option is to use custom_fun
and custom_fun_args
arguments of the Cell
class to pass regular python functions and optionally arguments for these to set the biophysical properties of the model.
A few example files (e.g., /examples/example5.py
and /examples/example6.py
) supplied with LFPy
, make use of these different methods to specify the biophysical properties of a layer-5 cat pyramidal cell model adapted from Mainen and Sejnowski (1996), by using the relevant parts from the original model code from ModelDB24.
Note that the default behavior of the Cell
is to insert NEURON's pas
and extracellular
mechanisms across all sections, and set the number of compartments for each section according to the d_lambda
rule, with distance between nodes no longer than a fraction d_lambda
=0.1 of length constants λf computed at f = 100 Hz (Hines and Carnevale, 2001). This default behavior can be switched off with the Cell
keyword arguments:
In this case the passive properties, compartmentalization, and optionally the extracellular mechanism to enable calculation of extracellular potentials, must be set by the procedures that also set the remaining biophysics of the cell model, otherwise NEURON may fail to assess the equivalent circuit of the model neuron.
If a model loaded in LFPy
fails to reproduce the original model behavior, a simple way to verify that properties like temperature, morphology or channel densities are correct is to print and compare the properties of all compartments in both implementations:
In HOC
:
In Python:
Note that compiled NMODL
files present in the working folder will be loaded by default, but such files located elsewhere have to be imported explicitly:
Above, the morphology and specifications of the biophysical properties were given as keyword arguments to LFPy.Cell
. Models existing in memory can in principle be executed by supplying the keyword arguments morphology=None, delete_sections=False
in addition to the above cell_parameters
, e.g., if a model is defined via the NEURON graphical or command line interface. Defining scripts with the full specification of the model loaded with LFPy.Cell
, is, however, in most cases more tractable.
5.5. Using Cell Templates
As illustrated in Section 4.2, the TemplateCell
class requires a template specification to assign section references. The template specification file should conform to the basic structure of the following example, assigning the somatic, dendritic and axonal sections of a reconstructed morphology to lists:
begintemplate LFPyCellTemplate
public soma, axon, dend, apic
public all, somatic, axonal, basal, apical
objref all, somatic, axonal, basal, apical
proc init() {
all = new SectionList()
somatic = new SectionList()
axonal = new SectionList()
basal = new SectionList()
apical = new SectionList()
}
create soma[1], axon[1], dend[1], apic[1]
endtemplate LFPyCellTemplate
5.6. The extracellular
Mechanism and Parallel NEURON
LFPy
by default inserts the extracellular
mechanism provided by NEURON in every compartment (which is useful to simulate the use of e.g., extracellular stimulation electrodes). This mechanism conveniently provides direct access to the total transmembrane current In, eliminating the need to individually extract all ionic, resistive, capacitive and synaptic transmembrane currents and sum them. While certain minor limitations for use of the extracellular
mechanism together with the parallel capabilities of NEURON provided by ParallelContext
exist, i.e., in combination with the multisplit-method and splitcell-method applied to dendritic trees of individual cells (Hines et al., 2008), the present version of LFPy
has not been written in a way that exploit NEURONs parallel capabilities. Therefore, LFPy does not support implicit parallel simulations of extracellular potentials with interconnected neurons. Within that scope, different cell-objects in general have to be distributed between different MPI-ranks, and their corresponding connections have to be communicated using the provided ParallelContext
interface. Note that in the MPI example in Section 4.3, each cell exists independently without connections on different MPI ranks which does not require the NEURON ParallelContext
.
5.7. Indexed Compartments and Section References
LFPy
extensively uses numpy
array-operations for efficient calculation of extracellular potentials. Most data regarding specific compartments in the model neuron is therefore stored in numpy
-arrays with length equal to the total number of compartments in the cell. This includes, for example, the start- and end coordinates of current sources along the x, y, z-dimensions and the transmembrane currents in each time step. Each compartment is in this representation assigned a specific (unique) index.
However, the usual way to access compartments in NEURON is through section references and relative coordinates:
i.e., there are no 'global' indices as in LFPy
where instead the compartment indices, idx
, correspond to a counter in a nested loop over all sections and compartments:
Therefore, to ease this transition for users accustomed to working with specific models in NEURON, LFPy.Cell
provides methods for getting indices corresponding to sections in the NEURON namespace
or conversely, getting section names and positions from compartment indices:
5.8. Constructing Line Sources
Morphologically detailed neuron models resulting from histological reconstruction (De Schutter, 2009), Ch. 8), typically specify sections with an arbitrary number of data points (x, y, z, d), i.e., 3D locations and diameters. For a section corresponding to a continuous piece of dendrite split into Nseg compartments, NEURON creates equivalent cables that correspond to the arc length as specified by the histological 3D-points, where the cables have equal length, but varying diameter, effectively with different electrotonic length constants. The total length of the compartments is equal to the total arc-length of the reconstructed section, but the detailed geometry is not needed for solving the cable equation. Compartments and their respective transmembrane currents must however be assigned a location and orientation in 3D space. In LFPy
, the start and end-point coordinates of each straight line source are obtained using linear interpolation along the total arc-length of each section, so that for a section with section.nseg==1
the line source is a straight line between the start and end-points of the section, for section.nseg==2
, straight lines between the start, mid- and end-points of each section are used and so forth. As a consequence, the total length of the line sources will typically be less than the total arc length of the section depending on its geometry, but more histological information may be preserved with line sources by increasing the number of compartments per section. This reduction in morphological detail is implied in Figure 2A. The diameter and surface area of each compartment as reported by NEURON is preserved, however, such that the minimum allowable distance between a putative extracellular site and compartment axis will be equal to its radius. If conflicts are detected, the minimum radius employed in extracellular potential calculations is automatically set equal to the respective compartment radius.
5.9. Fast and Memory-Efficient Scheme for Calculating Extracellular Potentials
The traditional way of employing the forward formalism for calculation of extracellular potentials as described in section 2.2 is to first extract the membrane currents of a model neuron for the entire duration of the simulation time, and to store them temporarily either in memory or on file (Holt and Koch, 1999; Gold et al., 2006, 2007; Pettersen et al., 2008). The stored transmembrane currents may then be used to calculate the extracellular potentials offline. This is, however, a computationally inefficient and memory-consuming procedure. For example, storing all transmembrane currents of a 1000-compartment neuron model at 64-bit float precision for 1 s of simulation time running at 20 kHz temporal resolution, will require 160 MB of uncompressed binary storage (e.g. with numpy.save()
or with HDF5
25), and as much as ~500 MB in a text file using numpy.savetxt()
with %.18e
formatting.
As shown in section 4.2, this inefficient and memory-consuming process of intermediate storage of membrane currents can be omitted altogether. Assuming linear superposition of extracellular potentials from different current sources in extracellular media, LFPy
can geometrically map the contribution from each compartment-current to any electrode contact point defined with the class LFPy.RecExtElectrode
. This is done by temporarily substituting the cell's membrane currents with an (N, N) identity-matrix, and running the cell object and corresponding identity matrix through the LFPy.RecExtElectrode
class, defining the geometry of an extracellular recording device with Ncontacts contact points. The end result is an (N, Ncontacts) coefficient matrix C, that only needs to be computed once. For simulations of extracellular potentials, the potentials at the different electrode contacts at every time step ti is then simply given by the dot product
where the vector I(ti) of length N contains the respective membrane currents, and Φ(ti) a vector with length Ncontacts containing the extracellular potentials at time-step ti. The memory requirements are potentially reduced by orders of magnitude (≈N/Ncontacts) vs. in-memory storage of transmembrane currents, at the cost of calculating C. Any such array Cx (or list
thereof) can readily be passed with keyword argument dotprodcoeffs
to cell.simulate()
. LFPy
thereby facilitates additional computations relying on compartmental membrane currents, where cell
and stimulus can still be used to set up the model.
LFPy
will default to storing results in-memory, but simulation of extracellular potentials to HDF5
directly with h5py
is supported by setting LFPy.Cell.simulate
keyword arguments to_memory=False
, to_file=True
, and file_name=“some/file/name.h5”
.
6. Discussion and Outlook
We have presented a new Python software package, LFPy
, for calculation of extracellular potentials around morphologically reconstructed neurons. Despite its name, the software is not only applicable for calculation of local field potentials (LFPs), the low-frequency part of the extracellular potentials (cf. Example 1 in section 3.1). As the biophysical forward-modeling scheme is also applicable for the higher frequencies contained in electrical signals recorded in the brain, LFPy
can equally efficiently be used for simulations of high-frequency signals such as extracellular spikes (cf. Example 2 in section 3.2).
While the present version 1.0 of LFPy
is focused on the calculation of single-neuron contributions to the extracellular potentials, the computational scheme generalizes directly to the calculation of signals from populations of neurons. This was illustrated in Example 3 in section 3.3 where also parallelization of the computational scheme by means of MPI was employed, however without communication between units. At present, LFPy
is however less suitable for the investigation of extracellular potentials generated in genuine network models that require parallelization of the network activity. At present, this is a limitation in the current version of the software mainly in that the simulation control is incorporated as an LFPy.Cell
class method, and that the class LFPy.TemplateCell
(which allows for multiple simultaneous cell representations) is not using the capabilities of NEURON for assigning each cell to different MPI ranks. However, as simulation of extracellular signals from network activity likely will become increasingly important, we aim to implement solutions to these limitations in future versions of LFPy
.
The computational scheme presented here, and implemented in version 1.0 of LFPy
, is based on the biophysical forward model in Equation (2). This formula inherently assumes an infinite, isotropic, homogeneous, and ohmic extracellular medium (Pettersen et al., 2012). However, the scheme can be straightforwardly generalized to account for anisotropic conductivities (Nicholson and Freeman, 1975; Logothetis et al., 2007; Goto et al., 2010), or jumps in conductivities at tissue interfaces (Pettersen et al., 2006). Also, even if the conductivity σ is found to be frequency dependent, the forward modeling scheme can still be used for each frequency (Fourier) component separately. For further discussion of the validity and possible generalizations of the present scheme, see Pettersen et al. (2012). Finally, when the extracellular conductivities around the recording electrodes have such a complicated spatial structure that analytical formulas either do not exist or are unpractical [e.g., in cortical slice recordings with multielectrode arrays (MEAs) Bakker et al., 2009], one can always solve the forward problem by means of finite element modeling (FEM) (Logg et al., 2012; Ness et al., 2012; Lempka and McIntyre, 2013). A natural avenue of future work is to expand LFPy
to account for such new situations as needs arises.
Another natural application of LFPy
is the investigation of effects from externally imposed electrical potentials in the extracellular medium, for example due to currents injected during deep-brain stimulation (DBS) (Oluigbo et al., 2012) or induced by transcranial magnetic stimulation (TMS) or transcranial direct current stimulation (tDCS) (McKinley et al., 2012). In fact, externally imposed spatiotemporally distributed extracellular potentials (Anastassiou et al., 2010, 2011; Pashut et al., 2011) may already be included in the present version of LFPy
(by use of cell.insert_v_ext()
). However, effects from so called ephaptic coupling (Anastassiou et al., 2011), where neurons mutually interact via extracellular potentials stemming from their own neuronal activity, is less amenable for investigation by the present version of LFPy
.
The development of neuroinformatics tools obviously benefits strongly from an active community of users providing feedback, and possibly even new code reflecting new applications. As we believe that detailed biophysical modeling of extracellular potentials must become an integral ingredient in the future interpretation of such signals, we are hopeful that the present launch of LFPy
will signal the beginning of an active community of such modelers, preferably contributing to the joint development of this tool.
Conflict of Interest Statement
The authors declare that the research was conducted in the absence of any commercial or financial relationships that could be construed as a potential conflict of interest.
Acknowledgments
We acknowledge support from the The Research Council of Norway (NOTUR, eNeuro, NevroNor), the EU Grant 269921 (BrainScaleS), the Polish Ministry of Science and Higher Education (grants N N303 542839 and IP2011 030971), and the International Neuroinformatics Coordinating Facility (INCF).
Footnotes
1. ^http://senselab.med.yale.edu/modeldb/.
3. ^numpy.scipy.org.
4. ^senselab.med.yale.edu/modeldb/ShowModel.asp?model=2488.
5. ^senselab.med.yale.edu/modeldb/ShowModel.asp?model=139653.
8. ^www.python.org.
9. ^www.debian.org.
10. ^www.cython.org.
11. ^docs.python.org/2.7/library/profile.
12. ^www.scipy.org.
13. ^matplotlib.org.
14. ^alfven.org/wp/hdf5-for-python.
15. ^mpi4py.scipy.org.
16. ^www.ipython.org.
17. ^www.neuron.yale.edu.
19. ^www.neuron.yale.edu/neuron/download.
20. ^https://pypi.python.org/pypi/LFPy.
22. ^www.neuromorpho.org.
23. ^www.neuroml.org.
24. ^senselab.med.yale.edu/modeldb/ShowModel.asp?model=2488.
References
Anastassiou, C. A., Montgomery, S. M., Barahona, M., Buzsáki, G., and Koch, C. (2010). The effect of spatially inhomogeneous extracellular electric fields on neurons. J. Neurosci. 30, 1925–1936. doi: 10.1523/JNEUROSCI.3635-09.2010
Anastassiou, C. A., Perin, R., Markram, H., and Koch, C. (2011). Ephaptic coupling of cortical neurons. Nat. Neurosci. 14, 217–223. doi: 10.1038/nn.2727
Ascoli, G. A., Donohue, D. E., and Halavi, M. (2007). Neuromorpho.org: a central resource for neuronal morphologies. J. Neurosci. 27, 9247–9251. doi: 10.1523/JNEUROSCI.2055-07.2007
Bakker, R., Schubert, D., Levels, K., Bezgin, G., Bojak, I., and Kötter, R. (2009). Classification of cortical microcircuits based on micro-electrode-array data from slices of rat barrel cortex. Neural Netw. 22, 1159–1168. doi: 10.1016/j.neunet.2009.07.014
Bédard, C., and Destexhe, A. (2012). Local field potentials,” in Handbook of Neural Activity Measurement, eds R. Brette and A. Destexhe (Cambridge, UK: Cambridge University Press), 136–191. doi: 10.1017/CBO9780511979958.005
Bédard, C., Kröger, H., and Destexhe, A. (2004). Modeling extracellular field potentials and the frequency-filtering properties of extracellular space. Biophys. J. 86, 1829–1842. doi: 10.1016/S0006-3495(04)74250-2
Brette, R., and Destexhe, A. (eds.). (2012). Handbook of Neural Activity Measurement. Cambridge, UK: Cambridge University Press. doi: 10.1017/CBO9780511979958
Buzsáki, G. (2004). Large-scale recording of neuronal ensembles. Nat. Neurosci. 7, 446–451. doi: 10.1038/nn1233
Buzsáki, G., Anastassiou, C. A., and Koch, C. (2012). The origin of extracellular fields and currents — EEG, ECoG, LFP and spikes. Nat. Rev. Neurosci. 13, 407–420. doi: 10.1038/nrn3241
Carnevale, N. T. (2007). Neuron simulation environment. Scholarpedia 2, 1378. doi: 10.4249/scholarpedia.1378
Carnevale, N. T., and Hines, M. L. (2006). The NEURON Book. Cambridge, UK: Cambridge University Press. doi: 10.1017/CBO9780511541612
De Schutter, E. E. (2009). Computational Modeling Methods for Neuroscientists. Cambridge, MA: MIT Press. doi: 10.7551/mitpress/9780262013277.001.0001
Einevoll, G. T., Franke, F., Hagen, E., Pouzat, C., and Harris, K. D. (2012). Towards reliable spike-train recordings from thousands of neurons with multielectrodes. Curr. Opin. Neurobiol. 22, 11–17. doi: 10.1016/j.conb.2011.10.001
Einevoll, G. T., Kayser, C., Logothetis, N. K., and Panzeri, S. (2013a). Modelling and analysis of local field potentials for studying the function of cortical circuits. Nat. Rev. Neurosci. 14, 770–785. doi: 10.1038/nrn3599
Einevoll, G. T., Lindén, H., Tetzlaff, T., Łęski, S., and Pettersen, K. H. (2013b). “Local field potential: biophysical origin and analysis,” in Principles of Neural Coding, eds R. Q. Quiroga and S. Panzeri (Boca Raton, FL: CRC Press), 37–59.
Einevoll, G. T., Pettersen, K. H., Devor, A., Ulbert, I., Halgren, E., and Dale, A. M. (2007). Laminar population analysis: estimating firing rates and evoked synaptic activity from multielectrode recordings in rat barrel cortex. J. Neurophysiol. 97, 2174–2190. doi: 10.1152/jn.00845.2006
Gleeson, P., Crook, S., Cannon, R. C., Hines, M. L., Billings, G. O., Farinella, M., et al. (2010). Neuroml: a language for describing data driven models of neurons and networks with a high degree of biological detail. PLOS Comput. Biol. 6:e1000815. doi: 10.1371/journal.pcbi.1000815
Gold, C., Henze, D. A., and Koch, C. (2007). Using extracellular action potential recordings to constrain compartmental models. J. Comput. Neurosci. 23, 39–58. doi: 10.1007/s10827-006-0018-2
Gold, C., Henze, D. A., Koch, C., and Buzsáki, G. (2006). On the origin of the extracellular action potential waveform: a modeling study. J. Neurophysiol. 95, 3113–3128. doi: 10.1152/jn.00979.2005
Goto, T., Hatanaka, R., Ogawa, T., Sumiyoshi, A., Riera, J., and Kawashima, R. (2010). An evaluation of the conductivity profile in the somatosensory barrel cortex of wistar rats. J. Neurophysiol. 104, 3388–3412. doi: 10.1152/jn.00122.2010
Gratiy, S. L., Devor, A., Einevoll, G. T., and Dale, A. M. (2011). On the estimation of population-specific synaptic currents from laminar multielectrode recordings. Front. Neuroinform. 5:32. doi: 10.3389/fninf.2011.00032
Hämäläinen, M., Haari, R., Ilmoniemi, R. J., Knuutila, J., and Lounasmaa, O. V. (1993). Magnetoencephalography — theory, instrumentation, and application to noninvasive studies of the working human brain. Rev. Mod. Phys. 65, 413–496. doi: 10.1103/RevModPhys.65.413
Hay, E., Hill, S., Schürmann, F., Markram, H., and Segev, I. (2011). Models of neocortical layer 5b pyramidal cells capturing a wide range of dendritic and perisomatic active properties. PLOS Comput. Biol. 7:e1002107. doi: 10.1371/journal.pcbi.1002107
Hines, M. L., and Carnevale, N. T. (2001). Neuron: a tool for neuroscientists. Neuroscientist 7, 123–135. doi: 10.1177/107385840100700207
Hines, M. L., Davison, A. P., and Muller, E. (2009). NEURON and Python. Front. Neuroinform. 3:1. doi: 10.3389/neuro.11.001.2009
Hines, M. L., Markram, H., and Schürmann, F. (2008). Fully implicit parallel simulation of single neurons. J. Comput. Neurosci. 25, 439–448. doi: 10.1007/s10827-008-0087-5
Hines, M. L., Morse, T., Migliore, M., Carnevale, N. T., and Shepherd, G. M. (2004). ModelDB: A database to support computational neuroscience. J. Comput. Neurosci. 17, 7–11. doi: 10.1023/B:JCNS.0000023869.22017.2e
Holt, G. R., and Koch, C. (1999). Electrical interactions via the extracellular potential near cell bodies. J. Comput. Neurosci. 6, 169–184. doi: 10.1023/A:1008832702585
Hunter, J. D. (2007). Matplotlib: a 2d graphics environment. Comput. Sci. Eng. 9, 90–95. doi: 10.1109/MCSE.2007.55
Jones, E., Oliphant, T., Peterson, P., et al. (2001). SciPy: Open source scientific tools for Python. Available online at: http://www.scipy.org/
Langtangen, H. (2009). A Primer on Scientific Programming with Python. Berlin; Heidelberg: Springer-Verlag Mathematics and Statistics. doi: 10.1007/978-3-642-02475-7
Lempka, S. F., and McIntyre, C. C. (2013). Theoretical analysis of the local field potential in deep brain stimulation applications. PLoS ONE 8:e59839. doi: 10.1371/journal.pone.0059839
Łęski, S., Lindén, H., Tetzlaff, T., Pettersen, K. H., and Einevoll, G. T. (2013). Frequency dependence of signal power and spatial reach of the local field potential. PLoS Comput. Biol. 9:e1003137. doi: 10.1371/journal.pcbi.1003137
Lindén, H., Pettersen, K. H., and Einevoll, G. T. (2010). Intrinsic dendritic filtering gives low-pass power spectra of local field potentials. J. Comput. Neurosci. 29, 423–444. doi: 10.1007/s10827-010-0245-4
Lindén, H., Tetzlaff, T., Potjans, T. C., Pettersen, K. H., Grün, S., Diesmann, M., et al. (2011). Modeling the spatial reach of the LFP. Neuron 72, 859–872. doi: 10.1016/j.neuron.2011.11.006
Logg, A., Mardal, K.-A., and Wells, G. N. (2012). Automated Solution of Differential Equations by the Finite Element Method: The Fenics Book. Berlin; Heidelberg: Springer-Verlag. doi: 10.1007/978-3-642-23099-8
Logothetis, N. K., Kayser, C., and Oeltermann, A. (2007). In vivo measurement of cortical impedance spectrum in monkeys: implications for signal propagation. Neuron 55, 809–823. doi: 10.1016/j.neuron.2007.07.027
Mainen, Z. F., and Sejnowski, T. J. (1996). Influence of dendritic structure on firing pattern in model neocortical neurons. Nature 382, 363–366. doi: 10.1038/382363a0
McKinley, R., Bridges, N., Walters, C. M, and Nelson, J. (2012). Modulating the brain at work using noninvasive transcranial stimulation. Neuroimage 59, 129–137. doi: 10.1016/j.neuroimage.2011.07.075
Nelson, M. J., and Pouget, P. (2010). Do electrode properties create a problem in interpreting local field potential recordings? J. Neurophysiol. 103, 2315–2317. doi: 10.1152/jn.00157.2010
Ness, T. B., Hagen, E., Negwer, M., Bakker, R., Schubert, D., and Einevoll, G. T. (2012). “Modeling extracellular spikes and local field potentials recorded in MEAs,” in Proceedings of the 8th international meeting on Multielectrode Arrays (Reutlingen).
Nicholson, C., and Freeman, J. A. (1975). Theory of current source-density analysis and determination of conductivity tensor for anuran cerebellum. J. Neurophysiol. 38, 356–368.
Nunez, P. L., and Srinivasan, R. (2006). Electric Fields of the Brain, 2nd Edn. New York, NY: Oxford University Press, Inc. doi: 10.1093/acprof:oso/9780195050387.001.0001
Oluigbo, C. O., Salma, A., and Rezai, A. R. (2012). Deep brain stimulation for neurological disorders. IEEE Rev. Biomed. Eng. 5, 88–99. doi: 10.1109/RBME.2012.2197745
Panzeri, S., and Quian Quiroga, R. (eds.). (2013). Principles of Neural Coding. Boca Raton, FL: CRC Press.
Pashut, T., Wolfus, S., Friedman, A., Lavidor, M., Bar-Gad, I., Yeshurun, Y., et al. (2011). Mechanisms of magnetic stimulation of central nervous system neurons. PLoS Comput. Biol. 7:e1002022. doi: 10.1371/journal.pcbi.1002022
Pérez, F., and Granger, B. E. (2007). IPython: a system for interactive scientific computing. Comput. Sci. Eng. 9, 21–29. doi: 10.1109/MCSE.2007.53
Pettersen, K. H., Devor, A., Ulbert, I., Dale, A. M., and Einevoll, G. T. (2006). Current-source density estimation based on inversion of electrostatic forward solution: effects of finite extent of neuronal activity and conductivity discontinuities. J. Neurosci. Methods 154, 116–133. doi: 10.1016/j.jneumeth.2005.12.005
Pettersen, K. H., and Einevoll, G. T. (2008). Amplitude variability and extracellular low-pass filtering of neuronal spikes. Biophys. J. 94, 784–802. doi: 10.1529/biophysj.107.111179
Pettersen, K. H., Hagen, E., and Einevoll, G. T. (2008). Estimation of population firing rates and current source densities from laminar electrode recordings. J. Comput. Neurosci. 24, 291–313. doi: 10.1007/s10827-007-0056-4
Pettersen, K. H., Lindén, H., Dale, A. M., and Einevoll, G. T. (2012). “Extracellular spikes and CSD,” in Handbook of Neural Activity Measurement, eds R. Brette and A. Destexhe (Cambridge, UK: Cambridge University Press), 92–135. doi: 10.1017/CBO9780511979958.004
Rall, W., and Shepherd, G. M. (1968). Theoretical reconstruction of field potentials and dendrodendritic synaptic interactions in olfactory bulb. J. Neurophysiol. 31, 884–915.
Reimann, M. W., Anastassiou, C. A., Perin, R., Hill, S. L., Markram, H., and Koch, C. (2013). A biophysically detailed model of neocortical local field potentials predicts the critical role of active membrane currents. Neuron 79, 375–390. doi: 10.1016/j.neuron.2013.05.023
Keywords: local field potential, extracellular potential, biophysics, forward modeling, compartmental modeling, detailed morphology, spike waveform, Python
Citation: Lindén H, Hagen E, Łęski S, Norheim ES, Pettersen KH and 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
Received: 10 September 2013; Accepted: 09 December 2013;
Published online: 16 January 2014.
Edited by:
Andrew P. Davison, Centre National de la Recherche Scientifique, FranceReviewed by:
Nicholas T. Carnevale, Yale University School of Medicine, USAShyam Diwakar, Amrita University, India
Copyright © 2014 Lindén, Hagen, Łęski, Norheim, Pettersen and Einevoll. This is an open-access article distributed under the terms of the Creative Commons Attribution License (CC BY). The use, distribution or reproduction in other forums is permitted, provided the original author(s) or licensor are credited and that the original publication in this journal is cited, in accordance with accepted academic practice. No use, distribution or reproduction is permitted which does not comply with these terms.
*Correspondence: Gaute T. Einevoll, Department of Mathematical Sciences and Technology, Norwegian University of Life Sciences, PO Box 5003, Ås 1432, Norway e-mail: gaute.einevoll@nmbu.no
†These authors have contributed equally to this work.