OSCR

Automated ROI detection allows rapid quantification of synaptic activity across tens of thousands of synapses in cell culture.

A correction to this paper has been published: the notice, 42549241, from Europe PMC.

Code ↔ Paper

9 matches between paragraphs of the paper and lines of its authors' code, computed by the harvester (lexical-v1). Click a colored paragraph or line to see its counterpart.

The 9 matches
  1. [1] § Methods › Signal extraction and normalization ↔ src/analyze_suite2p/detector_utility.py, lines 14–76 · score 0.87 · rolling median, Suite2p ROI detection, airPLS, fluorescence compared, raw fluorescence, baseline correction
  2. [2] § Methods › Baseline and calcium transient detection ↔ src/analyze_suite2p/detector_utility.py, lines 207–299 · score 0.78 · baseline fluorescence, peak detection, find peaks, detect peaks, stamps, prominence
  3. [3] § Results ↔ src/analyze_suite2p/detector_utility.py, lines 14–76 · score 0.70 · airPLS, raw fluorescence, standard deviations, baseline corrected, suite2p, mask
  4. [4] § Methods › Normalizing active synapses to neurite coverage ↔ src/analyze_suite2p/export_cellprofiler_skeletons.py, lines 66–141 · score 0.69 · Neurite coverage, CellProfiler, Normalized synapses, skeletonized, exported, Threshold
  5. [5] § Methods › Baseline and calcium transient detection ↔ src/analyze_suite2p/plotting_utility.py, lines 19–53 · score 0.67 · peak detection, find peaks, standard deviations, prominence, width, stamps
  6. [6] § Results › Chronic memantine treatment reduces synaptic calcium transient amplitude ↔ R_analysis/glmm_effect_functions.R, lines 407–489 · score 0.66 · 3–102, 7–124, 8–218, synaptic event, MGO, Forest
  7. [7] § Results › Synaptic calcium imaging detects differential effects of patient-derived NMDAR autoantibodies ↔ R_analysis/glmm_effect_functions.R, lines 407–489 · score 0.60 · 3–102, 7–124, 8–218, MGO, model, NMDAR
  8. [8] § Methods › Statistical analysis ↔ R_analysis/glmm_effect_functions.R, lines 97–182 · score 0.58 · glmmTMB, Gamma, GLMMs, log, fit, models
  9. [9] § Results ↔ src/analyze_suite2p/export_cellprofiler_skeletons.py, lines 66–141 · score 0.56 · Thresholded neurites, CellProfiler, normalizing synapse, Skeletonized, suite2p, dendritic

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 · 436 lines · 17 KB · GPL-3.0 · 3 matches

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from scipy.signal import find_peaks
  4. import pandas as pd
  5. import scipy.signal as signal
  6. from scipy.stats import norm
  7. from analyze_suite2p import config_loader
  8. from BaselineRemoval import BaselineRemoval
  9. import os
  10. _DEFAULT_CONFIG = config_loader.load_json_config_file()
  11. config = _DEFAULT_CONFIG
  12. def calculate_deltaF(F_file, config, event_threshold = None, lambda_window = None):
  13. """
  14. Convert raw fluorescence (F.npy) into change in fluorescence compared to baseline (dF / F0).
  15. Args:
  16. -----------
  17. F_file : str
  18. Path to NumPy array containing raw flourescence (F.npy) trace from suite2p.
  19. config : SimpleNameSpace dictionary
  20. loaded automatically from config_loader.load_json_config_file(file = None)
  21. event_threshold : float, optional
  22. Threshold (in MAD units) to mask obvious events by multiplying threshold by standard deviation.
  23. The Default value is 2; smaller values will limit the number of baseline points used for correction.
  24. lambda_window :
  25. airPLS lambda value, smaller numbers result in more smoothing, a value of 10 or 100
  26. is recommended to start with
  27. Number of frames to subsample for rolling median calculation
  28. Returns:
  29. --------
  30. deltaF : 1D numpy array
  31. dF/F0 normalized fluorescence
  32. MAD baseline estimated
  33. ZhangFit / airPLS automated baseline correction
  34. deltaF is saved into the suite2p output folder generated from suite2p ROI detection.
  35. """
  36. savepath = rf"{F_file}".replace("\\F.npy","") ## make savepath original folder, indicates where deltaF.npy is saved
  37. F = np.load(rf"{F_file}", allow_pickle=True)
  38. Fneu = np.load(rf"{F_file[:-4]}"+"neu.npy", allow_pickle=True)
  39. deltaF= []
  40. if event_threshold is None:
  41. event_threshold = config.analysis_params.MAD_baseline_filter_threshold
  42. if lambda_window is None:
  43. lambda_window = config.analysis_params.lambda_window
  44. for f, fneu in zip(F, Fneu):
  45. corrected_trace = f - (0.7*fneu) ## neuropil correction
  46. #Remove bleaching to generate change in Fluorescence
  47. baseline_corrected = BaselineRemoval(corrected_trace)
  48. airPLS_corrected = baseline_corrected.ZhangFit(lambda_= lambda_window)
  49. #Determine baseline F0 value
  50. trace_median = np.median(corrected_trace)
  51. trace_mad = np.median(np.abs(corrected_trace - trace_median))
  52. norm_sigma = 1.4826*trace_mad
  53. baseline_mask = np.abs(corrected_trace - trace_median) < event_threshold * norm_sigma
  54. F0 = np.median(corrected_trace[baseline_mask])
  55. #calculate dF / F0
  56. normalized_F = (airPLS_corrected)/F0
  57. deltaF.append(normalized_F)
  58. deltaF = np.array(deltaF)
  59. deltaF = np.squeeze(deltaF)
  60. if not os.path.exists(f"{savepath}/deltaF.npy"):
  61. np.save(f"{savepath}/deltaF.npy", deltaF, allow_pickle=True)
  62. print(f"delta F traces saved as deltaF.npy under {savepath}\n")
  63. else:
  64. print(f"deltaF files already exist for {F_file[len(config.general_settings.main_folder)+1:-21]}")
  65. return deltaF
  66. def rolling_correction_deltaF(F_file, config, event_threshold = None, lambda_window = None):
  67. """
  68. Convert raw fluorescence (F.npy) into change in fluorescence compared to baseline (dF / F0)
  69. using rolling median baseline correction.
  70. Args:
  71. -----------
  72. F_file : str
  73. Path to NumPy array containing raw flourescence (F.npy) trace from suite2p.
  74. config : SimpleNameSpace dictionary
  75. loaded automatically from config_loader.load_json_config_file(file = None)
  76. event_threshold : float, optional
  77. Number of standard deviations above MAD to se peak filtering; default is 2
  78. lambda_window : int, optional
  79. Number of frames to subsample for rolling median calculation
  80. Returns:
  81. --------
  82. deltaF : 1D numpy array
  83. dF/F0 normalized fluorescence
  84. MAD baseline estimated
  85. rolling median automated baseline correction
  86. deltaF is saved into the suite2p output folder generated from suite2p ROI detection.
  87. """
  88. savepath = rf"{F_file}".replace("\\F.npy","") ## make savepath original folder, indicates where deltaF.npy is saved
  89. F = np.load(rf"{F_file}", allow_pickle=True)
  90. Fneu = np.load(rf"{F_file[:-4]}"+"neu.npy", allow_pickle=True)
  91. deltaF= []
  92. if event_threshold is None:
  93. event_threshold = config.analysis_params.MAD_baseline_filter_threshold
  94. if lambda_window is None:
  95. lambda_window = config.analysis_params.lambda_window
  96. for f, fneu in zip(F, Fneu):
  97. corrected_trace = f - (0.7*fneu) ## neuropil correction
  98. #Remove bleaching to generate change in Fluorescence
  99. baseline_corrected = remove_bleaching(corrected_trace, 'rolling_med', window = lambda_window) #TODO make interatable with config file
  100. #Determine baseline F0 value
  101. trace_median = np.median(corrected_trace)
  102. trace_mad = np.median(np.abs(corrected_trace - trace_median))
  103. norm_sigma = 1.4826*trace_mad
  104. baseline_mask = np.abs(corrected_trace - trace_median) < event_threshold * norm_sigma
  105. F0 = np.median(corrected_trace[baseline_mask])
  106. #calculate dF / F0
  107. normalized_F = (baseline_corrected)/F0
  108. deltaF.append(normalized_F)
  109. deltaF = np.array(deltaF)
  110. deltaF = np.squeeze(deltaF)
  111. if not os.path.exists(f"{savepath}/deltaF.npy") and not config.analysis_params.overwrite_suite2p:
  112. np.save(f"{savepath}/deltaF.npy", deltaF, allow_pickle=True)
  113. print(f"delta F traces saved as deltaF.npy under {savepath}\n")
  114. elif os.path.exists(f"{savepath}/deltaF.npy") and config.analysis_params.overwrite_suite2p:
  115. np.save(f"{savepath}/deltaF.npy", deltaF, allow_pickle=True)
  116. print(f"delta F traces saved as deltaF.npy under {savepath}\n")
  117. else:
  118. print(f"deltaF files already exist for {F_file[len(config.general_settings.main_folder)+1:-21]}")
  119. return deltaF
  120. def estimate_single_trace_baseline_noise_mad(F_trace, event_threshold = 2):
  121. """
  122. Estimate noise sigma from baseline-only windows using MAD.
  123. Args:
  124. -----------
  125. F : 1D numpy array
  126. Baseline-corrected ΔF/F trace.
  127. frame_rate : float
  128. Sampling rate (Hz).
  129. event_threshold : float
  130. Preserved from calculate_deltaF function above.
  131. Threshold (in MAD units) to mask obvious events by multiplying by estimated noise standard deviation.
  132. Default: 2 (SD above median)
  133. Smaller values will limit the number of baseline points used for correction.
  134. min_baseline_sec : float
  135. Minimum duration (seconds) of a baseline window.
  136. Default: 10 s
  137. Returns:
  138. --------
  139. sigma : float
  140. Estimated noise standard deviation.
  141. baseline_mask : boolean array
  142. Mask of samples classified as baseline.
  143. """
  144. trace_median = np.median(F_trace)
  145. mad = np.median(np.abs(F_trace - trace_median))
  146. sigma = 1.4826 * mad
  147. event_mask = np.abs(F_trace - trace_median) > event_threshold * sigma
  148. trace_baseline = ~event_mask
  149. baseline_samples = F_trace[trace_baseline]
  150. baseline_median = np.median(baseline_samples)
  151. baseline_mad = np.median(np.abs(baseline_samples - baseline_median))
  152. sigma = 1.4826 * baseline_mad
  153. return sigma, baseline_samples
  154. def filter_outliers(trace):
  155. """
  156. Filter outliers (peaks) from calcium trace using the trace IQR
  157. Args:
  158. -----------
  159. trace : 1D numpy array
  160. Fluorescence trace (e.g., F.npy) from suite2p output.
  161. Returns:
  162. --------
  163. filtered_values : 1D array
  164. values from 1D array that fall within the original trace IQR.
  165. """
  166. q1,q3 = np.percentile(trace, [25,75])
  167. iqr = q3-q1
  168. lower_bound = q1 - 1.5*iqr
  169. upper_bound = q3 + 1.5*iqr
  170. filtered_values = trace[(trace >= lower_bound) & (trace <= upper_bound)]
  171. return filtered_values
  172. def single_synapse_peak_detection(deltaF, return_peaks = False,
  173. return_decay_frames = False,
  174. return_amplitudes = False,
  175. return_decay_time = False,
  176. return_peak_count = False,
  177. extract_peaks = False):
  178. """
  179. Identify time stamps and metrics of individual calcium spikes for a single ROI.
  180. Args:
  181. -----------
  182. deltaF : 1D numpy array
  183. Normalized fluroescence trace
  184. return_peaks : bool, optional
  185. Returns time stamps (frame) for each peak
  186. return_decay_frames : bool, optional
  187. Returns time stamp (frame) for when each peak returns to threshold
  188. if no return to threshold --> returns NaN
  189. return_amplitudes : bool, optional
  190. Returns normalized amplitude for each detected peak
  191. return_decay_times : bool, optional
  192. Returns decay time from peak frame to crossing threshold (in seconds)
  193. return_peak_count : bool, optional
  194. Returns len(peaks)
  195. extract_peaks : bool, optional
  196. Returns peaks + 30 frames for peak library --> to be used for Tau calculations
  197. Returns:
  198. --------
  199. IF any==True :
  200. return_peaks : returns calcium spike time_stamps
  201. return_decay_frames : returns number of frames for calcium spike to decay to threshold
  202. return_amplitudes : returns amplitude of calcium spike in relation to baseline fluorescence (F0)
  203. return_decay_time : returns decay time in seconds (converts number of frames into seconds)
  204. return_peak_count : returns the total number of calcium spikes for the ROI fluorescence trace
  205. extract_peaks : returns deltaF window around calcium spike for calcium spike library
  206. """
  207. sigma, deltaF_baseline = estimate_single_trace_baseline_noise_mad(deltaF, event_threshold=2)
  208. baseline_reference = np.median(deltaF_baseline)
  209. peak_detection_multiplier = 4.5# float(config.analysis_params.peak_detection_threshold)
  210. threshold = np.median(deltaF_baseline) + (peak_detection_multiplier * sigma)
  211. peaks, _ = find_peaks(deltaF, height = threshold, distance = 5, prominence = baseline_reference + sigma, width = (2,None))
  212. amplitudes = deltaF[peaks] - baseline_reference #amplitude
  213. peak_count = len(peaks)
  214. negative_points = np.where((deltaF < threshold))[0]
  215. # print(negative_points)
  216. decay_points = []
  217. decay_time = []
  218. if return_decay_time:
  219. for peak1, peak2 in zip(peaks[:-1], peaks[1:]):
  220. negative_between_peaks = negative_points[negative_points>peak1]
  221. negative_between_peaks = negative_between_peaks[negative_between_peaks<peak2]
  222. if len(negative_between_peaks)>0:
  223. decay_points.append(negative_between_peaks[0])
  224. if len(negative_between_peaks)==0:
  225. decay_points.append(np.nan)
  226. if len(peaks)>0:
  227. negative_after_last_peak = negative_points[negative_points>peaks[-1]]
  228. if len(negative_after_last_peak)>0:
  229. decay_points.append(negative_after_last_peak[0])
  230. else:
  231. decay_points.append(np.nan)
  232. else:
  233. decay_points = []
  234. for peak,decay in zip(peaks, decay_points):
  235. decay_time.append(np.abs(decay - peak)/config.general_settings.frame_rate) #import framerate
  236. decay_points = np.array(decay_points) #decay frames crossing baseline
  237. decay_time = np.array(decay_time) #seconds after a calcium peak to return to baseline
  238. if return_peaks == True:
  239. return peaks
  240. if return_decay_frames == True:
  241. return decay_points
  242. if return_amplitudes == True:
  243. return amplitudes
  244. if return_decay_time == True:
  245. return decay_time
  246. if return_peak_count == True:
  247. return peak_count
  248. if extract_peaks:
  249. peak_dict = {}
  250. #TODO fix up these points for peak library
  251. # for peak in peaks:
  252. # peak_dict.update(f'peak_{peak}': 'deltaF[peak:peak+30]')
  253. return peak_dict
  254. def detect_spikes_by_mod_z(input_trace, **signal_kwargs):
  255. """
  256. Detect spikes by median absolute difference (MAD) of each frame from median of the trace.
  257. Args:
  258. -----------
  259. input_trace : 1D NumPy array
  260. **signal_kwargs : assorted see signal.find_peaks()
  261. Ex. width = (min,max), peak_prominence = type(float), height = type(float), threshold = type(float), distance = int/float
  262. Returns:
  263. --------
  264. peak time frames using signal.find_peaks() function
  265. """
  266. median = np.median(input_trace)
  267. deviation_from_med = np.array(input_trace) - median
  268. mad = np.median(np.abs(deviation_from_med))
  269. mod_zscore = deviation_from_med/(1.4826*mad)
  270. return signal.find_peaks(mod_zscore, **signal_kwargs)[0]
  271. def plot_spikes(raw_trace, detector_func, detector_trace=None, **detector_kwargs):
  272. """
  273. Plot ROI calcium trace with overlayed detected spikes as red vertical lines.
  274. Args:
  275. -----------
  276. raw_trace : 1D NumPy array
  277. detector_func : Function
  278. Ex. scipy.signal.find_peaks() / detect_spikes_by_mod_z()
  279. detector_trace : bool, optional
  280. **detector_kwargs : assorted, optional
  281. Ex. scipy.signal.find_peaks(x, height = , threshold = , peak_prominence = , width = , distance = )
  282. Returns:
  283. --------
  284. matplotlib.pyplot.plot line graph
  285. blue : detector_trace (if true) or raw trace
  286. red : detected spikes
  287. """
  288. if detector_trace is None:
  289. detector_input_trace = raw_trace.copy()
  290. else:
  291. detector_input_trace = detector_trace.copy()
  292. spikes = detector_func(detector_input_trace, **detector_kwargs)
  293. plt.plot(range(len(raw_trace)), raw_trace, color="blue")
  294. for spk in spikes:
  295. plt.axvline(spk, color="red")
  296. plt.show()
  297. def rolling_min(input_series, window_size):
  298. """
  299. Calculate rolling minimum value (input_series.rolling()) over different windows of the input trace.
  300. Args:
  301. -----------
  302. input_series : 1D NumPy array
  303. raw_trace / F.npy / deltaF.npy
  304. window_size : int
  305. Size of window to measure with each iteration
  306. Returns:
  307. --------
  308. m : int / float
  309. Smallest local minimum across all windows
  310. """
  311. r = input_series.rolling(window_size, min_periods=1)
  312. m = r.min()
  313. return m
  314. def rolling_med(input_series, window_size):
  315. """
  316. Calculate rolling minimum value (input_series.rolling()) over different windows of the input trace.
  317. Args:
  318. -----------
  319. input_series : 1D NumPy array
  320. raw_trace / F.npy / deltaF.npy
  321. window_size : int
  322. Size of window to measure with each iteration
  323. Returns:
  324. --------
  325. m : int / float
  326. Smallest local minimum across all windows
  327. """
  328. r = input_series.rolling(window_size, min_periods=1)
  329. m = r.median()
  330. return m
  331. def remove_bleaching(input_trace, baseline_correction, window = None):
  332. """
  333. Basic first-order polynomial function to remove bleaching from single ROI calcium imaging trace
  334. Args:
  335. -----------
  336. input_trace : 1D array
  337. raw fluorescence trace (F.npy or corrected: F.npy - 0.7*Fneu.npy)
  338. functions by processing one ROI at a time
  339. baseline_correction : str
  340. String name of function to call for removing bleaching from fluorescence trace
  341. Accepts 'rolling_min' or 'rolling_med' as possible values; all other values will break the function
  342. Returns:
  343. --------
  344. input_trace - fit(range(len(input_trace)))
  345. input trace adjusted by rolling minimum
  346. polynomial fit built on length of trace, rolling min values, and order of polynomial (e.g. 2nd)
  347. poly1d fits a 1 dimensional polynomial to the adjusted trace which is subtraced from the raw trace (input_Trace)
  348. """
  349. possible_corrections = ['rolling_min', 'rolling_med']
  350. if baseline_correction not in possible_corrections:
  351. print(f"Please enter a valid correction method: {possible_corrections}")
  352. return
  353. if baseline_correction == "rolling_min":
  354. if window is not None:
  355. corr_trace = rolling_min(pd.Series(input_trace), window_size = int(window))
  356. else:
  357. corr_trace = rolling_min(pd.Series(input_trace), window_size=int(len(input_trace)/10))
  358. if baseline_correction == "rolling_med":
  359. if window is not None:
  360. corr_trace = rolling_med(pd.Series(input_trace), window_size = int(window))
  361. else:
  362. corr_trace = rolling_med(pd.Series(input_trace), window_size = int(len(input_trace)/10))
  363. # fit_coefficients = np.polyfit(range(len(corr_trace)), corr_trace, 2)
  364. # fit = np.poly1d(fit_coefficients)
  365. # return input_trace - fit(range(len(input_trace)))
  366. return input_trace - corr_trace

