One model to rule them all: Unification of voltage-gated potassium channel models via deep non-linear mixed effects modelling.
The 6 matches
- [1] § Methods › Raw data ↔ training_analysis.jl, lines 1–63 · score 1.00 · Kv2.2, Kv4.1, Kv1.4, Kv1.6, Kv10.2, Kv12.1
- [2] § Methods › Raw data ↔ process_data.jl, lines 1–72 · score 1.00 · Kv2.2, Kv4.1, Kv1.4, Kv1.6, Kv10.2, Kv12.1
- [3] § Results › Unified SciML Hodgkin-Huxley model gating function behaviour ↔ training_analysis.jl, lines 1–63 · score 0.95 · Kv10.2, Kv12.1, Kv1.3, Kv10.1, Kv1.5, Kv3.1
- [4] § Results › Unified SciML Hodgkin-Huxley model gating function behaviour ↔ src/plotting/aog_recipes.jl, lines 65–124 · score 0.95 · Kv10.2, Kv12.1, Kv1.3, Kv10.1, Kv1.5, Kv3.1
- [5] § Results ↔ src/plotting/aog_recipes.jl, lines 65–124 · score 0.90 · Kv3.2, Kv1.4, Kv1.6, Kv2.1, Kv10.1, Kv12.3
- [6] § Results ↔ src/plotting/aog_recipes.jl, lines 127–191 · score 0.57 · classical HH model, model predictions, SciML, box, RMSE, protocol
Paper
Loaded from Europe PMC by your browser, not stored by OSCR: doi.org · Europe PMC
The paper is loaded when this pane is shown.
The authors' code
Julia · 1,498 lines · 45 KB · no license · 3 matches
- prot_renamer = renamer(
- :act_m90 => "",
- :act_m80 => "",
- :act_m70 => "",
- :act_m60 => "",
- :act_m50 => "",
- :act_m40 => "",
- :act_m30 => "",
- :act_m20 => "",
- :act_m10 => "",
- :act_0 => "",
- :act_p10 => "",
- :act_p20 => "",
- :act_p30 => "",
- :act_p40 => "",
- :act_p50 => "",
- :act_p60 => "",
- :act_p70 => "",
- :act_p80 => "",
- ##
- :dea_m80 => "",
- :dea_m70 => "",
- :dea_m60 => "",
- :dea_m50 => "",
- :dea_m40 => "",
- :dea_m30 => "",
- :dea_m20 => "",
- :dea_m10 => "",
- :dea_0 => "",
- :dea_p10 => "",
- :dea_p20 => "",
- :dea_p30 => "",
- ##
- :ina_m40 => "",
- :ina_m30 => "",
- :ina_m20 => "",
- :ina_m10 => "",
- :ina_0 => "",
- :ina_p10 => "",
- :ina_p20 => "",
- :ina_p30 => "",
- :ina_p40 => "",
- :ina_p50 => "",
- :ina_p60 => "",
- :ina_p70 => "",
- ##
- :rec_50 => "",
- :rec_200 => "",
- :rec_350 => "",
- :rec_500 => "",
- :rec_650 => "",
- :rec_800 => "",
- :rec_950 => "",
- :rec_1100 => "",
- :rec_1250 => "",
- :rec_1400 => "",
- :rec_1550 => "",
- :rec_1700 => "",
- :rec_1850 => "",
- :rec_2000 => "",
- :rec_2150 => "",
- :rec_2300 => "",
- )
- base_renamer = renamer(
- :kv11 => "Kᵥ1.1",
- :kv12 => "Kᵥ1.2",
- :kv13 => "Kᵥ1.3",
- :kv14 => "Kᵥ1.4",
- :kv15 => "Kᵥ1.5",
- :kv16 => "Kᵥ1.6",
- :kv18 => "Kᵥ1.8",
- :kv21 => "Kᵥ2.1",
- :kv22 => "Kᵥ2.2",
- :kv31 => "Kᵥ3.1",
- :kv32 => "Kᵥ3.2",
- :kv33 => "Kᵥ3.3",
- :kv34 => "Kᵥ3.4",
- :kv41 => "Kᵥ4.1",
- :kv42 => "Kᵥ4.2",
- :kv43 => "Kᵥ4.3",
- :kv71 => "Kᵥ7.1",
- :kv73 => "Kᵥ7.3",
- :kv101 => "Kᵥ10.1",
- :kv102 => "Kᵥ10.2",
- :kv121 => "Kᵥ12.1",
- :kv123 => "Kᵥ12.3",
- )
- cname_renamer = renamer(
- :kv11 => "Kᵥ1.1 (n=51)",
- :kv12 => "Kᵥ1.2 (n=38)",
- :kv13 => "Kᵥ1.3 (n=67)",
- :kv14 => "Kᵥ1.4 (n=42)",
- :kv15 => "Kᵥ1.5 (n=47)",
- :kv16 => "Kᵥ1.6 (n=26)",
- :kv18 => "Kᵥ1.8 (n=9)",
- :kv21 => "Kᵥ2.1 (n=18)",
- :kv22 => "Kᵥ2.2 (n=21)",
- :kv31 => "Kᵥ3.1 (n=22)",
- :kv32 => "Kᵥ3.2 (n=28)",
- :kv33 => "Kᵥ3.3 (n=45)",
- :kv34 => "Kᵥ3.4 (n=26)",
- :kv41 => "Kᵥ4.1 (n=16)",
- :kv42 => "Kᵥ4.2 (n=12)",
- :kv43 => "Kᵥ4.3 (n=20)",
- :kv71 => "Kᵥ7.1 (n=11)",
- :kv73 => "Kᵥ7.3 (n=2)",
- :kv101 => "Kᵥ10.1 (n=20)",
- :kv102 => "Kᵥ10.2 (n=10)",
- :kv121 => "Kᵥ12.1 (n=24)",
- :kv123 => "Kᵥ12.3 (n=10)",
- :pooled => "Pooled (n=565)",
- )
- f_renamer = renamer(
- :im1_∞ => L"m_{1,\infty}(V)",
- :im2_∞ => L"m_{2,\infty}(V)",
- :im1_τ => L"\tau_1(V)",
- :im2_τ => L"\tau_2(V)",
- )
- function rows_cells_cols_prots(df, prot, types; nrows=5, w=100, h=100, data_color=:red, pred_color=:black, alpha=0.3)
- df_ch = filter(r -> (in(r.ctype, types) && r.protocol == prot), df)
- df_ch[:, :row_id] = repeat([missing], size(df_ch)[1])
- @rtransform!(df_ch, :i = string(findfirst(unique(filter(r -> r.ctype == :ctype, df_ch).id) .== :id)))
- df_flat = DataFrames.flatten(df_ch, [:t, :data])
- df_rec, df_pred = groupby(df_flat, :data_type)
- if df_rec[1, :data_type] == :prediction
- df_rec, df_pred = df_pred, df_rec
- end
- plt = data(df_rec) * visual(Lines, alpha=alpha) *
- mapping(
- :t => "Time (ms)",
- :data => "Normalized current (a.u.)",
- row=:i => renamer([string(i) => "" for i in 1:1000]),
- col=:ctype => base_renamer,
- color=:temp => renamer(("15" => "15°C", "25" => "25°C", "35" => "35°C")) => "Data recorded at"
- ) +
- data(df_pred) * visual(Lines, alpha=alpha, label="uSciML HH Model prediction", color=pred_color) *
- mapping(
- :t => "Time (ms)",
- :data => "Normalized current (a.u.)",
- row=:i => renamer([string(i) => "" for i in 1:1000]),
- col=:ctype => base_renamer,
- )
- axis = (width=w, height=h)
- pg = paginate(plt, row=nrows)
- fg = draw(
- pg,
- legend=(; framevisible=false, position=:top),
- facet=(; linkxaxes=:minimal),
- axis=axis,
- )
- return fg
- end
- function df_to_boxplot(df; w=100, h=100)
- df_flat = DataFrames.flatten(df, [:t, :data])
- df1, df2 = groupby(df_flat, :data_type)
- dfoi = if df1[1, :data_type] == :prediction
- df1
- else
- df2
- end
- model_renamer = renamer(
- (:SciML_pooled => "Unified SciML",
- :SciML_split => "Individual SciML",
- :classical_no_ref => "Classical HH, no rand. eff.",
- :classical_with_ref => "Classical with rand. eff."
- )
- )
- plt = data(dfoi) * visual(BoxPlot, show_outliers=false) *
- mapping(
- :model_type => model_renamer => "HH Model Type",
- :rmse => "RMSE (protocol traces level)",
- color=:model_type => model_renamer => "HH Model Type",
- layout=:ctype => cname_renamer
- )
- axis = (width=w, height=h, xticklabelrotation=pi / 4, xticklabelsvisible=false, limits=(nothing, nothing, -0.005, nothing))
- fg = draw(plt,
- legend=(; framevisible=false, position=:top),
- facet=(; linkxaxes=:none, linkyaxes=:none),
- axis=axis,)
- fg.figure.content[6].backgroundcolor = (:red, 0.3)
- fg.figure.content[19].backgroundcolor = (:red, 0.3)
- fg.figure.content[20].backgroundcolor = (:red, 0.3)
- return fg
- end
- function inf_tau_grid(df, flatten_syms, labels, fig_inds, transformer; w=100, h=100, alpha=1.0)
- df_flat = DataFrames.flatten(df, flatten_syms)
- fig = Figure(; size=(w, h))
- yscales = [
- identity,
- identity,
- log10,
- log10,
- ]
- grid_i = nothing
- for (sym, label, (i, j), tr) in zip(flatten_syms[1:end-1], labels, fig_inds, transformer)
- sub_i = fig[i, j]
- plt_i = data(df_flat) * visual(Lines, alpha=alpha) * (
- mapping(
- :v => (x -> 80 * x) => "Voltage (mV)",
- sym => (x -> tr(x)),
- color=:temp => (x -> string(x) * " °C") => "Temperature",
- row=:ctype => cname_renamer
- )
- )
- if j == 1
- grid_i = draw!(sub_i, plt_i, axis=(; ylabel=label, titlevisible=false, yscale=yscales[j]))
- elseif j == 4
- grid_i = draw!(sub_i, plt_i, axis=(; ylabel=label, yscale=yscales[j]))
- else
- grid_i = draw!(sub_i, plt_i, axis=(; ylabel=label, titlevisible=false, yscale=yscales[j]))
- end
- end
- legend!(fig[0, :], grid_i; nbanks=3, framevisible=false)
- rowsize!(fig.layout, 1, Relative(0.99))
- for k in 1:3
- colgap!(fig.layout, k, -5)
- end
- return fig
- end
- function plot_early_stopping_bands(df; w=100, h=100)
- df_unique_its = combine(groupby(df, [:channel, :iteration]),
- :rmse_low => (x -> x[1]) => :low,
- :rmse_high => (x -> x[1]) => :high,
- :rmse_median => (x -> x[1]) => :median)
- sort!(df_unique_its, :iteration)
- df_unique_mins = vcat([filter(r -> r.median == minimum(g[!, :median]), g) for g in groupby(df_unique_its, :channel)]...)
- plt1 = data(df_unique_its) * mapping(:iteration, :low, :high, layout=:channel => cname_renamer) * visual(Band, color=(:black, 0.3), label="95% CI")
- plt2 = data(df_unique_its) * mapping(:iteration, :median, layout=:channel => cname_renamer) * visual(Lines, color=(:black, 0.8), label="Median")
- plt4 = data(df_unique_mins) * mapping(:iteration, layout=:channel => cname_renamer) * visual(VLines, color=(:red, 0.8), label="Minimal Validation RMSE")
- axis = (width=w,
- height=h,
- ylabel="Validation RMSE",
- xticks=0:30:300,
- xticklabelrotation=pi / 2
- )
- fg = draw(plt1 + plt2 + plt4,
- legend=(; framevisible=false, position=:top),
- axis=axis,
- facet=(; linkxaxes=:none)
- )
- end
- function make_big_grid_bands(df, fb, sb, syms, labels, idx1, idx2, tr; w=100, h=100, alpha=1.0)
- fig = Figure(; size=(w, h))
- _, grid_i = inf_tau_grid_bands!(
- fig,
- filter(:ctype => (x -> in(x, fb)), df),
- syms,
- labels,
- idx1,
- tr,
- alpha=0.2)
- _, grid_i = inf_tau_grid_bands!(
- fig,
- filter(:ctype => (x -> in(x, sb)), df),
- syms,
- labels,
- idx2,
- tr,
- alpha=0.2)
- legend!(fig[0, :], grid_i; nbanks=3, framevisible=false)
- Label(fig[1, 1], labels[1], padding=(0, 0, -20, 0))
- Label(fig[1, 2], labels[2], padding=(0, 0, -20, 0))
- Label(fig[1, 3], labels[3], padding=(0, 0, -20, 0))
- Label(fig[1, 4], labels[4], padding=(0, 0, -20, 0))
- Label(fig[1, 5], labels[1], padding=(0, 0, -20, 0))
- Label(fig[1, 6], labels[2], padding=(0, 0, -20, 0))
- Label(fig[1, 7], labels[3], padding=(0, 0, -20, 0))
- Label(fig[1, 8], labels[4], padding=(0, 0, -20, 0))
- rowsize!(fig.layout, 1, Relative(0.03))
- rowsize!(fig.layout, 2, Relative(0.93))
- for i in 1:8
- colsize!(fig.layout, i, Relative(0.125))
- end
- for k in 1:3
- colgap!(fig.layout, k, -5)
- end
- for k in 5:7
- colgap!(fig.layout, k, -5)
- end
- return fig
- end
- function inf_tau_grid_bands!(fig, df, syms, labels, fig_inds, transformer; w=100, h=100, alpha=1.0)
- tr = NamedTuple{Tuple(syms[1:end-1])}(transformer)
- dfs = map(syms[1:end-1]) do sym
- v = []
- temp = []
- q025 = []
- q975 = []
- meds = []
- ctype = []
- for g in groupby(df, [:ctype, :temp])
- mat_sym = cat(g[!, sym]..., dims=2)
- q025_i = tr[sym].(quantile.(eachrow(mat_sym), 0.025))
- q975_i = tr[sym].(quantile.(eachrow(mat_sym), 0.975))
- med_i = tr[sym].(median.(eachrow(mat_sym)))
- push!(v, g[1, :v])
- push!(temp, g[1, :temp])
- push!(ctype, g[1, :ctype])
- push!(q025, q025_i)
- push!(q975, q975_i)
- push!(meds, med_i)
- end
- t = (v=v, low=q025, high=q975, median=meds, temp=temp, channel=ctype)
- DataFrame(t)
- end
- yscales = [
- identity,
- identity,
- log10,
- log10,
- identity,
- identity,
- log10,
- log10,
- ]
- grid_i = nothing
- for (sym, label, (i, j), df_i) in zip(syms[1:end-1], labels, fig_inds, dfs)
- df_flat = DataFrames.flatten(df_i, [:v, :low, :high, :median])
- sub_i = fig[i, j]
- plt_i_1 = data(df_flat) *
- mapping(:v => (x -> 80 * x) => "V (mV)", :low, :high, row=:channel => cname_renamer, color=:temp => (x -> string(x) * " °C") => "Temperature") *
- visual(Band, alpha=alpha)
- plt_i_2 = data(df_flat) *
- mapping(:v => (x -> 80 * x) => "V (mV)", :median, row=:channel => cname_renamer, color=:temp => (x -> string(x) * " °C") => "Temperature") *
- visual(Lines)
- plt_i = plt_i_1 + plt_i_2
- if j in [1; 5]
- grid_i = draw!(sub_i, plt_i,
- axis=(;
- limits=(nothing, nothing, -0.1, 1.1),
- titlevisible=false,
- ylabelvisible=false,
- yscale=yscales[j],
- xticklabelrotation=pi / 2,
- xticks=-90:45:90))
- elseif j in [2; 6]
- grid_i = draw!(sub_i, plt_i,
- axis=(;
- limits=(nothing, nothing, -0.1, 1.1),
- titlevisible=false,
- ylabelvisible=false,
- yticklabelsvisible=false,
- yscale=yscales[j],
- xticklabelrotation=pi / 2,
- xticks=-90:45:90))
- elseif j in [3; 7]
- grid_i = draw!(sub_i, plt_i,
- axis=(;
- limits=(nothing, nothing, 10^-2.5, 10^4.5),
- titlevisible=false,
- ylabelvisible=false,
- yscale=yscales[j],
- yticks=[10^-2; 10^1; 10^4],
- ytickformat=values -> ["10⁻²"; "10¹"; "10⁴"],
- xticklabelrotation=pi / 2,
- xticks=-90:45:90))
- elseif j in [4; 8]
- grid_i = draw!(sub_i, plt_i,
- axis=(;
- limits=(nothing, nothing, 10^-2.5, 10^4.5),
- ylabelvisible=false,
- yscale=yscales[j],
- yticklabelsvisible=false,
- yticks=[10^-2; 10^1; 10^4],
- ytickformat=values -> ["10⁻²"; "10¹"; "10⁴"],
- xticklabelrotation=pi / 2,
- xticks=-90:45:90))
- end
- end
- rowlabels = filter(fig.content) do x
- x isa Label && x.layoutobservables.gridcontent[].side === Right()
- end
- for label in rowlabels
- label.fontsize = 12
- end
- return fig, grid_i
- end
- function df_to_pairplot(df, names;
- w=100,
- h=100,
- cgap=10,
- rgap=10,
- labelfontsize=10,
- ticklabelsize=10,
- contour_lims=(nothing, nothing, nothing, nothing),
- hist_lims=(nothing, nothing, nothing, nothing),
- cmap=:bluesreds,
- alpha=0.5,
- nbins=20
- )
- fig = Figure(size=(w, h))
- gs = GridLayout(fig[1, 1])
- pairplot(
- gs,
- df[!, names] => (
- PairPlots.Scatter(color=df[!, :rmse], markersize=6, colormap=cmap, alpha=alpha),
- PairPlots.MarginHist(color=(:grey, 0.3)),
- PairPlots.MarginDensity(),
- ),
- bins=Dict(
- :η₁ => nbins,
- :η₂ => nbins,
- :η₃ => nbins,
- :η₄ => nbins,
- :η₅ => nbins,
- :η₆ => nbins,
- :η₇ => nbins,
- :η₈ => nbins,
- ),
- topright=true,
- bottomleft=false,
- labels=Dict(
- :η₁ => "",
- :η₂ => "",
- :η₃ => "",
- :η₄ => "",
- :η₅ => "",
- :η₆ => "",
- :η₇ => "",
- :η₈ => "",
- :η₉ => "",
- )
- )
- pairplot(
- gs,
- df[!, names] => (
- PairPlots.Contour(),
- PairPlots.MarginHist(color=(:grey, 0.3)),
- PairPlots.MarginDensity(),
- ),
- bins=Dict(
- :η₁ => nbins,
- :η₂ => nbins,
- :η₃ => nbins,
- :η₄ => nbins,
- :η₅ => nbins,
- :η₆ => nbins,
- :η₇ => nbins,
- :η₈ => nbins,
- ),
- )
- ###### this is hacky but didn't find other options
- for ax in fig.content
- ax.xticklabelrotation = pi / 3
- ax.yticklabelrotation = 0
- ax.ylabelsize = labelfontsize
- ax.xlabelsize = labelfontsize
- ax.yticklabelsize = ticklabelsize
- ax.xticklabelsize = ticklabelsize
- ax.ylabelpadding = -10
- ax.xlabelpadding = -10
- if ax.limits[][2] === nothing
- ax.limits = contour_lims
- else
- ax.limits = hist_lims
- end
- end
- Colorbar(fig[1, 2], limits=(minimum(df[!, :rmse]), maximum(df[!, :rmse])), colormap=cmap, label="RMSE")
- rowgap!(gs, rgap)
- colgap!(gs, cgap)
- return fig
- end
- function df_to_stuff_v_temp(df, fb, sb, f_syms; w=100, h=100)
- fig = Figure(size=(w, h))
- batches = [fb, sb]
- for i in 1:2
- batch = batches[i]
- df_flat = DataFrames.flatten(filter(:ctype => (x -> in(x, batch)), df), f_syms)
- sub_i = fig[1, i]
- plt = data(df_flat) * mapping(:v => "V (mV)",
- [:m1_∞ => "" :m2_∞ => "" :m1_τ => "" :m2_τ => ""],
- col=dims(2) => renamer([L"m_{1,\infty}(V)" L"m_{2,\infty}(V)" L"\tau_1(V)" L"\tau_2(V)"]),
- row=:ctype => base_renamer,
- color=:temp => "Temperature °C",
- group=:temp => nonnumeric
- ) *
- visual(Lines, linewidth=4) +
- data((x=[-80; 80], y=[-1.1; 1.1])) * mapping(:x, :y) * visual(Lines, alpha=0.0)
- axis = (;
- limits=(-88, 88, -0.1, nothing),
- xticks=-80:40:80,
- xticklabelrotation=pi / 2,
- ylabel=""
- )
- draw!(
- sub_i,
- plt,
- axis=axis,
- facet=(; linkyaxes=:none))
- end
- Colorbar(fig[1, 3],
- limits=(minimum(df[!, :temp]), maximum(df[!, :temp])),
- label="Temperature °C",
- colormap=cgrad(:viridis, 5, categorical=true)
- )
- return fig
- end
- function protocol_vpcs(df, model, subs)
- gdf = groupby(df, :protocol)
- vpc_objs = []
- vpc_keys = []
- for g in gdf[subs]
- println(g[1, :protocol])
- pop = [collect(g[!, :subject])...]
- p = g[1, :params]
- ebes = [collect(g[!, :ebe])...]
- fpm = fit(
- model,
- pop,
- p,
- MAP(FOCE()),
- optim_options=(;
- iterations=0,
- show_trace=false,
- ),
- init_randeffs=ebes,
- constantcoef=filter(i -> i !== :σ, keys(p)),
- )
- _vpc = vpc(fpm)
- push!(vpc_objs, _vpc)
- push!(vpc_keys, g[1, :protocol])
- end
- return NamedTuple{Tuple(vpc_keys)}(vpc_objs)
- end
- function vpcs_nt_to_plot(vpc_nt; w=100, h=100, prot="act")
- all_df = DataFrame(repeat([[],], 10),
- [:data_τ, :data_time, :I_obs, :sim_τ, :sim_time, :lower, :upper, :lower_error, :upper_error, :protocol]
- )
- ks_prot = [i for i in keys(vpc_nt) if string(i)[1:3] == prot]
- map(ks_prot) do k
- vpc_i = vpc_nt[k]
- data_i = vpc_i.popvpc.data_quantiles
- sim_i = vpc_i.simulated_quantiles
- df_i = DataFrame(
- [data_i[!, :τ], data_i[!, :time], data_i[!, :I_obs], sim_i[!, :τ], sim_i[!, :time], sim_i[!, :lower], sim_i[!, :upper]],
- [:data_τ, :data_time, :I_obs, :sim_τ, :sim_time, :lower, :upper]
- )
- @rtransform!(df_i, :lower_error = :I_obs < :lower ? :I_obs : :lower)
- @rtransform!(df_i, :upper_error = :I_obs > :upper ? :I_obs : :upper)
- @rtransform!(df_i, :protocol = k)
- append!(all_df, df_i)
- end
- plt = data(all_df) * mapping(:sim_time, :I_obs, group=:data_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Lines) +
- data(all_df) * mapping(:sim_time, :lower, :upper, group=:sim_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Band, alpha=0.5, color=:lightblue) +
- data(all_df) * mapping(:sim_time, :lower_error, :lower, group=:sim_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Band, alpha=0.5, color=:red, overdraw=false) +
- data(all_df) * mapping(:sim_time, :upper, :upper_error, group=:sim_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Band, alpha=0.5, color=:red)
- axis = (width=w, height=h, xlabel="Time (ms)", ylabel=L"\frac{I}{I_{max}}")
- draw(plt, axis=axis)
- end
- function cust_gof(insp; cmap=:binary, hbins=100, cbins=1000, w=600, h=600,
- xy_lw=nothing,
- loess_lw=nothing,
- ols_lw=nothing,
- xy_col=nothing,
- loess_col=nothing,
- ols_col=nothing,
- )
- data = [i.observations.I_obs for i in insp.o.data]
- data = vcat(data...)
- m_id = .!ismissing.(data)
- data = Vector{Float64}(data[m_id])
- pred = [i.pred.I_obs for i in insp.pred]
- pred = vcat(pred...)
- pred = pred[m_id]
- ipred = [i.ipred.I_obs for i in insp.pred]
- ipred = vcat(ipred...)
- ipred = ipred[m_id]
- time = [i.subject.time for i in insp.wres]
- time = vcat(time...)
- time = time[m_id]
- wres = [i.wres.I_obs for i in insp.wres]
- wres = vcat(wres...)
- wres = Vector{Float64}(wres[m_id])
- iwres = [i.iwres.I_obs for i in insp.wres]
- iwres = vcat(iwres...)
- iwres = Vector{Float64}(iwres[m_id])
- loess_elem = [LineElement(color=loess_col, linewidth=loess_lw),]
- ols_elem = [LineElement(color=ols_col, linewidth=ols_lw),]
- xy_elem = [LineElement(color=xy_col, linewidth=xy_lw),]
- h1 = fit(Histogram, (pred, data), nbins=hbins)
- h2 = fit(Histogram, (ipred, data), nbins=hbins)
- h3 = fit(Histogram, (time, wres), nbins=hbins)
- h4 = fit(Histogram, (ipred, iwres), nbins=hbins)
- crange_min = 1
- crange_max = log10(1 + maximum([
- maximum(h1.weights);
- maximum(h2.weights);
- maximum(h3.weights);
- maximum(h4.weights)
- ]))
- f = Figure(; size=(w, h))
- ax1 = Axis(
- f[1, 1],
- limits=(-0.05, 1.05, -0.05, 1.05),
- xlabel="Population Predictions",
- ylabel="Observations",
- xticklabelrotation=pi / 4
- )
- contour!(
- ax1,
- collect(h1.edges[1][1:end-1]),
- collect(h1.edges[2])[1:end-1],
- log10.(Float64.(h1.weights) .+ 1),
- colormap=cmap,
- colorrange=(crange_min, crange_max),
- levels=cbins)
- observations_vs_predictions!(
- ax1,
- insp,
- markersize=0,
- ols_color=ols_col,
- ols_linewidth=ols_lw,
- loess_color=loess_col,
- loess_linewidth=loess_lw,
- )
- ax2 = Axis(
- f[1, 2],
- limits=(-0.05, 1.05, -0.05, 1.05),
- xlabel="Individual Predictions",
- ylabel="Observations",
- xticklabelrotation=pi / 4
- )
- contour!(
- ax2,
- collect(h2.edges[1][1:end-1]),
- collect(h2.edges[2])[1:end-1],
- log10.(Float64.(h2.weights) .+ 1),
- colormap=cmap,
- colorrange=(crange_min, crange_max),
- levels=cbins)
- observations_vs_ipredictions!(
- ax2,
- insp,
- markersize=0,
- ols_color=ols_col,
- ols_linewidth=ols_lw,
- loess_color=loess_col,
- loess_linewidth=loess_lw,
- )
- ax3 = Axis(
- f[2, 1],
- limits=(nothing, nothing, -10, 10),
- ylabel="Weighted population residuals",
- xlabel="Time (ms)",
- xticklabelrotation=pi / 4
- )
- contour!(
- ax3,
- collect(h3.edges[1][1:end-1]),
- collect(h3.edges[2])[1:end-1],
- log10.(Float64.(h3.weights) .+ 1),
- colormap=cmap,
- colorrange=(crange_min, crange_max),
- levels=cbins)
- wresiduals_vs_time!(
- ax3,
- insp,
- markersize=0,
- ols_color=ols_col,
- ols_linewidth=ols_lw,
- loess_color=loess_col,
- loess_linewidth=loess_lw,
- )
- ax4 = Axis(
- f[2, 2],
- limits=(nothing, nothing, -10, 10),
- ylabel="Weighted individual residuals",
- xlabel="Individual predictions",
- xticklabelrotation=pi / 4
- )
- contour!(
- ax4,
- collect(h4.edges[1][1:end-1]),
- collect(h4.edges[2])[1:end-1],
- log10.(Float64.(h4.weights) .+ 1),
- colormap=cmap,
- colorrange=(crange_min, crange_max),
- levels=cbins)
- iwresiduals_vs_ipredictions!(
- ax4,
- insp,
- markersize=0,
- ols_color=ols_col,
- ols_linewidth=ols_lw,
- loess_color=loess_col,
- loess_linewidth=loess_lw,
- )
- Legend(f[0, :],
- [loess_elem, ols_elem, xy_elem],
- ["LOESS", "OLS", L"y=x"],
- framevisible=false,
- nbanks=3,
- )
- Colorbar(f[1:2, 3], limits=(crange_min, crange_max), colormap=cmap, label="log₁₀(# of points + 1)")
- rowsize!(f.layout, 0, Relative(0.05))
- return f
- end
- function plot_all_vpcs(vpc_nt; w=100, h=100, text=repeat([[100; 0.5; "asd"]], 58))
- all_df = DataFrame(repeat([[],], 10),
- [:data_τ, :data_time, :I_obs, :sim_τ, :sim_time, :lower, :upper, :lower_error, :upper_error, :protocol]
- )
- map(keys(vpc_nt)) do k
- vpc_i = vpc_nt[k]
- data_i = vpc_i.popvpc.data_quantiles
- sim_i = vpc_i.simulated_quantiles
- df_i = DataFrame(
- [data_i[!, :τ], data_i[!, :time], data_i[!, :I_obs], sim_i[!, :τ], sim_i[!, :time], sim_i[!, :lower], sim_i[!, :upper]],
- [:data_τ, :data_time, :I_obs, :sim_τ, :sim_time, :lower, :upper]
- )
- @rtransform!(df_i, :lower_error = :I_obs < :lower ? :I_obs : :lower)
- @rtransform!(df_i, :upper_error = :I_obs > :upper ? :I_obs : :upper)
- @rtransform!(df_i, :protocol = k)
- append!(all_df, df_i)
- end
- f = Figure(size=(w, h))
- for (i, pro) in zip(1:4, ["act", "dea", "ina", "rec"])
- df_prot = filter(r -> occursin(pro, string(r.protocol)), all_df)
- plt = data(df_prot) * mapping(:sim_time => "", :I_obs, group=:data_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Lines) +
- data(df_prot) * mapping(:sim_time => "", :lower, :upper, group=:sim_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Band, alpha=0.75, color=:lightblue) +
- data(df_prot) * mapping(:sim_time => "", :lower_error, :lower, group=:sim_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Band, alpha=0.5, color=:red) +
- data(df_prot) * mapping(:sim_time => "", :upper, :upper_error, group=:sim_τ => nonnumeric, layout=:protocol => prot_renamer) * visual(Band, alpha=0.5, color=:red)
- with_theme(Theme(colgap=1, rowgap=-3)) do
- draw!(
- f[i, 1],
- plt,
- axis=(;
- yticklabelsize=12,
- xticklabelsize=12,
- yticks=[0.1, 0.5, 0.9]
- )
- )
- end
- end
- Label(f[1, 2], "Activation", rotation=-pi / 2)
- Label(f[2, 2], "Deactivation", rotation=-pi / 2)
- Label(f[3, 2], "Inactivation", rotation=-pi / 2)
- Label(f[4, 2], "Recovery", rotation=-pi / 2)
- Label(f[:, 0], L"\frac{I}{I_{max}}", rotation=pi / 2, fontsize=14)
- Label(f[5, :], "Time (ms)", fontsize=14)
- data_elem = LineElement(color=:black, linewidth=2)
- quant_elem = PolyElement(color=(:lightblue, 0.75))
- outlier_elem = PolyElement(color=(:red, 0.5))
- Legend(f[0, :],
- [data_elem, quant_elem, outlier_elem],
- [
- "Observed quantiles",
- "Simulated 95% CI, τ = [0.1, 0.5, 0.9]",
- "Outliers"
- ],
- framevisible=false,
- nbanks=3,
- )
- for i in 1:4
- rowsize!(f.layout, i, Relative(0.25))
- end
- colsize!(f.layout, 0, Relative(0.005))
- colsize!(f.layout, 1, Relative(0.99))
- colsize!(f.layout, 2, Relative(0.005))
- rowgap!(f.layout, 1)
- rowgap!(f.layout, 1, 10)
- colgap!(f.layout, 2, 7.5)
- all_axes = [i for i in f.content if i isa Axis]
- for (ax_i, text_i) in zip(all_axes, text)
- text!(ax_i, text_i[1], text_i[2], text=text_i[3], fontsize=12, rotation=-pi / 2)
- end
- return f
- end
- function example_boxplot_with_traces(df, df_unst; w=100, h=100)
- df_flat = DataFrames.flatten(df, [:t, :data])
- df1, df2 = groupby(df_flat, :data_type)
- dfoi = if df1[1, :data_type] == :prediction
- df1
- else
- df2
- end
- ddata = if df1[1, :data_type] == :prediction
- df2
- else
- df1
- end
- model_renamer = renamer(
- (:SciML_pooled => "Unified SciML",
- :SciML_split => "Individual SciML",
- :classical_no_ref => "Classical HH, no rand. eff.",
- :classical_with_ref => "Classical with rand. eff."
- )
- )
- null_renamer = renamer(
- (:SciML_pooled => "",
- :SciML_split => "",
- :classical_no_ref => "",
- :classical_with_ref => ""
- )
- )
- f = Figure(size=(w, h))
- p1 = data(filter(r -> r.ctype == :kv11, dfoi)) * visual(BoxPlot, show_outliers=false) *
- mapping(
- :model_type => model_renamer => "HH Model Type",
- :rmse => "RMSE",
- color=:model_type => model_renamer => "HH Model Type",
- layout=:ctype => cname_renamer
- )
- p2 = data(filter(r -> !ismissing(r.I_obs), df_unst)) * visual(Lines, alpha=0.5, linewidth=2) *
- mapping(
- :time => "Time (ms)",
- :I_obs_ipred => L"\frac{I}{I_{max}}",
- color=:model_type,
- col=:model_type => null_renamer,
- group=:id => nonnumeric
- )
- p3 = data(filter(r -> !ismissing(r.I_obs), df_unst)) * visual(Lines, color=(:black, 0.5), linewidth=2) *
- mapping(
- :time => "Time (ms)",
- :I_obs => L"\frac{I}{I_{max}}",
- col=:model_type => null_renamer,
- group=:id => nonnumeric
- )
- gr1 = draw!(
- f[1, 5],
- p1,
- axis=(
- xticklabelsvisible=false,
- ),
- )
- gr2 = draw!(
- f[1, 1:4],
- p2 + p3,
- )
- legend!(
- f[0, :],
- gr1;
- framevisible=false, position=:top, nbanks=4
- )
- rowsize!(f.layout, 1, Relative(0.92))
- return f
- end
- function df_temp_to_plot(df, fb, sb; w=100, h=100)
- fig = Figure(size=(w, h))
- gr_i = nothing
- for (i, b) in zip(1:2, [fb, sb])
- plt =
- data(filter(r -> r.ctype in b, df)) * mapping(
- :v => "",
- [:τ1_Q10 => "" :τ2_Q10 => ""],
- col=dims(2) => renamer([L"\tau_1(V)" L"\tau_2(V)"]),
- row=:ctype => base_renamer,
- color=:T_ref => renamer((15 => L"\frac{f_{T=15}}{f_{T=25}}", 25 => L"\frac{f_{T=25}}{f_{T=35}}")) => "Ref. Temp.",
- group=:T_ref => nonnumeric
- ) *
- visual(Lines, linewidth=2)
- gr_i = draw!(
- fig[1, i],
- plt,
- axis=(
- limits=(-20, 80, nothing, nothing),
- xticks=-80:40:80,
- xticklabelrotation=pi / 2,
- ),
- facet=(; linkyaxes=:none)
- )
- end
- Label(fig[2, :], "Voltage (mV)")
- Label(fig[:, 0], L"Q_{10}(V)", rotation=pi / 2)
- legend!(fig[0, :], gr_i; title="asd", framevisible=false, nbanks=2)
- rowsize!(fig.layout, 1, Relative(0.95))
- return fig
- end
- function df_temp_to_plot_ipreds(df, fb, sb; w=100, h=100)
- fig = Figure(size=(w, h))
- gr_i = nothing
- for (i, b) in zip(1:2, [fb, sb])
- plt =
- data(filter(r -> r.ctype in b, df)) * mapping(
- :v => "",
- [:m1_Q10 => "" :m2_Q10 => "" :τ1_Q10 => "" :τ2_Q10 => ""],
- col=dims(2) => renamer([L"m_{1,\infty}(V)" L"m_{2,\infty}(V)" L"\tau_1(V)" L"\tau_2(V)"]),
- row=:ctype => base_renamer,
- color=:T_ref => renamer((15 => L"\frac{f_{T=15}}{f_{T=25}}", 25 => L"\frac{f_{T=25}}{f_{T=35}}")) => "Ref. Temp.",
- group=:T_ref => nonnumeric
- ) *
- visual(Lines, linewidth=2, alpha=0.5)
- gr_i = draw!(
- fig[1, i],
- plt,
- axis=(
- limits=(-80, 80, nothing, nothing),
- xticks=-80:40:80,
- xticklabelrotation=pi / 2,
- ),
- )
- end
- Label(fig[2, :], "Voltage (mV)")
- Label(fig[:, 0], L"Q_{10}(V)", rotation=pi / 2)
- legend!(fig[0, :], gr_i; title="asd", framevisible=false, nbanks=2)
- rowsize!(fig.layout, 1, Relative(0.95))
- return fig
- end
- function plot_data_processing(hd; w=100, h=100)
- ###cols
- ### 1 raw 2 MAPE 3 smoothing 4 baseline 5 normalize 6 rescale 7 artefacts 8 downsample
- ###
- downsampler(t, s, nbins) = M4downsample(t, s, nbins)
- denoiser(x) = denoise(x, factor=1.0)[1]
- MAPE(x, y) = mean(abs.((x - y) ./ x))
- fig = Figure(size=(w, h))
- act_50 = hd["acquisition"]["timeseries"]["Activation"]["repetitions"]["repetition2"]["data"][end-3, :]
- act_70 = hd["acquisition"]["timeseries"]["Activation"]["repetitions"]["repetition2"]["data"][end-1, :]
- act_80 = hd["acquisition"]["timeseries"]["Activation"]["repetitions"]["repetition2"]["data"][end, :]
- act_t = LinRange(0, 700, length(act_50))
- dea = hd["acquisition"]["timeseries"]["Deactivation"]["repetitions"]["repetition1"]["data"][1, :]
- dea_t = LinRange(0, 700, length(dea))
- ina = hd["acquisition"]["timeseries"]["Inactivation"]["repetitions"]["repetition1"]["data"][end, :]
- ina_t = LinRange(0, 1750, length(ina))
- rec_k = keys(hd["acquisition"]["timeseries"]["Recovery"]["repetitions"]["repetition1"]["data"])
- rec = [hd["acquisition"]["timeseries"]["Recovery"]["repetitions"]["repetition1"]["data"][k]["data"][:] for k in rec_k]
- rec_idx = sortperm(length.(rec))
- rec = rec[rec_idx]
- rec_t = [LinRange(0, 100 + 1500 + 50 + 150 * (i - 1) + 200 + 100, length(rec[i])) for i in 1:16]
- ### =====================
- ax11 = Axis(fig[1, 1], title="Raw data", limits=(-35, 800, -0.1, 1.1), ygridvisible=false)
- ax21 = Axis(fig[2, 1], limits=(-35, 800, -0.1, 1.1), ygridvisible=false)
- ax31 = Axis(fig[3, 1], limits=(-85, 1800, -0.1, 1.1), ygridvisible=false)
- ax41 = Axis(fig[4, 1], limits=(-210, 4300, -0.1, 1.1), ygridvisible=false)
- lines!(ax11, act_t, act_50, color=:blue)
- lines!(ax11, act_t, act_70, color=:red)
- lines!(ax11, act_t, act_80, color=:black)
- lines!(ax21, dea_t, dea, color=:black)
- lines!(ax31, ina_t, ina, color=:black)
- map(zip(rec_t, rec)) do (t, r)
- lines!(ax41, t, r, color=(:black, 0.3))
- end
- hidedecorations!(ax11)
- hidedecorations!(ax21)
- hidedecorations!(ax31)
- hidedecorations!(ax41)
- ### =====================
- ax12 = Axis(fig[1, 2], title="Set baseline", limits=(-35, 800, -0.1, 1.1))
- ax22 = Axis(fig[2, 2], limits=(-35, 800, -0.1, 1.1))
- ax32 = Axis(fig[3, 2], limits=(-85, 1800, -0.1, 1.1))
- ax42 = Axis(fig[4, 2], limits=(-210, 4300, -0.1, 1.1))
- act_50 .-= mean(act_50[act_t.<40])
- act_70 .-= mean(act_70[act_t.<40])
- act_80 .-= mean(act_80[act_t.<40])
- lines!(ax12, act_t, act_50, color=:blue)
- lines!(ax12, act_t, act_70, color=:red)
- lines!(ax12, act_t, act_80, color=:black)
- dea .-= mean(dea[dea_t.<40])
- lines!(ax22, dea_t, dea, color=:black)
- ina .-= mean(ina[ina_t.<40])
- lines!(ax32, ina_t, ina, color=:black)
- map(zip(rec_t, rec)) do (t, r)
- r .-= mean(r[t.<40])
- lines!(ax42, t, r, color=(:black, 0.3))
- end
- hidedecorations!(ax12)
- hidedecorations!(ax22)
- hidedecorations!(ax32)
- hidedecorations!(ax42)
- ### =====================
- ax13 = Axis(fig[1, 3], title="Smoothing", limits=(-35, 800, -0.1, 1.1))
- ax23 = Axis(fig[2, 3], limits=(-35, 800, -0.1, 1.1))
- ax33 = Axis(fig[3, 3], limits=(-85, 1800, -0.1, 1.1))
- ax43 = Axis(fig[4, 3], limits=(-210, 4300, -0.1, 1.1))
- act_50[1000:5991] .= denoise(act_50[1000:5991])[1]
- act_70[1000:5991] .= denoise(act_70[1000:5991])[1]
- act_80[1000:5991] .= denoise(act_80[1000:5991])[1]
- lines!(ax13, act_t, act_50, color=:blue)
- lines!(ax13, act_t, act_70, color=:red)
- lines!(ax13, act_t, act_80, color=:black)
- dea[1000:3991] .= denoise(dea[1000:3991])[1]
- dea[4100:5991] .= denoise(dea[4100:5991])[1]
- lines!(ax23, dea_t, dea, color=:black)
- ina[1000:15990] .= denoise(ina[1000:15990])[1]
- ina[16100:16981] .= denoise(ina[16100:16981])[1]
- lines!(ax33, ina_t, ina, color=:black)
- map(zip(rec_t, rec)) do (t, r)
- r[1000:15990] .= denoise(r[1000:15990])[1]
- lines!(ax43, t, r, color=(:black, 0.3))
- end
- hidedecorations!(ax13)
- hidedecorations!(ax23)
- hidedecorations!(ax33)
- hidedecorations!(ax43)
- ### =====================
- ax14 = Axis(fig[1, 4], title="Normalization + Rescaling", limits=(-35, 800, -0.1, 1.1))
- ax24 = Axis(fig[2, 4], limits=(-35, 800, -0.1, 1.1))
- ax34 = Axis(fig[3, 4], limits=(-85, 1800, -0.1, 1.1))
- ax44 = Axis(fig[4, 4], limits=(-210, 4300, -0.1, 1.1))
- act_80_max = maximum(act_80[1000:5991])
- act_70_max = maximum(act_70[1000:5991])
- act_50_max = maximum(act_50[1000:5991])
- act_50 ./= act_80_max
- act_70 ./= act_80_max
- act_80 ./= act_80_max
- lines!(ax14, act_t, act_50, color=:blue)
- lines!(ax14, act_t, act_70, color=:red)
- lines!(ax14, act_t, act_80, color=:black)
- dea_max = maximum(dea[1000:3991])
- dea = dea * (act_70_max / dea_max) / act_80_max
- lines!(ax24, dea_t, dea, color=:black, label="Deactivation")
- lines!(ax24, act_t, act_70, color=:red, label="Activation +70mV")
- ina_max = maximum(ina[1000:15990])
- ina = ina * (act_70_max / ina_max) / act_80_max
- lines!(ax34, ina_t, ina, color=:black, label="Inactivation +70mV")
- lines!(ax34, act_t, act_70, color=:red, label="Activation +70mV")
- rec = map(rec) do r
- r_max = maximum(r[1000:15990])
- r = r * (act_50_max / r_max) / act_80_max
- end
- map(zip(rec_t, rec)) do (t, r)
- lines!(ax44, t, r, color=(:black, 0.3), label="Recovery")
- end
- lines!(ax44, act_t, act_50, color=:blue, label="Activation +50mV")
- hidedecorations!(ax14)
- hidedecorations!(ax24)
- hidedecorations!(ax34)
- hidedecorations!(ax44)
- ### =====================
- ax15 = Axis(fig[1, 5], title="Exclude artifacts", limits=(-35, 800, -0.1, 1.1))
- ax25 = Axis(fig[2, 5], limits=(-35, 800, -0.1, 1.1))
- ax35 = Axis(fig[3, 5], limits=(-85, 1800, -0.1, 1.1))
- ax45 = Axis(fig[4, 5], limits=(-210, 4300, -0.1, 1.1))
- act_t = Vector{Union{Float64,Missing}}(act_t)
- act_50 = Vector{Union{Float64,Missing}}(act_50)
- act_70 = Vector{Union{Float64,Missing}}(act_70)
- act_80 = Vector{Union{Float64,Missing}}(act_80)
- act_50[386:399] .= missing
- act_50[491:499] .= missing
- act_50[981:999] .= missing
- act_50[5992:6099] .= missing
- act_70[386:399] .= missing
- act_70[491:499] .= missing
- act_70[981:999] .= missing
- act_70[5992:6099] .= missing
- act_80[386:399] .= missing
- act_80[491:499] .= missing
- act_80[981:999] .= missing
- act_80[5992:6099] .= missing
- act_t[386:399] .= missing
- act_t[491:499] .= missing
- act_t[981:999] .= missing
- act_t[5992:6099] .= missing
- lines!(ax15, collect(skipmissing(act_t)), collect(skipmissing(act_50)), color=:blue)
- lines!(ax15, collect(skipmissing(act_t)), collect(skipmissing(act_70)), color=:red)
- lines!(ax15, collect(skipmissing(act_t)), collect(skipmissing(act_80)), color=:black)
- dea_t = Vector{Union{Float64,Missing}}(dea_t)
- dea = Vector{Union{Float64,Missing}}(dea)
- dea_t[386:399] .= missing
- dea_t[491:499] .= missing
- dea_t[981:999] .= missing
- dea_t[3992:4099] .= missing
- dea_t[5992:6099] .= missing
- dea[386:399] .= missing
- dea[491:499] .= missing
- dea[981:999] .= missing
- dea[3992:4099] .= missing
- dea[5992:6099] .= missing
- lines!(ax25, collect(skipmissing(dea_t)), collect(skipmissing(dea)), color=:black)
- ina_t = Vector{Union{Float64,Missing}}(ina_t)
- ina = Vector{Union{Float64,Missing}}(ina)
- ina_t[386:399] .= missing
- ina_t[491:499] .= missing
- ina_t[981:999] .= missing
- ina_t[15991:16099] .= missing
- ina_t[16982:17099] .= missing
- ina[386:399] .= missing
- ina[491:499] .= missing
- ina[981:999] .= missing
- ina[15991:16099] .= missing
- ina[16982:17099] .= missing
- lines!(ax35, collect(skipmissing(ina_t)), collect(skipmissing(ina)), color=:black)
- rec_t = map(rec_t) do t
- li = length(t)
- t = Vector{Union{Float64,Missing}}(t)
- t[386:399] .= missing
- t[491:499] .= missing
- t[981:999] .= missing
- t[15991:16099] .= missing
- t[(li-3019):(li-2996)] .= missing
- t[(li-999):(li-901)] .= missing
- t
- end
- rec = map(rec) do r
- li = length(r)
- r = Vector{Union{Float64,Missing}}(r)
- r[386:399] .= missing
- r[491:499] .= missing
- r[981:999] .= missing
- r[15991:16099] .= missing
- r[(li-3019):(li-2996)] .= missing
- r[(li-999):(li-901)] .= missing
- r
- end
- map(zip(rec_t, rec)) do (t, r)
- lines!(ax45, collect(skipmissing(t)), collect(skipmissing(r)), color=(:black, 0.3))
- end
- hidedecorations!(ax15)
- hidedecorations!(ax25)
- hidedecorations!(ax35)
- hidedecorations!(ax45)
- ### =====================
- ax16 = Axis(fig[1, 6], title="MAPE exclusion", limits=(-35, 800, -0.1, 1.1))
- ax26 = Axis(fig[2, 6], limits=(-35, 800, -0.1, 1.1))
- ax36 = Axis(fig[3, 6], limits=(-85, 1800, -0.1, 1.1))
- ax46 = Axis(fig[4, 6], limits=(-210, 4300, -0.1, 1.1))
- dea_i = (collect(skipmissing(dea_t)) .> 100) .&& (collect(skipmissing(dea_t)) .< 300)
- act_i = (collect(skipmissing(act_t)) .> 100) .&& (collect(skipmissing(act_t)) .< 300)
- dea_MAPE = MAPE(collect(skipmissing(act_70))[act_i], collect(skipmissing(dea))[dea_i])
- text!(ax26, 100, 0.0, text="MAPE=" * string(dea_MAPE)[1:5])
- lines!(ax26, collect(skipmissing(dea_t))[dea_i], collect(skipmissing(dea))[dea_i], color=:black)
- lines!(ax26, collect(skipmissing(act_t))[act_i], collect(skipmissing(act_70))[act_i], color=:red)
- ina_i = (collect(skipmissing(ina_t)) .> 100) .&& (collect(skipmissing(ina_t)) .< 500)
- act_i = (collect(skipmissing(act_t)) .> 100) .&& (collect(skipmissing(act_t)) .< 500)
- ina_MAPE = MAPE(act_70[1000:5990], ina[1000:5990])
- text!(ax36, 100, 0.0, text="MAPE=" * string(ina_MAPE)[1:5])
- lines!(ax36, collect(skipmissing(ina_t))[ina_i], collect(skipmissing(ina))[ina_i], color=:black)
- lines!(ax36, collect(skipmissing(act_t))[act_i], collect(skipmissing(act_70))[act_i], color=:red)
- map(zip(rec_t, rec)) do (t, r)
- r_i = (collect(skipmissing(t)) .> 100) .&& (collect(skipmissing(t)) .< 500)
- lines!(ax46, collect(skipmissing(t))[r_i], collect(skipmissing(r))[r_i], color=(:black, 0.3))
- end
- lines!(ax46, collect(skipmissing(act_t))[act_i], collect(skipmissing(act_50))[act_i], color=:blue)
- r_MAPEs = [MAPE(act_50[1000:5991], i[1000:5991]) < 0.05 for i in rec]
- last_vals = [i[15990] for i in rec]
- med = median(last_vals)
- sd = std(last_vals)
- last_vals = [(abs(i - med) / sd) < 1 for i in last_vals]
- r_incl = [i for i in 1:length(r_MAPEs) if r_MAPEs[i] && last_vals[i]]
- rec_t = rec_t[r_incl]
- rec = rec[r_incl]
- hidedecorations!(ax16)
- hidespines!(ax16)
- hidedecorations!(ax26)
- hidedecorations!(ax36)
- hidedecorations!(ax46)
- ### =====================
- ax17 = Axis(fig[1, 7], title="Down-sampling", limits=(-35, 800, -0.1, 1.1))
- ax27 = Axis(fig[2, 7], limits=(-35, 800, -0.1, 1.1))
- ax37 = Axis(fig[3, 7], limits=(-85, 1800, -0.1, 1.1))
- ax47 = Axis(fig[4, 7], limits=(-210, 4300, -0.1, 1.1))
- act_t_d = [
- act_t[icr(1, 385, 3)];
- act_t[icr(400, 490, 3)];
- act_t[icr(500, 980, 3)];
- downsampler(act_t[1000:5991], act_50[1000:5991], 30)[1];
- act_t[icr(6100, 6990, 3)]
- ]
- act_50_d = [
- act_50[icr(1, 385, 3)];
- act_50[icr(400, 490, 3)];
- act_50[icr(500, 980, 3)];
- downsampler(act_t[1000:5991], act_50[1000:5991], 30)[2];
- act_50[icr(6100, 6990, 3)]
- ]
- act_70_d = [
- act_70[icr(1, 385, 3)];
- act_70[icr(400, 490, 3)];
- act_70[icr(500, 980, 3)];
- downsampler(act_t[1000:5991], act_70[1000:5991], 30)[2];
- act_70[icr(6100, 6990, 3)]
- ]
- act_80_d = [
- act_80[icr(1, 385, 3)];
- act_80[icr(400, 490, 3)];
- act_80[icr(500, 980, 3)];
- downsampler(act_t[1000:5991], act_80[1000:5991], 30)[2];
- act_80[icr(6100, 6990, 3)]
- ]
- lines!(ax17, collect(skipmissing(act_t_d)), collect(skipmissing(act_50_d)), color=:blue, label="Activation +50mV")
- lines!(ax17, collect(skipmissing(act_t_d)), collect(skipmissing(act_70_d)), color=:red, label="Activation +70mV")
- lines!(ax17, collect(skipmissing(act_t_d)), collect(skipmissing(act_80_d)), color=:black, label="Activation +80mV")
- ina_t_d = [
- ina_t[icr(1, 385, 3)];
- ina_t[icr(400, 490, 3)];
- ina_t[icr(500, 980, 3)];
- downsampler(ina_t[1000:15990], ina[1000:15990], 90)[1];
- downsampler(ina_t[16100:16981], ina[16100:16981], 6)[1];
- ina_t[icr(17100, 17490, 3)]
- ]
- ina_d = [
- ina[icr(1, 385, 3)];
- ina[icr(400, 490, 3)];
- ina[icr(500, 980, 3)];
- downsampler(ina[1000:15990], ina[1000:15990], 90)[1];
- downsampler(ina[16100:16981], ina[16100:16981], 6)[1];
- ina[icr(17100, 17490, 3)]
- ]
- lines!(ax37, collect(skipmissing(ina_t_d)), collect(skipmissing(ina_d)), color=:black)
- map(zip(rec_t, rec)) do (t, r)
- li = length(r)
- t_d = [
- t[icr(1, 385, 3)];
- t[icr(400, 490, 3)];
- t[icr(500, 980, 3)];
- downsampler(t[1000:15990], r[1000:15990], 90)[1];
- t[icr(16100, li - 3020, 3)];
- downsampler(
- t[(li-2995):(li-1000)],
- r[(li-2995):(li-1000)],
- 12)[1]
- t[icr(li - 900, li, 3)]
- ]
- r_d = [
- r[icr(1, 385, 3)];
- r[icr(400, 490, 3)];
- r[icr(500, 980, 3)];
- downsampler(t[1000:15990], r[1000:15990], 90)[2];
- r[icr(16100, li - 3020, 3)];
- downsampler(
- r[(li-2995):(li-1000)],
- r[(li-2995):(li-1000)],
- 12)[2]
- r[icr(li - 900, li, 3)]
- ]
- lines!(ax47, collect(skipmissing(t_d)), collect(skipmissing(r_d)), color=(:black, 0.3))
- end
- hidedecorations!(ax17)
- hidedecorations!(ax27)
- hidespines!(ax27)
- hidedecorations!(ax37)
- hidedecorations!(ax47)
- Legend(fig[1, 8], ax17, framevisible=false)
- Legend(fig[2, 8], ax24, framevisible=false)
- Legend(fig[3, 8], ax34, framevisible=false)
- Legend(fig[4, 8], ax44, framevisible=false, unique=true)
- for i in 1:4
- rowsize!(fig.layout, i, Relative(0.25))
- end
- return fig
- end
aog_recipes.jl at commit 26dc63b, no license · at the source
Overview
- Institute for Machine Learning, School of Informatics, University of Edinburgh, Edinburgh, United Kingdom
- Computational Neuroscience Unit, Okinawa Institute of Science and Technology, Okinawa, Japan
- Faculty of Medicine, Medical School Berlin, Berlin, Germany
Abstract
Ion channels are essential for signal processing and propagation in neural cells. Voltage-gated ion channels permeable to potassium (Kv) form one of the most prominent channel families. Techniques used to model the voltage-dependent gating of Kv channels date back to Hodgkin and Huxley (1952). Different Kv types can display radically different kinetic properties, requiring different mathematical models. However, the construction of Hodgkin-Huxley-like (HH-like) models is generally complex and time consuming due to the number of parameters, their tuning and having to choose functional forms to model gating. In addition to the between-Kv type heterogeneity, there can be significant within-Kv type kinetic heterogeneity between different cells with genetically identical channels. Since HH-like models do not account for such variability, extensions to it are necessary. We use scientific machine learning (SciML), the integration of machine learning methodologies with existing scientific models, and non-linear mixed effects (NLME) modelling to bypass the limitations of HH-like modelling. NLME is a modelling methodology that takes into account both within- and between-subject variability. These tools allowed us to complement the HH-like modelling and construct a unified SciML HH-like model that fits the recordings from 20 different Kv types. The unified SciML HH-like model produced closer fits to the data compared to a set of seven previous HH-like models and was able to represent the highly heterogeneous data from different cells. Our model may be the first step in producing a SciML foundation model for ion channels that would be capable of modelling the gating kinetics of any ion channel type.
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 6 matches between paragraphs and lines of code.
dom-linkevicius/SciMLHHModels.jl
26dc63b6cd5de79536731f072cf6c4d28328bb00, 23 February 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
16 files
- process_data.jl, Julia, 127 lines, 1 match
- src/
SciMLHHModels.jl , Julia, 90 lines - src/
data_wrangling/ , Julia, 30 linesdownsampling_functions.j l - src/
data_wrangling/ , Julia, 237 linesdownsampling_protocols.j l - src/
data_wrangling/ , Julia, 169 linesexclude_cells.jl - src/
data_wrangling/ , Julia, 605 linesloader_functions.jl - src/
data_wrangling/ , Julia, 81 linesoutlier_handling.jl - src/
data_wrangling/ , Julia, 205 linesprotocol_setups.jl - src/
models/ , Julia, 1,072 linesbaseline_models.jl - src/
models/ , Julia, 122 linessciml_models.jl - src/
plotting/ , Julia, 1,498 lines, 3 matchesaog_recipes.jl - src/
plotting/ , Julia, 652 linesmetrics_diagnostics.jl - training_analysis.jl, Julia, 754 lines, 2 matches
- training_pooled.jl, Julia, 167 lines
- training_split.jl, Julia, 111 lines
- README.md, Text, 12 lines
modeldb:229585
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
francescoalemanno/KissSmoothing.jl
4f2110c57e5d0868d4f35ca4dd487f73a296ae68, 5 June 2023Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
4 files
- src/
KissSmoothing.jl , Julia, 298 lines - test/
runtests.jl , Julia, 96 lines - LICENSE.md, License, 22 lines
- README.md, Text, 229 lines
njohner/Kv-kinetic-models
18e0352b9f4d1778c4fe71c5a1d3f29d20714c11, 2 April 2018Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
190 files
- hbp-00009_KCNQ5/
hbp-00009_KCNQ5__11State , NEURON, 79 liness/ hbp-00009_KCNQ5__11State s.mod - hbp-00009_KCNQ5/
hbp-00009_KCNQ5__11State , NEURON, 49 liness/ hbp-00009_KCNQ5__11State s_test_model.hoc - hbp-00009_KCNQ5/
hbp-00009_KCNQ5__13State , NEURON, 90 liness/ hbp-00009_KCNQ5__13State s.mod - hbp-00009_KCNQ5/
hbp-00009_KCNQ5__13State , NEURON, 49 liness/ hbp-00009_KCNQ5__13State s_test_model.hoc - hbp-00009_KCNQ5/
hbp-00009_KCNQ5__4States , NEURON, 63 lines/ hbp-00009_KCNQ5__4States .mod - hbp-00009_KCNQ5/
hbp-00009_KCNQ5__4States , NEURON, 49 lines/ hbp-00009_KCNQ5__4States _test_model.hoc - hbp-00009_KCNQ5/
hbp-00009_KCNQ5__6States , NEURON, 72 lines/ hbp-00009_KCNQ5__6States .mod - hbp-00009_KCNQ5/
hbp-00009_KCNQ5__6States , NEURON, 49 lines/ hbp-00009_KCNQ5__6States _test_model.hoc - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv1.1__11State s_temperature2_Kv11.mod - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.1__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv1.1__13State s_temperature2_Kv11.mod - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.1__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv1.1__4States _temperature2_Kv11.mod - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.1__4States _temperature2_test_model .hoc - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv1.1__6States _temperature2_Kv11.mod - hbp-00009_Kv1.1/
hbp-00009_Kv1.1__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.1__6States _temperature2_test_model .hoc - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__11State , NEURON, 79 liness/ hbp-00009_Kv1.2__11State s_Kv12.mod - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__11State , NEURON, 49 liness/ hbp-00009_Kv1.2__11State s_test_model.hoc - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__13State , NEURON, 90 liness/ hbp-00009_Kv1.2__13State s_Kv12.mod - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__13State , NEURON, 49 liness/ hbp-00009_Kv1.2__13State s_test_model.hoc - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__4States , NEURON, 63 lines/ hbp-00009_Kv1.2__4States _Kv12.mod - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__4States , NEURON, 49 lines/ hbp-00009_Kv1.2__4States _test_model.hoc - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__6States , NEURON, 72 lines/ hbp-00009_Kv1.2__6States _Kv12.mod - hbp-00009_Kv1.2/
hbp-00009_Kv1.2__6States , NEURON, 49 lines/ hbp-00009_Kv1.2__6States _test_model.hoc - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__11State , NEURON, 79 liness/ hbp-00009_Kv1.3__11State s_Kv13.mod - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__11State , NEURON, 49 liness/ hbp-00009_Kv1.3__11State s_test_model.hoc - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__13State , NEURON, 90 liness/ hbp-00009_Kv1.3__13State s_Kv13.mod - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__13State , NEURON, 49 liness/ hbp-00009_Kv1.3__13State s_test_model.hoc - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__4States , NEURON, 63 lines/ hbp-00009_Kv1.3__4States _Kv13.mod - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__4States , NEURON, 49 lines/ hbp-00009_Kv1.3__4States _test_model.hoc - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__6States , NEURON, 72 lines/ hbp-00009_Kv1.3__6States _Kv13.mod - hbp-00009_Kv1.3/
hbp-00009_Kv1.3__6States , NEURON, 49 lines/ hbp-00009_Kv1.3__6States _test_model.hoc - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv1.4__11State s_temperature2_Kv14.mod - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.4__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv1.4__13State s_temperature2_Kv14.mod - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.4__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv1.4__4States _temperature2_Kv14.mod - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.4__4States _temperature2_test_model .hoc - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv1.4__6States _temperature2_Kv14.mod - hbp-00009_Kv1.4/
hbp-00009_Kv1.4__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.4__6States _temperature2_test_model .hoc - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__11State , NEURON, 79 liness/ hbp-00009_Kv1.5__11State s_Kv15.mod - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__11State , NEURON, 49 liness/ hbp-00009_Kv1.5__11State s_test_model.hoc - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__13State , NEURON, 90 liness/ hbp-00009_Kv1.5__13State s_Kv15.mod - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__13State , NEURON, 49 liness/ hbp-00009_Kv1.5__13State s_test_model.hoc - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__4States , NEURON, 63 lines/ hbp-00009_Kv1.5__4States _Kv15.mod - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__4States , NEURON, 49 lines/ hbp-00009_Kv1.5__4States _test_model.hoc - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__6States , NEURON, 72 lines/ hbp-00009_Kv1.5__6States _Kv15.mod - hbp-00009_Kv1.5/
hbp-00009_Kv1.5__6States , NEURON, 49 lines/ hbp-00009_Kv1.5__6States _test_model.hoc - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv1.6__11State s_temperature2_Kv16.mod - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.6__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv1.6__13State s_temperature2_Kv16.mod - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.6__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv1.6__4States _temperature2_Kv16.mod - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.6__4States _temperature2_test_model .hoc - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv1.6__6States _temperature2_Kv16.mod - hbp-00009_Kv1.6/
hbp-00009_Kv1.6__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.6__6States _temperature2_test_model .hoc - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv1.7__11State s_temperature2_Kv17.mod - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.7__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv1.7__13State s_temperature2_Kv17.mod - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv1.7__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv1.7__4States _temperature2_Kv17.mod - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.7__4States _temperature2_test_model .hoc - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv1.7__6States _temperature2_Kv17.mod - hbp-00009_Kv1.7/
hbp-00009_Kv1.7__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv1.7__6States _temperature2_test_model .hoc - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_11 , NEURON, 79 linesStates/ hbp-00009_Kv10.1__003_11 States_Kv101.mod - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_11 , NEURON, 49 linesStates/ hbp-00009_Kv10.1__003_11 States_test_model.hoc - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_13 , NEURON, 90 linesStates/ hbp-00009_Kv10.1__003_13 States_Kv101.mod - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_13 , NEURON, 49 linesStates/ hbp-00009_Kv10.1__003_13 States_test_model.hoc - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_4S , NEURON, 63 linestates/ hbp-00009_Kv10.1__003_4S tates_Kv101.mod - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_4S , NEURON, 49 linestates/ hbp-00009_Kv10.1__003_4S tates_test_model.hoc - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_6S , NEURON, 72 linestates/ hbp-00009_Kv10.1__003_6S tates_Kv101.mod - hbp-00009_Kv10.1/
hbp-00009_Kv10.1__003_6S , NEURON, 49 linestates/ hbp-00009_Kv10.1__003_6S tates_test_model.hoc - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__11 , NEURON, 79 linesStates/ hbp-00009_Kv10.1_003__11 States_Kv101.mod - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__11 , NEURON, 49 linesStates/ hbp-00009_Kv10.1_003__11 States_test_model.hoc - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__13 , NEURON, 90 linesStates/ hbp-00009_Kv10.1_003__13 States_Kv101.mod - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__13 , NEURON, 49 linesStates/ hbp-00009_Kv10.1_003__13 States_test_model.hoc - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__4S , NEURON, 63 linestates/ hbp-00009_Kv10.1_003__4S tates_Kv101.mod - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__4S , NEURON, 49 linestates/ hbp-00009_Kv10.1_003__4S tates_test_model.hoc - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__6S , NEURON, 72 linestates/ hbp-00009_Kv10.1_003__6S tates_Kv101.mod - hbp-00009_Kv10.1_003/
hbp-00009_Kv10.1_003__6S , NEURON, 49 linestates/ hbp-00009_Kv10.1_003__6S tates_test_model.hoc - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__11Stat , NEURON, 84 lineses_temperature2/ hbp-00009_Kv10.2__11Stat es_temperature2_Kv102.mo d - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__11Stat , NEURON, 49 lineses_temperature2/ hbp-00009_Kv10.2__11Stat es_temperature2_test_mod el.hoc - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__13Stat , NEURON, 101 lineses_temperature2/ hbp-00009_Kv10.2__13Stat es_temperature2_Kv102.mo d - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__13Stat , NEURON, 49 lineses_temperature2/ hbp-00009_Kv10.2__13Stat es_temperature2_test_mod el.hoc - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__4State , NEURON, 68 liness_temperature2/ hbp-00009_Kv10.2__4State s_temperature2_Kv102.mod - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__4State , NEURON, 49 liness_temperature2/ hbp-00009_Kv10.2__4State s_temperature2_test_mode l.hoc - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__6State , NEURON, 83 liness_temperature2/ hbp-00009_Kv10.2__6State s_temperature2_Kv102.mod - hbp-00009_Kv10.2/
hbp-00009_Kv10.2__6State , NEURON, 49 liness_temperature2/ hbp-00009_Kv10.2__6State s_temperature2_test_mode l.hoc - hbp-00009_Kv12.1/
hbp-00009_Kv12.1__11Stat , NEURON, 84 lineses_temperature2/ hbp-00009_Kv12.1__11Stat es_temperature2_Kv121.mo d - hbp-00009_Kv12.1/
hbp-00009_Kv12.1__11Stat , NEURON, 49 lineses_temperature2/ hbp-00009_Kv12.1__11Stat es_temperature2_test_mod el.hoc - hbp-00009_Kv12.1/
hbp-00009_Kv12.1__4State , NEURON, 68 liness_temperature2/ hbp-00009_Kv12.1__4State s_temperature2_Kv121.mod - hbp-00009_Kv12.1/
hbp-00009_Kv12.1__4State , NEURON, 49 liness_temperature2/ hbp-00009_Kv12.1__4State s_temperature2_test_mode l.hoc - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__11Stat , NEURON, 79 lineses/ hbp-00009_Kv12.3__11Stat es_Kv123.mod - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__11Stat , NEURON, 49 lineses/ hbp-00009_Kv12.3__11Stat es_test_model.hoc - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__13Stat , NEURON, 90 lineses/ hbp-00009_Kv12.3__13Stat es_Kv123.mod - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__13Stat , NEURON, 49 lineses/ hbp-00009_Kv12.3__13Stat es_test_model.hoc - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__4State , NEURON, 63 liness/ hbp-00009_Kv12.3__4State s_Kv123.mod - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__4State , NEURON, 49 liness/ hbp-00009_Kv12.3__4State s_test_model.hoc - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__6State , NEURON, 72 liness/ hbp-00009_Kv12.3__6State s_Kv123.mod - hbp-00009_Kv12.3/
hbp-00009_Kv12.3__6State , NEURON, 49 liness/ hbp-00009_Kv12.3__6State s_test_model.hoc - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv2.1__11State s_temperature2_Kv21.mod - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv2.1__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv2.1__13State s_temperature2_Kv21.mod - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv2.1__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv2.1__4States _temperature2_Kv21.mod - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv2.1__4States _temperature2_test_model .hoc - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv2.1__6States _temperature2_Kv21.mod - hbp-00009_Kv2.1/
hbp-00009_Kv2.1__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv2.1__6States _temperature2_test_model .hoc - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv2.2__11State s_temperature2_Kv22.mod - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv2.2__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv2.2__13State s_temperature2_Kv22.mod - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv2.2__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv2.2__4States _temperature2_Kv22.mod - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv2.2__4States _temperature2_test_model .hoc - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv2.2__6States _temperature2_Kv22.mod - hbp-00009_Kv2.2/
hbp-00009_Kv2.2__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv2.2__6States _temperature2_test_model .hoc - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv3.1__11State s_temperature2_Kv31.mod - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv3.1__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv3.1__13State s_temperature2_Kv31.mod - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv3.1__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv3.1__4States _temperature2_Kv31.mod - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv3.1__4States _temperature2_test_model .hoc - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv3.1__6States _temperature2_Kv31.mod - hbp-00009_Kv3.1/
hbp-00009_Kv3.1__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv3.1__6States _temperature2_test_model .hoc - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__11State , NEURON, 79 liness/ hbp-00009_Kv3.2__11State s_Kv32.mod - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__11State , NEURON, 49 liness/ hbp-00009_Kv3.2__11State s_test_model.hoc - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__13State , NEURON, 90 liness/ hbp-00009_Kv3.2__13State s_Kv32.mod - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__13State , NEURON, 49 liness/ hbp-00009_Kv3.2__13State s_test_model.hoc - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__4States , NEURON, 63 lines/ hbp-00009_Kv3.2__4States _Kv32.mod - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__4States , NEURON, 49 lines/ hbp-00009_Kv3.2__4States _test_model.hoc - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__6States , NEURON, 72 lines/ hbp-00009_Kv3.2__6States _Kv32.mod - hbp-00009_Kv3.2/
hbp-00009_Kv3.2__6States , NEURON, 49 lines/ hbp-00009_Kv3.2__6States _test_model.hoc - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__11State , NEURON, 79 liness/ hbp-00009_Kv3.3__11State s_Kv33.mod - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__11State , NEURON, 49 liness/ hbp-00009_Kv3.3__11State s_test_model.hoc - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__13State , NEURON, 90 liness/ hbp-00009_Kv3.3__13State s_Kv33.mod - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__13State , NEURON, 49 liness/ hbp-00009_Kv3.3__13State s_test_model.hoc - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__4States , NEURON, 63 lines/ hbp-00009_Kv3.3__4States _Kv33.mod - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__4States , NEURON, 49 lines/ hbp-00009_Kv3.3__4States _test_model.hoc - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__6States , NEURON, 72 lines/ hbp-00009_Kv3.3__6States _Kv33.mod - hbp-00009_Kv3.3/
hbp-00009_Kv3.3__6States , NEURON, 49 lines/ hbp-00009_Kv3.3__6States _test_model.hoc - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__11State , NEURON, 79 liness/ hbp-00009_Kv3.4__11State s_Kv34.mod - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__11State , NEURON, 49 liness/ hbp-00009_Kv3.4__11State s_test_model.hoc - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__13State , NEURON, 90 liness/ hbp-00009_Kv3.4__13State s_Kv34.mod - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__13State , NEURON, 49 liness/ hbp-00009_Kv3.4__13State s_test_model.hoc - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__4States , NEURON, 63 lines/ hbp-00009_Kv3.4__4States _Kv34.mod - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__4States , NEURON, 49 lines/ hbp-00009_Kv3.4__4States _test_model.hoc - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__6States , NEURON, 72 lines/ hbp-00009_Kv3.4__6States _Kv34.mod - hbp-00009_Kv3.4/
hbp-00009_Kv3.4__6States , NEURON, 49 lines/ hbp-00009_Kv3.4__6States _test_model.hoc - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__11State , NEURON, 79 liness/ hbp-00009_Kv4.1__11State s_Kv41.mod - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__11State , NEURON, 49 liness/ hbp-00009_Kv4.1__11State s_test_model.hoc - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__13State , NEURON, 90 liness/ hbp-00009_Kv4.1__13State s_Kv41.mod - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__13State , NEURON, 49 liness/ hbp-00009_Kv4.1__13State s_test_model.hoc - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__4States , NEURON, 63 lines/ hbp-00009_Kv4.1__4States _Kv41.mod - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__4States , NEURON, 49 lines/ hbp-00009_Kv4.1__4States _test_model.hoc - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__6States , NEURON, 72 lines/ hbp-00009_Kv4.1__6States _Kv41.mod - hbp-00009_Kv4.1/
hbp-00009_Kv4.1__6States , NEURON, 49 lines/ hbp-00009_Kv4.1__6States _test_model.hoc - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__11State , NEURON, 79 liness/ hbp-00009_Kv4.2__11State s_Kv42.mod - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__11State , NEURON, 49 liness/ hbp-00009_Kv4.2__11State s_test_model.hoc - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__13State , NEURON, 90 liness/ hbp-00009_Kv4.2__13State s_Kv42.mod - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__13State , NEURON, 49 liness/ hbp-00009_Kv4.2__13State s_test_model.hoc - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__4States , NEURON, 63 lines/ hbp-00009_Kv4.2__4States _Kv42.mod - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__4States , NEURON, 49 lines/ hbp-00009_Kv4.2__4States _test_model.hoc - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__6States , NEURON, 72 lines/ hbp-00009_Kv4.2__6States _Kv42.mod - hbp-00009_Kv4.2/
hbp-00009_Kv4.2__6States , NEURON, 49 lines/ hbp-00009_Kv4.2__6States _test_model.hoc - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__11State , NEURON, 79 liness/ hbp-00009_Kv4.3__11State s_Kv43.mod - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__11State , NEURON, 49 liness/ hbp-00009_Kv4.3__11State s_test_model.hoc - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__13State , NEURON, 90 liness/ hbp-00009_Kv4.3__13State s_Kv43.mod - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__13State , NEURON, 49 liness/ hbp-00009_Kv4.3__13State s_test_model.hoc - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__4States , NEURON, 63 lines/ hbp-00009_Kv4.3__4States _Kv43.mod - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__4States , NEURON, 49 lines/ hbp-00009_Kv4.3__4States _test_model.hoc - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__6States , NEURON, 72 lines/ hbp-00009_Kv4.3__6States _Kv43.mod - hbp-00009_Kv4.3/
hbp-00009_Kv4.3__6States , NEURON, 49 lines/ hbp-00009_Kv4.3__6States _test_model.hoc - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv6.4__11State s_temperature2_Kv64.mod - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv6.4__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv6.4__13State s_temperature2_Kv64.mod - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv6.4__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv6.4__4States _temperature2_Kv64.mod - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv6.4__4States _temperature2_test_model .hoc - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv6.4__6States _temperature2_Kv64.mod - hbp-00009_Kv6.4/
hbp-00009_Kv6.4__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv6.4__6States _temperature2_test_model .hoc - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__11State , NEURON, 84 liness_temperature2/ hbp-00009_Kv9.1__11State s_temperature2_Kv91.mod - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__11State , NEURON, 49 liness_temperature2/ hbp-00009_Kv9.1__11State s_temperature2_test_mode l.hoc - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__13State , NEURON, 101 liness_temperature2/ hbp-00009_Kv9.1__13State s_temperature2_Kv91.mod - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__13State , NEURON, 49 liness_temperature2/ hbp-00009_Kv9.1__13State s_temperature2_test_mode l.hoc - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__4States , NEURON, 68 lines_temperature2/ hbp-00009_Kv9.1__4States _temperature2_Kv91.mod - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__4States , NEURON, 49 lines_temperature2/ hbp-00009_Kv9.1__4States _temperature2_test_model .hoc - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__6States , NEURON, 83 lines_temperature2/ hbp-00009_Kv9.1__6States _temperature2_Kv91.mod - hbp-00009_Kv9.1/
hbp-00009_Kv9.1__6States , NEURON, 49 lines_temperature2/ hbp-00009_Kv9.1__6States _temperature2_test_model .hoc - rename.py, Python, 57 lines
- README.md, Text, 27 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 4 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 206 scripts, each with its path and the digest of its content;
- 6 matches between paragraphs of the paper and lines of the code (method lexical-v1);
- neither the text of the paper nor the code itself.
Its JSON (tracing-map.json) is deposited on Zenodo with its DOI once the map is validated.
Data
No dataset and no data link were found in the paper.
Data Availability
All of the data is freely publicly available at https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 30 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 4 authors, 11 MeSH terms, 1 funder, 49 references.
Cite
This paper
Linkevicius, D., Chadwick, A., Stefan, M. I., & Sterratt, D. C. (2026). One model to rule them all: Unification of voltage-gated potassium channel models via deep non-linear mixed effects modelling. PLoS computational biology, 22(4), e1013078. https://
BibTeX
@article{linkevicius2026
author = {Linkevicius, Domas and Chadwick, Angus and Stefan, Melanie I. and Sterratt, David C.},
title = {{One model to rule them all: Unification of voltage-gated potassium channel models via deep non-linear mixed effects modelling}},
journal = {PLoS computational biology},
year = {2026},
month = apr,
volume = {22},
number = {4},
pages = {e1013078},
publisher = {PLOS},
issn = {1553-734X},
doi = {10.1371/
url = {https://
pmid = {42044162},
pmcid = {PMC13143182}
}
RIS
TY - JOUR
AU - Linkevicius, Domas
AU - Chadwick, Angus
AU - Stefan, Melanie I.
AU - Sterratt, David C.
TI - One model to rule them all: Unification of voltage-gated potassium channel models via deep non-linear mixed effects modelling
T2 - PLoS computational biology
J2 - PLoS Comput Biol
PY - 2026
DA - 2026/
VL - 22
IS - 4
SP - e1013078
SN - 1553-734X
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "One model to rule them all: Unification of voltage-gated potassium channel models via deep non-linear mixed effects modelling",
"container-title": "PLoS computational biology",
"author": [
{
"family": "Linkevicius",
"given": "Domas"
},
{
"family": "Chadwick",
"given": "Angus"
},
{
"family": "Stefan",
"given": "Melanie I."
},
{
"family": "Sterratt",
"given": "David C."
}
],
"container-title-short":
"volume": "22",
"issue": "4",
"page": "e1013078",
"DOI": "10.1371/
"PMID": "42044162",
"PMCID": "PMC13143182",
"ISSN": "1553-734X",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
4,
27
]
]
}
}
The tracing map gets a citation of its own once an author has validated it and it has a DOI.
Similar papers
The papers with a page that share the most with this one: the tools found in their code, their categories, datasets, cited references and authors, the rarest counting most.
- [1] doi:10.1038/s41540-026-00749-5 [code]
- A novel approach to quantify out-of-distribution uncertainty in Neural and Universal Differential Equations.Journal: NPJ systems biology and applicationsIn common: Makie, DataFrames.jl, Distributions.jl, 1 reference
- [2] doi:10.1038/s41593-026-02342-9 [code]
- Interpretable abstractions of artificial neural networks predict behavior and neural activity during human information gathering.Journal: Nature neuroscienceIn common: Makie, DataFrames.jl, Distributions.jl
- [3] doi:10.1371/journal.ppat.1014263 [code]
- PrP turnover in vivo and the time to effect of prion disease therapeutics.Journal: PLoS pathogensIn common: Makie, DataFrames.jl, Distributions.jl
- [4] doi:10.1371/journal.pcbi.1014156 [code]
- Art's hidden topology: A window into human perception.Journal: PLoS computational biologyIn common: Makie, DataFrames.jl, Distributions.jl
- [5] doi:10.7554/elife.89629 [code]
- Active dendrites enable robust spiking computations despite timing jitter.Journal: eLifeIn common: Makie, Distributions.jl, NEURON
- [6] doi:10.1371/journal.pcbi.1014222 [code]
- Neural population models for EEG: From Canonical models to alternative model structures.Journal: PLoS computational biologyIn common: DataFrames.jl, Distributions.jl, 1 reference
- [7] doi:10.1093/pnasnexus/pgag213 [code]
- Two-factor synaptic plasticity enables memory consolidation during neuronal burst firing.Journal: PNAS nexusIn common: DataFrames.jl, Distributions.jl, cellular / molecular, 1 reference
- [8] doi:10.1038/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: DataFrames.jl, Distributions.jl, cellular / molecular
- [9] doi:10.1038/s41586-026-10629-x [code]
- Whole-genome duplication shaped cell-type evolution in the vertebrate brain.Journal: NatureIn common: DataFrames.jl, Distributions.jl, cellular / molecular
- [10] doi:10.1093/bioinformatics/btag328 [code]
- eFEL: electrophysiology feature extraction library.Journal: Bioinformatics (Oxford, England)In common: NEURON, 2 references
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
Claim this paper
Correct its record
Say what each link of this record is, remove the ones that are not the paper's, add the ones that are missing. The correction becomes a new version of the record, in its Versions section.
Validate its tracing map
You validate the map as this page shows it: 4 repositories of the authors' code, each at its verified commit and with its license, 206 scripts, and 6 matches between paragraphs and code (see the Code and Map sections). It then receives a DOI on Zenodo, with you (your ORCID iD) and OSCR as its creators; the code itself is not deposited.
The map's fingerprint: sha256:f554389ce92d3c92…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
