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