detector_utility.py at commit ae19f9c, under GPL-3.0 · at the source

Overview

Authors: John Carl Begley1,2,3,4, Harald Prüss2,5, Paul Turko4, Camin Dean2,3,6
ORCID iDs: Paul Turko
  1. Institute of Biology, Humboldt-Universität zu Berlin, Berlin, Germany
  2. German Center for Neurodegenerative Diseases (DZNE) Berlin, Berlin, Germany
  3. Einstein Center for Neurosciences Berlin, Berlin, Germany
  4. Shared Primary Neuron Facility (SPNF), Institute for Integrative Neuroanatomy, Charité – Universitätsmedizin, Berlin, Germany
  5. Department of Neurology and Experimental Neurology, Charité – Universitätsmedizin Berlin, Berlin, Germany
  6. Bernstein Center for Computational Neuroscience Berlin, Berlin, Germany
Journal: Frontiers in synaptic neuroscience, volume 18, article 1832103
Dates: received 16 March 2026; accepted 12 May 2026; published online 28 May 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.3389/fnsyn.2026.1832103 · PMID 42291802 · PMCID PMC13254171 · OpenAlex W7162628158
Open access: gold, a free copy (OpenAlex)
Status: code verified
Methods: Connectivity, Statistics, Preprocessing, fMRI & imaging, Single-unit activity, calcium imaging
Keywords: calcium imaging, NMDAR auto-antibodies, automated ROI detection, presynaptic function, post-synaptic function
Topic: Neuroscience and Neuropharmacology Research (Cellular and Molecular Neuroscience, Neuroscience), according to OpenAlex
Citations: not cited yet (Europe PMC); 73 references in the paper
Notices: A correction to this paper has been published (42549241, from Europe PMC)

