OSCR

Electrophysiological development and functional plasticity in dissociated human cerebral organoids across multiple cell lines.

Code ↔ Paper

7 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 7 matches · 1 of them tie a paragraph to a whole file without given lines: a weak match, whose lines are not tinted
  1. [1] § STAR★Methods › Quantification and statistical analysis › Dimensionality reduction analysis ↔ python/plot_parity_report.py, lines 28 to 105 · score 0.90 · global efficiency, modularity score, network burst duration, node strength, edge weight, active electrodes · Report a mismatch
  2. [2] § STAR★Methods › Quantification and statistical analysis › MEA data analysis ↔ src/meanap/params.py, lines 20 to 442 · score 0.89 · bior1.5, probabilistic thresholding, Network metrics, functional connections, MEA NAP, template · Report a mismatch
  3. [3] § STAR★Methods › Quantification and statistical analysis › MEA data analysis ↔ MEApipeline.m, lines 5 to 86 · score 0.83 · bior1.5, probabilistic thresholding, MEA network, functional connections, MEA NAP, wavelet · Report a mismatch
  4. [4] § STAR★Methods › Quantification and statistical analysis › Dimensionality reduction analysis ↔ AdvancedSettings.m, lines 175 to 267 · score 0.81 · global efficiency, modularity score, node strength, edge weight, node degree, components · Report a mismatch
  5. [5] § STAR★Methods › Quantification and statistical analysis › MEA data analysis ↔ src/meanap/params.py, lines 20 to 442 · score 0.75 · single electrode, Poisson, depth, network burst, firing rate, probability · Report a mismatch
  6. [6] § STAR★Methods › Quantification and statistical analysis › MEA data analysis ↔ Functions/plotting/plotNetworkBursts.m, the whole file · a weak match · score 0.67 · inter spike interval, network burst, firing rate, histograms, probability, logged · Report a mismatch
  7. [7] § Results › Dissociated organoids respond to a chemical plasticity stimulus ↔ python/plot_parity_report.py, lines 28 to 105 · score 0.51 · single electrode bursting, edge weight, firing rate, network bursts, strength, ISI · Report a mismatch

Paper

Loaded from Europe PMC by your browser; OSCR does not store it: doi.org · Europe PMC

The paper is loaded when this pane is shown.

The authors' code

