Repository navigation
Releases: IntGenomicsLab/lrsinglecell
Releases · IntGenomicsLab/lrsinglecell
Release list
v1.0.0
First release of LRSinglecell. The pipeline is a continuation of the scdnalong branch of
ljwharbers/scnanoseq (at 1ff784a), itself built on
nf-core/scnanoseq v1.3.0, rebuilt on the nf-core/tools 4.2.1 template as a
standalone IntGenomicsLab pipeline. The changes below are relative to nf-core/scnanoseq v1.3.0.
Pipeline
- Renamed to
IntGenomicsLab/lrsinglecell; the entry workflow isINTGENOMICSLAB_LRSINGLECELLand the software versions file ispipeline_info/lrsinglecell_software_mqc_versions.yml - Test profiles read their data from IntGenomicsLab/test-datasets (
lrsinglecell/), copied unchanged from nf-core/test-datasetsscnanoseq - Moved to the nf-core/tools 4.2.1 template (minimum Nextflow
25.10.4,nf-schema2.7.3,nft-utils1.2.1, updatedutils_*subworkflows,multiqcmodule andfastqcmodule (FastQC 0.13.0, only used with--skip_fastqc false))
Enhancements
- DNA samples are now deduplicated by
mark_dna_duplicates.pyinstead ofpicard MarkDuplicates. Within a barcode it keeps Picard's single-end key and also merges the two records flexiplex writes for one raw read, up to 10 bp of 5' jitter between reads that read through to the far adapter, and A-A fragments read from the other end; onchrM/MTonly the exact relations apply. On three libraries this recovers 99% of the same-molecule pairs Picard missed (judged by heterozygous-SNP haplotypes) without adding false merges, raising the DNA duplicate rate by 1-2.5 points. The duplicate flag now also reaches secondary and supplementary alignments, and the marked BAM is published as written, without a second sort. Metrics stay in Picard format for MultiQC, next to a per-rule*.dedup_summary.tsv; seedocs/output.md - Added support for processing single-cell/nuclei DNA samples alongside cDNA samples in the same pipeline run, via a new optional
typecolumn (dna/cdna) in the input samplesheet - Added
flexiplex/discovery,flexiplex/filterandflexiplex/assignmodules for barcode extraction, filtering and assignment - Added
demultiplex_flexiplexanddemultiplex_blazesubworkflows, replacing the previous inline demultiplexing steps in the main workflow - Added
align_deduplicate_dnasubworkflow (minimap2alignment,mark_dna_duplicates.py,BAM_STATS_SAMTOOLS) for DNA sample processing - Added
demux_tool_cdna/demux_tool_dnaparameters to selectflexiplexorblazefor cDNA demultiplexing (DNA currently supportsflexiplexonly) - Added
lrkallistoas a third--quantifieroption: an alignment-free path that pseudoaligns the demultiplexed FASTQ with lr-kallisto (kallisto bus --long), counts genes withbustools count --genecountsand quantifies transcripts withkallisto quant-tcc --long, deduplicating UMIs withbustoolsin both cases. Adds atest_lrkallistoprofile and thegffreadmodule for transcript sequence extraction - Bumped IsoQuant to v3.13.1
- Deduplication now groups UMIs by feature rather than by alignment position. Genome alignments are tagged with a gene by gene-body overlap (new
tag_genesandsplit_gene_statusmodules,GX/GN/GStags) and grouped withumi_tools --per-gene; reads with an ambiguous gene call or none are deduplicated positionally and merged back, so no reads are dropped. Transcriptome alignments useumi_tools --per-gene --per-contig, where a contig is a transcript. This substantially changes absolute UMI counts — on the data this was developed against, total duplicate removal rose from 6.5% to ~34%, i.e. previous counts were inflated by roughly 1.6x. Relative expression is essentially unchanged (Spearman 0.998, no genes lost), so clustering and ratio-based analyses are unaffected, but UMIs per cell, library complexity and saturation estimates will differ from earlier releases. Revert with--dedup_per_gene=false/--dedup_per_contig=false - Added a per-sample UMI deduplication summary (
<sample>/<type>/{genome,transcriptome}/qc/umitools/dedup/*.umi_dedup_summary.tsv) with input reads, output reads, duplicate reads and duplication rate, summed over the per-chunkumi_tools dedupruns by the newumitools_dedup_summarymodule, and shown as a "UMI-tools Deduplication" table in the MultiQC report. Previously theumi_toolslogs were discarded and no duplication rate was reported umi_tools dedupnow always takes the cell barcode from the correctedCBtag. Previously this applied only when--demux_tool_cdna flexiplexwas set; theblazepath fell back to reading the raw, uncorrected barcode out of the read name, which fragmented cells and made the two demultiplexing paths incomparable- Bumped flexiplex to v1.02.7 and run it with
-a true, so it reports every read rather than only the reads it could assign. Reads from a droplet below the knee are no longer dropped for want of a known barcode, and the uncorrected barcode comes back inCR, which is what makes such a droplet distinguishable from a read with no barcode region at all. v1.02.7 also fixes an out-of-bounds read in flexiplex's UMI handling that only triggers on UMI-less protocols, i.e. the DNA path - Removed the
flexiformattermodule. It existed to move the barcode and UMI from the read name into BAM tags, which is no longer needed: flexiplex writesCB/CR/UB/URinto the FASTQ comment itself, andminimap2 -ynow carries them onto every alignment.-yis applied only when demultiplexing with flexiplex, since a basecaller comment on any other FASTQ would be copied in verbatim and produce unparseable records - Deduplication now groups on
XB/UBrather thanCB/UR.XBis a derived tag holding the corrected barcode for a called cell and the uncorrected one for a droplet flexiplex could not match to the known list, so uncalled droplets stay separate instead of pooling into a single-cell.UBis flexiplex's corrected UMI;URholds the raw one. Theblazepath writes both tags too, so the two demultiplexers stay comparable. DNApicard MarkDuplicateskeys onXBfor the same reason - Reads in which flexiplex found no barcode region at all are now discarded during assignment rather than carried through the pipeline. They belong to no droplet, called or empty, and flexiplex gives them a one-character UMI placeholder instead of a real UMI. Dropping them at the FASTQ stage keeps them out of alignment entirely and means every alignment downstream has a real
CR, a realXBand a full-width UMI - Added a second IsoQuant run over the same alignments, published to
isoquant_all_droplets/, grouping onXBso that droplets below the knee are quantified alongside the called cells. The existingisoquant/run is unchanged and still groups onCB - Added the lr-kallisto equivalent of that second pass, published to
lrkallisto_all_droplets/: a newlrkallisto_countsubworkflow runs the counting half (split_bc_umi->kallisto bus->bustools->kallisto quant-tcc) twice off the same reads and the same index, once keyed on the barcode flexiplex matched to the known list and once onXB. The existinglrkallisto/outputs are unchanged - Bounded that all-droplet pass.
XBis the raw uncorrected barcode below the knee and the pass deliberately skipsbustools correct, so nothing limited the column count and sequencing error alone minted a barcode per read — on a full sample ~14.1M columns against ~8.8k called cells, which the long-read EM could not finish.split_bc_uminow takes an allowlist built from the read counts flexiplex has already collected, so barcodes below--lrkallisto_all_min_readsare dropped before pseudoalignment. At the default of 100 that is ~233k columns retaining ~54% of the below-knee reads, and it boundskallisto busandbustoolsas well as the EM - The lr-kallisto
gene/matrix is the integer UMI count matrix frombustools count --genecounts --umi-gene, in both thelrkallisto/andlrkallisto_all_droplets/passes. Thekallisto quant-tccEM gene abundances were considered for it and rejected: they are fractional (0.25, 0.333333, ...), which CellBender and every other tool with a count likelihood reject, and they inflatenFeaturein the Seurat QC because any nonzero EM weight counts as a detected gene. The all-droplet matrix exists for exactly that ambient/empty-droplet use. The published matrix is the standard kb-python gene matrix: a UMI compatible with more than one gene is discarded rather than distributed, so gene totals are lower than the EM totals by the gene-ambiguous fraction (28% on the chr21 test data, a worst case for so small a reference).--multimappingis deliberately not used for the gene count, since with--genecountsit splits ambiguous UMIs evenly and reintroduces the fractions; it can only be added through the separateext.args2ofBUSTOOLS_TCC, and the module then fails rather than publish a fractional matrix under anintegerheader.gene/features.tsv.gzcarries gene id, gene name and feature type, so the directory reads as a Cell Ranger v3 MEX directory. The EM gene abundances are still published asquant/matrix.abundance.gene.mtx. Thetranscript/matrix (and the oarfish matrix) remain EM estimates and stay fractional, so their Seurat QCnFeaturestill counts every nonzero EM weight and is not comparable with the IsoQuant transcript QC - The cDNA genome alignment is now produced whenever there are cDNA reads, rather than only when a genome quantifier was requested. Previously
--quantifier lrkallistoskipped the entire cDNA alignment arm, so an lr-kallisto run produced no cDNA BAM at all; the BAM is a deliverable in its own right (coverage, IGV, fusions, variants) and is independent of how the reads are quantified. lr-kallisto still pseudoaligns from th...