Multimodal reference brain atlas of adult <i>Danionella cerebrum</i>
The 2 matches
- [1] § Methods › Sexual dimorphism analysis ↔ Fig5.ipynb, lines 289–333 · score 0.68 · female biased, male female, volume change, dimorphic, Figure 5
- [2] § Methods › Brain area overrepresentation analysis ↔ Fig4.ipynb, lines 890–929 · score 0.52 · Phipson Smyth, enrichment, permutation, Figure 4
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
Jupyter notebook · 581 lines · 18 KB · CC-BY-NC-SA-4.0 · 1 match
- # %% [markdown]
- # ## Notebook to generate the panels for the Fig. 5 of Kadobianskyi et al., 2026
- # %% [markdown]
- # ### Registration and analysis of the morphological differences in male and female Danionella cerebrum
- # %% [markdown]
- # Load libraries, ants numpy matplotlib. Additional requirements: pandas, seaborn
- # %%
- %env ITK_GLOBAL_DEFAULT_NUMBER_OF_THREADS=16
- import ants
- import numpy as np
- from matplotlib import pyplot as plt
- import sys, os
- from ants.core import ants_image_io as iio
- # %% [markdown]
- # Load the template
- # %%
- template_mixed = ants.image_read('./template_2p_mixed.nii')
- template_mixed
- # %%
- plt.figure(figsize=(12, 12), dpi=100)
- plt.imshow(template_mixed.max(2), cmap='gray')
- plt.show()
- # %% [markdown]
- # Load the jacobian determinants of the warp maps from each individual male and female fish to the mixed template. These were generated from the warp maps in the following way:
- #
- # ```
- # male_warped = ants.image_read('.../fish01.regd.nii.gz') # and 10 other warp maps for male fish
- # female_warped = ants.image_read('.../fish11.regd.nii.gz') # and 9 other warp maps for female fish
- #
- # logj_female = ants.create_jacobian_determinant_image(domain_image=template_mixed, do_log=True, tx='.../deformations/fish01.warptotemp.nii.gz')
- # logj_male = ants.create_jacobian_determinant_image(domain_image=template_mixed, do_log=True, tx='.../deformations/fish11.warptotemp.nii.gz')
- # ```
- #
- # and saved into the lists of warp maps onto the disk
- #
- # ```
- # logjs_male_np = [logj.numpy() for logj in logjs_male]
- # logjs_female_np = [logj.numpy() for logj in logjs_female]
- # np.savez_compressed('./logjs.npz', female=logjs_female_np, male=logjs_male_np)
- # %%
- logjs = np.load('sdm//logjs.npz')
- # %%
- logjs_female_np = logjs['female']
- logjs_male_np = logjs['male']
- # %% [markdown]
- # Load the segmentation with masks and remove the eyes
- # %%
- masks = ants.image_read('./segmentation.nii.gz')
- masks_np = masks.numpy()
- masks_np[masks_np == 204] = 0
- # %%
- z = 95
- plt.figure(figsize=(12, 12), dpi=100)
- plt.imshow(masks_np[:,:,z], cmap='Reds', alpha=.5)
- plt.imshow(logjs_male_np[1][:,:,z], cmap='Greys', alpha=.5)
- plt.show()
- # %% [markdown]
- # Import the label definitions
- # %%
- from collections import defaultdict
- label_names = {}
- with open('./dc_label_descriptions.txt', 'r') as file:
- lines = file.readlines()
- for line in lines:
- if line.startswith('#') or line.strip() == '':
- continue
- parts = line.strip().split()
- index = int(parts[0])
- name = ' '.join(parts[7:]).replace('"', '')
- label_names[index] = name
- # %% [markdown]
- # Prepare the test code
- # %%
- import numpy as np
- import pandas as pd
- from scipy.stats import t as tdist
- from statsmodels.stats.multitest import multipletests
- def prepare_label_index(masks_np, include_ids=None, exclude_ids=None):
- lab = np.asarray(masks_np, dtype=np.int64).ravel()
- if include_ids is None:
- label_ids = np.unique(lab)
- label_ids = label_ids[label_ids != 0]
- else:
- label_ids = np.array(sorted(i for i in include_ids if i != 0), dtype=np.int64)
- if exclude_ids is not None:
- exclude_ids = set(int(x) for x in exclude_ids)
- label_ids = np.array([i for i in label_ids if i not in exclude_ids], dtype=np.int64)
- if label_ids.size == 0:
- raise ValueError("No labels left after filtering.")
- lut = np.full(int(lab.max()) + 1, -1, dtype=np.int64)
- lut[label_ids] = np.arange(label_ids.size, dtype=np.int64)
- roi_index = lut[lab]
- keep_mask = roi_index >= 0
- roi_index = roi_index[keep_mask]
- voxel_counts = np.bincount(roi_index, minlength=label_ids.size)
- return roi_index, keep_mask, label_ids, voxel_counts
- def compute_roi_means(volumes, keep_mask, roi_index, n_rois):
- X = np.zeros((len(volumes), n_rois), dtype=np.float64)
- for i, vol in enumerate(volumes):
- values = np.asarray(vol).ravel()[keep_mask]
- sums = np.bincount(roi_index, weights=values, minlength=n_rois)
- counts = np.bincount(roi_index, minlength=n_rois)
- X[i] = sums / np.maximum(counts, 1)
- return X
- # convert log differences to linear differences
- def compute_mean_roi_volumes(volumes, keep_mask, roi_index, n_rois):
- out = np.zeros(n_rois, dtype=np.float64)
- for vol in volumes:
- jac = np.exp(np.asarray(vol).ravel()[keep_mask])
- sums = np.bincount(roi_index, weights=jac, minlength=n_rois)
- out += sums
- return out / max(len(volumes), 1)
- # Main test function for the Welch t-test
- def roi_stats_logJ(
- logjs_male_np,
- logjs_female_np,
- masks_np,
- label_info=None,
- include_ids=None,
- exclude_ids=None,
- min_voxels=50, # min voxel number per mask to consider for the test
- ):
- roi_index_all, keep_mask, label_ids_all, voxel_counts_all = prepare_label_index(
- masks_np,
- include_ids=include_ids,
- exclude_ids=exclude_ids,
- )
- n_rois_all = label_ids_all.size
- Xm_all = compute_roi_means(logjs_male_np, keep_mask, roi_index_all, n_rois_all)
- Xf_all = compute_roi_means(logjs_female_np, keep_mask, roi_index_all, n_rois_all)
- keep_roi = voxel_counts_all >= int(min_voxels)
- label_ids = label_ids_all[keep_roi]
- voxel_counts = voxel_counts_all[keep_roi]
- Xm = Xm_all[:, keep_roi]
- Xf = Xf_all[:, keep_roi]
- nm = Xm.shape[0]
- nf = Xf.shape[0]
- mean_m = Xm.mean(axis=0)
- mean_f = Xf.mean(axis=0)
- var_m = Xm.var(axis=0, ddof=1)
- var_f = Xf.var(axis=0, ddof=1)
- delta_logJ = mean_m - mean_f
- pooled_var = ((nm - 1) * var_m + (nf - 1) * var_f) / max(nm + nf - 2, 1)
- pooled_sd = np.sqrt(np.maximum(pooled_var, 1e-12))
- # Effect sizes: Cohen's d / Hedge's g
- cohens_d = delta_logJ / pooled_sd
- J = 1.0 - 3.0 / (4 * (nm + nf) - 9)
- hedges_g = J * cohens_d
- vol_m_all = compute_mean_roi_volumes(logjs_male_np, keep_mask, roi_index_all, n_rois_all)
- vol_f_all = compute_mean_roi_volumes(logjs_female_np, keep_mask, roi_index_all, n_rois_all)
- vol_m = vol_m_all[keep_roi]
- vol_f = vol_f_all[keep_roi]
- # linear volume difference
- delta_pct = 100.0 * (vol_m - vol_f) / (vol_f + 1e-12)
- se = np.sqrt(np.maximum(var_m / nm + var_f / nf, 1e-18))
- t_stat = delta_logJ / se
- df_num = (var_m / nm + var_f / nf) ** 2
- df_den = (
- (var_m ** 2) / (nm ** 2 * max(nm - 1, 1))
- + (var_f ** 2) / (nf ** 2 * max(nf - 1, 1))
- )
- dof = np.maximum(df_num / np.maximum(df_den, 1e-18), 1.0)
- # p-value
- p_value = 2.0 * tdist.sf(np.abs(t_stat), dof)
- # correct for multiple tests
- reject_null, p_value_adj, _, _ = multipletests(p_value, method="fdr_bh")
- df = pd.DataFrame({
- "label_id": label_ids.astype(int),
- "n_vox": voxel_counts.astype(int),
- "mean_male": mean_m,
- "mean_female": mean_f,
- "delta_logJ": delta_logJ,
- "vol_m": vol_m,
- "vol_f": vol_f,
- "delta_pct": delta_pct,
- "sd_male": np.sqrt(var_m),
- "sd_female": np.sqrt(var_f),
- "cohens_d": cohens_d,
- "hedges_g": hedges_g,
- "p_value": p_value,
- "p_value_adj": p_value_adj,
- "reject_null": reject_null,
- })
- if label_info is not None:
- df["label_name"] = pd.Series(label_info).reindex(df["label_id"]).values
- return df.sort_values("p_value_adj").reset_index(drop=True)
- def largest_volume_changes(df, top_n=20, only_sig=False, q=0.05):
- d = add_delta_pct_if_missing(df)
- if only_sig and "p_value_adj" in d.columns:
- d = d[d["p_value_adj"] < q]
- d = d.sort_values("delta_pct", key=lambda s: np.abs(s), ascending=False)
- cols = [
- c for c in [
- "label_id", "label_name", "n_vox",
- "vol_m", "vol_f",
- "mean_male", "mean_female", "delta_logJ", "delta_pct",
- "cohens_d", "hedges_g",
- "p_value", "p_value_adj", "reject_null", "direction"
- ]
- if c in d.columns
- ]
- return d[cols].head(top_n)
- # %% [markdown]
- # Now run the test
- # %%
- df_jac = roi_stats_logJ(
- logjs_male_np=logjs_male_np,
- logjs_female_np=logjs_female_np,
- masks_np=masks_np, # segmentation mask
- label_info=label_names, # label names / IDs
- exclude_ids=None, # no labels excluded
- min_voxels=0 # no small labels excluded
- )
- # Can be loaded from sdm/welch_SDM_table.csv
- # %%
- df_jac.head()
- # %% [markdown]
- # Build a plot of top 10 male- and top 10 female-biased brain regions by relative volume change (linear)
- # %%
- import numpy as np
- import pandas as pd
- import seaborn as sns
- import matplotlib.pyplot as plt
- def plot_regions_by_percent_change(
- df, top_n=20, title="Dimorphic regions by volume change",
- out_pdf="regions_percent_change.pdf",
- p_col="p_value_adj",
- size_cap_log10=6.0, size_range=(50, 300),
- palette={"female > male": "#5E81AC", "male > female": "#D08770"},
- show_size_legend=True,
- # squish the plot around the middle -20/+20% to preserve space
- squish=True, gap=20.0, center_scale=0.35,
- ):
- """
- Plot dimorphic regions along a single vertical axis.
- - Selects top_n/2 regions with largest negative delta_pct (female > male)
- and top_n/2 with largest positive delta_pct (male > female),
- then plots them together on one axis.
- - x-axis is delta_pct (male − female), squished around 0.
- - Dot size indicates significance (-log10 p).
- """
- d = df.copy()
- # Split into male-biased (delta>0) and female-biased (delta<0)
- d_pos = d[d["delta_pct"] > 0].copy() # male > female
- d_neg = d[d["delta_pct"] < 0].copy() # female > male
- # Top N labels per side (male/female)
- n_each = max(1, top_n // 2)
- pos_top = d_pos.sort_values("delta_pct", ascending=False).head(n_each)
- neg_top = d_neg.sort_values("delta_pct", ascending=True).head(n_each)
- # Combine and sort by signed delta so female-biased appear at top
- d_plot = pd.concat([neg_top, pos_top], axis=0)
- d_plot = d_plot.sort_values("delta_pct", ascending=True).copy()
- # Direction labels for coloring
- d_plot["Direction"] = np.where(
- d_plot["delta_pct"] > 0, "male > female", "female > male"
- )
- # Region names for y-axis
- d_plot["Region"] = d_plot.get("label_name", d_plot.get("label_id"))
- d_plot["Region"] = d_plot["Region"].fillna(d_plot.get("label_id")).astype(str)
- d_plot["Region"] = pd.Categorical(
- d_plot["Region"], categories=d_plot["Region"], ordered=True
- )
- # Significance → size mapping
- q = d_plot.get(p_col, d_plot.get("p_value", pd.Series(np.ones(len(d_plot))))).astype(float)
- q = q.fillna(1.0).clip(lower=1e-300, upper=1.0)
- sig = np.minimum(-np.log10(q), size_cap_log10) / size_cap_log10
- s_min, s_max = size_range
- sizes = s_min + sig * (s_max - s_min)
- # transform x axis (squish)
- x = d_plot["delta_pct"].values.astype(float)
- def ticks_from_data(x_vals, gap=15.0):
- lo, hi = np.min(x_vals), np.max(x_vals)
- step = 20.0
- base = np.arange(np.floor(lo/step)*step, np.ceil(hi/step)*step + 0.1, step)
- for v in (-gap, 0.0, +gap):
- if v < lo or v > hi:
- continue
- if not np.any(np.isclose(base, v)):
- base = np.sort(np.r_[base, v])
- return base
- if squish and np.any(x < -gap) and np.any(x > gap) and center_scale < 1.0:
- b = center_scale * gap # new half-width for center
- shift = gap - b
- def f(v):
- v = np.asarray(v, float).copy()
- mid = (np.abs(v) <= gap)
- left = (v < -gap)
- right = (v > +gap)
- v[mid] = (b/gap) * v[mid] # compress center region
- v[left] = v[left] + shift # pull left block rightward
- v[right] = v[right] - shift # pull right block leftward
- return v
- x_plot = f(x)
- tick_vals = ticks_from_data(x, gap=gap)
- tick_pos = f(tick_vals)
- zero_x = f(np.array([0.0]))[0]
- else:
- def f(v): return np.asarray(v, float)
- x_plot = x
- tick_vals = ticks_from_data(x, gap=gap)
- tick_pos = f(tick_vals)
- zero_x = 0.0
- d_plot["_x_plot"] = x_plot
- # plot
- sns.set(style="white", rc={"axes.spines.right": False, "axes.spines.top": False})
- fig, ax = plt.subplots(figsize=(4, 7))
- h = sns.scatterplot(
- data=d_plot,
- x="_x_plot",
- y="Region",
- hue="Direction",
- palette=palette,
- edgecolor="white",
- linewidth=0.5,
- alpha=0.9,
- ax=ax,
- legend=False,
- )
- h.collections[-1].set_sizes(sizes)
- ax.axvline(zero_x, color="lightgray", linestyle="-", linewidth=1)
- # ticks show true values; positions are transformed
- ax.set_xticks(tick_pos)
- ax.set_xticklabels([f"{v:.0f}" for v in tick_vals])
- # small padding
- lo = x_plot.min()
- hi = x_plot.max()
- ax.set_xlim(lo - 0.05 * (hi - lo + 1e-9),
- hi + 0.05 * (hi - lo + 1e-9))
- ax.set_xlabel("Relative volume change (%), male − female", fontsize=14)
- ax.set_ylabel("Region")
- ax.set_title(title, fontsize=16)
- # size legend for p values
- if show_size_legend:
- example_p = np.array([0.05, 0.01, 0.001])
- ex_sig = np.minimum(-np.log10(example_p), size_cap_log10) / size_cap_log10
- ex_sizes = s_min + ex_sig * (s_max - s_min)
- handles = [
- plt.scatter([], [], s=s, c="gray", alpha=0.9, edgecolors="none")
- for s in ex_sizes
- ]
- labels = [f"p = {pv:g}" for pv in example_p]
- leg = ax.legend(
- handles, labels,
- title="significance",
- loc="upper right",
- frameon=False,
- labelspacing=0.6,
- )
- ax.add_artist(leg)
- for sp in ax.spines.values():
- sp.set_visible(False)
- plt.savefig(out_pdf, dpi=300, bbox_inches="tight")
- plt.show()
- # %%
- plot_regions_by_percent_change(
- df_jac,
- top_n=20, # 10 female>male + 10 male>female
- title="Dimorphic regions by volume change",
- out_pdf='sdm_ttest.pdf'
- )
- # %% [markdown]
- # Now calculate voxel-wise Cohen's d for the last panel
- # %%
- import numpy as np
- import matplotlib.pyplot as plt
- # 1) voxelwise Cohen's d from lists of logJ volumes in the template space
- def voxelwise_cohens_d_from_logJ(logjs_male_np, logjs_female_np, eps=1e-12):
- M = np.stack(logjs_male_np, axis=0).astype(np.float32) # (nm, X, Y, Z)
- F = np.stack(logjs_female_np, axis=0).astype(np.float32) # (nf, X, Y, Z)
- nm, nf = M.shape[0], F.shape[0]
- mean_m, mean_f = M.mean(0), F.mean(0)
- var_m = M.var(0, ddof=1)
- var_f = F.var(0, ddof=1)
- sp2 = ((nm-1)*var_m + (nf-1)*var_f) / max(1, (nm + nf - 2))
- sp = np.sqrt(np.maximum(sp2, eps))
- d = (mean_m - mean_f) / sp
- return d
- # %%
- d_vox = voxelwise_cohens_d_from_logJ(logjs_male_np, logjs_female_np)
- template_np = template_mixed.numpy()
- # %% [markdown]
- # Prepare the plot function
- # %%
- import numpy as np
- import matplotlib.pyplot as plt
- from matplotlib.colors import LinearSegmentedColormap, Normalize
- from mpl_toolkits.axes_grid1 import make_axes_locatable
- def hex2rgb(h):
- h = h.lstrip("#")
- return np.array([int(h[i:i+2], 16) for i in (0, 2, 4)], dtype=float) / 255.0
- def project_mip(vol3d, axis=2):
- return np.max(np.asarray(vol3d, float), axis=axis)
- def show_axial_split_male_female_vertical(
- d_vox,
- brain_mask=None,
- pos_color="#D08770",
- neg_color="#5E81AC",
- clip_pct=99.0,
- crop_to_mask=True,
- pad=2,
- figsize=(8.0, 8.0),
- title_pos="Male > female (|Cohen's d|)",
- title_neg="Female > male (|Cohen's d|)",
- out_pdf=None,
- ):
- d = np.asarray(d_vox, float)
- if brain_mask is not None:
- d = np.where(brain_mask, d, 0.0)
- dpos = np.maximum(d, 0.0)
- dneg = np.maximum(-d, 0.0)
- P = project_mip(dpos, axis=2)
- N = project_mip(dneg, axis=2)
- if crop_to_mask and brain_mask is not None:
- m2d = np.any(brain_mask, axis=2)
- ys, xs = np.where(m2d)
- if xs.size and ys.size:
- x0 = max(xs.min() - pad, 0)
- x1 = min(xs.max() + pad, P.shape[1] - 1)
- y0 = max(ys.min() - pad, 0)
- y1 = min(ys.max() + pad, P.shape[0] - 1)
- P = P[y0:y1+1, x0:x1+1]
- N = N[y0:y1+1, x0:x1+1]
- eps = 1e-12
- pmax = np.percentile(P[P > 0], clip_pct) if np.any(P > 0) else 1.0
- nmax = np.percentile(N[N > 0], clip_pct) if np.any(N > 0) else 1.0
- Pn = np.clip(P / (pmax + eps), 0, 1)
- Nn = np.clip(N / (nmax + eps), 0, 1)
- pos_cmap = LinearSegmentedColormap.from_list("pos", [(1, 1, 1), hex2rgb(pos_color)])
- neg_cmap = LinearSegmentedColormap.from_list("neg", [(1, 1, 1), hex2rgb(neg_color)])
- fig, axes = plt.subplots(2, 1, figsize=figsize, dpi=120, constrained_layout=True)
- ax_neg = axes[0]
- ax_neg.imshow(Nn, origin="lower", cmap=neg_cmap)
- ax_neg.set_title(title_neg, fontsize=12)
- ax_neg.axis("off")
- ax_pos = axes[1]
- ax_pos.imshow(Pn, origin="lower", cmap=pos_cmap)
- ax_pos.set_title(title_pos, fontsize=12)
- ax_pos.axis("off")
- for ax, vmax, label, cmap in [
- (ax_neg, nmax, r"Max |Cohen's d| along Z (female > male)", neg_cmap),
- (ax_pos, pmax, r"Max |Cohen's d| along Z (male > female)", pos_cmap),
- ]:
- divider = make_axes_locatable(ax)
- cax = divider.append_axes("right", size="3%", pad=0.05)
- mappable = plt.cm.ScalarMappable(norm=Normalize(0, vmax), cmap=cmap)
- cb = fig.colorbar(mappable, cax=cax, orientation="vertical")
- cb.set_label(label, rotation=90, labelpad=6)
- cb.outline.set_visible(False)
- cb.ax.tick_params(length=3, width=0)
- cb.ax.set_facecolor("none")
- if out_pdf is not None:
- plt.savefig(out_pdf, dpi=300, bbox_inches="tight")
- plt.show()
- # %%
- show_axial_split_male_female_vertical(
- d_vox,
- brain_mask=masks_np != 0,
- pos_color="#D08770",
- neg_color="#5E81AC",
- clip_pct=99.0,
- crop_to_mask=True,
- pad=2,
- out_pdf="cohensd_volume.pdf",
- )
- # %%
Fig5.ipynb at commit c855337, under CC-BY-NC-SA-4.0 · at the source
Overview
- Charité Universitätsmedizin, Berlin, Germany
- Massachusetts Institute of Technology, Cambridge, MA, USA
- University of Ottawa, Ottawa, Canada
Abstract
The abstract is not reproduced here: the paper's license (CC BY-NC-ND) does not allow it. Read it in the paper, at the publisher or on Europe PMC.
Repository
Its files are read in the Code ↔ Paper reader above, with 2 matches between paragraphs and lines of code.
gin.g-node.org/danionella/kadobianskyi_et_al_2026
c855337bd33084103fa3410d6f3c1a313fec388b, 16 July 2026Availability: 1 check, the latest on 30 September 2026: the link answers
- 30 September 2026: the link answers
4 files
- Fig4.ipynb, Jupyter, 1,085 lines, 1 match
- Fig5.ipynb, Jupyter, 581 lines, 1 match
- LICENSE, License, 105 lines
- README.md, Text, 43 lines
The paper's code and data availability statement is in the Data section.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 1 repository of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 2 scripts, each with its path and the digest of its content;
- 2 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
- gin.g-node.org/
danionella/ , at gin.g-node.org; found in “Data availability”dc_atlas
Code and data availability statement
The paper has a code and data availability statement. Its license (CC BY-NC-ND) does not allow reproducing it here; in short, from what the harvester recognized in it:
- it points to a dataset: gin.g-node.org/
danionella/ dc_atlas - it points to the authors' code: gin.g-node.org/
danionella/ kadobianskyi_et_al_2026
Read it in the paper: doi.org/10.64898/2026.03.09.710483.
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, journal, dates, 10 authors, 4 keywords, 1 funder, 94 references.
Cite
This paper
Kadobianskyi, M., Henninger, J., Markov, D., Groneberg, A., Veith, J., Renz, M., Atabay, K. D., Reddien, P. W., Maler, L., & Judkewitz, B. (2026). Multimodal reference brain atlas of adult <i>Danionella cerebrum</
BibTeX
@article{kadobianskyi202
author = {Kadobianskyi, Mykola and Henninger, Jörg and Markov, Daniil and Groneberg, Antonia and Veith, Johannes and Renz, Marc and Atabay, Kutay Deniz and Reddien, Peter W. and Maler, Leonard and Judkewitz, Benjamin},
title = {{Multimodal reference brain atlas of adult <i>Danionella cerebrum</
journal = {bioRxiv (preprint)},
year = {2026},
month = mar,
publisher = {bioRxiv},
issn = {2692-8205},
doi = {10.64898/
url = {https://
}
RIS
TY - JOUR
AU - Kadobianskyi, Mykola
AU - Henninger, Jörg
AU - Markov, Daniil
AU - Groneberg, Antonia
AU - Veith, Johannes
AU - Renz, Marc
AU - Atabay, Kutay Deniz
AU - Reddien, Peter W.
AU - Maler, Leonard
AU - Judkewitz, Benjamin
TI - Multimodal reference brain atlas of adult <i>Danionella cerebrum</
T2 - bioRxiv (preprint)
J2 - bioRxiv
PY - 2026
DA - 2026/
SN - 2692-8205
PB - bioRxiv
DO - 10.64898/
UR - https://
ER -
CSL-JSON
{
"id": "10.64898/
"type": "article",
"title": "Multimodal reference brain atlas of adult <i>Danionella cerebrum</
"container-title": "bioRxiv (preprint)",
"author": [
{
"family": "Kadobianskyi",
"given": "Mykola"
},
{
"family": "Henninger",
"given": "Jörg"
},
{
"family": "Markov",
"given": "Daniil"
},
{
"family": "Groneberg",
"given": "Antonia"
},
{
"family": "Veith",
"given": "Johannes"
},
{
"family": "Renz",
"given": "Marc"
},
{
"family": "Atabay",
"given": "Kutay Deniz"
},
{
"family": "Reddien",
"given": "Peter W."
},
{
"family": "Maler",
"given": "Leonard"
},
{
"family": "Judkewitz",
"given": "Benjamin"
}
],
"container-title-short":
"DOI": "10.64898/
"ISSN": "2692-8205",
"publisher": "bioRxiv",
"URL": "https://
"issued": {
"date-parts": [
[
2026,
3,
11
]
]
}
}
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.64898/2026.03.04.709502 [code]
- Distributed hierarchical filters partition the Danionella vocal repertoireJournal: bioRxiv (preprint)In common: ANTs, SciPy, Matplotlib, 1 other tool, 3 references, 2 authors
- [2] doi:10.1038/s41467-026-69633-4 [code]
- Visuomotor decision-making through multifeature convergence in the larval zebrafish hindbrain.Journal: Nature communicationsIn common: seaborn, pandas, SciPy, 2 other tools, 4 references
- [3] doi:10.1038/s41592-026-03179-7 [code]
- Voltage imaging of neurons distributed across entire brains of larval zebrafish.Journal: Nature methodsIn common: SciPy, Matplotlib, NumPy, optical imaging (calcium, voltage, 2-photon), histology / microscopy, 3 references
- [4] doi:10.1126/sciadv.aec6922 [code]
- A sensorimotor instability drives a locomotor transition during fish development.Journal: Science advancesIn common: 5 references
- [5] doi:10.1016/j.isci.2026.116206 [code]
- Gut distension evokes rapid neural dynamics in vagal and hindbrain populations of larval zebrafish.Journal: iScienceIn common: statsmodels, seaborn, pandas, 3 other tools, optical imaging (calcium, voltage, 2-photon), 2 references
- [6] doi:10.3390/cancers18162636 [code]
- Exploring the Impact of T2-Weighted MRI Fat Saturation on Radiomics Stability for Brain Radionecrosis Prediction After Skull-Base Proton Therapy: A Pilot Study.Journal: CancersIn common: ANTs, statsmodels, seaborn, 4 other tools, 1 reference
- [7] doi:10.1162/netn.a.547 [code]
- An evaluation of the efficacy of single-echo and multi-echo fMRI denoising strategies.Journal: Network neuroscience (Cambridge, Mass.)In common: ANTs, statsmodels, seaborn, 4 other tools, 1 reference
- [8] doi:10.1038/s41593-026-02376-z [code]
- A framework for comparative analysis of human and mouse cortical neuron dendrites in corresponding brain regions.Journal: Nature neuroscienceIn common: statsmodels, seaborn, pandas, 3 other tools, 2 references
- [9] doi:10.1002/alz.71649 [code]
- Postmortem brain MRI reveals differential associations of subcortical and limbic volumes with cortical thinning and neurodegenerative pathologies.Journal: Alzheimer's & dementia : the journal of the Alzheimer's AssociationIn common: ANTs, statsmodels, seaborn, 4 other tools, histology / microscopy
- [10] doi:10.1162/imag.a.1362 [code]
- Human fMRI at 11.7T: Assessing feasibility, stability, and reliability on the Iseult scanner.Journal: Imaging neuroscience (Cambridge, Mass.)In common: ANTs, statsmodels, seaborn, 4 other tools, methods / 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.
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: 1 repository of the authors' code, each at its verified commit and with its license, 2 scripts, and 2 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:dc60e8984a3fd337…
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
[.
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.
