Brachyury expression levels predict lineage potential and axis-forming ability of in vitro-derived neuromesodermal progenitors.
The 5 matches
- [1] § Materials and methods › Spatial gene expression pattern analysis for in vivo data ↔ Figure 6E.ipynb, lines 51–206 · score 0.73 · covariance matrix, expression profiles, bootstrap, gi, discretised, python
- [2] § Results › 6. TBXT and SOX2 in vivo spatial patterns provide separate information to NM fated regions ↔ Figure 6E.ipynb, lines 447–493 · score 0.64 · cell width, positional error, AP midline, AP axis, genes, ratio
- [3] § Materials and methods › Mouse husbandry ↔ data-analysis-math-model.ipynb, lines 1–45 · score 0.61 · Biosystems Dynamics Research, RIKEN Center, Edinburgh, Laboratory, UK, Animal
- [4] § Materials and methods › Gastruloid culture, live imaging and quantitative analysis ↔ Figure 4B-E.ipynb, lines 463–584 · score 0.61 · gastruloid trace, NMP region, DMSO, isolating, median, orientation
- [5] § Materials and methods › Gastruloid culture, live imaging and quantitative analysis ↔ batch_scripts/NMP_ROI_v3.py, lines 280–369 · score 0.55 · median projecting, poles, centroid, isolating, stacks, orientation
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 · 654 lines · 19 KB · MIT · 2 matches
- # %%
- import numpy as np
- import matplotlib.pyplot as plt
- import pandas as pd
- import os
- import seaborn as sns
- import matplotlib.pyplot as plt
- from scipy.ndimage import uniform_filter1d
- from scipy.ndimage import gaussian_filter1d
- import warnings
- from scipy.spatial import cKDTree
- warnings.filterwarnings('ignore')
- # Import Wt_E8_data data from French et al 2025 data file 1
- Wt_E8_fileName = 'Data_1.xlsx'
- Wt_E8_sheetName = 'Wt_E8.5_data'
- Wt_E8_data = pd.read_excel(
- Wt_E8_fileName,
- sheet_name=Wt_E8_sheetName
- )
- # Also import data that contains real distances AP disitance from notochord
- distances = pd.read('Data_4.csv')
- # merge datasets
- all_cells = pd.concat([all_cells, distances], axis=1)
- # Normalise data to 0-1 range - primarily for plotting purposes
- # and putting all genes on the same scale.
- # Calculations not be sensitive to unit values by design.
- tbxt_percentiles = np.percentile(all_cells['TBXT'], (0.1, 99.99))
- sox2_percentiles = np.percentile(all_cells['SOX2'], (0.1, 99.99))
- all_cells['TBXT_01_norm'] = (all_cells['TBXT'] - tbxt_percentiles[0]) / (tbxt_percentiles[1] - tbxt_percentiles[0])
- all_cells['SOX2_01_norm'] = (all_cells['SOX2'] - sox2_percentiles[0]) / (sox2_percentiles[1] - sox2_percentiles[0])
- tbxt_percentiles = np.percentile(all_cells['log_TBXT'], (0.1, 99.99))
- sox2_percentiles = np.percentile(all_cells['log_SOX2'], (0.1, 99.99))
- all_cells['TBXT_01_norm_log'] = (all_cells['log_TBXT'] - tbxt_percentiles[0]) / (tbxt_percentiles[1] - tbxt_percentiles[0])
- all_cells['SOX2_01_norm_log'] = (all_cells['log_SOX2'] - sox2_percentiles[0]) / (sox2_percentiles[1] - sox2_percentiles[0])
- # Define ratios from differenet calculations
- all_cells['TBXT_SOX2_ratio'] = np.log2((all_cells['TBXT']/all_cells['SOX2']))
- all_cells['TBXT_SOX2_ratio_log'] = all_cells['SOX2_01_norm_log'] - all_cells['TBXT_01_norm_log']
- # %% [markdown]
- # ### Original Dubuis et al 2013 matlab function
- #
- # %% Computes positional error carried by nG genes. Assumes that at every position, the
- # %% gene expression variability is well described by a multivariate gaussian. Bootstraps
- # %% the result be repeatedly estimating the error with leave-one-out procedure.
- # %
- # %
- # % Julien Dubuis, Gasper Tkacik (2008, 2010, 2014)
- # %
- # % INPUT:
- # % data
- # % nG x nN x nX matrix containing samples of expression profiles
- # % for nG genes from nN embroys, sampled at positions nX
- # % data should be normalized such that the mean profile is between
- # % 0 and 1 (individual profiles can fluctuate out of these bounds)
- # % nbins
- # % the new discretization to use along the position axis; nbins
- # % has to divide nX without a reminder; consecutive bins in the
- # % original discretization will be averaged together
- # % zsmooth
- # % smoothing to apply to the mean profiles before computing the
- # % numerical derivative; indicates the number of consecutive bins
- # % to smooth over; 1 = no smoothing
- # % OUTPUT:
- # % sigmaX
- # % estimate of positional error, of dimension (nshuffles) x
- # % (nbins), containing nshuffles leave-one-out estimates
- # % meanG
- # % the mean of the profiles using the new smoothing and
- # % discretization; dimension nG x nbins
- # % dGdX
- # % numerical spatial derivative of the gene expression patterns;
- # % dimension nG x nbins
- # % covG
- # % the covariance matrix of expression levels of dimension nG x nG
- # % x nbins
- #
- # function [sigmaX meanG dGdX covG] = compute_SigmaX(data, nbins, zsmooth)
- #
- # if (nargin <= 1)
- # nbins = 100;
- # zsmooth = 1;
- # end;
- #
- # nshuffles = 10;
- #
- # if (numel(size(data)) == 2)
- # data = reshape(data, 1, size(data,1), size(data, 2));
- # end
- #
- # [nG nN nX] = size(data);
- #
- # if (mod(nX, nbins)~=0)
- # error('The new number of spatial bins must divide the original number.');
- # end
- #
- # disp(sprintf('**** COMPUTE_SIGMAX: Estimating positional error of %d genes from %d embryos.', nG, nN));
- # disp(sprintf('**** COMPUTE_SIGMAX: %d spatial bins -> %d spatial bins, smoothing over %d bins.', nX, nbins, zsmooth));
- #
- #
- # nK = nX/nbins;
- #
- # dX = 1./nbins;
- #
- # meanG = zeros(nG, nshuffles, nbins);
- #
- # covgg=cell(nshuffles, nbins);
- #
- # divgg=cell(nshuffles, nbins);
- #
- # sigmax4G=NaN(nshuffles, nbins);
- #
- # for kk=1:nshuffles
- #
- # samps=randperm(nN);
- # samps=samps(1:nN-1);
- #
- # gg = data(:,samps,:);
- #
- # for l=1:nbins,
- #
- # meanG(:,kk,l) = squeeze(nanmean(nanmean(gg(:,:,(l-1)*nK+1:l*nK),2),3));
- #
- # for q=1:nG,
- # tt(q,:) = flatten(gg(q,:,(l-1)*nK+1:l*nK));
- # end
- #
- # covgg{kk,l}=nancov(tt');
- #
- # end
- #
- # if (~isempty(zsmooth))
- # for q=1:nG,
- # meanG(q,kk,:) = smooth(meanG(q,kk,:),zsmooth);
- # end
- # end
- #
- # divgg{kk,1} = (meanG(:,kk,2) - meanG(:,kk,1))/dX;
- # divgg{kk,nbins} = (meanG(:,kk,nbins) - meanG(:,kk,nbins-1))/dX;
- #
- # for l=2:nbins-1,
- # divgg{kk,l} = (meanG(:,kk,l+1)-meanG(:,kk,l-1))/(2*dX);
- # end
- #
- #
- # %size(divgg{kk,l})
- # for l=1:nbins,
- # if (sum(flatten(isnan(covgg{kk,l}))) > 0 || sum(isnan(divgg{kk,l}))>0)
- # sigmaX(kk,l) = nan;
- # else
- # sigmaX(kk,l) = 1/sqrt(divgg{kk,l}'*covgg{kk,l}^(-1)*divgg{kk,l});
- # end
- # end
- # end
- #
- # for l=1:nbins,
- # covG(:,:,l) = covgg{1,l};
- # dGdX(:,l) = divgg{1,l};
- # end
- # meanG = squeeze(mean(meanG(:,:,:),2));
- # end
- # %% [markdown]
- # ### Python translation
- # %%
- def make_data_array(df, cols, bin_col="LR_bin"):
- """"
- Convert dataframe to 3D array of shape (nGenes, nEmbryos, nPositions) for positional error calculation.
- """
- embryos = np.sort(df["Embryo"].unique()) # sort embryos to ensure consistent ordering
- positions = np.sort(df[bin_col].unique()) # sort positions to ensure consistent ordering
- # Initialize array with NaN values to handle missing data
- data = np.full(
- (len(cols), len(embryos), len(positions)),
- np.nan
- )
- # Create lookup dictionaries to map embryo and position labels to array indices
- embryo_lookup = {e:i for i,e in enumerate(embryos)}
- pos_lookup = {p:i for i,p in enumerate(positions)}
- for _, row in df.iterrows():
- ei = embryo_lookup[row["Embryo"]]
- pi = pos_lookup[row[bin_col]]
- for gi, col in enumerate(cols):
- data[gi, ei, pi] = row[col]
- return data, positions, embryos
- def positional_error(data, smoothing=None):
- """
- Calculate positional error using the method of Dubuis et al 2013,
- Direct tranlsation of MATLAB code from Dubuis et al 2013.
- Minor changes to pre-compute calculations outside of loops.
- """
- # data array is nGenes x nEmbryos x nX-positions
- nG, nE, nX = data.shape
- # No. shuffles for leave-one-out procedure
- # Same as in Dubuis et al 2013
- nshuffles = 10
- # Initialize array to hold positional error estimates for each shuffle and position
- sigma = np.full((nshuffles, nX), np.nan)
- # Loop over shuffles
- for kk in range(nshuffles):
- # Randomly permute embryos and leave one out
- perm = np.random.permutation(nE)
- samps = perm[:nE - 1]
- gg = data[:, samps, :]
- # Mean profile for this shuffle
- # this is calculated in loop in original
- # MATLAB code but can be pre-computed here
- meanG_kk = np.nanmean(gg, axis=1) # nG x nX
- # Smooth mean profile if requested
- # Typically smoothing is set to 3 as in Dubuis et al 2013
- # I use smaller gaussian smoothing to remove high
- # frequency noise rather than wider uniform smoothing as in Dubuis et al 2013.
- # Their image collection method introduces some smoothing anyway
- # than single cell resoltion we have here.
- if smoothing is not None and smoothing > 1:
- for g in range(nG):
- meanG_kk[g, :] = uniform_filter1d(
- meanG_kk[g, :],
- size=smoothing,
- mode='nearest'
- )
- # Pre-compute gradient of mean profile with respect to position
- # This is the "g'" term in the positional error formula and
- # calculate in loop in the original MATLAB code
- dGdX = np.gradient(meanG_kk, axis=1)
- # Loop over positions to calculate positional error at each position
- for x in range(nX):
- # Extract data for this position across all genes and embryos
- X = data[:, :, x] # shape (nG, nE)
- # Remove any genes with NaN values at this position
- valid = ~np.any(np.isnan(X), axis=0)
- X = X[:, valid]
- # Find covariance matrix of gene expression at this position
- covgg = np.cov(X)
- if nG == 1:
- covgg = np.array([[covgg]])
- try:
- # Calculate error using formula from Dubuis et al 2013:
- # error = g' * C^(-1) * g
- error = (
- dGdX[:, x].T # use .T to ensure g is a row vector
- @ np.linalg.inv(covgg) # C^(-1) - use linear algebra inversion to get inverse of covariance matrix
- @ dGdX[:, x] # g
- )
- # Invert error to get positional error or bin-bin uncertainty estimate (sigma)
- # sigma = 1 / sqrt( g' * C^(-1) * g )
- sigma[kk,x] = 1 / np.sqrt(error)
- except np.linalg.LinAlgError:
- pass
- return sigma
- # %%
- # Isolate cells in somite stage 4 and 6
- # These are stages where we have fate data
- epi_nuc = all_cells[(all_cells['SP'] == 4) | (all_cells['SP'] == 6)]
- # Set bin size to approximate width of epithelia cell
- distances_list = []
- for embryo in epi_nuc['Embryo'].unique():
- embryo_data = epi_nuc[epi_nuc['Embryo'] == embryo].copy()
- tree = cKDTree(embryo_data[['X', 'Y', 'Z']])
- distances, _ = tree.query(embryo_data[['X', 'Y', 'Z']], k=6)
- mean_distance = np.mean(distances[:, 1]) # mean distance to 5 nearest neighbors (excluding self)
- distances_list.append(mean_distance)
- # Calculate average and standard deviation of distances to nearest neighbors across all embryos
- distances_list = np.array(distances_list)
- ap_bin_size = np.mean(distances_list)
- std_bin_size = np.std(distances_list)
- print(f"Average cell width (bin size) = {ap_bin_size:.2f} microns, std = {std_bin_size:.2f} microns")
- # Isolate midline cells - witthin regions of interest
- epi_nuc_ap_midline = epi_nuc[(np.abs(epi_nuc['Dist_to_Midline']) <= 25)]
- epi_nuc_medial_lateral = epi_nuc[((epi_nuc['Dist_to_Notochord']) >= 0) & ((epi_nuc['Dist_to_Notochord']) <= 50)]
- genesets = {
- "SOX2": ["SOX2_01_norm"],
- "TBXT": ["TBXT_01_norm"],
- "SOX2_TBXT": ["SOX2_01_norm", "TBXT_01_norm"],
- "RATIO": ["TBXT_SOX2_ratio_log"],
- }
- # cut the AP axis into bins of size ap_bin_size and find the average expression of each channel in each bin, then plot the average expression against the midline AP position for each channel
- epi_nuc_ap_midline['AP_bin'] = (epi_nuc_ap_midline['Dist_to_Notochord'] // ap_bin_size) * ap_bin_size
- epi_nuc_medial_lateral['LR_bin'] = (epi_nuc_medial_lateral['Dist_to_Midline'] // ap_bin_size) * ap_bin_size
- # subset between -100 and 100 on the AP axis
- epi_nuc_medial_lateral = epi_nuc_medial_lateral[(epi_nuc_medial_lateral['Dist_to_Notochord'] >= -150) & (epi_nuc_medial_lateral['Dist_to_Notochord'] <= 150)]
- epi_nuc_medial_lateral = epi_nuc_medial_lateral[(epi_nuc_medial_lateral['Dist_to_Midline'] >= -180) & (epi_nuc_medial_lateral['Dist_to_Midline'] <= 180)]
- # group by AP bin and find average expression of each channel in each bin
- epi_nuc_ap_midline_avg = epi_nuc_ap_midline.groupby(['AP_bin', 'Embryo']).agg({
- 'SOX2_01_norm': 'mean',
- 'TBXT_01_norm': 'mean',
- 'TBXT_SOX2_ratio_log': 'mean'
- }).reset_index()
- epi_nuc_medial_lateral_avg = epi_nuc_medial_lateral.groupby(['LR_bin', 'Embryo']).agg({
- 'SOX2_01_norm': 'mean',
- 'TBXT_01_norm': 'mean',
- 'TBXT_SOX2_ratio_log': 'mean'
- }).reset_index()
- # Kernel width of smoothing used in Dubuis et al 2013 is 3 cells,
- smoothing_internal = 3
- # =========== First calculate positional error along AP axis for midline cells ===========
- results_AP_midline = {}
- for name, cols in genesets.items():
- data, positions, embryos = make_data_array(
- epi_nuc_ap_midline_avg,
- cols,
- bin_col="AP_bin"
- )
- sigma= (
- positional_error(
- data,
- smoothing=smoothing_internal
- )
- )
- # calculate SEM as std/sqrt(n) where n is the number of shuffles (nshuffles)
- nshuffles = sigma.shape[0]
- mean_sigma = np.nanmean(sigma, axis=0)
- sem_sigma = np.nanstd(sigma, axis=0) / np.sqrt(nshuffles)
- lower = mean_sigma - 1.96 * sem_sigma
- upper = mean_sigma + 1.96 * sem_sigma
- results_AP_midline[name] = {
- "AP_bin": positions,
- "sigma": mean_sigma,
- "lower": lower,
- "upper": upper
- }
- notostart =0 # position of notochord on AP axis - set to 0 as we are plotting relative to notochord
- ROIdepth = 50 # apprximate width of region - about the width of notochord
- fig, ax = plt.subplots(2,2, figsize=(3, 2), sharex=True)
- ax = ax.flatten()
- colors = {
- "SOX2": "#D65BC6",
- "TBXT": "#28b834",
- "SOX2_TBXT": "#000000",
- "RATIO": "#db4444"
- }
- # Add shaded regions to indicate notochord and paraxial mesoderm - these are the same in all plots so can be added in loop
- for axs in ax:
- axs.axvspan(
- notostart,
- notostart + ROIdepth,
- color='#5ab4ac',
- alpha=0.5
- )
- axs.axvspan(
- notostart,
- notostart - ROIdepth,
- color="#808080",
- alpha=0.5
- )
- axs.axvspan(
- notostart- ROIdepth,
- notostart - 2*ROIdepth,
- color='#d8b365',
- alpha=0.5
- )
- # Plot average expression profiles for each channel along AP axis for midline cells
- for channel in ['SOX2_01_norm', 'TBXT_01_norm',]:
- sns.lineplot(data=epi_nuc_ap_midline_avg, x='AP_bin', y=channel,
- ax=ax[0], color=colors.get(channel.split('_')[0], None),
- errorbar='sd')
- # turn off axis labels ax[0].set_xlabel('')
- ax[0].set_ylabel('')
- ax[0].set_title('')
- ax[0].set_yticks([0.2,0.4,0.6])
- # Plot ratio of TBXT to SOX2 along AP axis for midline cells
- sns.lineplot(data=epi_nuc_ap_midline_avg, x='AP_bin', y='TBXT_SOX2_ratio_log',
- ax=ax[1], color=colors.get('RATIO', None))
- ax[1].set_xlabel('')
- ax[1].set_ylabel('')
- # Looop over datasets (single genes, double genes, and ratio) to plot positional error along AP axis for midline cells
- for name, res in results_AP_midline.items():
- lower = res['lower']
- upper = res['upper']
- sigma = res['sigma']
- if name in ["SOX2", "TBXT"]:
- axs = ax[2]
- else:
- axs = ax[3]
- axs.plot(
- res["AP_bin"],
- sigma,
- label=name,
- color=colors.get(name, None)
- )
- # Calculate asymmetric error bars for confidence intervals - ensure that error bars do not extend below 0
- yerr_lower = np.maximum(
- 0,
- sigma - lower
- )
- yerr_upper = np.maximum(
- 0,
- upper - sigma
- )
- axs.errorbar(
- res["AP_bin"],
- sigma,
- yerr=[yerr_lower, yerr_upper],
- fmt='none',
- ecolor=colors.get(name, None),
- alpha=0.8,
- capsize=2,
- linewidth=1
- )
- # Set y-axis limites to the width of a ROI (10 cell widths or 50 microns)
- axs.set_ylim(0, 5)
- axs.set_xlim(-100, 50)
- axs.set_yticks(np.arange(0, 6, 1), minor=True) # add minor ticks every 1 unit
- # put y = 5 line as single cell positional error
- axs.axhline(1, color='black', linestyle='--', alpha=0.5, linewidth=1)
- # set all axis labels as size 8
- for axs in ax:
- axs.set_xlabel('')
- axs.set_ylabel('')
- axs.tick_params(axis='x', labelsize=8)
- axs.tick_params(axis='y', labelsize=8)
- plt.tight_layout( h_pad=0.1, w_pad=0.1)
- plt.savefig(os.path.join('Figures', 'AP_midline_positional_information.pdf'))
- plt.show()
- # =========== Now perform same analysis for medial-lateral axis ===========
- results_medial_lateral = {}
- for name, cols in genesets.items():
- data, positions, embryos = make_data_array(
- epi_nuc_medial_lateral_avg,
- cols,
- bin_col="LR_bin"
- )
- sigma= (
- positional_error(
- data,
- smoothing=smoothing_internal
- )
- )
- # calculate SEM as std/sqrt(n) where n is the number of shuffles (nshuffles)
- nshuffles = sigma.shape[0]
- mean_sigma = np.nanmean(sigma, axis=0)
- sem_sigma = np.nanstd(sigma, axis=0) / np.sqrt(nshuffles)
- lower = mean_sigma - 1.96 * sem_sigma
- upper = mean_sigma + 1.96 * sem_sigma
- results_medial_lateral[name] = {
- "LR_bin": positions,
- "sigma": mean_sigma,
- "lower": lower,
- "upper": upper
- }
- ROIdepth = 50
- fig, ax = plt.subplots(2,2, figsize=(3, 2), sharex=True)
- ax = ax.flatten()
- colors = {
- "SOX2": "#D65BC6",
- "TBXT": "#28b834",
- "SOX2_TBXT": "#000000",
- "RATIO": "#db4444"
- }
- for axs in ax:
- axs.axvspan(
- -ROIdepth/2,
- ROIdepth/2,
- color='#5ab4ac',
- alpha=0.5
- )
- axs.axvspan(
- -ROIdepth*1.5,
- -ROIdepth/2,
- color="#808080",
- alpha=0.5
- )
- axs.axvspan(
- ROIdepth*1.5,
- ROIdepth/2,
- color="#808080",
- alpha=0.5
- )
- axs.axvspan(
- -ROIdepth*1.5,
- -ROIdepth*2.5,
- color='#d8b365',
- alpha=0.5
- )
- axs.axvspan(
- ROIdepth*1.5,
- ROIdepth*2.5,
- color='#d8b365',
- alpha=0.5
- )
- for channel in ['SOX2_01_norm', 'TBXT_01_norm']:
- sns.lineplot(data=epi_nuc_medial_lateral_avg, x='LR_bin', y=channel,
- ax=ax[0], color=colors.get(channel.split('_')[0], None),
- errorbar='sd')
- ax[0].set_ylabel('')
- ax[0].set_title('')
- sns.lineplot(data=epi_nuc_medial_lateral_avg, x='LR_bin', y='TBXT_SOX2_ratio_log',
- ax=ax[1], color=colors.get('RATIO', None))
- ax[1].set_xlabel('')
- ax[1].set_ylabel('')
- ax[1].set_yticks([-0.2,0, 0.2])
- ax[1].set_ylim(-0.35, 0.35)
- for name, res in results_medial_lateral.items():
- if name in ["SOX2", "TBXT"]:
- axs = ax[2]
- else:
- axs = ax[3]
- axs.plot(
- res["LR_bin"],
- res["sigma"],
- label=name,
- color=colors.get(name, None)
- )
- yerr_lower = np.maximum(
- 0,
- res["sigma"] - res["lower"]
- )
- yerr_upper = np.maximum(
- 0,
- res["upper"] - res["sigma"]
- )
- axs.errorbar(
- res["LR_bin"],
- res["sigma"],
- yerr=[yerr_lower, yerr_upper],
- fmt='none',
- ecolor=colors.get(name, None),
- alpha=0.8,
- capsize=2,
- linewidth=1
- )
- axs.set_ylim(0, 5)
- axs.set_xlim(-125, 125)
- axs.set_yticks(np.arange(0, 6, 1), minor=True)
- # put y = 5 line as single cell positional error
- axs.axhline(1, color='black', linestyle='--', alpha=0.5, linewidth=1)
- # set all axis labels as size 8
- for axs in ax:
- axs.set_xlabel('')
- axs.set_ylabel('')
- axs.tick_params(axis='x', labelsize=8)
- axs.tick_params(axis='y', labelsize=8)
- plt.tight_layout( h_pad=0.1, w_pad=0.1)
- plt.savefig(os.path.join('Figures', 'St1_ML_positional_information.pdf'))
- plt.show()
Figure 6E.ipynb at commit cfcfa4e, under MIT · at the source
Overview
- Institute for Regeneration and Repair, Centre for Regenerative Medicine, Institute for Stem Cell Research, School of Biological Sciences, University of Edinburgh, Edinburgh, United Kingdom
- School of Biosciences, University of Nottingham, Sutton Bonington Campus, Nottingham, United Kingdom
- Department of Genetics, University of Cambridge, Cambridge, United Kingdom
- RIKEN Center for Biosystems Dynamics Research, Kobe, Japan
- Department of Cell, Developmental and Integrative Biology, University of Alabama at Birmingham, Birmingham, Alabama, United States of America
- GSK, Stevenage, United Kingdom
- The Wellcome Sanger Institute, Wellcome Genome Campus, Cambridge, United Kingdom
- Immunology Unit, Department of Pathology and Experimental Therapy, School of Medicine, Universitat de Barcelona, Barcelona, Spain
- Laboratory of Molecular Cell Biology and Development, Department of Animal Development and Physiology, Graduate School of Biostudies, Kyoto University, Kyoto, Japan
- Instituto de Tecnología, Universidad Argentina de la Empresa, Buenos Aires, Argentina
Abstract
Neuromesodermal progenitors (NMPs) produce the spinal cord and musculoskeleton in the elongating anterior-posterior axis. In vivo, NMPs possess dual potency, coinciding with regions co-expressing SOX2 and Brachyury (TBXT). In vitro, SOX2/
Reproduced under the paper's license (CC BY), from the paper cited above.
Repositories
Its files are read in the Code ↔ Paper reader above, with 5 matches between paragraphs and lines of code.
Zenodo 21650680
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
4 files
- data-analysis-math-model
.ipynb — Jupyter, 1,947 lines - index.ipynb — Jupyter, 26 lines
- LICENSE.txt — License, 27 lines
- README.md — Text, 4 lines
Zenodo 21676159
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
Zenodo 15802710
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
Zenodo 17192095
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
Zenodo 17154933
Availability: 1 check, the latest on 27 September 2026: the link answers (HTTP 200)
- 27 September 2026: the link answers (HTTP 200)
4 files
- data-analysis-math-model
.ipynb — Jupyter, 1,947 lines - index.ipynb — Jupyter, 26 lines
- LICENSE.txt — License, 27 lines
- README.md — Text, 4 lines
mattfrenchh/pringle
20874e6bf622182dba48f4d516c490805c577fa0, 29 June 2025Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
20 files
- Chick/
chick_PRINGLE.ipynb — Jupyter, 1,119 lines - Fly/
fly_PRINGLE.ipynb — Jupyter, 1,553 lines - Mouse/
Scripts/ — Jupyter, 350 lines1. Data pre-processing.ipynb - Mouse/
Scripts/ — Jupyter, 869 lines2. PRINGLE- mouse.ipynb - Mouse/
Scripts/ — Jupyter, 273 lines3. Plotting PRINGLED maps.ipynb - PRGL_modules/
PRINGLE.py — Python, 926 lines - Supp Data and Figure scripts/
Figure_2.R — R, 67 lines - Supp Data and Figure scripts/
Figure_3.R — R, 432 lines - Supp Data and Figure scripts/
Figure_4.R — R, 375 lines - Supp Data and Figure scripts/
Figure_5B.m — MATLAB, 50 lines - Supp Data and Figure scripts/
Figure_5C-G.R — R, 661 lines - Supp Data and Figure scripts/
Figure_6B.R — R, 167 lines - Supp Data and Figure scripts/
Figure_6D.m — MATLAB, 158 lines - Supp Data and Figure scripts/
Figure_7.ipynb — Jupyter, 572 lines - Supp Data and Figure scripts/
Figure_8.ipynb — Jupyter, 884 lines - Supp Data and Figure scripts/
Figure_9.ipynb — Jupyter, 562 lines - Supp Data and Figure scripts/
superviolin.m — MATLAB, 239 lines - Supp Data and Figure scripts/
superviolincvcomp.m — MATLAB, 233 lines - LICENSE — License, 21 lines
- README.md — Text, 26 lines
albertoceccarelli/brachyury-expression-levels-predict-lineage-potential
bc9773d9a9c5ccd461e3e80ae7152c3c45043898, 28 July 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
4 files
- data-analysis-math-model
.ipynb — Jupyter, 1,947 lines, 1 match - index.ipynb — Jupyter, 26 lines
- LICENSE.txt — License, 27 lines
- README.md — Text, 4 lines
mattfrenchh/binagui-casas_granes_et.al._2026_fig4_6_s5_s6
cfcfa4ec945aac281ec23c367d90b362afb4e95f, 29 July 2026Availability: 1 check, the latest on 27 September 2026: the link answers
- 27 September 2026: the link answers
11 files
- Figure 4B-E.ipynb — Jupyter, 884 lines, 1 match
- Figure 6B,C,D,F Suppl Fig 5,6.ipynb — Jupyter, 2,766 lines
- Figure 6E.ipynb — Jupyter, 654 lines, 2 matches
- batch_scripts/
NMP_ROI_V3_quant.sh — Shell, 203 lines - batch_scripts/
NMP_ROI_v3.py — Python, 383 lines, 1 match - batch_scripts/
median_prj.sh — Shell, 43 lines - batch_scripts/
median_projection.py — Python, 46 lines - batch_scripts/
segment_gloids.py — Python, 131 lines - batch_scripts/
segment_gloids.sh — Shell, 90 lines - LICENSE — License, 21 lines
- README.md — Text, 25 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:
- 8 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 33 scripts, each with its path and the digest of its content;
- 5 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
- zenodo:21708690 — at Zenodo; found in “Data Availability”
Data Availability
All relevant data can be found within the article, supplementary information and repositories as stated below. RNAseq raw data can be found at GEO accession number GSE339040. FCS files and data related to flow cytometry experiments and gene expression analyses can be found in Zenodo DOI: https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Versions
The history of this record: each version stored by the harvester or made by a correction of its authors or of the maintainers of its code, and what changed in its facts. The texts of the paper (its abstract, its availability statements) are not part of it; versions that changed only those are not listed.
Version 1, 27 September 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 17 authors, 13 MeSH terms, 9 funders, 61 references.
Cite
This paper
Binagui-Casas, A., Granés, A., Ceccarelli, A. S., French, M., Wymeersch, F. J., Portero Migueles, R., Annoh, J., Huang, Y., Karagianni, E. P., Wong, F. C. K., Wright, R., Brumm, A. S., Lopez Ramajo, D., Takasato, M., Lowell, S., Chara, O., & Wilson, V. (2026). Brachyury expression levels predict lineage potential and axis-forming ability of in vitro-derived neuromesodermal progenitors. PLoS biology, 24(8), e3003960. https://
BibTeX
@article{binaguicasas202
author = {Binagui-Casas, Anahí and Granés, Anna and Ceccarelli, Alberto S. and French, Matthew and Wymeersch, Filip J. and Portero Migueles, Rosa and Annoh, Jennifer and Huang, Yali and Karagianni, Eleni P. and Wong, Frederick C. K. and Wright, Raffee and Brumm, Anna Sophie and Lopez Ramajo, Daniel and Takasato, Minoru and Lowell, Sally and Chara, Osvaldo and Wilson, Valerie},
title = {{Brachyury expression levels predict lineage potential and axis-forming ability of in vitro-derived neuromesodermal progenitors}},
journal = {PLoS biology},
year = {2026},
month = aug,
volume = {24},
number = {8},
pages = {e3003960},
publisher = {PLOS},
issn = {1544-9173},
doi = {10.1371/
url = {https://
pmid = {42640957},
pmcid = {PMC13533433}
}
RIS
TY - JOUR
AU - Binagui-Casas, Anahí
AU - Granés, Anna
AU - Ceccarelli, Alberto S.
AU - French, Matthew
AU - Wymeersch, Filip J.
AU - Portero Migueles, Rosa
AU - Annoh, Jennifer
AU - Huang, Yali
AU - Karagianni, Eleni P.
AU - Wong, Frederick C. K.
AU - Wright, Raffee
AU - Brumm, Anna Sophie
AU - Lopez Ramajo, Daniel
AU - Takasato, Minoru
AU - Lowell, Sally
AU - Chara, Osvaldo
AU - Wilson, Valerie
TI - Brachyury expression levels predict lineage potential and axis-forming ability of in vitro-derived neuromesodermal progenitors
T2 - PLoS biology
J2 - PLoS Biol
PY - 2026
DA - 2026/
VL - 24
IS - 8
SP - e3003960
SN - 1544-9173
PB - PLOS
DO - 10.1371/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1371/
"type": "article-journal",
"title": "Brachyury expression levels predict lineage potential and axis-forming ability of in vitro-derived neuromesodermal progenitors",
"container-title": "PLoS biology",
"author": [
{
"family": "Binagui-Casas",
"given": "Anahí"
},
{
"family": "Granés",
"given": "Anna"
},
{
"family": "Ceccarelli",
"given": "Alberto S."
},
{
"family": "French",
"given": "Matthew"
},
{
"family": "Wymeersch",
"given": "Filip J."
},
{
"family": "Portero Migueles",
"given": "Rosa"
},
{
"family": "Annoh",
"given": "Jennifer"
},
{
"family": "Huang",
"given": "Yali"
},
{
"family": "Karagianni",
"given": "Eleni P."
},
{
"family": "Wong",
"given": "Frederick C. K."
},
{
"family": "Wright",
"given": "Raffee"
},
{
"family": "Brumm",
"given": "Anna Sophie"
},
{
"family": "Lopez Ramajo",
"given": "Daniel"
},
{
"family": "Takasato",
"given": "Minoru"
},
{
"family": "Lowell",
"given": "Sally"
},
{
"family": "Chara",
"given": "Osvaldo"
},
{
"family": "Wilson",
"given": "Valerie"
}
],
"container-title-short":
"volume": "24",
"issue": "8",
"page": "e3003960",
"DOI": "10.1371/
"PMID": "42640957",
"PMCID": "PMC13533433",
"ISSN": "1544-9173",
"publisher": "PLOS",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
8,
25
]
]
}
}
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/s42003-026-10957-8 [code]
- Brain defence by the extracellular matrix protein Cochlin.Journal: Communications biologyIn common: OpenCV, scikit-image, reshape2, 11 other tools, mouse
- [2] doi:10.1016/j.xcrm.2026.102766 [code]
- A longitudinal single-cell and spatial multiomic atlas of pediatric high-grade glioma.Journal: Cell reports. MedicineIn common: tifffile, OpenCV, scikit-image, 10 other tools
- [3] doi:10.1186/s11689-026-09713-0 [code]
- DRP1 mutations associated with EMPF1 encephalopathy perturb the transcriptional profile and maturation of cortical neurons.Journal: Journal of neurodevelopmental disordersIn common: tifffile, OpenCV, scikit-image, 9 other tools
- [4] doi:10.1371/journal.pcbi.1014571 [code]
- SynAPSeg: A novel dataset and image analysis framework for deep learning-based synapse detection and quantification.Journal: PLoS computational biologyIn common: tifffile, OpenCV, scikit-image, 7 other tools, 2 references
- [5] doi:10.1002/imt2.70163 [code]
- Spatial multi-omics unveils sphingolipid metabolic reprogramming within the retinal pathological niche.Journal: iMetaIn common: OpenCV, scikit-image, reshape2, 9 other tools, mouse
- [6] doi:10.1093/nc/niag029 [code]
- A data-driven approach to identifying and evaluating connectivity-based neural correlates of conscious visual perception.Journal: Neuroscience of consciousnessIn common: scikit-image, patchwork, statsmodels, 9 other tools, 1 reference
- [7] 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 communicationsIn common: tifffile, OpenCV, scikit-image, 8 other tools
- [8] doi:10.7554/elife.109717 [code]
- Retrosplenial cortex enables context-dependent goal-directed sensorimotor transformation.Journal: eLifeIn common: tifffile, OpenCV, scikit-image, 8 other tools, mouse
- [9] doi:10.1002/advs.202522762 [code]
- Enhancing Maturation of Human Neuromuscular Organoids via Electrical Stimulation.Journal: Advanced science (Weinheim, Baden-Wurttemberg, Germany)In common: tifffile, scikit-image, patchwork, 7 other tools, 1 reference
- [10] doi:10.1073/pnas.2609132123 [code]
- A human lysosomal storage disorder toolkit for decoding proteome landscapes in cortical-like and dopaminergic-like induced neurons.Journal: Proceedings of the National Academy of Sciences of the United States of AmericaIn common: tifffile, scikit-image, reshape2, 8 other tools
Contribute
The authors of this paper can claim it, correct its record and validate its tracing map, and the maintainers of its code (its owner, or a public member of its organization) correct what it says of their repository; anyone signed in can ask for its removal. Every request goes to OSCR's own machine, which answers it; your account page follows them.
Sign in with ORCID to claim this paper as one of its authors, correct its record or validate its tracing map: when the paper's metadata lists your ORCID iD, you are recognized at once. Maintainers of its code: sign in with GitHub, then claim the repository on your account page.
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: 8 repositories of the authors' code, each at its verified commit and with its license, 33 scripts, and 5 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:c044edb0c9a19cbe…
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.
