From 0c374140e3b598859853c0ee2115a391c4028779 Mon Sep 17 00:00:00 2001
From: Sam Yates <halfflat@gmail.com>
Date: Thu, 25 Jun 2020 10:42:21 +0200
Subject: [PATCH] Add LFP example/demo. (#1073)

* Add C++ analogue to simple NEURON demo provided by LFPy project under example/lfp.
* Add plot script for rending example output to match that from NEURON demo.
---
 example/CMakeLists.txt            |   1 +
 example/lfp/CMakeLists.txt        |   4 +
 example/lfp/README.md             |  30 +++
 example/lfp/example_nrn_EP.png    | Bin 0 -> 63137 bytes
 example/lfp/lfp.cpp               | 303 ++++++++++++++++++++++++++++++
 example/lfp/neuron_lfp_example.py | 296 +++++++++++++++++++++++++++++
 example/lfp/plot-lfp.py           |  71 +++++++
 7 files changed, 705 insertions(+)
 create mode 100644 example/lfp/CMakeLists.txt
 create mode 100644 example/lfp/README.md
 create mode 100644 example/lfp/example_nrn_EP.png
 create mode 100644 example/lfp/lfp.cpp
 create mode 100755 example/lfp/neuron_lfp_example.py
 create mode 100755 example/lfp/plot-lfp.py

diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt
index 0c33de29..7a665e5c 100644
--- a/example/CMakeLists.txt
+++ b/example/CMakeLists.txt
@@ -10,3 +10,4 @@ add_subdirectory(ring)
 add_subdirectory(gap_junctions)
 add_subdirectory(single)
 add_subdirectory(probe-demo)
+add_subdirectory(lfp)
diff --git a/example/lfp/CMakeLists.txt b/example/lfp/CMakeLists.txt
new file mode 100644
index 00000000..a3046c48
--- /dev/null
+++ b/example/lfp/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_executable(lfp EXCLUDE_FROM_ALL lfp.cpp)
+add_dependencies(examples lfp)
+target_link_libraries(lfp PRIVATE arbor ext-tinyopt)
+file(COPY plot-lfp.py DESTINATION "${CMAKE_RUNTIME_OUTPUT_DIRECTORY}")
diff --git a/example/lfp/README.md b/example/lfp/README.md
new file mode 100644
index 00000000..a185549c
--- /dev/null
+++ b/example/lfp/README.md
@@ -0,0 +1,30 @@
+# Local field potential demo
+
+How might one use Arbor to compute the local field potential near a cell?
+
+This example provide a simple demonstration, simulating one cell and computing
+the LFP from the total membrane current.
+
+The code attempts to provide an Arbor version of the supplied NEURON LFP example
+`neuron_lfp_example.py`. The plot from the NEURON code is included as `example_nrn_EP.png`.
+
+## How to run
+
+The example builds an executable `lfp` that performs a 100 ms simulation of
+a single ball-and-stick neuron, measuring the local field potential at two
+electrode sites.
+
+Running `lfp` generates a JSON file with the simulation output written to stdout.
+The included `plot-lfp.py` script will parse this output and generate a plot.
+
+Run `lfp` and display the output in a window:
+```
+lfp | plot-lfp.py
+```
+
+Run `lfp` and save the results, then generate a plot image:
+```
+lfp > out.json
+plot-lfp.py -o out.png out.json
+```
+
diff --git a/example/lfp/example_nrn_EP.png b/example/lfp/example_nrn_EP.png
new file mode 100644
index 0000000000000000000000000000000000000000..d3b3fa042ddaf518eae6271953484ce33e378c1d
GIT binary patch
literal 63137
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

literal 0
HcmV?d00001

diff --git a/example/lfp/lfp.cpp b/example/lfp/lfp.cpp
new file mode 100644
index 00000000..268fd286
--- /dev/null
+++ b/example/lfp/lfp.cpp
@@ -0,0 +1,303 @@
+#include <cassert>
+#include <vector>
+#include <iostream>
+
+#include <arbor/load_balance.hpp>
+#include <arbor/cable_cell.hpp>
+#include <arbor/morph/morphology.hpp>
+#include <arbor/morph/place_pwlin.hpp>
+#include <arbor/morph/region.hpp>
+#include <arbor/simple_sampler.hpp>
+#include <arbor/simulation.hpp>
+#include <arbor/sampling.hpp>
+#include <arbor/util/any.hpp>
+#include <arbor/util/any_ptr.hpp>
+
+using arb::util::any;
+using arb::util::any_cast;
+using arb::util::any_ptr;
+using arb::cell_gid_type;
+
+// Recipe represents one cable cell with one synapse, together with probes for total trans-membrane current, membrane voltage,
+// ionic current density, and synaptic conductance. A sequence of spikes are presented to the one synapse on the cell.
+
+struct lfp_demo_recipe: public arb::recipe {
+    explicit lfp_demo_recipe(arb::event_generator events): events_(std::move(events))
+    {
+        make_cell(); // initializes cell_ and synapse_location_.
+    }
+
+    arb::cell_size_type num_cells() const override { return 1; }
+    arb::cell_size_type num_targets(cell_gid_type) const override { return 1; }
+
+    std::vector<arb::probe_info> get_probes(cell_gid_type) const override {
+        // Four probes:
+        //   0. Total membrane current across cell.
+        //   1. Voltage at synapse location.
+        //   2. Total ionic current density at synapse location.
+        //   3. Expsyn synapse conductance value.
+        return {
+            arb::cable_probe_total_current_cell{},
+            arb::cable_probe_membrane_voltage{synapse_location_},
+            arb::cable_probe_total_ion_current_density{synapse_location_},
+            arb::cable_probe_point_state{0, "expsyn", "g"}};
+    }
+
+    arb::cell_kind get_cell_kind(cell_gid_type) const override {
+        return arb::cell_kind::cable;
+    }
+
+    arb::util::unique_any get_cell_description(cell_gid_type) const override {
+        return cell_;
+    }
+
+    virtual std::vector<arb::event_generator> event_generators(cell_gid_type) const {
+        return {events_};
+    }
+
+    any get_global_properties(arb::cell_kind) const {
+        arb::cable_cell_global_properties gprop;
+        gprop.default_parameters = arb::neuron_parameter_defaults;
+        return gprop;
+    }
+
+private:
+    arb::cable_cell cell_;
+    arb::locset synapse_location_;
+    arb::event_generator events_;
+
+    void make_cell() {
+        using namespace arb;
+
+        // Set up morphology as two branches:
+        // * soma, length 20 μm radius 10 μm, with SWC tag 1.
+        // * apical dendrite, length 490 μm, radius 1 μm, with SWC tag 4.
+        sample_tree tree;
+        tree.append({{0, 0, +10, 10}, 1}); // (root point)
+        tree.append({{0, 0, -10, 10}, 1});
+        tree.append(0, {{0, 0,   10, 1}, 4}); // attach to root point.
+        tree.append({{0, 0, 500, 1}, 4});
+
+        cell_ = cable_cell(tree);
+
+        // Use NEURON defaults for reversal potentials, ion concentrations etc., but override ra, cm.
+        cell_.default_parameters.axial_resistivity = 100;     // [Ω·cm]
+        cell_.default_parameters.membrane_capacitance = 0.01; // [F/m²]
+
+        // Twenty CVs per branch, except for the soma.
+        cell_.default_parameters.discretization = cv_policy_fixed_per_branch(20, cv_policy_flag::single_root_cv);
+
+        // Add pas and hh mechanisms:
+        cell_.paint(reg::tagged(1), "hh"); // (default parameters)
+        cell_.paint(reg::tagged(4), mechanism_desc("pas").set("e", -70));
+
+        // Add exponential synapse at centre of soma (0.5 along branch 0).
+        synapse_location_ = mlocation{0, 0.5};
+        cell_.place(synapse_location_, mechanism_desc("expsyn").set("e", 0).set("tau", 2));
+    }
+};
+
+struct position { double x, y, z; };
+
+struct lfp_sampler {
+    lfp_sampler(const arb::place_pwlin& p, std::vector<position> electrodes, double sigma):
+        placement(p), electrodes(std::move(electrodes)), sigma(sigma) {}
+
+    // Compute response coefficients for each electrode, given a set of cable-like sources.
+    void initialize(const arb::mcable_list& cables) {
+        const unsigned n_electrode = electrodes.size();
+        response.assign(n_electrode, std::vector<double>(cables.size()));
+
+        std::vector<arb::mpoint> midpoints;
+        std::transform(cables.begin(), cables.end(), std::back_inserter(midpoints),
+            [this](const auto& c) { return placement.at({c.branch, 0.5*(c.prox_pos+c.dist_pos)}); });
+
+        const double coef = 1/(4*M_PI*sigma); // [Ω·m]
+        for (unsigned i = 0; i<n_electrode; ++i) {
+            const position& e = electrodes[i];
+
+            std::transform(midpoints.begin(), midpoints.end(), response[i].begin(),
+                [coef, &e](auto p) {
+                    p.x -= e.x;
+                    p.y -= e.y;
+                    p.z -= e.z;
+                    double r = std::sqrt(p.x*p.x+p.y*p.y+p.z*p.z); // [μm]
+                    return coef/r; // [MΩ]
+                });
+        }
+    }
+
+    void reset() {
+        response.clear();
+        lfp_time.clear();
+        lfp_voltage.clear();
+    }
+
+    bool is_initialized() const {
+        return !response.empty();
+    }
+
+    // On receipt of a sequence of cell-wide current samples, apply response matrix and save results to lfp_voltage.
+    arb::sampler_function callback() {
+        return [this](arb::probe_metadata pm, std::size_t n, const arb::sample_record* samples) {
+            auto cables_ptr = any_cast<const arb::mcable_list*>(pm.meta);
+            assert(cables_ptr);
+
+            if (!is_initialized()) {
+                // The first time we get metadata, build the response matrix.
+                initialize(*cables_ptr);
+            }
+
+            std::vector<double> currents;
+            lfp_voltage.resize(response.size());
+
+            for (std::size_t i = 0; i<n; ++i) {
+                lfp_time.push_back(samples[i].time);
+
+                auto data_ptr = any_cast<const arb::cable_sample_range*>(samples[i].data);
+                assert(data_ptr);
+
+                for (unsigned j = 0; j<response.size(); ++j) {
+                    lfp_voltage[j].push_back(std::inner_product(data_ptr->first, data_ptr->second, response[j].begin(), 0.));
+                }
+            }
+        };
+    }
+
+    std::vector<double> lfp_time;
+    std::vector<std::vector<double>> lfp_voltage; // [mV] (one vector per electrode)
+
+private:
+    const arb::place_pwlin placement; // Represents cell morphology in space.
+    const std::vector<position> electrodes;    // [μm]
+    const double sigma;                        // [S/m]
+    std::vector<std::vector<double>> response; // [MΩ]
+};
+
+// JSON output helpers:
+
+template <typename T, typename F>
+struct as_json_array_wrap {
+    const T& data;
+    F fn;
+    as_json_array_wrap(const T& data, const F& fn): data(data), fn(fn) {}
+
+    friend std::ostream& operator<<(std::ostream& out, const as_json_array_wrap& a) {
+        out << '[';
+        bool first = true;
+        for (auto& x: a.data) out << (!first? ", ": (first=false, "")) << a.fn(x);
+        return out << ']';
+    }
+};
+
+struct {
+    template <typename F>
+    auto operator()(const F& fn) const {
+        return [&fn](const auto& data) { return as_json_array_wrap<decltype(data), F>(data, fn); };
+    }
+
+    auto operator()() const {
+        return this->operator()([](const auto& x) { return x; });
+    }
+} as_json_array;
+
+// Run simulation.
+
+int main(int argc, char** argv) {
+    auto context = arb::make_context();
+
+    // Weight 0.005 μS, onset at t = 0 ms, mean frequency 0.1 kHz.
+    auto events = arb::poisson_generator({0, 0}, .005, 0., 0.1, std::minstd_rand{});
+    lfp_demo_recipe R(events);
+
+    const double t_stop = 100;    // [ms]
+    const double sample_dt = 0.1; // [ms]
+    const double dt = 0.1;        // [ms]
+
+    arb::simulation sim(R, arb::partition_load_balance(R, context), context);
+
+    std::vector<position> electrodes = {
+        {30, 0, 0},
+        {30, 0, 100}
+    };
+
+    auto sample_schedule = arb::regular_schedule(sample_dt);
+
+    arb::morphology cell_morphology = any_cast<arb::cable_cell>(R.get_cell_description(0)).morphology();
+    arb::place_pwlin placed_cell(cell_morphology);
+    lfp_sampler lfp(placed_cell, electrodes, 3.0);
+    sim.add_sampler(arb::one_probe({0, 0}), sample_schedule, lfp.callback(), arb::sampling_policy::exact);
+
+    arb::trace_vector<double, arb::mlocation> membrane_voltage;
+    sim.add_sampler(arb::one_probe({0, 1}), sample_schedule, make_simple_sampler(membrane_voltage), arb::sampling_policy::exact);
+
+    arb::trace_vector<double> ionic_current_density;
+    sim.add_sampler(arb::one_probe({0, 2}), sample_schedule, make_simple_sampler(ionic_current_density), arb::sampling_policy::exact);
+
+    arb::trace_vector<double> synapse_g;
+    sim.add_sampler(arb::one_probe({0, 3}), sample_schedule, make_simple_sampler(synapse_g), arb::sampling_policy::exact);
+
+    sim.run(t_stop, dt);
+
+    // Output results in JSON format suitable for plotting by plot-lfp.py script.
+
+    auto get_t = [](const auto& x) { return x.t; };
+    auto get_v = [](const auto& x) { return x.v; };
+    auto scale = [](double s) { return [s](const auto& x) { return x*s; }; };
+    auto to_xz = [](const auto& p) { return std::array<double, 2>{p.x, p.z}; };
+
+    // Compute synaptic current from synapse conductance and membrane potential.
+    std::vector<double> syn_i;
+    assert(synapse_g.get(0).size()==membrane_voltage.get(0).size());
+    std::transform(synapse_g.get(0).begin(), synapse_g.get(0).end(), membrane_voltage.get(0).begin(), std::back_inserter(syn_i),
+        [](arb::trace_entry<double> g, arb::trace_entry<double> v) {
+            assert(g.t==v.t);
+            return g.v*v.v;
+        });
+
+    // Collect points from 2-d morphology in vectors of arrays (x, z, radius), one per branch.
+    // (This process will be simplified with improvements to the place_pwlin API.)
+    std::vector<std::vector<std::array<double, 3>>> samples;
+    for (unsigned branch = 0; branch<cell_morphology.num_branches(); ++branch) {
+        samples.push_back({});
+        auto branch_range = cell_morphology.branch_indexes(branch);
+        for (auto i_ptr = branch_range.first; i_ptr!=branch_range.second; ++i_ptr) {
+            arb::msample s = cell_morphology.samples()[*i_ptr];
+            samples.back().push_back(std::array<double, 3>{s.loc.x, s.loc.z, s.loc.radius});
+        }
+    }
+
+    auto probe_xz = to_xz(placed_cell.at(membrane_voltage.get(0).meta));
+    std::vector<std::array<double, 2>> electrodes_xz;
+    std::transform(electrodes.begin(), electrodes.end(), std::back_inserter(electrodes_xz), to_xz);
+
+    std::cout <<
+        "{\n"
+        "\"morphology\": {\n"
+        "\"unit\": \"μm\",\n"
+        "\"samples\": " << as_json_array(as_json_array(as_json_array()))(samples) << ",\n"
+        "\"probe\": " << as_json_array()(probe_xz) << ",\n"
+        "\"electrodes\": " << as_json_array(as_json_array())(electrodes_xz) << "\n"
+        "},\n"
+        "\"extracellular potential\": {\n"
+        "\"unit\": \"μV\",\n"
+        "\"time\": " << as_json_array()(lfp.lfp_time) << ",\n"
+        "\"values\": " << as_json_array(as_json_array(scale(1e3)))(lfp.lfp_voltage) << "\n"
+        "},\n"
+        "\"synaptic current\": {\n"
+        "\"unit\": \"nA\",\n"
+        "\"time\": "  << as_json_array(get_t)(synapse_g.get(0)) << ",\n"
+        "\"value\": " << as_json_array()(syn_i) << "\n"
+        "},\n"
+        "\"membrane potential\": {\n"
+        "\"unit\": \"mV\",\n"
+        "\"time\": "  << as_json_array(get_t)(membrane_voltage.get(0)) << ",\n"
+        "\"value\": " << as_json_array(get_v)(membrane_voltage.get(0)) << "\n"
+        "},\n"
+        "\"ionic current density\": {\n"
+        "\"unit\": \"A/m²\",\n"
+        "\"time\": "  << as_json_array(get_t)(ionic_current_density.get(0)) << ",\n"
+        "\"value\": " << as_json_array(get_v)(ionic_current_density.get(0)) << "\n"
+        "}\n"
+        "}\n";
+}
diff --git a/example/lfp/neuron_lfp_example.py b/example/lfp/neuron_lfp_example.py
new file mode 100755
index 00000000..1d1023ac
--- /dev/null
+++ b/example/lfp/neuron_lfp_example.py
@@ -0,0 +1,296 @@
+#!/usr/env/bin python
+# -*- coding: utf-8 -*-
+# Author: Torbjørn Ness <torbjorn.ness@nmbu.no>
+'''
+NEURON and Python - Creating a multi-compartment model with synaptic input
+with randomized activation times
+'''
+# Import modules for plotting and NEURON itself 
+import matplotlib.pyplot as plt
+import neuron
+import numpy as np
+
+
+class Cell:
+    """
+    Cell class that handles interactions with NEURON. It finds the center position
+    of each cellular compartment (cell.xmid, cell.ymid, cell.zmid), and the transmembrane currents
+    cell.imem
+    """
+
+    def __init__(self):
+        cvode = neuron.h.CVode()
+        cvode.use_fast_imem(1)
+        self.tstop = 100.        # simulation duration in ms
+        self.v_init = -65        # membrane voltage(s) at t = 0
+
+        neuron.h.dt = 0.1
+
+        self.make_cell()
+        neuron.h.define_shape()
+        self.seclist = []
+        counter = 0
+        for sec in neuron.h.allsec():
+            self.seclist.append(sec)
+            for seg in sec:
+                counter += 1
+        self.totnsegs = counter  # Total number of compartments in cell model
+        self.collect_geometry()
+
+
+        self.insert_synapse(self.seclist[0])
+
+        self.initiate_recorders()
+
+    def make_cell(self):
+        neuron.h("""
+        create soma[1]
+        create apic[1]
+        objref all
+        all = new SectionList()
+        soma[0] {pt3dclear()
+          pt3dadd(0, 0, -10, 20)
+          pt3dadd(0, 0, 10, 20)}
+
+        apic[0] {pt3dclear()
+          pt3dadd(0, 0, 10, 2)
+          pt3dadd(0, 0, 500, 2)}
+
+        connect apic[0](0), soma[0](1)
+
+        apic[0] {nseg = 20}
+        forall {
+            Ra = 100.
+            cm = 1.
+            all.append()
+        }
+        apic[0] { insert pas }
+        soma[0] { insert hh }
+
+        """)
+
+    def initiate_recorders(self):
+        self.imem = []  # Record membrane currents
+        self.vmem = []  # Record membrane potentials
+
+        for sec in neuron.h.allsec():
+            for seg in sec:
+                v_ = neuron.h.Vector()
+                v_.record(seg._ref_v, neuron.h.dt)
+                self.vmem.append(v_)
+
+                i_ = neuron.h.Vector()
+                i_.record(seg._ref_i_membrane_, neuron.h.dt)
+                self.imem.append(i_)
+
+        self.tvec = neuron.h.Vector()
+        self.tvec.record(neuron.h._ref_t)
+
+        if hasattr(self, "syn"):
+            self.syn_i = neuron.h.Vector()  # Record synaptic current
+            self.syn_i.record(self.syn._ref_i, neuron.h.dt)
+
+    def insert_synapse(self, syn_sec):
+        """
+        Function to insert a single synapse into cell model, as section syn_sec
+        """
+        print(syn_sec.diam)
+        syn = neuron.h.ExpSyn(0.5, sec=syn_sec)
+        syn.e = 0.         # reversal potential of synapse conductance in mV
+        syn.tau = 2.       # time constant of synapse conductance in ms
+
+        ns = neuron.h.NetStim(0.5)     # spike time generator object (~presynaptic)
+        ns.noise = 1.                  # Fractional randomness (intervals from exp dist)
+        ns.start = 0.                  # approximate time of first spike
+        ns.number = 1000               # number of spikes
+        ns.interval = 10.              # average interspike interval
+        nc = neuron.h.NetCon(ns, syn)    # Connect generator to synapse
+        nc.weight[0] = .005                  # Set synapse weight
+
+        # Everything must be stored or NEURON will forget they ever existed
+        self.ns = ns
+        self.nc = nc
+        self.syn = syn
+
+    def collect_geometry(self):
+        """
+        Function to get positions, diameters etc of each segment in NEURON
+        """
+
+        areavec = np.zeros(self.totnsegs)
+        diamvec = np.zeros(self.totnsegs)
+        lengthvec = np.zeros(self.totnsegs)
+
+        xstartvec = np.zeros(self.totnsegs)
+        xendvec = np.zeros(self.totnsegs)
+        ystartvec = np.zeros(self.totnsegs)
+        yendvec = np.zeros(self.totnsegs)
+        zstartvec = np.zeros(self.totnsegs)
+        zendvec = np.zeros(self.totnsegs)
+
+        counter = 0
+
+        #loop over all segments
+        for sec in neuron.h.allsec():
+            n3d = int(neuron.h.n3d())
+            nseg = sec.nseg
+            gsen2 = 1./2/nseg
+            if n3d > 0:
+                #create interpolation objects for the xyz pt3d info:
+                L = np.zeros(n3d)
+                x = np.zeros(n3d)
+                y = np.zeros(n3d)
+                z = np.zeros(n3d)
+                for i in range(n3d):
+                    L[i] = neuron.h.arc3d(i)
+                    x[i] = neuron.h.x3d(i)
+                    y[i] = neuron.h.y3d(i)
+                    z[i] = neuron.h.z3d(i)
+
+                #normalize as seg.x [0, 1]
+                L /= sec.L
+
+                #temporary store position of segment midpoints
+                segx = np.zeros(nseg)
+                for i, seg in enumerate(sec):
+                    segx[i] = seg.x
+
+                #can't be >0 which may happen due to NEURON->Python float transfer:
+                segx0 = (segx - gsen2).round(decimals=6)
+                segx1 = (segx + gsen2).round(decimals=6)
+
+                #fill vectors with interpolated coordinates of start and end points
+                xstartvec[counter:counter+nseg] = np.interp(segx0, L, x)
+                xendvec[counter:counter+nseg] = np.interp(segx1, L, x)
+
+                ystartvec[counter:counter+nseg] = np.interp(segx0, L, y)
+                yendvec[counter:counter+nseg] = np.interp(segx1, L, y)
+
+                zstartvec[counter:counter+nseg] = np.interp(segx0, L, z)
+                zendvec[counter:counter+nseg] = np.interp(segx1, L, z)
+
+                #fill in values area, diam, length
+                for i, seg in enumerate(sec):
+                    areavec[counter] = neuron.h.area(seg.x)
+                    diamvec[counter] = seg.diam
+                    lengthvec[counter] = sec.L/nseg
+                    counter += 1
+
+        # starting position of each compartment (segment)
+        self.xstart = xstartvec
+        self.ystart = ystartvec
+        self.zstart = zstartvec
+
+        # ending position of each compartment (segment)
+        self.xend = xendvec
+        self.yend = yendvec
+        self.zend = zendvec
+
+        # Calculates the center position of each compartment (segment)
+        self.xmid = 0.5 * (self.xstart + self.xend)
+        self.ymid = 0.5 * (self.ystart + self.yend)
+        self.zmid = 0.5 * (self.zstart + self.zend)
+        self.area = areavec
+        self.diam = diamvec
+
+    def simulate(self):
+
+        neuron.h.finitialize(self.v_init)
+        neuron.h.fcurrent()
+
+        while neuron.h.t < self.tstop:
+            neuron.h.fadvance()
+
+        self.vmem = np.array(self.vmem)
+        self.imem = np.array(self.imem)
+        self.syn_i = np.array(self.syn_i)
+        self.tvec = np.array(self.tvec)[:self.vmem.shape[1]]
+
+
+class ExtElectrode:
+    def __init__(self, elec_x, elec_y, elec_z):
+        """
+
+        :param elec_x, elec_y, elec_z : x,y,z-positions (um) of each electrode. Must
+        be numpy arrays of equal length
+
+        """
+        self.sigma = 0.3  # Extracellular conductivity (S/m)
+        self.elec_x = elec_x
+        self.elec_y = elec_y
+        self.elec_z = elec_z
+        self.num_elecs = len(self.elec_x)
+
+        # Give electrodes different colors for plotting purposes:
+        self.elec_clr = lambda idx: plt.cm.viridis(idx / self.num_elecs)
+
+    def calc_extracellular_potential(self, cell):
+        self.calc_mapping(cell)
+        self.extracellular_potential = np.dot(electrode.mapping, cell.imem)
+
+    def calc_mapping(self, cell):
+        """
+        Calculates 'mapping' of size (number of electrodes) * (number of cell compartments)
+        Extracellular potential can then be calculated as
+        :param cell: class containing x,y,z-positions (um) of each
+        compartment (segment) center as cell.xmid, cell.ymid, cell.zmid
+
+        """
+        self.mapping = np.zeros((self.num_elecs, cell.totnsegs))
+        for e_idx in range(self.num_elecs):
+            r2 = ((cell.xmid - self.elec_x[e_idx])**2 +
+                  (cell.ymid - self.elec_y[e_idx])**2 +
+                  (cell.zmid - self.elec_z[e_idx])**2)
+
+            self.mapping[e_idx] = 1 / (4 * np.pi * self.sigma * np.sqrt(r2))
+
+
+def plot_results(cell, electrode):
+    ################################################################################
+    # Plot simulated output
+    ################################################################################
+    fig = plt.figure(figsize=(9, 5))
+    fig.subplots_adjust(wspace=0.5, hspace=0.9)
+    ax_morph = fig.add_subplot(131, aspect=1, xlim=[-150, 150], ylim=[-100, 600],
+                               title="morphology", xlabel="x ($\mu$m)", ylabel="y ($\mu$m)")
+    ax_syn = fig.add_subplot(332, ylabel='nA', title="synaptic current", xlabel='time (ms)')
+    ax_vmem = fig.add_subplot(335, ylabel='mV', xlabel='time (ms)', title="membrane potential")
+    ax_imem = fig.add_subplot(338, ylabel='nA', xlabel='time (ms)', title="membrane current")
+    ax_ep = fig.add_subplot(133, ylabel='$\mu$V', xlabel="time (ms)", title="Extracellular potential")
+
+    plot_comp_idx = 0
+    plot_comp_clr = 'r'
+
+    for idx in range(cell.totnsegs):
+        ax_morph.plot([cell.xstart[idx], cell.xend[idx]],
+                      [cell.zstart[idx], cell.zend[idx]], lw=cell.diam[idx] / 2, c='k')
+    ax_morph.plot(cell.xmid[plot_comp_idx], cell.zmid[plot_comp_idx], marker='*', c=plot_comp_clr)
+
+    ax_syn.plot(cell.tvec, cell.syn_i, c='k', lw=2)
+    ax_vmem.plot(cell.tvec, cell.vmem[0, :], c=plot_comp_clr, lw=2)
+    ax_imem.plot(cell.tvec, cell.imem[0, :], c=plot_comp_clr, lw=2)
+
+    for e_idx in range(electrode.num_elecs):
+        e_clr = electrode.elec_clr(e_idx)
+        sig = 1000 * electrode.extracellular_potential[e_idx]  # convert to uV
+        ax_ep.plot(cell.tvec, sig, c=e_clr)
+        ax_morph.plot(electrode.elec_x[e_idx], electrode.elec_z[e_idx], marker='o', c=e_clr)
+
+    fig.savefig('example_nrn_EP.png')
+
+    plt.close(fig)
+
+if __name__ == '__main__':
+    cell = Cell()
+    cell.simulate()
+
+    num_elecs = 2
+    elec_x = 30 * np.ones(num_elecs)
+    elec_y = np.zeros(num_elecs)
+    elec_z = np.linspace(0, 100, num_elecs)
+
+    electrode = ExtElectrode(elec_x, elec_y, elec_z)
+    electrode.calc_extracellular_potential(cell)
+
+    plot_results(cell, electrode)
+
diff --git a/example/lfp/plot-lfp.py b/example/lfp/plot-lfp.py
new file mode 100755
index 00000000..14ddde3e
--- /dev/null
+++ b/example/lfp/plot-lfp.py
@@ -0,0 +1,71 @@
+#!/usr/bin/env python
+
+import argparse
+import matplotlib.pyplot as plt
+import json
+import math
+import sys
+
+# Read JSON output of lfp example from stdin and plot.
+#
+# The JSON data for timeseries is structured as:
+#    <string>: { "unit": <string>, "time": [ <number>... ], "value": [ <number>... ] }
+# or:
+#    <string>: { "unit": <string>, "time": [ <number>... ], "values": [[ <number>... ] ...] }
+#
+# 2-d morphology data is represented as samples (x, z, r) where r is the radius, one array
+# per branch. Extra point data (probe location, electrode sites) as pairs (x, z):
+#   "morphology": { "unit": <string>, "samples":  [[[<number> <number> <number>] ...] ...]
+#                   "probe": [<number> <number>], "electrodes": [[<number> <number>] ...] }
+
+def subplot_timeseries(fig, index, jdict, key):
+    data = jdict[key]
+    sub = fig.add_subplot(index, ylabel=data['unit'], title=key, xlabel='time (ms)')
+    ts = data['time']
+    vss = data['values'] if 'values' in data else [data['value']]
+
+    for vs in vss: sub.plot(ts, vs)
+
+def subplot_morphology(fig, index, jdict, key, xlim, ylim):
+    data = jdict[key]
+    unit = data['unit']
+    sub = fig.add_subplot(index, xlabel='x ('+unit+')', ylabel='y ('+unit+')', title=key, xlim=xlim, ylim=ylim)
+
+    for samples in data['samples']:
+        polys = [([x0-s0*dy, x0+s0*dy, x1+s1*dy, x1-s1*dy], [y0+s0*dx, y0-s0*dx, y1-s1*dx, y1+s1*dx])
+                for ((x0, y0, r0), (x1, y1, r1)) in zip(samples, samples[1:])
+                for dx, dy in [(x1-x0, y1-y0)]
+                for d in [math.sqrt(dx*dx+dy*dy)]
+                if d>0
+                for s0, s1 in [(r0/d, r1/d)]]
+
+        for xs, ys in polys: sub.fill(xs, ys, 'k')
+    sub.plot(*[u for x, y in data['electrodes'] for u in [[x], [y], 'o']])
+    sub.plot(*[u for x, y in [data['probe']] for u in [[x], [y], 'r*']])
+
+P = argparse.ArgumentParser(description='Plot results of LFP demo.')
+P.add_argument(
+    'input', metavar='FILE', nargs='?', type=argparse.FileType('r'), default=sys.stdin,
+    help='LFP example output in JSON')
+P.add_argument(
+    '-o', '--output', metavar='FILE', dest='outfile',
+    help='save plot to file FILE')
+
+args = P.parse_args()
+j = json.load(args.input)
+
+fig = plt.figure(figsize=(9, 5))
+fig.subplots_adjust(wspace=0.6, hspace=0.9)
+
+subplot_morphology(fig, 131, j, 'morphology', xlim=[-100, 100], ylim=[-100, 600])
+subplot_timeseries(fig, 332, j, 'synaptic current')
+subplot_timeseries(fig, 335, j, 'membrane potential')
+subplot_timeseries(fig, 338, j, 'ionic current density')
+subplot_timeseries(fig, 133, j, 'extracellular potential')
+
+if args.outfile:
+    fig.savefig(args.outfile)
+else:
+    plt.show()
+
+plt.close(fig)
-- 
GitLab