Efficient simulation of 3D reaction-diffusion in models of neurons (McDougal et al, 2022)

 Download zip file 
Help downloading and running models
Accession:267018
Validation, visualization, and analysis scripts for NEURON's 3D reaction-diffusion support.
Reference:
1 . McDougal RA, Conte C, Eggleston L, Newton AJH, Galijasevic H (2022) Efficient Simulation of 3D Reaction-Diffusion in Models of Neurons and Networks Front. Neuroinform.
Model Information (Click on a link to find other models with that property)
Model Type:
Brain Region(s)/Organism:
Cell Type(s):
Channel(s):
Gap Junctions:
Receptor(s):
Gene(s):
Transmitter(s):
Simulation Environment: NEURON; Python;
Model Concept(s): Methods; Reaction-diffusion;
Implementer(s):
import time
from neuron import h, rxd
import multiprocessing
import numpy as np
import sqlite3
import tqdm
import pandas as pd

DB_FILENAME = "simple_geometry_convergence.db"

try:
    with sqlite3.connect(DB_FILENAME) as conn:
        old_data = pd.read_sql("SELECT * FROM data", conn)
except:
    old_data = pd.DataFrame({"dx": [], "resolution": []})


def run_sim(dx, res=2, L=20, diam=2):
    start = time.perf_counter()

    rxd.options.ics_partial_volume_resolution = res

    dend = h.Section(name="dend")
    dend.L = L
    dend.diam = diam
    rxd.set_solve_type(dimension=3)

    cyt = rxd.Region([dend], name="cyt", dx=dx)
    ca = rxd.Species(cyt, name="ca", charge=2)

    true_volume = h.PI * dend.diam ** 2 * 0.25 * dend.L
    true_area = h.PI * dend.diam * dend.L + 0.5 * h.PI * dend.diam ** 2

    data = pd.DataFrame(
        {
            "dx": [dx],
            "L": L,
            "diam": diam,
            "surface_area": sum(ca.nodes.surface_area),
            "volume": sum(ca.nodes.volume),
            "surface_area_relative_error": 1 - sum(ca.nodes.surface_area) / true_area,
            "volume_relative_error": 1 - sum(ca.nodes.volume) / true_volume,
            "runtime": time.perf_counter() - start,
            "resolution": res
        }
    )
    with sqlite3.connect(DB_FILENAME) as conn:
        data.to_sql("data", conn, if_exists="append", index=False)



if __name__ == "__main__":
    for dx in tqdm.tqdm(np.logspace(np.log10(0.5), -2)):
        for res in [10, 8, 6, 4, 2]:
            if any((old_data["dx"] == dx) & (old_data["resolution"] == res)):
                continue
            else:
                p = multiprocessing.Process(target=run_sim, args=(dx, res))
                p.start()
                p.join()
    

Loading data, please wait...