Python · 383 lines · 16 KB · GPL-3.0 · 2 matches

  1. #!/usr/bin/env python3
  2. """Generate a side-by-side MATLAB-vs-Python plot parity report for MEA-NAP.
  3. Walks a MATLAB output tree and a Python output tree, pairs the plots each
  4. pipeline produced (handling the two pipelines' different file/folder naming
  5. conventions), and emits a single self-contained HTML report that shows every
  6. plot from both pipelines side by side. Missing cells make parity gaps obvious.
  7. Usage:
  8. python python/plot_parity_report.py \
  9. --matlab OutputData24Dec2025 \
  10. --python OutputData_Python \
  11. --out plot_parity_report.html
  12. Re-run after each plotting fix to track progress. Image tags reference the
  13. output files by path *relative to the report's location*, so keep the report at
  14. the repo root (default) or pass --out somewhere the relative paths still resolve.
  15. """
  16. from __future__ import annotations
  17. import argparse
  18. import html
  19. import os
  20. import re
  21. from collections import defaultdict
  22. from pathlib import Path
  23. # --- MATLAB readable label -> Python metric code -----------------------------
  24. # MATLAB names group-comparison plots "<N>_<readable label>_by<Grouping>.png";
  25. # Python names them "<code>_by<Grouping>[_node].png". This maps the readable
  26. # label to the code so the two can be paired. Derived from PlotNetMet.m /
  27. # PlotEphysStats.m ordering and src/meanap/pipeline/plotting_step{2,4}.py.
  28. LABEL2CODE = {
  29. # step 2 - recording level (ephys)
  30. "number of active electrodes": "numActiveElec",
  31. "mean firing rate (Hz)": "FRmean",
  32. "median firing rate (Hz)": "FRmedian",
  33. "network burst rate (per minute)": "NBurstRate",
  34. "mean number of channels involved in network bursts": "meanNumChansInvolvedInNbursts",
  35. "mean network burst length (s)": "meanNBstLengthS",
  36. "mean ISI within network burst (ms)": "meanISIWithinNbursts_ms",
  37. "mean ISI outside network bursts (ms)": "meanISIoutsideNbursts_ms",
  38. "coefficient of variation of inter network burst intervals": "CVofINBI",
  39. "fraction of bursts in network bursts": "fracInNburst",
  40. "Single-electrode burst rate (per minute)": "channelAveBurstRate",
  41. "Single-electrode average burst duration (ms)": "channelAveBurstDur",
  42. "Single-electrode average ISI within burst (ms)": "channelAveISIwithinBurst",
  43. "Single-electrode average ISI outside burst (ms)": "channelAveISIoutsideBurst",
  44. "Mean fraction of spikes in bursts per electrode": "channelAveFracSpikesInBursts",
  45. # step 2 - node level (ephys)
  46. "mean_firing_rate_node": "FR",
  47. "mean_firing_rate_active_node": "FRactive",
  48. "Unit burst rate (per minute)": "channelBurstRate",
  49. "Unit within-burst firing rate (Hz)": "channelWithinBurstFr",
  50. "Unit burst duration (ms)": "channelBurstDur",
  51. "Unit ISI within burst (ms)": "channelISIwithinBurst",
  52. "Unit ISI outside burst (ms)": "channeISIoutsideBurst",
  53. "Unit fraction of spikes in bursts": "channelFracSpikesInBursts",
  54. # step 4 - recording level (network)
  55. "network size": "aN",
  56. "density": "Dens",
  57. "Node degree mean": "NDmean",
  58. "Top 25% node degree": "NDtop25",
  59. "Significant edge weight mean": "sigEdgesMean",
  60. "Top 10% edge weight mean": "sigEdgesTop10",
  61. "Node strength mean": "NSmean",
  62. "Local efficiency mean": "ElocMean",
  63. "clustering coefficient": "CC",
  64. "number of modules": "nMod",
  65. "modularity score": "Q",
  66. "Percentage within-module z-score greater than 0": "percentZscoreGreaterThanZero",
  67. "Percentage within-module z-score less than 0": "percentZscoreLessThanZero",
  68. "mean path length": "PL",
  69. "Participant coefficient (PC) mean": "PCmean",
  70. "Bottom 10% PC": "PCmeanBottom10",
  71. "Top 10% PC": "PCmeanTop10",
  72. "global efficiency": "Eglob",
  73. "NC1PeripheralNodes": "NCpn1",
  74. "NC2NonhubConnectors": "NCpn2",
  75. "NC3NonhubKinless": "NCpn3",
  76. "NC4ProvincialHubs": "NCpn4",
  77. "NC5ConnectorHubs": "NCpn5",
  78. "NC6KinlessHubs": "NCpn6",
  79. "small worldness sigma": "SW",
  80. "small worldness omega": "SWw",
  81. "Mean average controllability": "aveControlMean",
  82. "Mean modal controllability": "modalControlMean",
  83. "Num NMF components": "num_nnmf_components",
  84. "nNMF div network size": "nComponentsRelNS",
  85. "Effective rank": "effRank",
  86. # step 4 - node level (network)
  87. "node degree": "ND",
  88. "edge weight": "MEW",
  89. "node strength": "NS",
  90. "local efficiency": "Eloc",
  91. "within-module degree z-score": "Z",
  92. "betweenness centrality": "BC",
  93. "participation coefficient": "PC",
  94. "Average Controllability": "aveControl",
  95. "Modal Controllability": "modalControl",
  96. }
  97. BY_SUFFIX = re.compile(r"_by(Group|Age|DIV)(_node)?$")
  98. NUM_PREFIX = re.compile(r"^\d+_")
  99. LAG_PY = re.compile(r"Lag(\d+)ms")
  100. def canon_path(rel: str) -> str:
  101. """Normalise a relative path so MATLAB and Python trees line up.
  102. Python uses 'Lag10ms' folder tokens where MATLAB uses '10mslag'.
  103. """
  104. return LAG_PY.sub(lambda m: f"{m.group(1)}mslag", rel)
  105. def metric_key(stem: str, is_matlab: bool, is_group: bool) -> str:
  106. """Reduce a filename stem to a pipeline-agnostic key for pairing.
  107. Only group-comparison plots (those under a 2B/4B *_GroupComparisons folder)
  108. get the numeric-prefix strip + MATLAB-label->code translation, because only
  109. there do the two pipelines diverge: MATLAB writes "<N>_<readable>_by<Grp>",
  110. Python writes "<code>_by<Grp>[_node]". MATLAB is also inconsistent — the
  111. ByAge folders drop the "_by<Grp>" suffix — so we key on the folder, not the
  112. suffix. Individual / spike / edge-threshold plots share identical filenames
  113. across pipelines, so their stems are left untouched and pair verbatim.
  114. """
  115. if not is_group:
  116. return stem
  117. stem = BY_SUFFIX.sub("", stem)
  118. if is_matlab:
  119. readable = NUM_PREFIX.sub("", stem)
  120. return LABEL2CODE.get(readable, readable)
  121. return stem
  122. def pair_key(rel: str, is_matlab: bool) -> str:
  123. """Full pairing key: canonical directory + metric key."""
  124. rel = canon_path(rel)
  125. d, name = os.path.split(rel)
  126. stem = name[:-4] if name.lower().endswith(".png") else name
  127. is_group = "GroupComparisons" in d
  128. return f"{d}/{metric_key(stem, is_matlab, is_group)}"
  129. def section_of(key: str) -> str:
  130. """Human-readable section for grouping/navigation."""
  131. if key.startswith("./1_SpikeDetection") or key.startswith("1_SpikeDetection"):
  132. return "1 · Spike Detection"
  133. if "2A_IndividualNeuronalAnalysis" in key:
  134. return "2A · Neuronal Activity — Individual"
  135. if "2B_GroupComparisons" in key:
  136. return "2B · Neuronal Activity — Group"
  137. if "3_EdgeThresholdingCheck" in key:
  138. return "3 · Edge Thresholding Check"
  139. if "4A_IndividualNetworkAnalysis" in key:
  140. return "4A · Network Activity — Individual"
  141. if "4B_GroupComparisons" in key:
  142. return "4B · Network Activity — Group"
  143. return "Other"
  144. SECTION_ORDER = [
  145. "1 · Spike Detection",
  146. "2A · Neuronal Activity — Individual",
  147. "2B · Neuronal Activity — Group",
  148. "3 · Edge Thresholding Check",
  149. "4A · Network Activity — Individual",
  150. "4B · Network Activity — Group",
  151. "Other",
  152. ]
  153. def collect(root: Path, is_matlab: bool, filt: "re.Pattern | None" = None) -> dict[str, str]:
  154. """Map pairing key -> path relative to `root` for every PNG under root.
  155. If ``filt`` is given, only PNGs whose relative path matches the regex are
  156. included (used to focus a report on a subsystem, e.g. the stim plots).
  157. """
  158. out: dict[str, str] = {}
  159. for p in root.rglob("*.png"):
  160. rel = os.path.relpath(p, root)
  161. if filt is not None and not filt.search(rel):
  162. continue
  163. out[pair_key("./" + rel, is_matlab)] = rel
  164. return out
  165. def rel_from_report(report_dir: Path, root: Path, rel: str) -> str:
  166. return os.path.relpath(root / rel, report_dir).replace(os.sep, "/")
  167. def build_report(matlab_root: Path, python_root: Path, out_path: Path,
  168. filt: "re.Pattern | None" = None) -> dict:
  169. mat = collect(matlab_root, is_matlab=True, filt=filt)
  170. py = collect(python_root, is_matlab=False, filt=filt)
  171. report_dir = out_path.parent.resolve()
  172. all_keys = sorted(set(mat) | set(py))
  173. sections: dict[str, list] = defaultdict(list)
  174. for k in all_keys:
  175. sections[section_of(k)].append(k)
  176. # per-section stats
  177. stats = {}
  178. for sec, keys in sections.items():
  179. both = sum(1 for k in keys if k in mat and k in py)
  180. mat_only = sum(1 for k in keys if k in mat and k not in py)
  181. py_only = sum(1 for k in keys if k in py and k not in mat)
  182. stats[sec] = (both, mat_only, py_only, len(keys))
  183. tot_both = sum(s[0] for s in stats.values())
  184. tot_mat_only = sum(s[1] for s in stats.values())
  185. tot_py_only = sum(s[2] for s in stats.values())
  186. def img_cell(root, rel, side):
  187. if rel is None:
  188. return f'<div class="cell missing"><span>— no {side} plot —</span></div>'
  189. src = html.escape(rel_from_report(report_dir, root, rel))
  190. title = html.escape(rel)
  191. return (
  192. f'<div class="cell"><a href="{src}" target="_blank">'
  193. f'<img loading="lazy" src="{src}" title="{title}"></a>'
  194. f'<div class="fname">{title}</div></div>'
  195. )
  196. parts = []
  197. parts.append(HEADER)
  198. parts.append(f"""
  199. <header>
  200. <h1>MEA-NAP plot parity — MATLAB vs Python</h1>
  201. <p class="paths"><b>MATLAB:</b> {html.escape(str(matlab_root))} &nbsp;|&nbsp;
  202. <b>Python:</b> {html.escape(str(python_root))}</p>
  203. <div class="totals">
  204. <span class="badge both">{tot_both} paired</span>
  205. <span class="badge matonly">{tot_mat_only} MATLAB-only (missing in Python)</span>
  206. <span class="badge pyonly">{tot_py_only} Python-only (extra)</span>
  207. </div>
  208. <label class="filter"><input type="checkbox" id="onlyGaps"> Show only parity gaps (missing on one side)</label>
  209. </header>
  210. <nav>
  211. """)
  212. for sec in SECTION_ORDER:
  213. if sec not in stats:
  214. continue
  215. b, mo, po, _ = stats[sec]
  216. parts.append(
  217. f'<a href="#{slug(sec)}">{html.escape(sec)} '
  218. f'<small>({b}✓ {mo}▲ {po}▼)</small></a>'
  219. )
  220. parts.append("</nav>")
  221. for sec in SECTION_ORDER:
  222. if sec not in sections:
  223. continue
  224. keys = sections[sec]
  225. b, mo, po, tot = stats[sec]
  226. parts.append(f'<section id="{slug(sec)}">')
  227. parts.append(
  228. f'<h2>{html.escape(sec)} '
  229. f'<span class="secstats">{b} paired · {mo} MATLAB-only · {po} Python-only</span></h2>'
  230. )
  231. parts.append(
  232. '<div class="colbar"><div></div>'
  233. '<div class="cols"><span class="mlab">MATLAB</span>'
  234. '<span class="pyth">Python</span></div></div>'
  235. )
  236. for k in keys:
  237. m_rel = mat.get(k)
  238. p_rel = py.get(k)
  239. gap = (m_rel is None) or (p_rel is None)
  240. row_cls = "row gap" if gap else "row"
  241. label = html.escape(k.split("/")[-1])
  242. sub = html.escape("/".join(k.split("/")[:-1]))
  243. parts.append(f'<div class="{row_cls}" data-gap="{int(gap)}">')
  244. parts.append(f'<div class="rowhead"><b>{label}</b><br><small>{sub}</small></div>')
  245. parts.append('<div class="pair">')
  246. parts.append(img_cell(matlab_root, m_rel, "MATLAB"))
  247. parts.append(img_cell(python_root, p_rel, "Python"))
  248. parts.append("</div></div>")
  249. parts.append("</section>")
  250. parts.append(FOOTER)
  251. out_path.write_text("\n".join(parts), encoding="utf-8")
  252. return {
  253. "paired": tot_both,
  254. "matlab_only": tot_mat_only,
  255. "python_only": tot_py_only,
  256. "sections": stats,
  257. "out": str(out_path),
  258. }
  259. def slug(s: str) -> str:
  260. return re.sub(r"[^a-z0-9]+", "-", s.lower()).strip("-")
  261. HEADER = """<!doctype html>
  262. <html lang="en"><head><meta charset="utf-8">
  263. <meta name="viewport" content="width=device-width, initial-scale=1">
  264. <title>MEA-NAP plot parity</title>
  265. <style>
  266. :root { color-scheme: light dark; }
  267. * { box-sizing: border-box; }
  268. body { margin: 0; font: 14px/1.5 -apple-system, Segoe UI, Roboto, sans-serif;
  269. background: #0f1115; color: #e6e8eb; }
  270. header { padding: 20px 24px; border-bottom: 1px solid #2a2e37; position: sticky; top: 0;
  271. background: #0f1115ee; backdrop-filter: blur(6px); z-index: 10; }
  272. h1 { margin: 0 0 6px; font-size: 20px; }
  273. .paths { margin: 0 0 10px; color: #9aa0aa; font-size: 12px; }
  274. .totals { display: flex; gap: 10px; flex-wrap: wrap; margin-bottom: 8px; }
  275. .badge { padding: 3px 10px; border-radius: 999px; font-size: 12px; font-weight: 600; }
  276. .badge.both { background: #16351f; color: #7ee2a0; }
  277. .badge.matonly { background: #3a2a12; color: #f0b866; }
  278. .badge.pyonly { background: #122a3a; color: #6cc2f0; }
  279. .filter { font-size: 13px; color: #c3c8d0; cursor: pointer; user-select: none; }
  280. nav { display: flex; flex-wrap: wrap; gap: 8px; padding: 12px 24px; border-bottom: 1px solid #2a2e37; }
  281. nav a { color: #c3c8d0; text-decoration: none; font-size: 12px; padding: 4px 10px;
  282. background: #1a1d24; border-radius: 6px; }
  283. nav a small { color: #8b919b; }
  284. nav a:hover { background: #262a33; }
  285. section { padding: 8px 24px 32px; }
  286. h2 { font-size: 16px; border-bottom: 1px solid #2a2e37; padding-bottom: 6px; }
  287. h2 .secstats { font-size: 12px; font-weight: 400; color: #8b919b; margin-left: 8px; }
  288. .row { display: grid; grid-template-columns: 190px 1fr; gap: 14px; padding: 12px 0;
  289. border-bottom: 1px solid #1c2027; align-items: start; }
  290. .row.gap { background: #1a140c22; }
  291. .rowhead { font-size: 13px; word-break: break-word; }
  292. .rowhead small { color: #8b919b; font-size: 11px; }
  293. .pair { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
  294. .colbar { display: grid; grid-template-columns: 190px 1fr; gap: 14px; position: sticky;
  295. top: 118px; z-index: 5; background: #0f1115; padding: 6px 0; }
  296. .colbar .cols { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; }
  297. .colbar .cols span { font-weight: 700; color: #9aa0aa; font-size: 12px;
  298. text-transform: uppercase; letter-spacing: .05em; }
  299. .colbar .cols .mlab { color: #f0b866; }
  300. .colbar .cols .pyth { color: #6cc2f0; }
  301. .cell { background: #1a1d24; border: 1px solid #2a2e37; border-radius: 8px; padding: 8px;
  302. display: flex; flex-direction: column; align-items: center; }
  303. .cell img { max-width: 100%; height: auto; border-radius: 4px; background: #fff; }
  304. .cell.missing { justify-content: center; min-height: 120px; color: #8b6a3a;
  305. border-style: dashed; font-style: italic; }
  306. .fname { font-size: 10px; color: #7c828c; margin-top: 6px; word-break: break-all; text-align: center; }
  307. .colhdr { display: grid; grid-template-columns: 190px 1fr; gap: 14px; padding: 6px 24px 0; }
  308. .colhdr .labels { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; font-weight: 700; color: #9aa0aa; }
  309. </style></head><body>
  310. """
  311. FOOTER = """
  312. <script>
  313. document.getElementById('onlyGaps').addEventListener('change', function(e){
  314. const on = e.target.checked;
  315. document.querySelectorAll('.row').forEach(r => {
  316. r.style.display = (on && r.dataset.gap === '0') ? 'none' : '';
  317. });
  318. });
  319. </script>
  320. </body></html>
  321. """
  322. def main():
  323. ap = argparse.ArgumentParser(description=__doc__)
  324. ap.add_argument("--matlab", default="OutputData24Dec2025")
  325. ap.add_argument("--python", default="OutputData_Python")
  326. ap.add_argument("--out", default="plot_parity_report.html")
  327. ap.add_argument("--filter", default=None,
  328. help="only include PNGs whose relative path matches this regex "
  329. "(e.g. a subsystem like the stim plots)")
  330. args = ap.parse_args()
  331. filt = re.compile(args.filter) if args.filter else None
  332. res = build_report(Path(args.matlab), Path(args.python), Path(args.out), filt=filt)
  333. print(f"Wrote {res['out']}")
  334. print(f" paired: {res['paired']}")
  335. print(f" MATLAB-only: {res['matlab_only']}")
  336. print(f" Python-only: {res['python_only']}")
  337. print(" by section:")
  338. for sec, (b, mo, po, tot) in res["sections"].items():
  339. print(f" {sec:45s} {b:4d} paired {mo:4d} MATLAB-only {po:4d} Python-only")
  340. if __name__ == "__main__":
  341. main()

