Protein trafficking and synaptic demand configure complex and dynamic synaptome architectures of individual neurons.
The 6 matches · 2 of them tie a paragraph to a whole file, not to given lines: weak matches, whose lines are not tinted
- [1] § Methods › Simulation and parameter optimisation ↔ simulation/CA1_3dv_identifiability_PSO_GA.py, lines 314–380 · score 0.61 · global optimum, Nelder Mead, PSO, GA, Simulation
- [2] § Methods › Simulation and parameter optimisation ↔ simulation/CA1_identifiability_PSO_GA.py, lines 315–410 · score 0.61 · global optimum, Nelder Mead, PSO, GA, Simulation
- [3] § Methods › Simulation and parameter optimisation ↔ Eddie/runDGIdentifiability.sh, the whole file · a weak match · score 0.60 · GB memory, runtime limit, python
- [4] § Methods › Simulation and parameter optimisation ↔ Eddie/runDG_Identifiability_10.sh, the whole file · a weak match · score 0.60 · GB memory, runtime limit, python
- [5] § Results › Spatiotemporal distribution of PSD95 is tuned by local transport ↔ simulation/CA1_20reg_1dv_3w_2par_PSO_GA.py, lines 234–292 · score 0.58 · CA1slm, CA1so, CA1sr, fit, degradation, simulation
- [6] § Results › Spatiotemporal distribution of PSD95 is tuned by local transport ↔ simulation/CA1_20reg_1dv_3w_3par_PSO_GA.py, lines 234–292 · score 0.58 · CA1slm, CA1so, CA1sr, fit, degradation, simulation
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
Python · 406 lines · 14 KB · CC-BY-4.0 · 1 match
- # If in Jupyter or within ipython run both following lines
- # If in the terminal run nrnivmodl to load Neuron engine
- # %%bash
- # nrnivmodl
- from neuron import h
- import numpy as np
- import matplotlib.pyplot as plt
- import math
- import scipy.linalg
- from PyNeuronToolbox.record import ez_record,ez_convert
- from PyNeuronToolbox.morphology import dist_between,allsec_preorder
- #np.random.seed(123456789)
- import logging
- FORMAT = '%(asctime)s :: %(levelname)s :: %(message)s'
- logging.basicConfig(format=FORMAT,level=logging.INFO)
- log = logging.getLogger("GA-logger")
- # Load morphology and other stuff
- # --> SegLists: soma[2], dend[74], dend_5[37], apic[42], axon[1]
- # --> Files from Migliore & Migliore (2012)
- # --> CA1 pyramidal neuron
- h.load_file('stdrun.hoc')
- h.xopen('ri06.hoc')
- h.xopen('fixnseg.hoc')
- h.xopen('5a_nogui.hoc')
- h.tstop = 700.0
- from sko.GA import RCGA
- from sko.PSO import PSO
- from scipy.optimize import minimize, Bounds
- import pandas as pd
- import sushibelt
- import time
- def sushi_system(a, b, c, d, l):
- """
- Returns a matrix A, such that dx/dt = A*x
- N = # of compartments
- A is (2N x 2N) matrix
- x is (2N x 1) vector.
- The first N elements correspond to concentrations of u (molecules in transit)
- The second half correspond to concentrations of u-star (active molecules)
- The trafficking rate constants along the microtubules are given by the vectors "a" and "b"
- The rate constants for u turning into u* is given by the vector "c"
- The rate constants for u* turning into u is given by the vector "d"
- The rate constants for the degradation of u* is given by the vector "l"
- """
- # number of compartments
- N = len(l)
- ## State-space equations
- # dx/dt = Ax + Bu
- A = np.zeros((2 * N, 2 * N))
- # Trafficking along belt
- # Iterative traversal of dendritic tree in pre-order
- i = 0
- section = None
- parentStack = [(None, h.soma[0])]
- while len(parentStack) > 0:
- # Get next section to traverse
- # --> p is parent index, section is h.Section object
- (p, section) = parentStack.pop()
- # Trafficking to/from parent
- if p is not None:
- # Out of parent, into child
- ai = a.pop()
- A[p, p] += -ai
- A[i, p] += ai
- # Into parent, out of child
- bi = b.pop()
- A[p, i] += bi
- A[i, i] += -bi
- # visit all segments in compartment
- for (j, seg) in enumerate(section):
- # Deal with out/into rates within compartment, just tridiag matrix
- if j > 0:
- # Out of parent, into child
- ai = a.pop()
- A[i - 1, i - 1] += -ai
- A[i, i - 1] += ai
- # Into parent, out of child
- bi = b.pop()
- A[i - 1, i] += bi
- A[i, i] += -bi
- # move onto next compartment
- i += 1
- # now visit children in pre-order
- child_list = list(h.SectionRef(sec=section).child)
- if child_list is not None:
- child_list.reverse()
- for c_sec in child_list:
- parentStack.append([i - 1, c_sec]) # append parent index and child
- # Trafficking off the belt
- for i in range(N):
- A[i, i] += -c[i]
- A[i + N, i] += c[i]
- # Reattachment to belt
- # for i in range(N):
- # # reattachment
- # A[i, i + N] += d[i]
- # A[i + N, i + N] += -d[i]
- # Degradation after being taken off the belt
- for i in range(N):
- A[i + N, i + N] = -l[i]
- return A
- def trafficking_solution(utarg):
- """ Solve the problem by tuning trafficking rates, like Figs 1 and 2. """
- x = []
- # Iterative traversal of dendritic tree in pre-order
- i = 0
- section = None
- parentStack = [(None, h.soma[0])]
- while len(parentStack) > 0:
- # Get next section to traverse
- # --> p is parent index, section is h.Section object
- (p, section) = parentStack.pop()
- # Trafficking to/from parent
- if p is not None:
- mp = utarg[p] # concentration in parent
- mc = utarg[i] # concentration in child
- x.insert(0, mp / mc)
- # visit all segments in compartment
- for (j, seg) in enumerate(section):
- # Deal with out/into rates within compartment, just tridiag matrix
- if j > 0:
- mp = utarg[i - 1]
- mc = utarg[i]
- x.insert(0, mp / mc)
- # move onto next compartment
- i += 1
- # now visit children in pre-order
- child_list = list(h.SectionRef(sec=section).child)
- if child_list is not None:
- child_list.reverse()
- for c_sec in child_list:
- parentStack.append([i - 1, c_sec]) # append parent index and child
- # return calculated guesses (flip, up/down since get_deriv pops from start)
- return np.array(x)
- def get_sys_matrix(utarg, F=0.5, Ctau=1e-3, dscale=0.1, dv=1e-7):
- # F is a mixing factor between 0 and 1
- K = np.sum(utarg) / N
- x = trafficking_solution(F * utarg + (1 - F) * K)
- a = (1 / (1 + x))
- a = list(a)
- b = list((1 / (1 + x ** -1)))
- l = list(np.ones(N) * dv)
- c = list(Ctau * utarg / (F * utarg + (1 - F) * K))
- d = list([ci * dscale for ci in c])
- A = sushi_system(a, b, c, d, l)
- return A
- def solve_u(u0,w,V,Vinv,t):
- D = np.diag(np.exp(w*t)) # diagonal matrix exponential
- PHI = np.real(V.dot(D.dot(Vinv))) # state transition matrix
- return PHI.dot(u0) # calculate u(t)
- def sim_time(A,u0,time,nframes=10):
- # Run a simulation (log time)
- # --> this is a linear system; thus, matrix exponential provides exact solution
- utrace = [u0]
- w,V = scipy.linalg.eig(A)
- Vinv = np.linalg.inv(V)
- t = np.logspace(-0.5,math.log10(time),nframes)
- for t_ in t: utrace.append(solve_u(u0,w,V,Vinv,t_))
- return np.array(utrace).T
- bgSignal = 1e-5
- def calcUtrace(par,delta=bgSignal):
- F = par[0]
- Ctau = 10 ** par[1]
- mProp = par[2]
- dv = np.zeros(N)
- utarg = delta*np.ones(N)
- for k in range(N):
- if itarg[k] > 2:
- dv[k] = 10 ** par[itarg[k]]
- utarg[k] = par[itarg[k]+3]
- utarg /= np.sum(utarg)
- K = np.sum(utarg) / N
- x = trafficking_solution(F * utarg + (1 - F) * K)
- a = (1 / (1 + x))
- a = list(a)
- b = list((1 / (1 + x ** -1)))
- l = list(dv)
- c = list(Ctau * utarg / (F * utarg + (1 - F) * K))
- d = list(np.zeros(N))
- A = sushi_system(a, b, c, d, l)
- u0 = np.concatenate((mProp * dinit, (1 - mProp) * dinit))
- utrace = sim_time(A, u0, day7)
- return utrace
- log.info("function defined")
- ##### Read data ######
- #seglist in pre-order
- sec_list = allsec_preorder(h)
- seg_list = []
- for sec in sec_list:
- locs = np.linspace(0,1,sec.nseg+2)[1:-1]
- for loc in locs:
- seg_list.append(sec(loc))
- N = len(seg_list)
- tdf=pd.read_csv('../data/seg_mapping.csv')
- abbCA1=tdf['abb']
- abbT={}
- segIdx={}
- for i in range(N):
- abbT[abbCA1[i]] = 1+ abbT.get(abbCA1[i],0)
- ll=segIdx.get(abbCA1[i],[])
- ll.append(i)
- segIdx[abbCA1[i]] = ll
- expD=pd.read_csv('../data/CA1_gradient.csv')
- subreg = ['CA1so', 'CA1sr', 'CA1slm']
- cname0='D0M3'
- d0w = -1 * np.ones(N)
- for i in range(expD.shape[0]):
- abb = expD['Abbreviation'][i]
- sidx= segIdx[abb]
- d0w[sidx] *= -1*expD[f"{cname0}_MEAN"][i]/len(sidx)
- for i in range(N):
- if d0w[i]<0:
- d0w[i] = bgSignal
- dinit = d0w/np.sum(d0w)
- cname7='D7M3'
- d7w = -1*np.ones(N)
- for i in range(expD.shape[0]):
- abb = expD['Abbreviation'][i]
- sidx= segIdx[abb]
- d7w[sidx] *= -1 * expD[f"{cname7}_MEAN"][i]/len(sidx)
- for i in range(N):
- if d7w[i]<0:
- d7w[i] = bgSignal
- target = np.array(expD[f"{cname7}_MEAN"])/np.sum(expD[f"{cname0}_MEAN"]) #norm target to Day0 sum to take into accound degradation
- targSD = np.array(expD[f"{cname7}_SD"])/np.sum(expD[f"{cname0}_MEAN"]) #measurement errors
- tnorm = np.sum(target ** 2)
- day7 = 7 * 24 * 3600 # final time point
- itarg = np.ones(N, dtype=int)
- for i in range(expD.shape[0]):
- abb = expD['Abbreviation'][i]
- sidx = segIdx[abb]
- itarg[sidx] *= [j + 3 for j in range(len(subreg)) if subreg[j] == expD['Subregion'][i]][0]
- log.info("data read")
- cfiCounter = 0
- cfCounter = 0
- dumpCSV = True
- def costFunction(par):
- initTime = time.time()
- global cfCounter, dumpCSV
- cfCounter += 1
- log.info(f'Cost function starts: {cfCounter}')
- log.info(f'{par}')
- mProp = par[2]
- utrace = calcUtrace(par)
- resM, resF = sushibelt.aggregate_segments(utrace[:, -1], segIdx, expD['Abbreviation'], fun=np.sum)
- cost=np.sum(((resF/(1-mProp) - target)/targSD) ** 2)
- FinalTime = time.time() - initTime
- if dumpCSV:
- best_line = np.append(cfCounter, par)
- best_line = np.append(best_line, cost)
- df = pd.DataFrame(best_line).T
- #log.info(f'best df={df}')
- df.to_csv('CA1_3dv_cfi.csv',header=False,mode='a')
- log.info(f'Cost function done: cost={cost}. ({FinalTime})')
- return cost
- lowb=np.array([0, -18, 1e-7, -18, -18, -18, 1e-3, 1e-3, 1e-3])
- upbga=np.array([1, -1, 1-1e-7, 1, 1, 1, 1, 1, 1])
- bnds=Bounds(lb=lowb,ub=upbga)
- parnames=['F','Ctau','mProp','dv_CA1so','dv_CA1sr','dv_CA1slm','demand_CA1so','demand_CA1sr','demand_CA1slm']
- Nvals = 4 #10
- parvals = [1.0 * i/Nvals for i in range(Nvals+1)]
- numPar=len(parnames)
- def prepPar(cpar,pn,pval,pidx,bidx):
- lpar = np.zeros(numPar)
- lpar[pidx] = pval
- for j in range(numPar - 1):
- lpar[bidx[j]] = cpar[j]
- return lpar
- def profileChiSq(pn,pv=0,pso_iter=15,nm_iter=100,ga_cycles=200):
- pidx=[i for i in range(numPar) if parnames[i]==pn][0]
- pval=lowb[pidx]+(upbga[pidx]-lowb[pidx])*pv
- bidx= [i for i in range(numPar) if i != pidx]
- log.info(f'ChiSq starts: numPar={numPar}, pn={pn}, pidx={pidx}, pv={pv}, pval={pval}.')
- clowb=lowb[bidx]
- cupbga=upbga[bidx]
- cbnds=Bounds(lb=clowb,ub=cupbga)
- def costFunctionC(cpar):
- global cfiCounter
- cfiCounter += 1
- lpar = prepPar(cpar,pn,pval,pidx,bidx)
- pDF = pd.DataFrame(lpar).T
- pDF.index = [cfiCounter]
- pDF['ParamName'] = pn
- pDF['ParamVal'] = pval
- cost = costFunction(lpar)
- pDF['Cost'] = cost
- pDF.to_csv('CA1_3dv_cf_idnt.csv',header=False,mode='a')
- return cost
- log.info(f'{pn}={pval}, Start PSO')
- # Population size for the PSO should be at least 2*numPar and in ideal situation 5*numPar
- pso = PSO(func=costFunctionC, n_dim=(numPar - 1), pop=2*numPar, max_iter=pso_iter, lb=clowb,
- ub=cupbga, w=0.8, c1=0.5, c2=0.5)
- pso.run()
- log.info(f'{pn}={pval}, best_x is {pso.gbest_x}, best_y is {pso.gbest_y}')
- log.info(f'{pn}={pval}, Run Nelder-Mead on PSO result')
- result = minimize(costFunctionC, pso.gbest_x, method='nelder-mead',bounds=cbnds,options={'maxiter':nm_iter})
- log.info(f'{pn}={pval}, Prepare GA population')
- #use pso.gbest_x and pso.gbest_y to get access to the global optimum found
- psox = pso.pbest_x
- psoy=pso.pbest_y
- idx=np.argsort(psoy.flatten())
- gainit=np.vstack([psox[idx[:(2*(numPar-1)-1)]],result.x])
- #log.info(f'{pn}={pval}, psox: {psox.shape}, idx: {len(idx)}, pop_size={2*(numPar-1)}, gainit: {gainit.shape}')
- log.info(f'{pn}={pval}, GA starts, population dimensions: {gainit.shape}')
- ga = RCGA(func=costFunctionC, n_dim=(numPar-1), size_pop=2*(numPar-1), max_iter=50000, prob_mut=0.01, lb=clowb,
- ub=cupbga)
- ga.Chrom = (gainit-clowb)/(cupbga-clowb)
- bestX=result.x
- bestY=result.fun
- for cnt in range(ga_cycles):
- log.info(f'{pn}={pval}, Continue GA {cnt}')
- best_x, best_y = ga.run(10)
- best_x_p=prepPar(best_x,pn,pval,pidx,bidx)
- log.info(f'GA {pn}={pval} done {cnt}: cfCounter={cfCounter}, best CF={best_y}')
- log.info(f'{pn}={pval}, best par={best_x} ({len(best_x)})')
- best_line = np.append(cnt,best_x_p)
- #log.info(f'{pn}={pval}, best line={best_line} ({len(best_line)})')
- chrom = ga.Chrom
- bpar_dist = np.sum((bestX-ga.best_x) ** 2)
- if bpar_dist > 1e-7 :
- log.info(f'{pn}={pval}, Run Nelder-Mead on the best GA result {cnt}, best par distance = {bpar_dist}')
- result = minimize(costFunctionC, ga.best_x, method='nelder-mead', bounds=cbnds, options={'maxiter': nm_iter})
- chrom[np.argmax(ga.Y), :] = (result.x - clowb) / (cupbga - clowb)
- ga.Chrom=chrom
- bestX = result.x
- bestY = result.fun
- else :
- bestX = ga.best_x
- bestY = best_y
- log.info(f'{pn}={pval}, best par distance = {bpar_dist} and Nelder-Mead run on the best GA result is omitted.')
- log.info(f'GA {pn}={pval} completed {cnt}: cfCounter={cfCounter}, best CF={bestY}')
- return bestX, bestY
- chiCounter = 0
- i = 0
- jval = [1 + k for k in range(Nvals)]
- for pni in parnames :
- for pvj in parvals :
- cfiCounter = 0
- #pni = parnames[i]
- bestX, bestY = profileChiSq(pni,pvj,pso_iter=10,nm_iter=10,ga_cycles=10)
- pidx=[k for k in range(numPar) if parnames[k]==pni][0]
- pval=lowb[pidx]+(upbga[pidx]-lowb[pidx])*pvj
- bidx= [k for k in range(numPar) if k != pidx]
- bestX_p = prepPar(bestX, pni, pval, pidx, bidx)
- log.info(f'GA {pni}={pval} best found: cfCounter={cfCounter}, best CF={bestY}')
- log.info(f'{pni}={pval}, best found: par={bestX_p} ({len(bestX_p)}')
- bestLine = np.append(cfiCounter, bestX_p)
- log.info(f'{pni}={pval}, best found: line={bestLine} ({len(bestLine)})')
- bdf = pd.DataFrame(bestLine).T
- bdf['ParamName'] = pni
- bdf['ParamVal'] = pval
- bdf['Cost'] = bestY
- bdf.index = [chiCounter]
- log.info(f'{pni}={pval}, best found: df={bdf}')
- bdf.to_csv('CA1_3dv_ident.csv', header=False, mode='a')
- chiCounter += 1
CA1_3dv_identifiability_PSO_GA.py at commit 4bfbe08, under CC-BY-4.0 · at the source
Overview
- School of Informatics, Institute for Machine Learning, University of Edinburgh, Edinburgh, EH8 9AB UK
- Genes to Cognition Programme, Centre for Clinical Brain Sciences, University of Edinburgh, Edinburgh, EH16 4SB UK
- Institute of Neuroscience and Cardiovascular Research, University of Edinburgh, Edinburgh, EH16 4SB UK
- Okinawa Institute of Science and Technology, Okinawa, 904-0497 Japan
- Euan MacDonald Centre, University of Edinburgh, Edinburgh, EH16 4SB UK
- Simons Initiative for the Developing Brain (SIDB), Centre for Discovery Brain Sciences, University of Edinburgh, Edinburgh, EH8 9XD UK
- Computational Biomedicine Institute (IAS-5 / INM-9), Forschungszentrum Jülich, Jülich, 52425 Germany
Abstract
Excitatory synapses are the most abundant synapse type in the brain. Being essential for behaviour and implicated in hundreds of brain disorders, these synapses exhibit striking structural and functional diversity. Synaptome mapping at single-synapse resolution reveals that synaptic protein diversity is spatially organised along the dendritic tree of individual neurons and varies with age and cell type. However, the cell biological mechanisms underlying the generation of these complex spatial synaptic patterns remain poorly understood. Potential mechanisms include somatic and dendritic protein synthesis, protein trafficking, and local regulatory mechanisms such as activity-dependent degradation. Here we developed computational models to test how combinations of these processes account for empirical synaptome data. We found that a combination of molecular transport mechanisms and local synaptic demand for proteins was sufficient to explain very complex profiles of synaptic protein distributions observed in young, mature and old mice and in different cell types. Our findings suggest the highly complex and dynamic synaptome architecture of the brain is an emergent property of a minimal set of cell biological processes. Our model sets the stage for simulations of brain tissue incorporating molecularly diverse neuronal and synaptic types in a synaptome and connectome architecture.
Supplementary Information: The online version contains supplementary material available at 10.1038/
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.
oksankas/Sushi_belt_PSD95
4bfbe08ec8528238cc8f4ac7b1c0074714943245, 5 December 2025Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
104 files
- Eddie/
run3M_DG_optimization.sh , Shell, 32 lines - Eddie/
runDGIdentifiability.sh , Shell, 31 lines, 1 match - Eddie/
runDG_Identifiability_10 , Shell, 31 lines, 1 match.sh - Eddie/
runDG_Identifiability_10 , Shell, 16 lines_Mac.sh - Eddie/
runIdentifiability.sh , Shell, 21 lines - Eddie/
runIdentifiability20reg. , Shell, 31 linessh - Eddie/
runIdentifiability20reg_ , Shell, 31 linesmProp.sh - Eddie/
runSobol20reg.sh , Shell, 36 lines - Eddie/
runSushi.sh , Shell, 22 lines - Py_notebooks/
5a_nogui.hoc , NEURON, 228 lines - Py_notebooks/
CA1_20reg_1dv_WhatIf_exp , Jupyter, 690 lineseriment.ipynb - Py_notebooks/
CA1_20reg_1dv_experiment , Jupyter, 1,782 lines.ipynb - Py_notebooks/
CA1_3dv_experiment.ipynb , Jupyter, 642 lines - Py_notebooks/
CA1_geometry.ipynb , Jupyter, 324 lines - Py_notebooks/
DG_10dv.ipynb , Jupyter, 924 lines - Py_notebooks/
DG_10dv_3W.ipynb , Jupyter, 460 lines - Py_notebooks/
DG_1dv_3W.ipynb , Jupyter, 357 lines - Py_notebooks/
DG_1dv_dens.ipynb , Jupyter, 636 lines - Py_notebooks/
DG_1dv_dens_animation.ip , Jupyter, 801 linesynb - Py_notebooks/
DG_intensity_10dv_3W.ipy , Jupyter, 434 linesnb - Py_notebooks/
PrepareCA1_MpropHeatmapD , Jupyter, 164 linesata.ipynb - Py_notebooks/
PrepareDG_density_Heatma , Jupyter, 165 linespData.ipynb - Py_notebooks/
fixnseg.hoc , NEURON, 44 lines - Py_notebooks/
h.mod , NEURON, 102 lines - Py_notebooks/
kadist.mod , NEURON, 107 lines - Py_notebooks/
kaprox.mod , NEURON, 121 lines - Py_notebooks/
kdrca1.mod , NEURON, 91 lines - Py_notebooks/
km.mod , NEURON, 94 lines - Py_notebooks/
na3n.mod , NEURON, 132 lines - Py_notebooks/
naxn.mod , NEURON, 101 lines - Py_notebooks/
ri06.hoc , NEURON, 5,634 lines - simulation/
5a_nogui.hoc , NEURON, 228 lines - simulation/
CA1_20reg_1dv_18m_2par_P , Python, 388 linesSO_GA.py - simulation/
CA1_20reg_1dv_18m_3par_P , Python, 388 linesSO_GA.py - simulation/
CA1_20reg_1dv_18m_PSO_GA , Python, 378 lines.py - simulation/
CA1_20reg_1dv_3w_2par_PS , Python, 375 lines, 1 matchO_GA.py - simulation/
CA1_20reg_1dv_3w_3par_PS , Python, 375 lines, 1 matchO_GA.py - simulation/
CA1_20reg_1dv_3w_PSO_GA. , Python, 377 linespy - simulation/
CA1_20reg_1dv_NM.py , Python, 314 lines - simulation/
CA1_20reg_1dv_PSO_GA.py , Python, 395 lines - simulation/
CA1_20reg_1dv_model.py , Python, 335 lines - simulation/
CA1_20reg_neg_dv_PSO_GA. , Python, 365 linespy - simulation/
CA1_20reg_no_dv_PSO_GA.p , Python, 363 linesy - simulation/
CA1_3dv_PSO_GA.py , Python, 354 lines - simulation/
CA1_3dv_identifiability_ , Python, 406 lines, 1 matchPSO_GA.py - simulation/
CA1_GA.py , Python, 306 lines - simulation/
CA1_GA_restart.py , Python, 329 lines - simulation/
CA1_PSO_GA.py , Python, 372 lines - simulation/
CA1_identifiability_PSO_ , Python, 436 lines, 1 matchGA.py - simulation/
CA1_model.py , Python, 318 lines - simulation/
CA1_not_norm_GA_restart. , Python, 342 linespy - simulation/
CA1_not_norm_PSO_GA.py , Python, 352 lines - simulation/
DG_10reg_10dv_model.py , Python, 332 lines - simulation/
DG_10reg_10dv_model_dvon , Python, 343 linesly.py - simulation/
DG_10reg_1dv_model.py , Python, 331 lines - simulation/
DG_density_10reg_1dv_mod , Python, 337 linesel_dvonly.py - simulation/
DG_intensity_10reg_10dv_ , Python, 332 linesmodel.py - simulation/
DG_intensity_10reg_10dv_ , Python, 345 linesmodel_dvonly.py - simulation/
DG_intensity_10reg_1dv_m , Python, 330 linesodel.py - simulation/
DG_intensity_10reg_1dv_m , Python, 336 linesodel_dvonly.py - simulation/
Identifiability_PSO_GA.p , Python, 109 linesy - simulation/
Identifiability_PSO_GA_r , Python, 138 linesestart.py - simulation/
Identifiability_diffuse. , Python, 124 linespy - simulation/
Optimize_GA_restart.py , Python, 165 lines - simulation/
Optimize_PSO_GA.py , Python, 141 lines - simulation/
Optimize_PSO_GA_restart. , Python, 160 linespy - simulation/
Sample_Sobol.py , Python, 46 lines - simulation/
fixnseg.hoc , NEURON, 44 lines - simulation/
h.mod , NEURON, 102 lines - simulation/
kadist.mod , NEURON, 107 lines - simulation/
kaprox.mod , NEURON, 121 lines - simulation/
kdrca1.mod , NEURON, 91 lines - simulation/
km.mod , NEURON, 94 lines - simulation/
na3n.mod , NEURON, 132 lines - simulation/
naxn.mod , NEURON, 101 lines - simulation/
ri06.hoc , NEURON, 5,634 lines - simulation/
run18M_DG_10dv_optimizat , Python, 64 linesion.py - simulation/
run18M_DG_10dvonly_optim , Python, 34 linesization.py - simulation/
run18M_DG_density_1dv_dv , Python, 36 linesonly_optimization.py - simulation/
run18M_DG_intensity_10dv , Python, 34 linesonly_optimization.py - simulation/
run18M_DG_intensity_1dv_ , Python, 35 linesdvonly_optimization.py - simulation/
run3M_DG_10dv_optimizati , Python, 34 lineson.py - simulation/
run3M_DG_Identifiability , Python, 79 lines.py - simulation/
run3M_DG_optimization.py , Python, 35 lines - simulation/
run3M_DG_optimization_re , Python, 37 linesstart.py - simulation/
run3M_intensity_DG_10dv_ , Python, 34 linesoptimization.py - simulation/
run3W_CA1_Identifiabilit , Python, 88 linesy.py - simulation/
run3W_CA1_optimization.p , Python, 51 linesy - simulation/
run3W_CA1_sampling.py , Python, 31 lines - simulation/
run3W_DG_10dv_optimizati , Python, 64 lineson.py - simulation/
run3W_DG_10dvonlf_optimi , Python, 54 lineszation.py - simulation/
run3W_DG_density_1dv_dvo , Python, 54 linesnly_optimization.py - simulation/
run3W_DG_intensity_10dvo , Python, 54 linesnlf_optimization.py - simulation/
run3W_DG_intensity_1dv_d , Python, 55 linesvonly_optimization.py - simulation/
runCA1_20reg_1dv_3M_Iden , Python, 77 linestifiability.py - simulation/
runCA1_20reg_1dv_3M_Iden , Python, 70 linestifiability_mProp.py - simulation/
runCA1_20reg_1dv_3M_Sobo , Python, 35 linesl.py - simulation/
runCA1_20reg_1dv_3M_diff , Python, 51 lines_Identifiability_mProp.p y - simulation/
runDG_Identifiability_10 , Python, 78 linesdv.py - simulation/
runGA.py , Python, 49 lines - simulation/
runSushi.py , Python, 60 lines - sushibelt/
__init__.py , Python, 4 lines - sushibelt/
sushi.py , Python, 587 lines - README.md, Text, 74 lines
digitalresearchservices.ed.ac.uk/resources/eddie
Availability: 1 check, the latest on 30 September 2026: the link answers (HTTP 200)
- 30 September 2026: the link answers (HTTP 200)
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:
- 2 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 103 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 research code is available on a GitHub repository (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, 5 authors, 8 keywords, 9 MeSH terms, 2 funders, 28 references.
Cite
This paper
Sorokina, O., Bulovaite, E., Sorokin, A., Grant, S. G. N., & Armstrong, J. D. (2026). Protein trafficking and synaptic demand configure complex and dynamic synaptome architectures of individual neurons. Scientific reports, 16(1), 11541. https://
BibTeX
@article{sorokina2026pro
author = {Sorokina, Oksana and Bulovaite, Edita and Sorokin, Anatoly and Grant, Seth G N and Armstrong, J Douglas},
title = {{Protein trafficking and synaptic demand configure complex and dynamic synaptome architectures of individual neurons}},
journal = {Scientific reports},
year = {2026},
month = mar,
volume = {16},
number = {1},
pages = {11541},
publisher = {Nature Publishing Group},
issn = {2045-2322},
doi = {10.1038/
url = {https://
pmid = {41771946},
pmcid = {PMC13057022}
}
RIS
TY - JOUR
AU - Sorokina, Oksana
AU - Bulovaite, Edita
AU - Sorokin, Anatoly
AU - Grant, Seth G N
AU - Armstrong, J Douglas
TI - Protein trafficking and synaptic demand configure complex and dynamic synaptome architectures of individual neurons
T2 - Scientific reports
J2 - Sci Rep
PY - 2026
DA - 2026/
VL - 16
IS - 1
SP - 11541
SN - 2045-2322
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "Protein trafficking and synaptic demand configure complex and dynamic synaptome architectures of individual neurons",
"container-title": "Scientific reports",
"author": [
{
"family": "Sorokina",
"given": "Oksana"
},
{
"family": "Bulovaite",
"given": "Edita"
},
{
"family": "Sorokin",
"given": "Anatoly"
},
{
"family": "Grant",
"given": "Seth G N"
},
{
"family": "Armstrong",
"given": "J Douglas"
}
],
"container-title-short":
"volume": "16",
"issue": "1",
"page": "11541",
"DOI": "10.1038/
"PMID": "41771946",
"PMCID": "PMC13057022",
"ISSN": "2045-2322",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
2
]
]
}
}
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.1371/journal.pcbi.1014571 [code]
- SynAPSeg: A novel dataset and image analysis framework for deep learning-based synapse detection and quantification.Journal: PLoS computational biologyIn common: pandas, SciPy, Matplotlib, 1 other tool, 3 references
- [2] doi:10.1016/j.celrep.2026.117793 [code]
- Clustered inputs engage dendritic nonlinearities and calcium signaling to support efficient place-field formation in CA1 pyramidal neurons.Journal: Cell reportsIn common: NEURON, pandas, SciPy, 2 other tools, computational modeling (no new data), cellular / molecular
- [3] doi:10.3389/fncom.2026.1771884 [code]
- NEURONpyxl: fast, flexible, Python-integrated simulation of biophysical neural networks with complex plastic synapses.Journal: Frontiers in computational neuroscienceIn common: NEURON, pandas, SciPy, 2 other tools, computational modeling (no new data)
- [4] doi:10.1063/5.0308450 [code]
- Computational modeling of human vagus nerve stimulation with three-dimensional fascicular morphology.Journal: APL bioengineeringIn common: NEURON, pandas, SciPy, 2 other tools, computational modeling (no new data)
- [5] doi:10.1126/sciadv.aec4911 [code]
- Dendritic shaft constrictions shape synaptic integration in neurons.Journal: Science advancesIn common: NEURON, pandas, SciPy, 2 other tools, mouse, cellular / molecular
- [6] doi:10.1126/sciadv.aec3961 [code]
- Linking functional and structural dendritic spine remodeling during fear learning and extinction in vivo.Journal: Science advancesIn common: NEURON, pandas, SciPy, 2 other tools, mouse
- [7] doi:10.1073/pnas.2533168123 [code]
- Dendritic morphology and synaptic nonlinearities enhance functional complexity in human cortical neurons.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: NEURON, pandas, SciPy, 2 other tools, cellular / molecular
- [8] doi:10.1016/j.isci.2026.115488 [code]
- An integrated &
lt;i& gt;i& lt;/ i& gt; & lt;i& gt;n vitro& lt;/ i& gt; platform and biophysical modeling approach for studying synaptic transmission in isolated neuronal pairs. Journal: iScienceIn common: NEURON, pandas, SciPy, 2 other tools, cellular / molecular - [9] doi: [code]
- Going deeper with morphologically detailed neural networks by simulation-based gradient propagationJournal: Frontiers in computational neuroscienceIn common: NEURON, SciPy, Matplotlib, 1 other tool, computational modeling (no new data)
- [10] doi:10.1371/journal.pcbi.1014283 [code]
- Spatial richness of neural magnetic fields.Journal: PLoS computational biologyIn common: NEURON, SciPy, Matplotlib, 1 other tool, computational modeling (no new data)
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: 2 repositories of the authors' code, each at its verified commit and with its license, 103 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:bd55a384385e60db…
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.
