Evaluating exon skipping in the central nervous system in Duchenne muscular dystrophy using spatial transcriptomics.
The 8 matches
- [1] § Results › Spatial localization of Dmd isoforms in the wildtype brain ↔ Xenium_marker_dotplot.ipynb, lines 94–109 · score 0.96 · DG IMN Glut, CNU HYa GABA, CTX MGE GABA, CTX CGE GABA, NP CT L6b, Astro Epen
- [2] § Results › Spatial divergence and coexpression of full-length and shorter Dmd isoforms in the wildtype mouse brain ↔ Xenium_marker_dotplot.ipynb, lines 94–109 · score 0.94 · CNU HYa Glut, CNU HYa GABA, CNU LGE GABA, CTX MGE GABA, NP CT L6b, OPC Oligo
- [3] § STAR★Methods › Method details › Differential expression analysis between exon 51-positive and exon 51-negative cells ↔ Skipping_DE.ipynb, lines 1250–1320 · score 0.87 · log fold change, rank genes, skipped positive, positive cells, Scanpy, iterations
- [4] § Results › Mdx52 mice show altered full-length isoform expression ↔ Xenium_marker_dotplot.ipynb, lines 172–189 · score 0.75 · medial amygdalar nucleus, olfactory areas, ventricular system, CA2, basolateral
- [5] § Results › Efficacy of exon 51-skipping events in the brain after therapeutic intervention ↔ Xenium_marker_dotplot.ipynb, lines 172–189 · score 0.63 · cortex L2, ventricular system, L5, CA1, L6b, cluster
- [6] § Results › Spatial localization of Dmd isoforms in the wildtype brain ↔ Isoform_comparison.ipynb, lines 1284–1306 · score 0.58 · Dp427p2, Dp427m, Dp427c, Dp71, Dp40, WT
- [7] § Results › Dp427-sized isoform restoration in exon 51-skipped cells ↔ Isoform_comparison.ipynb, lines 1146–1180 · score 0.52 · Dp427p, Dp427m, Dp427c, isoform, cells
- [8] § Results › Dp427-sized isoform restoration in exon 51-skipped cells ↔ Coexpression_Isoforms.ipynb, lines 41–136 · score 0.51 · Dp427p, Dp427m, Dp427c, isoform, cells
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 · 497 lines · 15 KB · GPL-3.0 · 4 matches
- # %%
- import spatialdata as sd
- import decoupler as dc
- from spatialdata_io import xenium
- import numpy as np
- import pandas as pd
- import scipy.sparse as sp
- import matplotlib as mpl
- import matplotlib.pyplot as plt
- import seaborn as sns
- import anndata as ad
- import scanpy as sc
- import squidpy as sq
- sc.set_figure_params(figsize=(12,12))
- mpl.rcParams['figure.dpi'] = 300
- # %%
- Sample_895=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_895.h5ad")
- Sample_894=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_894.h5ad")
- Sample_898=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_898.h5ad")
- Sample_896=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_896.h5ad")
- Sample_897=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_897.h5ad")
- Sample_18=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_18.h5ad")
- Sample_886=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_886.h5ad")
- Sample_890=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_890.h5ad")
- Sample_891=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_891.h5ad")
- Sample_4=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_4.h5ad")
- Sample_5=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_5.h5ad")
- Sample_3=sc.read_h5ad("/exports/archive/hg-exon-skip/Qirong/Xenium/scanpy_object/Sample_3.h5ad")
- # %%
- adatas = Sample_895.concatenate(Sample_894,Sample_898,Sample_896,Sample_897,Sample_18,Sample_886,Sample_890,Sample_891,Sample_4,Sample_5,Sample_3)
- # %%
- adatas.layers["counts"] = adatas.X.copy()
- adatas.obs_names_make_unique()
- # %%
- sc.pp.normalize_total(adatas)
- sc.pp.log1p(adatas)
- # %%
- sc.tl.rank_genes_groups(adatas, 'Class', method='wilcoxon',pts=True)
- # %%
- rank_genes_df = sc.get.rank_genes_groups_df(adatas, group=None)
- # %%
- rank_genes_df
- # %%
- rank_genes_df.to_excel("/exports/humgen/qmao/Xenium_celltype_rank_genes.xlsx", index=False, engine="openpyxl")
- # %%
- filtered_genes = rank_genes_df[(rank_genes_df['pvals_adj'] <0.05)]
- # %%
- filtered_genes
- # %%
- filtered_genes = rank_genes_df[(rank_genes_df['logfoldchanges'] > 1)]
- # %%
- filtered_genes = rank_genes_df[(rank_genes_df['logfoldchanges'] > 1) &
- (rank_genes_df['pct_nz_group'] > 0.7) &
- (rank_genes_df['pct_nz_reference'] < 0.5)]
- # %%
- top_genes_per_cluster = (
- filtered_genes.groupby('group') # 'group' column represents clusters
- .apply(lambda x: x.nlargest(3, 'logfoldchanges')) # Select top 5 genes by logFC
- .reset_index(drop=True)
- )
- # Extract unique gene names
- selected_genes = top_genes_per_cluster['names'].unique()
- # %%
- Class_order = [
- 'IT-ET Glut', 'NP-CT-L6b Glut', 'DG-IMN Glut', 'CTX-CGE GABA', 'CTX-MGE GABA',
- 'CNU-LGE GABA', 'CNU-HYa GABA', 'CNU-HYa Glut', 'HY GABA', 'HY Glut',
- 'MH-LH Glut', 'TH Glut', 'Astro-Epen', 'OPC-Oligo', 'Vascular', 'Immune'
- ]
- # Convert the `group` column to a categorical type with the desired order
- top_genes_per_cluster["group"] = pd.Categorical(
- top_genes_per_cluster["group"],
- categories=Class_order,
- ordered=True
- )
- # Sort the DataFrame by the `group` column
- top_genes_per_cluster = top_genes_per_cluster.sort_values(by="group")
- # %%
- selected_genes=top_genes_per_cluster["names"]
- # %%
- sc.pl.dotplot(adatas, var_names=selected_genes.unique(), groupby='Class', swap_axes=False,show=False, dot_max=0.5, standard_scale='var')
- # %%
- # Update rcParams for consistent formatting
- plt.rcParams.update({
- 'figure.dpi': 300,
- 'savefig.dpi': 300,
- 'font.size': 12,
- 'axes.titlesize': 12,
- 'axes.labelsize': 12,
- 'xtick.labelsize': 12,
- 'ytick.labelsize': 12,
- 'legend.fontsize': 12
- })
- mpl.rcParams['font.family'] = 'DejaVu Sans' # or 'Arial'
- mpl.rcParams['svg.fonttype'] = 'none'
- width_per_gene = 0.3 # inches per gene (adjust to taste)
- figsize = (len(selected_genes.unique()) * width_per_gene, 6)
- sc.pl.dotplot(adatas, var_names=selected_genes.unique(),figsize=figsize,groupby='Class', swap_axes=False,show=False,categories_order=Class_order, dot_max=1.0, dot_min=0.0, smallest_dot=0.1, standard_scale='var')
- plt.savefig(f"/exports/humgen/qmao/Dotplot_marker_class.svg",format="svg",dpi=300, bbox_inches='tight')
- plt.show()
- # %%
- sc.tl.rank_genes_groups(adatas, 'Region', method='wilcoxon',pts=True)
- # %%
- sc.tl.rank_genes_groups(adatas, 'Region', method='wilcoxon',pts=True)
- # %%
- rank_genes_df = sc.get.rank_genes_groups_df(adatas, group=None)
- # %%
- rank_genes_df.to_excel("/exports/humgen/qmao/Xenium_region_rank_genes.xlsx", index=False, engine="openpyxl")
- # %%
- filtered_genes = rank_genes_df[(rank_genes_df['logfoldchanges'] > 0.5) &
- (rank_genes_df['pct_nz_group'] > 0.6) &
- (rank_genes_df['pct_nz_reference'] < 0.5)]
- # %%
- top_genes_per_cluster = (
- filtered_genes.groupby('group') # 'group' column represents clusters
- .apply(lambda x: x.nlargest(3, 'logfoldchanges')) # Select top 5 genes by logFC
- .reset_index(drop=True)
- )
- # Extract unique gene names
- selected_genes = top_genes_per_cluster['names'].unique()
- # %%
- # Define the specific order of row names (regions)
- region_order = [
- 'Cortex L1', 'Cortex L2/3', 'Cortex L4', 'Cortex L5', 'Cortex L6a', 'Cortex L6b','Retrosplenial cortex', 'Olfactory areas',
- 'CA1', 'CA2/3', 'Dendate gyrus', 'HPF field', 'Thalamus 1', 'Thalamus 2', 'Reticular nucleus', 'Lateral habenula', 'Medial habenula','Hypothalamus',
- 'Basolateral amygdalar nucleus',
- 'Central amygdalar nucleus', 'Medial amygdalar nucleus', 'Caudoputamen', 'Ventricular system','Fiber tracts','Unassigned'] # Example
- # Convert the `group` column to a categorical type with the desired order
- top_genes_per_cluster["group"] = pd.Categorical(
- top_genes_per_cluster["group"],
- categories=region_order,
- ordered=True
- )
- # Sort the DataFrame by the `group` column
- top_genes_per_cluster = top_genes_per_cluster.sort_values(by="group")
- selected_genes=top_genes_per_cluster["names"]
- # %%
- top_genes_per_cluster
- # %%
- selected_genes=top_genes_per_cluster["names"]
- adatas.obs["Region"].cat.reorder_categories(region_order)
- # %%
- # Update rcParams for consistent formatting
- plt.rcParams.update({
- 'figure.dpi': 300,
- 'savefig.dpi': 300,
- 'font.size': 12,
- 'axes.titlesize': 12,
- 'axes.labelsize': 12,
- 'xtick.labelsize': 12,
- 'ytick.labelsize': 12,
- 'legend.fontsize': 12
- })
- mpl.rcParams['font.family'] = 'DejaVu Sans' # or 'Arial'
- mpl.rcParams['svg.fonttype'] = 'none'
- width_per_gene = 0.3 # inches per gene (adjust to taste)
- figsize = (len(selected_genes.unique()) * width_per_gene, 8)
- sc.pl.dotplot(adatas, var_names=selected_genes.unique(),figsize=figsize,groupby='Region', swap_axes=False,show=False,categories_order=region_order, dot_max=1.0, dot_min=0.0, smallest_dot=0.1, standard_scale='var')
- plt.savefig(f"/exports/humgen/qmao/Dotplot_marker_region.svg",format="svg",dpi=300, bbox_inches='tight')
- plt.show()
- # %%
- import matplotlib.pyplot as plt
- import seaborn as sns
- import numpy as np
- adata=adatas
- # Replace with your gene names
- gene1 = "Slc17a7"
- gene2 = "Gfap"
- # Extract log-normalized expression values
- x = adata[:, gene1].X.toarray().flatten() if hasattr(adata[:, gene1].X, 'toarray') else adata[:, gene1].X.flatten()
- y = adata[:, gene2].X.toarray().flatten() if hasattr(adata[:, gene2].X, 'toarray') else adata[:, gene2].X.flatten()
- # Plot
- plt.figure(figsize=(6, 6))
- sns.scatterplot(x=x, y=y, s=10, alpha=0.6)
- plt.xlabel(f'{gene1} (Raw)')
- plt.ylabel(f'{gene2} (Raw)')
- plt.title(f'Scatter Plot: {gene1} vs {gene2}')
- plt.grid(True)
- plt.show()
- # %%
- # %%
- # %%
- counts_df=counts_df.fillna(0)
- # %%
- counts_df
- # %%
- # Step 1: Calculate the total number of cells for each sample (i.e., sum across rows for each column)
- total_cells_per_sample = counts_df.sum(axis=0)
- # Step 2: Calculate the percentage of cells in each region for each sample
- percentage_df = counts_df.div(total_cells_per_sample, axis=1) * 100
- # %%
- total_cells_per_sample
- # %%
- percentage_df
- # %%
- ### Immune
- # %%
- # List of AnnData objects (e.g., adata1, adata2, ...)
- adatas = [Sample_895, Sample_894, Sample_898,Sample_896,Sample_897,Sample_18,Sample_886,Sample_890,Sample_891,Sample_4,Sample_5,Sample_3,Sample_706,Sample_707,Sample_709T] # Replace with your actual AnnData objects
- # Initialize an empty list to store the counts per region for each sample in each AnnData object
- region_counts = []
- # Loop through each AnnData object to count occurrences of regions
- for adata in adatas:
- # Count the occurrences of each region in the "Regions" column
- adata = adata[adata.obs["Class"].isin(["Immune"]), :]
- counts_per_region = adata.obs["Region"].value_counts()
- # Append the result (this will be a pandas Series for each adata)
- region_counts.append(counts_per_region)
- # Convert the list of Series into a DataFrame
- counts_df = pd.DataFrame(region_counts).transpose()
- # Label columns (each corresponds to an AnnData object)
- counts_df.columns = [f"adata{i+1}" for i in range(len(adatas))]
- counts_df.columns = [adata.obs["Sample"].iloc[0] for adata in adatas]
- # %%
- # Define the specific order of row names (regions)
- region_order = [
- 'Cortex L1', 'Cortex L2/3', 'Cortex L4', 'Cortex L5', 'Cortex L6a', 'Cortex L6b','Retrosplenial cortex', 'Olfactory areas',
- 'CA1', 'CA2/3', 'Dendate gyrus', 'HPF field', 'Thalamus 1', 'Thalamus 2', 'Reticular nucleus', 'Lateral habenula', 'Medial habenula','Hypothalamus',
- 'Basolateral amygdalar nucleus',
- 'Central amygdalar nucleus', 'Medial amygdalar nucleus', 'Caudoputamen', 'Ventricular system','Fiber tracts','Unassigned'] # Example
- # Reorder rows based on the desired order (ensure all regions in `desired_region_order` exist in the counts_df index)
- counts_df = counts_df.loc[region_order]
- # %%
- counts_df=counts_df.fillna(0)
- # %%
- counts_df
- # %%
- # Step 1: Calculate the total number of cells for each sample (i.e., sum across rows for each column)
- total_cells_per_sample = counts_df.sum(axis=0)
- # Step 2: Calculate the percentage of cells in each region for each sample
- percentage_df = counts_df.div(total_cells_per_sample, axis=1) * 100
- # %%
- total_cells_per_sample
- # %%
- percentage_df
- # %%
- sq.pl.spatial_scatter(
- Sample_4,
- library_id="spatial",
- shape=None,
- color=[
- "Region",
- ],
- wspace=0.4,
- )
- # %%
- sq.pl.spatial_scatter(
- Sample_4,
- library_id="spatial",
- shape=None,
- color=[
- "Class",
- ],
- wspace=0.4,
- )
- # %%
- # List of AnnData objects (e.g., adata1, adata2, ...)
- adatas = [Sample_895, Sample_894, Sample_898,Sample_896,Sample_897,Sample_18,Sample_886,Sample_890,Sample_891,Sample_4,Sample_5,Sample_3,Sample_706,Sample_707,Sample_709T] # Replace with your actual AnnData objects
- # Initialize an empty list to store the counts per region for each sample in each AnnData object
- region_counts = []
- # Loop through each AnnData object to count occurrences of regions
- for adata in adatas:
- # Count the occurrences of each region in the "Regions" column
- counts_per_region = adata.obs["Class"].value_counts()
- # Append the result (this will be a pandas Series for each adata)
- region_counts.append(counts_per_region)
- # Convert the list of Series into a DataFrame
- counts_df = pd.DataFrame(region_counts).transpose()
- # Label columns (each corresponds to an AnnData object)
- counts_df.columns = [f"adata{i+1}" for i in range(len(adatas))]
- counts_df.columns = [adata.obs["Sample"].iloc[0] for adata in adatas]
- # %%
- counts_df.fillna(0)
- # %%
- df=counts_df
- # Plot stacked barplot
- fig, ax = plt.subplots(figsize=(8, 6))
- # Cumulative bottom for stacking
- bottom = None
- # Define colors for each category
- colors = ['skyblue', 'orange', 'green']
- # Loop through each row (category)
- for (category, row_values), color in zip(df.iterrows(), colors):
- ax.bar(df.columns, row_values, label=category, bottom=bottom, color=color)
- bottom = row_values if bottom is None else bottom + row_values
- # Customizations
- ax.set_ylabel("Counts")
- ax.set_title("Stacked Barplot of Count Table")
- ax.legend(title="Category")
- plt.show()
- # %%
- percentage_df = counts_df.div(counts_df.fillna(0).sum(axis=0), axis=1) * 100
- # %%
- percentage_df.T.plot(kind="bar", stacked=True, figsize=(10, 6), cmap="tab20")
- # %%
- percentage_df
- # %%
- # List of AnnData objects (e.g., adata1, adata2, ...)
- adatas = [Sample_895, Sample_894, Sample_898,Sample_896,Sample_897,Sample_18,Sample_886,Sample_890,Sample_891,Sample_4,Sample_5,Sample_3,Sample_706,Sample_707,Sample_709T] # Replace with your actual AnnData objects
- region_labels = Sample_895.obs["Region"].unique()
- # Initialize an empty list to store the counts per region for each sample in each AnnData object
- region_counts = []
- # Loop through each AnnData object to count occurrences of regions
- for adata in adatas:
- for region_label in region_labels:
- # Count the occurrences of each region in the "Regions" column
- adata = adata[adata.obs["Region"].isin([region_label]), :]
- counts_per_region = adata.obs["Class"].value_counts()
- # Append the result (this will be a pandas Series for each adata)
- region_counts.append(counts_per_region)
- # Convert the list of Series into a DataFrame
- counts_df = pd.DataFrame(region_counts).transpose()
- # Label columns (each corresponds to an AnnData object)
- counts_df.columns = [f"adata{i+1}" for i in range(len(adatas))]
- counts_df.columns = [adata.obs["Sample"].iloc[0] for adata in adatas]
- # %%
- # List of AnnData objects (e.g., adata1, adata2, ...)
- adatas = [Sample_895, Sample_894, Sample_898,Sample_896,Sample_897,Sample_18,Sample_886,Sample_890,Sample_891,Sample_4,Sample_5,Sample_3,Sample_706,Sample_707,Sample_709T] # Replace with your actual AnnData objects
- region_labels = Sample_895.obs["Region"].unique()
- # Initialize an empty list to store the counts per region for each sample in each AnnData object
- # Initialize dictionaries to store count and percentage DataFrames by region
- region_counts_dfs = {}
- region_percentages_dfs = {}
- # Iterate over each region label
- for region_label in region_labels:
- # Filter columns corresponding to the current region
- region_columns = [col for col in region_counts_df.columns if f"_{region_label}" in col]
- # Create a DataFrame for the current region
- region_df = region_counts_df[region_columns]
- # Rename columns to sample names
- region_df.columns = [col.split('_')[0] for col in region_columns]
- # Store the count DataFrame
- region_counts_dfs[region_label] = region_df
- # Calculate percentages by dividing each value by the column total and multiplying by 100
- region_percentages_df = region_df.div(region_df.sum(axis=0), axis=1) * 100
- # Store the percentage DataFrame
- region_percentages_dfs[region_label] = region_percentages_df
- # %%
- region_dfs["Cortex L5"]
- # %%
- region_dfs["Hypothalamus"]
- # %%
- region_percentages_dfs["Hypothalamus"]
- # %%
- region_dfs["Fiber tracts"]
- # %%
- region_dfs["Thalamus 2"]
- # %%
- region_percentages_dfs["Thalamus 2"]
- # %%
- region_dfs["Cortex L6b"]
- # %%
- region_percentages_dfs["Cortex L6b"]
- # %%
Xenium_marker_dotplot.ipynb at commit 47b52cd, under GPL-3.0 · at the source
Overview
- Department of Human Genetics, Leiden University Medical Center, Leiden, the Netherlands
- Université Paris-Saclay, UVSQ, Inserm, END-ICAP, Versailles, France
- Duchenne Center Netherlands, the Netherlands
- Delft Bioinformatics Lab, Delft University of Technology, Delft, the Netherlands
Abstract
Duchenne muscular dystrophy (DMD) causes progressive muscle degeneration due to dystrophin deficiency. Dystrophin is also expressed in the brain during development and postnatally, yet a characterization of dystrophin isoform expression across brain cells and regions is lacking, limiting our understanding of the cognitive impairment affecting one-third of the patients and hampering the development of dystrophin-restoring drugs in the central nervous system (CNS). Here, we applied spatial transcriptomics to map Dmd isoforms across mouse brain regions and cell types. Mdx52 mice received exon 51-skipping therapies restoring the Dp427-sized isoform at the transcript and protein levels. We observed distinct spatial patterns: full-length isoforms localized to deeper cortical layers and CA1, while shorter isoforms were enriched in cortical layer 1 and dentate gyrus. We present evidence of isoform restoration, immune activation following treatment, and a framework to evaluate exon-skipping therapies in the CNS using spatial transcriptomics.
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 8 matches between paragraphs and lines of code.
Qirongmao97/Xenium_DMD_brain
47b52cdeea5441f8cf059863a3e7876f60e7e83e, 6 July 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
12 files
- Banksy_spatial_clusterin
g.R , R, 111 lines - Coexpression_Isoforms.ip
ynb , Jupyter, 361 lines, 1 match - Conversion_h5ad_to_seura
t.ipynb , Jupyter, 28 lines - Dp140.ipynb, Jupyter, 99 lines
- Expression_abundance.ipy
nb , Jupyter, 219 lines - Isoform_comparison.ipynb
, Jupyter, 1,518 lines, 2 matches - Skipping_DE.ipynb, Jupyter, 1,468 lines, 1 match
- Skipping_WB.ipynb, Jupyter, 198 lines
- Untitled.ipynb, Jupyter, 200 lines
- Xenium_marker_dotplot.ip
ynb , Jupyter, 497 lines, 4 matches - repository limit reached (2,000 files or 30 MB): the rest is at the source (4 files)
- LICENSE, License, 674 lines
- README.md, Text, 29 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;
- 10 scripts, each with its path and the digest of its content;
- 8 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
- geo:GSE318507, at NCBI GEO; found in “Data and code availability”
Data and code availability
Raw and processed Xenium data have been deposited in NCBI’s Gene Expression Omnibus and are accessible through Series accession number GSE318507 (https://
As a reference for cell type annotation, adult mouse scRNA-seq (v2 chemistry) from the Allen Brain Atlas can be downloaded from the public data repository (https://
All analysis scripts and code used for data preprocessing and visualization are provided in a public GitHub repository (https://
Any additional information required to reanalyze the data reported in this paper is available from the corresponding authors 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 2, 28 September 2026
- Authors: added Qirong Mao (0000-0001-7938-6660); Pietro Spitali (0000-0003-2783-688X); removed Qirong Mao; Pietro Spitali
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 11 authors, 5 keywords, 6 funders, 67 references, 5 RRIDs.
Cite
This paper
Mao, Q., Ahmadi, A., de Vries, S., Heezen, L. G., Vacca, O., Doisy, M., Aartsma-Rus, A., van Putten, M., Goyenvalle, A., Mahfouz, A., & Spitali, P. (2026). Evaluating exon skipping in the central nervous system in Duchenne muscular dystrophy using spatial transcriptomics. iScience, 29(8), 116906. https://
BibTeX
@article{mao2026evaluati
author = {Mao, Qirong and Ahmadi, Alireza and de Vries, Sharon and Heezen, Laura GM and Vacca, Ophélie and Doisy, Mathilde and Aartsma-Rus, Annemieke and van Putten, Maaike and Goyenvalle, Aurélie and Mahfouz, Ahmed and Spitali, Pietro},
title = {{Evaluating exon skipping in the central nervous system in Duchenne muscular dystrophy using spatial transcriptomics}},
journal = {iScience},
year = {2026},
month = jul,
volume = {29},
number = {8},
pages = {116906},
publisher = {Elsevier},
issn = {2589-0042},
doi = {10.1016/
url = {https://
pmid = {42542656},
pmcid = {PMC13427662}
}
RIS
TY - JOUR
AU - Mao, Qirong
AU - Ahmadi, Alireza
AU - de Vries, Sharon
AU - Heezen, Laura GM
AU - Vacca, Ophélie
AU - Doisy, Mathilde
AU - Aartsma-Rus, Annemieke
AU - van Putten, Maaike
AU - Goyenvalle, Aurélie
AU - Mahfouz, Ahmed
AU - Spitali, Pietro
TI - Evaluating exon skipping in the central nervous system in Duchenne muscular dystrophy using spatial transcriptomics
T2 - iScience
J2 - iScience
PY - 2026
DA - 2026/
VL - 29
IS - 8
SP - 116906
SN - 2589-0042
PB - Elsevier
DO - 10.1016/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1016/
"type": "article-journal",
"title": "Evaluating exon skipping in the central nervous system in Duchenne muscular dystrophy using spatial transcriptomics",
"container-title": "iScience",
"author": [
{
"family": "Mao",
"given": "Qirong"
},
{
"family": "Ahmadi",
"given": "Alireza"
},
{
"family": "de Vries",
"given": "Sharon"
},
{
"family": "Heezen",
"given": "Laura GM"
},
{
"family": "Vacca",
"given": "Ophélie"
},
{
"family": "Doisy",
"given": "Mathilde"
},
{
"family": "Aartsma-Rus",
"given": "Annemieke"
},
{
"family": "van Putten",
"given": "Maaike"
},
{
"family": "Goyenvalle",
"given": "Aurélie"
},
{
"family": "Mahfouz",
"given": "Ahmed"
},
{
"family": "Spitali",
"given": "Pietro"
}
],
"container-title-short":
"volume": "29",
"issue": "8",
"page": "116906",
"DOI": "10.1016/
"PMID": "42542656",
"PMCID": "PMC13427662",
"ISSN": "2589-0042",
"publisher": "Elsevier",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
7,
23
]
]
}
}
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/s41592-026-03194-8 [code]
- Beyond benchmarking: an expert-guided consensus approach to spatially aware clustering.Journal: Nature methodsIn common: Squidpy, anndata, Scanpy, 9 other tools, genetics / omics, 4 references, author Ahmed Mahfouz
- [2] doi:10.1016/j.cell.2026.05.047 [code]
- An emergent disease-associated motor neuron state precedes cell death in ALS.Journal: CellIn common: Squidpy, statannotations, anndata, 10 other tools, genetics / omics, other condition, mouse, 3 references
- [3] doi:10.1038/s42003-026-10034-0 [code]
- Region- and cell type-specific changes in gene expression in the cerebellum after classical fear conditioning.Journal: Communications biologyIn common: Squidpy, anndata, Scanpy, 10 other tools, genetics / omics, mouse, 3 references
- [4] doi:10.1186/s13059-026-04177-w [code]
- Genomic sequence evolution underlying human neocortical interareal diversification.Journal: Genome biologyIn common: Squidpy, anndata, Scanpy, 9 other tools, genetics / omics, mouse, 3 references
- [5] doi:10.1038/s41467-026-71759-4 [code]
- CellNiche represents cellular microenvironments in atlas-scale spatial omics data with contrastive learning.Journal: Nature communicationsIn common: Squidpy, anndata, Scanpy, 5 other tools, other condition, mouse, 6 references
- [6] doi:10.1038/s41467-026-71803-3 [code]
- Charting the transition from in vitro gliogenesis to the in vivo maturation of human glial progenitor cells transplanted into the hypomyelinated mouse brain.Journal: Nature communicationsIn common: Squidpy, anndata, Scanpy, 9 other tools, genetics / omics, mouse, 2 references
- [7] doi:10.1038/s41467-026-68596-w [code]
- Spatial cartography of human thymus enables the geopositioning of lineage transcription factors in rare mimetic thymic epithelial cells.Journal: Nature communicationsIn common: Squidpy, anndata, Scanpy, 9 other tools, genetics / omics, 2 references
- [8] doi:10.1186/s13073-026-01704-z [code]
- Gene expression profiling enables refined parcellation of cortical layers in the heterogeneous human cerebral cortex.Journal: Genome medicineIn common: anndata, Scanpy, Seurat, 8 other tools, genetics / omics, mouse, 3 references
- [9] doi:10.21203/rs.3.rs-9676637/v1 [code]
- A Comprehensive Benchmarking of Spatial Deconvolution and Domain Detection Methods across Diverse Tissues and Spatial Transcriptomic TechnologiesJournal: Research Square (preprint)In common: Squidpy, anndata, Scanpy, 9 other tools, genetics / omics, 1 reference
- [10] doi:10.1016/j.isci.2026.116055 [code]
- Mapping the transcriptional diversity of calcium signaling in the mouse and human brain.Journal: iScienceIn common: Squidpy, anndata, Scanpy, 9 other tools, genetics / omics, mouse, 1 reference
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, 10 scripts, and 8 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:115e30f1cb2907d9…
Add the badge to its README
The badge links the code to this page. Copy one of these into the README of the paper's code: only you decide where it goes, and nothing is changed for you.
Markdown
[, paste the snippet at the top, then “Commit changes…” and, to review it first, “Create a new branch and start a pull request”. You open the pull request; OSCR asks for no permission.
Request its removal
To ask OSCR to remove this record, the copies of its authors' scripts or its tracing map, use the removal request page: signed in, you say who you are, what to remove and why, then review and confirm the request. Published rules decide every request (how).
Discussion, reproductions, activity
Discussion: questions and error reports about this paper and its code, from signed-in readers and its authors. It opens with sign-in.
Reproductions: reports from readers who ran the authors' code: what they reproduced, with which environment, commit and data. It opens with sign-in.
Activity: what happens around this paper: new versions of its record, its map's validation, discussions and reproductions. It opens with sign-in.