plot_parity_report.py at commit 9a8eaf2, under GPL-3.0 · at the source

Overview

Authors: Adam Pavlinek1,2, Sara Guerrisi1,2, Kara O’Driscoll1,2, Lucia Dutan Polit1,2, Roland Nagy1,2, APEX consortium, Madeline A. Lancaster3, Anthony C. Vernon1,2, Deepak P. Srivastava1,2,4
  1. Department of Basic and Clinical Neuroscience, Institute of Psychiatry, Psychology and Neuroscience, King’s College London, London SE5 9RT, UK
  2. MRC Centre for Neurodevelopmental Disorders, King’s College London, London, UK
  3. MRC Laboratory of Molecular Biology, Cambridge, UK
  4. Dementia Research Institute, King’s College London, London, UK
Institutions: King's College London (United Kingdom); MRC Centre for Neurodevelopmental Disorders (United Kingdom); MRC Laboratory of Molecular Biology (United Kingdom)
Journal: Cell reports methods, volume 6, issue 4, article 101371
Dates: received 8 April 2025; accepted 26 February 2026; published online 27 March 2026; in print April 2026
Type: Research article · Language: English
License: CC BY
Identifiers: DOI 10.1016/j.crmeth.2026.101371 · PMID 41903542 · PMCID PMC13107059 · OpenAlex W7141245314
Open access: gold, a free copy (OpenAlex)
Status: code verified (how the code is found and verified)
Categories: extracellular electrophysiology (units, LFP) (modality), human (organism)
Methods: Spectral & time-frequency, Statistics, Smoothing, state filtering, decompositions, Machine learning, Graphs, Single-unit activity, calcium imaging
Keywords: human induced pluripotent stem cells, micro-electrode arrays, MEA, cerebral organoids, neuronal cultures, functional connectivity, network dynamics, electrophysiology, estradiol, synaptic plasticity
MeSH: Brain*, Electrophysiological Phenomena*, Neuronal Plasticity*, Organoids*, Cell Differentiation, Cell Line, Humans, Microelectrodes, Neurodevelopment, Neurons (* major topic)
Topic: Neurogenesis and neuroplasticity mechanisms (Developmental Neuroscience, Neuroscience), according to OpenAlex
Funding: UK Medical Research Council (MR/L021064/1, MR/Y012968/1, MR/X004112/1, MR/Y008170/1); Simons Foundation Autism Research Initiative; Brain and Behavior Foundation (25957); MRC Centre for Neurodevelopmental Disorders, Medical Research Council (MR/P502108/1); Psychiatry Research Trust
Citations: not cited yet (Europe PMC); 96 references in the paper
Research resources: Sheep anti-EOMES (TBR2) (1:200) RRID:AB_10569705, Mouse anti-VGLUT1 (1:100) RRID:AB_10673111, Rabbit anti-EMX1 (1:200) RRID:AB_1078739, Rabbit anti-NEUROD2 (1:200) RRID:AB_10975628, Goat Anti-rabbit Alexa Fluor 568 RRID:AB_143157, Goat Anti-rabbit Alexa Fluor 488 RRID:AB_143165, Rat anti-CTIP2 (1:100) RRID:AB_2064130, Rabbit anti-TBR1 (1:200) RRID:AB_2200219, Goat Anti-mouse Alexa Fluor 488 RRID:AB_2534069, Donkey Anti-goat Alexa Fluor 488 RRID:AB_2534102, Goat Anti-guinea pig Alexa Fluor 488 RRID:AB_2534117, Goat Anti-guinea pig Alexa Fluor 568 RRID:AB_2534119, Goat Anti-rat Alexa Fluor 568 RRID:AB_2534121, Donkey Anti-sheep Alexa Fluor 568 RRID:AB_2535753, Donkey Anti-mouse Alexa Fluor 594 RRID:AB_2535789, Donkey Anti-rabbit Alexa Fluor 488 RRID:AB_2535792, Goat Anti-rabbit Alexa Fluor 647 RRID:AB_2535813, Mouse anti-TRA-1-81 (1:100) RRID:AB_2536706, Rabbit anti-GABA (1:500) RRID:AB_2549714, Guinea Pig anti-MAP2 (1:500) RRID:AB_2756610, Chicken anti-GFAP (1:1000) RRID:AB_304558, Goat anti-Nanog (1:100) RRID:AB_355097, Mouse anti-DLX2 (1:200) RRID:AB_3678657, Mouse anti-OCT3/4 (1:200) RRID:AB_628051

