A droplet-based long-read single-cell epigenome sequencing method for the high-throughput profiling of multidimensional regulatory elements within individual cells.
The 8 matches · 2 of them tie a paragraph to a whole file without given lines: weak matches, whose lines are not tinted
- [1] § Results › Allele-specific-C.Origami enables the prediction of high-resolution cell type- and allele-specific 3D chromatin architectures ↔ snp-density/SNP_density.ipynb, lines 297 to 383 · score 0.74 · sliding windows, SNP density, Mb window, C.Origami, predicted, model · Report a mismatch
- [2] § Materials and methods › Prediction of allele-specific 3D genome structures ↔ snp-density/SNP_density.ipynb, lines 297 to 383 · score 0.72 · sliding window, Mb window, C.Origami, prediction, model, SNP · Report a mismatch
- [3] § Materials and methods › Identification of allele-specific peaks ↔ src/generation/diploid-dna/01_build_haplotype_fasta.sh, the whole file · a weak match · score 0.68 · Illumina Platinum Genome, samtools, VCF, allelic, hg38, haplotype · Report a mismatch
- [4] § Results › Allele-specific-C.Origami enables the prediction of high-resolution cell type- and allele-specific 3D chromatin architectures ↔ snp-density/SNP_density.ipynb, lines 22 to 74 · score 0.63 · SNP density, Mb genomic windows, denser, raw, benchmark, resolution · Report a mismatch
- [5] § Materials and methods › Identification of allele-specific peaks ↔ snp-density/SNP_density.ipynb, lines 22 to 74 · score 0.63 · Illumina Platinum Genome, VCF, hg38, homozygous, SNP, heterozygous · Report a mismatch
- [6] § Materials and methods › Dimensionality reduction and clustering ↔ scripts/create_arrow.r, the whole file · a weak match · score 0.54 · create arrow, tile, TSS, score · Report a mismatch
- [7] § Results › Allele-specific-C.Origami enables the prediction of high-resolution cell type- and allele-specific 3D chromatin architectures ↔ tools/update_notebook_paths.py, lines 1 to 73 · score 0.50 · SNP density, benchmark, predicts, model, Mb, windows · Report a mismatch
- [8] § Materials and methods › Prediction of allele-specific 3D genome structures ↔ tools/update_notebook_paths.py, lines 1 to 73 · score 0.50 · dip3d, benchmarking, phased, prediction, model, Mb · 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
Jupyter notebook · 406 lines · 16 KB · no license · 4 matches
- # %%
- # --- Libraries ---
- # dplyr : tidy data manipulation
- # Cairo : nice anti-aliased font rendering for PNG output (ggplot)
- # patchwork : compose multiple ggplots into a single figure
- library(dplyr)
- library(Cairo)
- library(patchwork)
- library(GenomicRanges)
- # Force ggplot/Cairo to use a real sans-serif font on this system,
- # otherwise font lookup falls back to a 'sans' alias that is not always
- # available inside Jupyter R kernels and the figure renders with boxes.
- CairoFonts(
- regular = "sans:style=Regular",
- bold = "sans:style=Bold",
- italic = "sans:style=Italic",
- bolditalic = "sans:style=Bold Italic,BoldItalic",
- symbol = "Symbol", usePUA = TRUE
- )
- # %% [markdown]
- # # GM12878 heterozygous SNP density map
- #
- # **Goal:** find the most informative 2 Mb genomic windows for allele-specific
- # analyses in GM12878 (NA12878). "Informative" here means *densely populated
- # with phased heterozygous SNVs* — these are the only positions where reads can
- # actually be assigned to a haplotype, so they bound how much allele-specific
- # signal you can recover from any given window.
- #
- # **Pipeline (cell-by-cell):**
- #
- # 1. Load the **Illumina Platinum Genomes 2017 NA12878 phased VCF** (hg38).
- # - Already statistically phased (`GT` like `0|1` / `1|0`); `PS` tag carries
- # the phase set ID.
- # 2. **Keep only useful sites:**
- # - drop `1|1` homozygous-alt (not informative for haplotype assignment),
- # - drop `1|2` / `2|1` triallelic (rare, complicates phasing),
- # - drop indels, keep only SNVs (`nchar(ref)==nchar(alt)==1`).
- # 3. Convert SNVs → `GRanges`. Convert a pre-computed bed of **10 kb tiling
- # bins** of GRCh38 (`GRCh38_ref/GRCh38_10000_windows.bed`) → `GRanges`.
- # 4. Overlap SNVs against 10 kb bins → number of phased het SNVs per 10 kb bin.
- # Save as `GM12878_10k_snp_counts_summary.txt` and a bedGraph view.
- # 5. Build **500 kb tiling bins**, count how many of the 50 child 10-kb bins
- # inside each 500 kb bin actually contain ≥1 SNV (i.e. the 10-kb-resolution
- # *coverage fraction*, not raw SNV count). Range 0–50.
- # 6. **Slide a 4×500 kb (=2 Mb) window with step 500 kb** over the genome,
- # compute `mean_value = mean(coverage_fraction across the 4 child bins)`.
- # Sort descending → top windows are the genomic regions with the broadest
- # spread of phased heterozygous SNVs at 10 kb resolution.
- # 7. Save as **`GM12878_2M_10k_snp_density_summary.txt`**.
- #
- # ## What `GM12878_2M_10k_snp_density_summary.txt` contains
- #
- # A genome-wide ranking of overlapping 2 Mb windows by SNV-coverage density:
- #
- # | column | type | meaning |
- # |---|---|---|
- # | `chrom` | chr | chromosome (chr1–22, chrX) |
- # | `start` | int | window start, hg38, 0-based |
- # | `end` | int | `start + 2 000 000` |
- # | `mean_value` | float | average # of SNV-bearing 10-kb bins per 500 kb sub-bin within this 2 Mb window. Range 0–50; higher = denser SNV coverage = more haplotype-informative window |
- #
- # Rows are sorted by `mean_value` descending, so `head -n N` gives the top-N
- # most SNV-dense 2 Mb windows. Used by `corigami` plan-A/plan-B benchmarks to
- # pick the regions where allele-specific Hi-C prediction is even meaningful.
- # %%
- # Use repository-local phased variants and reference metadata.
- repo_root <- normalizePath("..")
- vcf_path <- file.path(repo_root, "src/data/variants/illumina_PlatinumGenomes_2017_hg38_NA12878_PS.vcf.gz")
- chrom_sizes_path <- file.path(repo_root, "src/data/reference/GRCh38.chrom.sizes")
- summary_path <- file.path(repo_root, "src/data/regions/GM12878_2M_10k_snp_density_summary.txt")
- snp <- read.table(vcf_path)
- # %%
- # Standard VCF column layout. The trailing 'sample' column packs the
- # per-sample fields described by 'format' (e.g. "GT:PS" → "1|0:1000").
- colnames(snp) <- c("chrom","pos","id","ref","alt","qual","filter","info","format","sample")
- # %%
- # Pull just the genotype string (GT field) out of the packed sample column.
- # 'sample' looks like "1|0:1000" where the part before ':' is GT and after ':'
- # is the phase set (PS) tag. We only need GT here.
- snp$GT <- gsub(":.*","",snp$sample)
- # %%
- # Sanity check: how many sites of each genotype class?
- # 0|1, 1|0 → phased heterozygous (informative for haplotype assignment)
- # 1|1 → homozygous-alt (NOT informative — both haplotypes look the same)
- # 1|2, 2|1 → phased multi-allelic heterozygous (rare)
- table(snp$GT)
- # %%
- # Drop homozygous-alt (1|1). Reads covering these positions cannot be
- # attributed to a specific haplotype because both maternal and paternal
- # carry the alt allele. Keep 0|1, 1|0, and the rare 1|2 / 2|1.
- snp <- snp[snp$GT != "1|1",]
- # %%
- # Compute REF / ALT allele lengths so we can keep only single-nucleotide
- # substitutions in the next cell. Indels (length != 1) are excluded because:
- # 1) downstream tools we use (bcftools consensus / WhatsHap haplotag) handle
- # SNVs and indels differently — restricting to SNVs keeps coordinates
- # identical between hg38 and the haplotype-resolved consensus,
- # 2) indel callsets are noisier than SNV callsets in this VCF.
- ref_len <- lapply(1:nrow(snp), function(x) nchar(snp$ref[x])) %>% unlist()
- alt_len <- lapply(1:nrow(snp), function(x) nchar(snp$alt[x])) %>% unlist()
- # %%
- # Keep biallelic SNVs (single base on both REF and ALT). After this filter
- # we have ~2.17M phased het SNVs across autosomes + chrX.
- snp_used <- snp[ref_len == 1 & alt_len == 1,]
- # %%
- # Quick visual check of the kept rows.
- head(snp_used)
- # %%
- # Confirm chromosome coverage — autosomes 1–22 + chrX (no chrY in this VCF
- # because NA12878 is female, no chrM either).
- unique(snp_used$chrom)
- # %%
- # Convert the SNV table to a GRanges using gUtils::dt2gr.
- # dt2gr looks for chrom + (start|pos) + (end|pos) columns; here we only have
- # 'pos', so it builds zero-width ranges at each SNV position. The metadata
- # columns (ref, alt, GT, ...) ride along as mcols on the GRanges.
- library(gUtils)
- snp_used_gr <- dt2gr(snp_used)
- # %%
- # Inspect: should report ~2.17M ranges, 23 sequences (autosomes + X).
- snp_used_gr
- # %%
- # Build 10 kb GRCh38 tiles directly from the uploaded chromosome sizes.
- chrom_sizes <- read.table(chrom_sizes_path, col.names = c("chrom", "length"))
- seqinfo_hg38 <- Seqinfo(
- seqnames = chrom_sizes$chrom,
- seqlengths = chrom_sizes$length
- )
- windows_10k <- tileGenome(
- seqinfo_hg38,
- tilewidth = 10000,
- cut.last.tile.in.chrom = TRUE
- )
- bins <- as.data.frame(windows_10k)[, c("seqnames", "start", "end")]
- colnames(bins) <- c("chrom", "start", "end")
- bins$start <- bins$start - 1L
- bins$idx <- seq_len(nrow(bins))
- # %%
- # Convert the generated 10 kb table to the GRanges layout used below.
- bins_gr <- dt2gr(bins)
- # %%
- # Overlap 10 kb bins (query) with SNV positions (subject).
- # `gUtils::%*%` is the GRanges-overlap operator: it returns one row per
- # (query, subject) pair that overlaps. The result `ov` carries:
- # - query.id = bin index that the SNV falls in
- # - subject.id = SNV index
- # - all original mcols from both sides (ref, alt, GT, idx, ...)
- ov <- bins_gr %*% snp_used_gr
- # %%
- # Inspect: ~2.17M overlap rows. Slightly more rows than total SNVs because
- # a bin boundary can split a (zero-width) SNV onto two adjacent bins in
- # 1-based vs 0-based coord overlap.
- ov
- # %%
- # Per-bin SNV count: tabulate overlap rows by bin (query.id).
- # `Var1` (factor of bin index) is converted back to integer for joining later.
- ov_sum <- table(ov$query.id) %>% as.data.frame()
- ov_sum$Var1 <- as.integer(as.character(ov_sum$Var1))
- # %%
- # Join the SNV counts back onto the full set of 10 kb bins so that bins
- # WITHOUT any SNV are still represented as rows (with Freq=NA, fixed below).
- ov_sum <- left_join(as.data.frame(bins_gr), ov_sum, by = c("idx" = "Var1"))
- # %%
- # Fill bins with no overlapping SNV: NA -> 0.
- ov_sum[is.na(ov_sum$Freq),]$Freq <- 0
- # %%
- # Plotting library used by the next cell.
- library(ggplot2)
- # %%
- # Quick distribution sanity check: stacked-fill bar showing the fraction of
- # 10 kb bins with each integer SNV count (0, 1, 2, ...). Most genome-wide
- # bins carry 0 SNVs; the long tail at high counts represents SNV hotspots.
- table(ov_sum$Freq) %>%
- as.data.frame() %>%
- ggplot(., aes(x = "identity", y = Freq)) +
- geom_col(aes(fill = Var1), color = "black", position = "fill")
- # %%
- head(ov_sum)
- # %%
- # OUTPUT 1: per-10kb-bin SNV count, full table (with chrom/start/end/idx/Freq).
- write.table(ov_sum, "./GM12878_10k_snp_counts_summary.txt",
- row.names = F, quote = F, sep = '\t')
- # %%
- # OUTPUT 2: same data as a 4-column bedGraph (chrom, start, end, Freq) so it
- # can be loaded directly into IGV/UCSC as a track. Columns 1:3 = coords,
- # column 7 of ov_sum = Freq (after as.data.frame(GRanges) the layout is
- # seqnames, start, end, width, strand, idx, Freq).
- write.table(ov_sum[,c(1:3,7)], "./GM12878_10k_snp_counts_summary.bedGraph",
- row.names = F, quote = F, col.names = F, sep = '\t')
- # %%
- # Sanity: full 10 kb bin GRanges (~309k bins covering all of GRCh38).
- bins_gr
- # %%
- # Subset 10 kb bins to those that contain at least one SNV (~224k bins).
- # This is the *coverage set*: each entry is a 10 kb window that we know
- # carries phasing information. Used downstream to compute, per 500 kb
- # super-bin, how many of its 50 child 10 kb bins are informative.
- bin_snp <- bins_gr[unique(ov$query.id)]
- # %%
- bin_snp
- # %%
- # Build 500 kb tiles and retain chr1-22 plus chrX.
- windows_500k <- tileGenome(
- seqinfo_hg38,
- tilewidth = 500000,
- cut.last.tile.in.chrom = TRUE
- )
- bins_500k <- as.data.frame(windows_500k)[, c("seqnames", "start", "end")]
- colnames(bins_500k) <- c("chrom", "start", "end")
- bins_500k$start <- bins_500k$start - 1L
- bins_500k <- bins_500k[bins_500k$chrom %in% paste0("chr", c(1:22, "X")), ]
- bins_500k$chrom <- factor(bins_500k$chrom, levels = paste0("chr", c(1:22, "X")))
- bins_500k <- bins_500k %>% arrange(chrom, start)
- bins_500k$idx <- seq_len(nrow(bins_500k))
- bins_500k_gr <- dt2gr(bins_500k)
- # %%
- # For each 500 kb bin, count how many of its child 10 kb bins (from bin_snp)
- # carry at least one SNV. The metric we end up with is a *coverage fraction*
- # at 10 kb resolution — range 0..50 — not a raw SNV count. This penalises
- # 500 kb bins where SNVs are clustered at one spot but absent elsewhere,
- # which would otherwise look "rich" if you only counted SNVs.
- #
- # `filter(width > 1)` drops zero-width adjacency hits at bin boundaries
- # (gUtils' overlap operator emits a degenerate width=1 row when only the
- # boundary touches; filter to honest interior overlaps).
- # `n_distinct(subject.id)` == number of 10 kb bins (subject.id == bin_snp idx)
- # that overlap this 500 kb super-bin (query.id == bins_500k_gr idx).
- snp_sum <- bins_500k_gr %*% bin_snp %>% as.data.frame() %>%
- filter(width > 1) %>%
- dplyr::group_by(query.id) %>%
- dplyr::summarise(sum = n_distinct(subject.id))
- # %%
- # Re-attach bin coordinates to the per-bin SNV-coverage count.
- snp_sum <- left_join(bins_500k, snp_sum, by = c("idx" = "query.id"))
- # %%
- # 500 kb bins with no SNV-bearing children: NA -> 0.
- snp_sum[is.na(snp_sum$sum),]$sum <- 0
- # %%
- head(snp_sum)
- # %%
- # Genome-wide track of SNV-bearing 10 kb bins per 500 kb super-bin.
- # Alternating chromosome colours (black/grey, with chrX in dark red) make the
- # karyotype layout obvious. Useful eyeball check before sliding-window step.
- options(repr.plot.width = 16, repr.plot.height = 2)
- library(ggplot2)
- ggplot(snp_sum, aes(x = idx, y = sum)) +
- geom_point(aes(color = chrom)) +
- scale_color_manual(values = c(rep(c("black", "grey"), 11), "darkred")) +
- theme_bw() +
- theme(axis.text.x = element_blank(), axis.title.x = element_blank()) +
- ylab("Number of SNV-bearing 10kb bins per 500kb bin") +
- ggtitle("SNV coverage per 500kb bin (NA12878 phased het SNVs)")
- # %%
- # Re-print head as a sanity check before the sliding-window step.
- head(snp_sum)
- # %%
- library(dplyr)
- library(furrr)
- library(future.apply)
- # ---------------------------------------------------------------------------
- # sliding_window_genome
- # ---------------------------------------------------------------------------
- # Aggregate a per-bin numeric column over a sliding window of consecutive
- # bins, separately for each chromosome. With the defaults below
- # (window_size = 4, step = 1) and an input of 500 kb tiles, this produces
- # overlapping 2 Mb windows stepped every 500 kb. We pick 2 Mb because the
- # downstream C.Origami model takes a 2 Mb context per prediction.
- #
- # Args:
- # df : data.frame with required columns chrom / start / end and a
- # numeric column to summarise.
- # window_size : number of consecutive child bins per output window.
- # step : stride (in child-bin units).
- # val_col : index of the numeric column in `df` (default 5 -> 'sum').
- #
- # Returns: data.frame(chrom, start, end, mean_value), one row per window.
- sliding_window_genome <- function(df, window_size = 4, step = 1, val_col = 5) {
- # Required columns check.
- if (!all(c("chrom", "start", "end") %in% colnames(df))) {
- stop("input data.frame must contain chrom/start/end columns")
- }
- # Sort by (chrom, start) so windowing walks each chromosome left-to-right.
- df_sorted <- df %>%
- arrange(chrom, start) %>%
- group_by(chrom) %>%
- mutate(row_id = row_number()) %>%
- ungroup()
- # Per-chromosome window builder. Returns one row per valid window.
- process_chrom <- function(sub_df) {
- n <- nrow(sub_df)
- if (n < window_size) return(data.frame()) # skip chromosomes shorter than 1 window
- # Valid window start indices: 1, 1+step, 1+2*step, ... up to (n-window_size+1).
- window_starts <- seq(1, n - window_size + 1, by = step)
- # Parallelise over windows within a chromosome (future_lapply backend).
- future_lapply(window_starts, function(i) {
- window_data <- sub_df[i:(i + window_size - 1), ]
- data.frame(
- chrom = unique(window_data$chrom),
- start = min(window_data$start),
- end = max(window_data$end),
- mean_value = mean(window_data[[val_col]], na.rm = TRUE),
- stringsAsFactors = FALSE
- )
- }) %>% bind_rows()
- }
- # Split by chromosome, then map per-chromosome processing in parallel
- # (future_map_dfr respects the active future::plan).
- result <- df_sorted %>%
- group_split(chrom) %>%
- future_map_dfr(process_chrom, .progress = TRUE)
- # If every value in a window was NA, mean(...) returns NaN — convert to NA
- # so downstream filters/sorts behave consistently.
- result$mean_value[is.nan(result$mean_value)] <- NA
- return(result)
- }
- ### Smoke test ---------------------------------------------------------------
- # Tiny synthetic input: two chromosomes, 10 bins each, normal-distributed
- # values around two distinct means. Confirms the function returns rolling
- # means without dropping rows.
- set.seed(123)
- test_data <- data.frame(
- chrom = rep(c("chr1", "chr2"), each = 10),
- start = c(1:10 * 100, 1:10 * 150),
- end = c(1:10 * 100 + 99, 1:10 * 150 + 149),
- value = c(rnorm(10, mean = 50), rnorm(10, mean = 100))
- )
- system.time({
- output <- sliding_window_genome(test_data, window_size = 4, val_col = 4)
- })
- print(head(output, 5))
- # %%
- # Apply the sliding window over the 500 kb SNV-coverage track.
- # val_col = 5 picks the 'sum' column (chrom/start/end/idx/sum). Defaults
- # window_size=4, step=1 -> 2 Mb windows stepped every 500 kb.
- snp_sum_sw <- sliding_window_genome(snp_sum)
- # %%
- # Sort descending by mean_value: the most SNV-dense 2 Mb windows come first.
- # `head -n N` of the output file then gives the top-N windows.
- snp_sum_sw <- snp_sum_sw %>% arrange(-mean_value)
- # %%
- # Top 50 windows. mean_value is "average # of SNV-bearing 10kb bins per
- # 500kb sub-bin", so the theoretical max is 50 (every 10kb bin in the
- # window carries a SNV). The top windows reach exactly 50 — fully informative.
- head(snp_sum_sw, 50)
- # %%
- # Write the ranked 2 Mb SNP-density regions to the shared repository input.
- write.table(snp_sum_sw, summary_path,
- row.names = F, quote = F, sep = "\t")
SNP_density.ipynb at commit 61448fc, no license · at the source
Overview
- School of Laboratory Medicine and Biotechnology, Southern Medical University, Guangzhou, Guangdong China
- School of Medicine, Jinan University, Guangzhou, Guangdong China
- The Second Affiliated Hospital & Liangzhu Laboratory, Zhejiang University School of Medicine, Hangzhou, Zhejiang China
- Department of Cardiology, Heart Center, Zhujiang Hospital, Southern Medical University, Guangzhou, Guangdong China
- Shanghai MobiDrop Co. Ltd, Shanghai, China
Abstract
Recently, long-read sequencing methods have revolutionized genomic research by allowing the resolution of previously inaccessible regions across the genome. However, the throughput and scalability of these methods have hindered their general application in the field. To address this limitation, we developed droplet-based methods for the single-cell profiling of chromatin accessibility (droplet-based single-cell Nanopore ATAC-seq, dscNanoATAC) and histone modifications (droplet-based single-cell NanoCUT&
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 8 matches between paragraphs and lines of code.
mskilab-org/gUtils
095377ab04195aecf6ebb8397072b24864c81599, 9 July 2026Availability: 1 check, the latest on 30 October 2026: the link answers
- 30 October 2026: the link answers
12 files
- R/
gUtils-package.R , R, 18 lines - R/
gUtils.R , R, 5,281 lines - data-raw/
prep_UCSC.R , R, 57 lines - notebooks/
Demo1.ipynb , Jupyter, 442 lines - notebooks/
Demo2.ipynb , Jupyter, 764 lines - notebooks/
Demo3.ipynb , Jupyter, 410 lines - rtdocs/
conf.py , Python, 258 lines - rtdocs/
figs.R , R, 186 lines - tests/
testthat.R , R, 4 lines - tests/
testthat/ , R, 1,645 linestest_rangeops.R - LICENSE, License, 339 lines
- README.md, Text, 172 lines
LuJiansen/dscNanoSeq
ec0701b9883549c9aeea2bf7ad6c2a2404e6e41d, 16 July 2026Availability: 1 check, the latest on 30 October 2026: the link answers
- 30 October 2026: the link answers
7 files
- pipeline/
dscNanoATAC_GM12878_alle , Jupyter, 317 lineslic_specific.ipynb - scripts/
coaccessibility.r , R, 78 lines - scripts/
create_arrow.r , R, 40 lines, 1 match - scripts/
merge_bam_stats.r , R, 33 lines - scripts/
nanoplexer.sh , Shell, 8 lines - LICENSE, License, 21 lines
- README.md, Text, 140 lines
Zenodo 15102690
Availability: 1 check, the latest on 30 October 2026: the link answers (HTTP 200)
- 30 October 2026: the link answers (HTTP 200)
LuJiansen/AS-C.Origami
61448fc802b69ee2d1a59404f4aa582f106b7bc3, 16 July 2026Availability: 1 check, the latest on 30 October 2026: the link answers
- 30 October 2026: the link answers
12 files
- benchmarks/
corigami_predict_benchma , Jupyter, 785 linesrk_dip3d_planA_merge.ipy nb - benchmarks/
corigami_predict_benchma , Jupyter, 862 linesrk_planAEH.ipynb - snp-density/
SNP_density.ipynb , Jupyter, 406 lines, 4 matches - src/
generation/ , Shell, 68 lines, 1 matchdiploid-dna/ 01_build_haplotype_fasta .sh - src/
generation/ , Python, 323 linesplan-e-ctcf/ 06_continuous_pwm_ctcf.p y - src/
prediction/ , Python, 103 linespredict_atac_only.py - src/
training/ , Shell, 27 linescorigami_train.sh - src/
training/ , Shell, 39 linescorigami_train_atac_only .sh - src/
training/ , Python, 82 linestrain_atac_only.py - tests/
test_repository_contract , Python, 274 lines.py - tools/
update_notebook_paths.py , Python, 108 lines, 2 matches - README.md, Text, 140 lines
Zenodo 21389362
Availability: 1 check, the latest on 30 October 2026: the link answers (HTTP 200)
- 30 October 2026: the link answers (HTTP 200)
12 files
- benchmarks/
corigami_predict_benchma , Jupyter, 785 linesrk_dip3d_planA_merge.ipy nb - benchmarks/
corigami_predict_benchma , Jupyter, 862 linesrk_planAEH.ipynb - snp-density/
SNP_density.ipynb , Jupyter, 406 lines - src/
generation/ , Shell, 68 linesdiploid-dna/ 01_build_haplotype_fasta .sh - src/
generation/ , Python, 323 linesplan-e-ctcf/ 06_continuous_pwm_ctcf.p y - src/
prediction/ , Python, 103 linespredict_atac_only.py - src/
training/ , Shell, 27 linescorigami_train.sh - src/
training/ , Shell, 39 linescorigami_train_atac_only .sh - src/
training/ , Python, 82 linestrain_atac_only.py - tests/
test_repository_contract , Python, 274 lines.py - tools/
update_notebook_paths.py , Python, 108 lines - README.md, Text, 140 lines
Code availability
Code for dscNanoSeq pipeline is available in GitHub (https://
Reproduced under the paper's license (CC BY), from the paper cited above.
Tracing map
Proposed by the machine: these links were found in the paper and verified at the source, without human review. The map will receive a Zenodo DOI once one of the paper's authors has validated it with their ORCID.
What the map holds:
- 5 repositories of the authors' code, each at its verified commit, with its license and how the link was found in the paper;
- 37 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
- zenodo:7226561, at Zenodo; found in the text, “Prediction of allele-specific 3D genome…”
Data Availability Statement
The sequencing data of dscNanoATAC and dscNanoCUT have been deposited in the Gene Expression Omnibus under accession code GSE293463.
Code for dscNanoSeq pipeline is available in GitHub (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, 30 October 2026: the first record
Recorded: type, language, journal, volume, issue, pages, dates, 6 authors, 2 keywords, 1 funder, 58 references.
Cite
This paper
Lu, J., Chen, K., Jia, S., Chen, G., Yu, X., & Li, W. (2026). A droplet-based long-read single-cell epigenome sequencing method for the high-throughput profiling of multidimensional regulatory elements within individual cells. Cell discovery, 12(1), 72. https://
BibTeX
@article{lu2026droplet,
author = {Lu, Jiansen and Chen, Kexuan and Jia, Shengtao and Chen, Guodong and Yu, Xianhong and Li, Wen},
title = {{A droplet-based long-read single-cell epigenome sequencing method for the high-throughput profiling of multidimensional regulatory elements within individual cells}},
journal = {Cell discovery},
year = {2026},
month = oct,
volume = {12},
number = {1},
pages = {72},
publisher = {Nature Publishing Group},
issn = {2056-5968},
doi = {10.1038/
url = {https://
pmid = {42934226},
pmcid = {PMC13710847}
}
RIS
TY - JOUR
AU - Lu, Jiansen
AU - Chen, Kexuan
AU - Jia, Shengtao
AU - Chen, Guodong
AU - Yu, Xianhong
AU - Li, Wen
TI - A droplet-based long-read single-cell epigenome sequencing method for the high-throughput profiling of multidimensional regulatory elements within individual cells
T2 - Cell discovery
J2 - Cell Discov
PY - 2026
DA - 2026/
VL - 12
IS - 1
SP - 72
SN - 2056-5968
PB - Nature Publishing Group
DO - 10.1038/
UR - https://
LA - en
ER -
CSL-JSON
{
"id": "10.1038/
"type": "article-journal",
"title": "A droplet-based long-read single-cell epigenome sequencing method for the high-throughput profiling of multidimensional regulatory elements within individual cells",
"container-title": "Cell discovery",
"author": [
{
"family": "Lu",
"given": "Jiansen"
},
{
"family": "Chen",
"given": "Kexuan"
},
{
"family": "Jia",
"given": "Shengtao"
},
{
"family": "Chen",
"given": "Guodong"
},
{
"family": "Yu",
"given": "Xianhong"
},
{
"family": "Li",
"given": "Wen"
}
],
"container-title-short":
"volume": "12",
"issue": "1",
"page": "72",
"DOI": "10.1038/
"PMID": "42934226",
"PMCID": "PMC13710847",
"ISSN": "2056-5968",
"publisher": "Nature Publishing Group",
"URL": "https://
"language": "en",
"issued": {
"date-parts": [
[
2026,
10,
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.1038/s41594-023-01060-1 [code]
- Droplet-based single-cell joint profiling of histone modifications and transcriptomes.Journal: Nature structural & molecular biologyIn common: pysam, SAMtools, patchwork, 5 other tools, genetics / omics, cellular / molecular, 10 references
- [2] doi:10.1038/s41593-026-02208-0 [code]
- Single-nucleus epigenomic profiling of the adult human central nervous system unveils epigenetic memory of developmental programs.Journal: Nature neuroscienceIn common: pysam, reticulate, SAMtools, 4 other tools, genetics / omics, 10 references
- [3] doi:10.1038/s41587-024-02447-1 [code]
- Droplet Hi-C enables scalable, single-cell profiling of chromatin architecture in heterogeneous tissues.Journal: Nature biotechnologyIn common: SAMtools, patchwork, cowplot, 6 other tools, genetics / omics, mouse, cellular / molecular, 7 references
- [4] doi:10.1038/s41467-024-52463-7 [code]
- A cell type-aware framework for nominating non-coding variants in Mendelian regulatory disorders.Journal: Nature communicationsIn common: BCFtools, pysam, SAMtools, 8 other tools, genetics / omics, mouse, cellular / molecular, 5 references
- [5] doi:10.1038/s41421-023-00642-z [code]
- Fast and flexible profiling of chromatin accessibility and total RNA expression in single nuclei using Microwell-seq3.Journal: Cell discoveryIn common: BCFtools, pysam, SAMtools, 6 other tools, genetics / omics, mouse, cellular / molecular, 6 references
- [6] doi:10.1038/s41467-025-57027-x [code]
- Topological identification and interpretation for single-cell epigenetic regulation elucidation in multi-tasks using scAGDE.Journal: Nature communicationsIn common: PyTorch Lightning, reticulate, patchwork, 7 other tools, genetics / omics, cellular / molecular, 6 references
- [7] doi:10.1038/s41587-022-01535-4 [code]
- Multimodal chromatin profiling using nanobody-based single-cell CUT&
Tag. Journal: Nature biotechnologyIn common: pysam, reticulate, SAMtools, 5 other tools, genetics / omics, mouse, cellular / molecular, 6 references - [8] doi:10.21203/rs.3.rs-9927928/v1 [code]
- Genome-wide and allele-resolved maps of the radial architecture of the mouse genomeJournal: Research Square (preprint)In common: BCFtools, pysam, SAMtools, 7 other tools, genetics / omics, mouse, 3 references
- [9] doi:10.1016/j.xgen.2026.101194 [code]
- Genetic diversity and regulatory features of human-specific NOTCH2NL duplications.Journal: Cell genomicsIn common: PyTorch Lightning, pysam, SAMtools, 8 other tools, cellular / molecular, 3 references
- [10] doi:10.1038/s41586-023-06824-9 [code]
- Single-cell analysis of chromatin accessibility in the adult mouse brain.Journal: NatureIn common: reticulate, patchwork, cowplot, 5 other tools, genetics / omics, mouse, cellular / molecular, 6 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.
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: 5 repositories of the authors' code, each at its verified commit and with its license, 37 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:46710ca504f94e07…
Add the badge to the code's README
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 -->
[](https://openscicode.org/badge/doi/10.1038/s41421-026-00928-y)
<!-- oscr-badge:end -->reStructuredText
.. oscr-badge:start
.. image:: https://openscicode.org/badge/doi/10.1038/s41421-026-00928-y.svg
:target: https://openscicode.org/badge/doi/10.1038/s41421-026-00928-y
:alt: OSCR
.. oscr-badge:endHTML
<!-- oscr-badge:start -->
<a href="https://openscicode.org/badge/doi/10.1038/s41421-026-00928-y"><img src="https://openscicode.org/badge/doi/10.1038/s41421-026-00928-y.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".
- mskilab-org/gUtils: README.md on GitHub
- LuJiansen/dscNanoSeq: README.md on GitHub
- LuJiansen/AS-C.Origami: README.md on GitHub
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.