Abstract

Synapses are the basic unit of information transfer between neurons. Their dysfunction is a common trigger of cognitive diseases and disorders. However, high-throughput analysis methods to assess synaptic function and dysfunction are lacking. Calcium imaging in cultured neurons in the absence of Mg2+ and presence of TTX allows visualization of NMDAR-dependent spontaneous synaptic calcium transients, which report pre and postsynaptic function. Here, we introduce a high-throughput automated analysis pipeline that combines Suite2p ROI detection and Python scripts to analyze tens of thousands of synapses and quantify changes in presynaptic vesicle fusion rates (frequency), postsynaptic function (amplitude), and the number of functional synapses. We use this pipeline to test known NMDAR agonists (glycine) and antagonists (ketamine, memantine, APV), presynaptic function modulating compounds (PDBu), and encephalitis patient-derived NMDAR auto-antibodies, where our pipeline proved more sensitive in detecting dysfunction at the single-synapse level than other methods. The ability to detect, track, and quantify activity across tens of thousands of synapses and millions of synaptic calcium transients using this pipeline will aid drug discovery of compounds that protect synapse function.

Reproduced under the paper's license (CC BY), from the paper cited above.

Repository

Its files are read in the Code ↔ Paper reader above, with 9 matches between paragraphs and lines of code.