Abstract

Microelectrode arrays (MEAs) are increasingly used to profile the development of synchronized activity in neural organoids, yet no organoid study has reported on the consistency of electrophysiological development across cell lines. Here, we used dissociated neural organoids derived from six cell lines on MEAs to characterize functional synapse development using multiple parameters across time. The dissociated organoids demonstrated increasing functional connectivity and network activity over time across all cell lines and plasticity in response to synaptic-like stimulation. Like the organoids they were derived from, dissociated organoid cultures contained a diverse mixture of cell types. These results demonstrate that dissociated cerebral organoids can generate functional neurons, akin to primary neuronal cultures from brain tissue, providing a scalable model for studies of neurodevelopment and synaptic function. Consistent with unguided differentiation, we observed variability in activity parameters linked to donor cell line and batch effects, which must be considered in experimental design.

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 7 matches between paragraphs and lines of code.

SAND-Lab/MEA-NAP

License: GPL-3.0
State: the link answers, verified on 30 September 2026
Evidence: files inventoried
Commit: 9a8eaf2b3ba2ce771aeffb16baf3aef50db31903, 25 September 2026
Languages: MATLAB (471), Python (277), JavaScript (15), C (3), Jupyter (3)
Size: 1,199 files, 769 scripts
Software Heritage: not archived
Found in: the text, “Key resources table”
Holds: README, license file, environment (pyproject.toml, uv.lock, docs/requirements.txt), tests, continuous integration, documentation, 3 notebooks
Not found: CITATION.cff
Tools: NumPy (159 files), pandas (55 files), Brain Connectivity Toolbox (33 files), Statistics and Machine Learning Toolbox (30 files), Matplotlib (30 files), SciPy (27 files), h5py (7 files), Signal Processing Toolbox (7 files), SpikeInterface (7 files), scikit-learn (6 files), Pillow (5 files), Numba (3 files), Wavelet Toolbox (2 files), scikit-image (2 files), seaborn (2 files), Image Processing Toolbox (1 file), Optimization Toolbox (1 file), NetworkX (1 file), PyWavelets (1 file), statsmodels (1 file)
Availability: 1 check, the latest on 30 September 2026: the link answers
  • 30 September 2026: the link answers
771 files

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:

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

Datasets cited

Data and code availability

• Bulk RNA-seq data have been deposited at GEO: GSE292624. Raw MEA data and well average data for all parameters have been deposited at King’s Open Research Data System (KORDS) at https://doi.org/10.18742/c.8097928. These are all publicly available as of the date of publication. Microscopy data reported in this paper will be shared by the lead contact upon request. • This paper does not report original code. • Any additional information required to reanalyze the data reported in this paper is available from the lead contact upon request.

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, 9 authors, 10 keywords, 10 MeSH terms, 5 funders, 93 references, 24 RRIDs.

Cite

This paper

Pavlinek, A., Guerrisi, S., O’Driscoll, K., Polit, L. D., Nagy, R., APEX consortium, Lancaster, M. A., Vernon, A. C., & Srivastava, D. P. (2026). Electrophysiological development and functional plasticity in dissociated human cerebral organoids across multiple cell lines. Cell reports methods, 6(4), 101371. https://doi.org/10.1016/j.crmeth.2026.101371

BibTeX

@article{pavlinek2026electrophysiological,
author = {Pavlinek, Adam and Guerrisi, Sara and O’Driscoll, Kara and Polit, Lucia Dutan and Nagy, Roland and {APEX consortium} and Lancaster, Madeline A. and Vernon, Anthony C. and Srivastava, Deepak P.},
title = {{Electrophysiological development and functional plasticity in dissociated human cerebral organoids across multiple cell lines}},
journal = {Cell reports methods},
year = {2026},
month = mar,
volume = {6},
number = {4},
pages = {101371},
publisher = {Elsevier},
issn = {2667-2375},
doi = {10.1016/j.crmeth.2026.101371},
url = {https://doi.org/10.1016/j.crmeth.2026.101371},
pmid = {41903542},
pmcid = {PMC13107059}
}

RIS

TY - JOUR
AU - Pavlinek, Adam
AU - Guerrisi, Sara
AU - O’Driscoll, Kara
AU - Polit, Lucia Dutan
AU - Nagy, Roland
AU - APEX consortium
AU - Lancaster, Madeline A.
AU - Vernon, Anthony C.
AU - Srivastava, Deepak P.
TI - Electrophysiological development and functional plasticity in dissociated human cerebral organoids across multiple cell lines
T2 - Cell reports methods
J2 - Cell Rep Methods
PY - 2026
DA - 2026/03/27
VL - 6
IS - 4
SP - 101371
SN - 2667-2375
PB - Elsevier
DO - 10.1016/j.crmeth.2026.101371
UR - https://doi.org/10.1016/j.crmeth.2026.101371
LA - en
ER -

CSL-JSON

{
"id": "10.1016/j.crmeth.2026.101371",
"type": "article-journal",
"title": "Electrophysiological development and functional plasticity in dissociated human cerebral organoids across multiple cell lines",
"container-title": "Cell reports methods",
"author": [
{
"family": "Pavlinek",
"given": "Adam"
},
{
"family": "Guerrisi",
"given": "Sara"
},
{
"family": "O’Driscoll",
"given": "Kara"
},
{
"family": "Polit",
"given": "Lucia Dutan"
},
{
"family": "Nagy",
"given": "Roland"
},
{
"literal": "APEX consortium"
},
{
"family": "Lancaster",
"given": "Madeline A."
},
{
"family": "Vernon",
"given": "Anthony C."
},
{
"family": "Srivastava",
"given": "Deepak P."
}
],
"container-title-short": "Cell Rep Methods",
"volume": "6",
"issue": "4",
"page": "101371",
"DOI": "10.1016/j.crmeth.2026.101371",
"PMID": "41903542",
"PMCID": "PMC13107059",
"ISSN": "2667-2375",
"publisher": "Elsevier",
"URL": "https://doi.org/10.1016/j.crmeth.2026.101371",
"language": "en",
"issued": {
"date-parts": [
[
2026,
3,
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.1016/j.crmeth.2024.100901 [code]
MEA-NAP: A flexible network analysis pipeline for neuronal 2D and 3D organoid multielectrode recordings.
Journal: Cell reports methods
In common: SpikeInterface, PyWavelets, Wavelet Toolbox, 17 other tools, DOI 10.7910/dvn/z14lwa, extracellular electrophysiology (units, LFP), 2 references
[2] doi:10.64898/2025.12.17.694950 [code]
Mecp2 deficiency impairs microscale cortical network topology and dynamics in a Rett syndrome mouse model
Journal: bioRxiv (preprint)
In common: SpikeInterface, PyWavelets, Wavelet Toolbox, 17 other tools, extracellular electrophysiology (units, LFP), 2 references
[3] doi:10.1002/adhm.202504889 [code]
Mapping the Cerebral Organoid Landscape: A Systematic Review of Preclinical 3D Models in Neuroscience.
Journal: Advanced healthcare materials
In common: Numba, pandas, SciPy, 2 other tools, 15 references
[4] doi:10.1038/s41586-025-09151-3 [code]
Morphodynamics of human early brain organoid development.
Journal: Nature
In common: Numba, NetworkX, scikit-image, 9 other tools, 6 references
[5] doi:10.1038/s41467-026-71458-0 [code]
Early differential impact of MeCP2 mutations on functional networks in Rett syndrome patient-derived human cortical organoids.
Journal: Nature communications
In common: Wavelet Toolbox, Brain Connectivity Toolbox, Numba, 10 other tools, 3 references
[6] doi:10.1038/s41467-022-33364-z [code]
Modeling human telencephalic development and autism-associated SHANK3 deficiency using organoids generated from single neural rosettes.
Journal: Nature communications
In common: Numba, Pillow, seaborn, 5 other tools, 10 references
[7] doi:10.1016/j.isci.2024.109415
Cortical brain organoid slices (cBOS) for the study of human neural cells in minimal networks.
Journal: iScience
In common: 13 references
[8] doi:10.1038/s41467-022-32115-4 [code]
Functional neuronal circuitry and oscillatory dynamics in human brain organoids.
Journal: Nature communications
In common: Pillow, Signal Processing Toolbox, seaborn, 4 other tools, extracellular electrophysiology (units, LFP), 8 references
[9] doi:10.1002/advs.202519893 [code]
NeuroSuite for Long-Term Functional and Structural Studies of Air-Liquid Interface Cerebral Organoids.
Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)
In common: Wavelet Toolbox, Pillow, Signal Processing Toolbox, 5 other tools, extracellular electrophysiology (units, LFP), 7 references
[10] doi:10.1371/journal.pbio.3003757 [code]
Cell type-agnostic transcriptomic signatures enable uniform comparisons of neural maturation.
Journal: PLoS biology
In common: NetworkX, h5py, seaborn, 5 other tools, 7 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.

Add the badge to the code's README

OSCR: the badge of this paper

If you are an author or a maintainer of this paper's code, you can add this badge. It says what OSCR knows of the paper (its code, its validated tracing map) and links the code to this page. Paste one of these snippets under the README's title. Keep the two marks around it, so that the badge can be replaced in place and is never added twice. OSCR changes nothing in your repository.

Markdown
<!-- oscr-badge:start -->
[![OSCR](https://openscicode.org/badge/doi/10.1016/j.crmeth.2026.101371.svg)](https://openscicode.org/badge/doi/10.1016/j.crmeth.2026.101371)
<!-- oscr-badge:end -->
reStructuredText
.. oscr-badge:start

.. image:: https://openscicode.org/badge/doi/10.1016/j.crmeth.2026.101371.svg
   :target: https://openscicode.org/badge/doi/10.1016/j.crmeth.2026.101371
   :alt: OSCR

.. oscr-badge:end
HTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1016/j.crmeth.2026.101371"><img src="https://openscicode.org/badge/doi/10.1016/j.crmeth.2026.101371.svg" alt="OSCR"></a>
<!-- oscr-badge:end -->

On GitHub, open the README, choose Edit (the pencil), paste the snippet under the title, then "Commit changes".

If you choose to, you can have the badge kept up to date for you, with oscr badge --write from the command line or with the GitHub Action in your repository's workflows. Every other form and option (a card, AsciiDoc, LaTeX, shields.io) is on the badge 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: code errors and mismatches between the code and the paper about this paper and its code, from readers and its authors, beside the paper and its tracing map.

Report a mismatch between the code and the paper · Report a code error (signed in)

Reproductions: reports from readers who ran the authors' code and did not get the paper's result, what they ran, with which environment, commit and data.

Report a reproduction failure (signed in)

Versions of its code: the releases of its code tied to a version of this paper (the preprint, the accepted manuscript, the version of record…), each with the tracing map versioned with it.

Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.