jay-cee-begs/synaptic_suite2p

License: GPL-3.0
State: the link answers, verified on 28 September 2026
Evidence: files inventoried
Commit: ae19f9c5c61e324f5fb03c3cfe6d6ab73809af81, 29 May 2026
Languages: Python (19), R (2), Jupyter (1)
Size: 42 files, 22 scripts
Software Heritage: not archived
Found in: “Code availability”
Holds: README, license file, environment (setup.py), 1 notebook
Not found: CITATION.cff, tests, continuous integration, documentation
Tools: NumPy (9 files), pandas (8 files), Matplotlib (5 files), ggplot2 (2 files), SciPy (2 files), tidyverse (2 files), broom (1 file), easystats (1 file), glmmTMB (1 file), Pillow (1 file), seaborn (1 file), Suite2p (1 file)
Availability: 1 check, the latest on 28 September 2026: the link answers
  • 28 September 2026: the link answers
24 files

Code availability

The code for synapse analysis in Python, neurite length measurement in CellProfiler, and R mixed-effect models is available here (https://github.com/jay-cee-begs/synaptic_suite2p).

Reproduced under the paper's license (CC BY), from the paper cited above.

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:

  • 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
  • 22 scripts, each with its path and the digest of its content;
  • 9 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 statement

The raw data supporting the conclusions of this article will be made available by the authors without undue reservation.

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, 28 September 2026: the first record

Recorded: type, language, journal, volume, pages, dates, 4 authors, 5 keywords, 70 references, 1 integrity notice.

Cite

This paper

Begley, J. C., Prüss, H., Turko, P., & Dean, C. (2026). Automated ROI detection allows rapid quantification of synaptic activity across tens of thousands of synapses in cell culture. Frontiers in synaptic neuroscience, 18, 1832103. https://doi.org/10.3389/fnsyn.2026.1832103

BibTeX

@article{begley2026automated,
author = {Begley, John Carl and Prüss, Harald and Turko, Paul and Dean, Camin},
title = {{Automated ROI detection allows rapid quantification of synaptic activity across tens of thousands of synapses in cell culture}},
journal = {Frontiers in synaptic neuroscience},
year = {2026},
month = may,
volume = {18},
pages = {1832103},
publisher = {Frontiers Media SA},
issn = {1663-3563},
doi = {10.3389/fnsyn.2026.1832103},
url = {https://doi.org/10.3389/fnsyn.2026.1832103},
pmid = {42291802},
pmcid = {PMC13254171}
}

RIS

TY - JOUR
AU - Begley, John Carl
AU - Prüss, Harald
AU - Turko, Paul
AU - Dean, Camin
TI - Automated ROI detection allows rapid quantification of synaptic activity across tens of thousands of synapses in cell culture
T2 - Frontiers in synaptic neuroscience
J2 - Front Synaptic Neurosci
PY - 2026
DA - 2026/05/28
VL - 18
SP - 1832103
SN - 1663-3563
PB - Frontiers Media SA
DO - 10.3389/fnsyn.2026.1832103
UR - https://doi.org/10.3389/fnsyn.2026.1832103
LA - en
ER -

CSL-JSON

{
"id": "10.3389/fnsyn.2026.1832103",
"type": "article-journal",
"title": "Automated ROI detection allows rapid quantification of synaptic activity across tens of thousands of synapses in cell culture",
"container-title": "Frontiers in synaptic neuroscience",
"author": [
{
"family": "Begley",
"given": "John Carl"
},
{
"family": "Prüss",
"given": "Harald"
},
{
"family": "Turko",
"given": "Paul"
},
{
"family": "Dean",
"given": "Camin"
}
],
"container-title-short": "Front Synaptic Neurosci",
"volume": "18",
"page": "1832103",
"DOI": "10.3389/fnsyn.2026.1832103",
"PMID": "42291802",
"PMCID": "PMC13254171",
"ISSN": "1663-3563",
"publisher": "Frontiers Media SA",
"URL": "https://doi.org/10.3389/fnsyn.2026.1832103",
"language": "en",
"issued": {
"date-parts": [
[
2026,
5,
28
]
]
}
}

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/s41514-026-00391-9 [code]
Region-specific transcriptional signatures of brain aging in the absence of neuropathology at the single-cell level.
Journal: npj aging
In common: glmmTMB, broom, ggplot2, 6 other tools, cellular / molecular, 1 reference
[2] doi:10.1126/sciadv.aec2042 [code]
IgLON5 autoimmune antibodies activate Tau via neuronal hyperactivity.
Journal: Science advances
In common: tidyverse, cellular / molecular, 3 references, author Paul Turko
[3] doi:10.1016/j.isci.2026.116206 [code]
Gut distension evokes rapid neural dynamics in vagal and hindbrain populations of larval zebrafish.
Journal: iScience
In common: Suite2p, Pillow, seaborn, 4 other tools, optical imaging (calcium, voltage, 2-photon), 1 reference
[4] doi:10.7554/elife.107088 [code]
Development of auditory and spontaneous movement responses to music over the first postnatal year.
Journal: eLife
In common: glmmTMB, easystats, ggplot2, 6 other tools
[5] doi:10.1093/nc/niag029 [code]
A data-driven approach to identifying and evaluating connectivity-based neural correlates of conscious visual perception.
Journal: Neuroscience of consciousness
In common: easystats, broom, ggplot2, 6 other tools, 1 reference
[6] doi:10.1016/j.celrep.2026.117505 [code]
Impaired spatial coding and neuronal hyperactivity in the medial entorhinal cortex of aged APP knock-in mice.
Journal: Cell reports
In common: glmmTMB, easystats, broom, 5 other tools
[7] doi:10.1002/hbm.70605 [code]
BrainEnrich: Revealing Biological Insights for Imaging-Derived Phenotypes Through Transcriptomic Enrichment.
Journal: Human brain mapping
In common: easystats, broom, ggplot2, 6 other tools
[8] doi:10.1093/cercor/bhag113 [code]
Long-term reliability and stability of parameterized resting state EEG: evidence from a five-year follow-up.
Journal: Cerebral cortex (New York, N.Y. : 1991)
In common: easystats, broom, ggplot2, 6 other tools
[9] doi:10.1038/s41467-026-73865-9 [code]
Histamine shapes the neurocomputational dynamics of human learning.
Journal: Nature communications
In common: easystats, broom, ggplot2, 6 other tools
[10] doi:10.1038/s41467-026-70287-5 [code]
Cortical-limbic circuit dynamics of approach-avoidance conflict in humans.
Journal: Nature communications
In common: easystats, broom, ggplot2, 6 other tools

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.

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.