Replies: 1 comment
Resolved: it was the Tn5 read-through, and clipping it recovers most of the lossThe hypothesis in this thread is confirmed, and the fix has landed (#356 → #357, measurement #358 → #359). The mechanism was exactly as posted here. STAR's Controlled before/after, four published GSE207085 cells (mouse, 150 bp PE, mm10) — same uBAM from seqforge's own extractor, same STAR command, one flag different:
+21 points of unique mapping; 58% of the Your "not claiming 40% is anomalous for Smart-seq3" caution was right to make, and the answer is that it is not. The unclipped arm above — different lab, species and tissue — lands on 42.39% uniquely mapped against this thread's 42.0% median for Where it landed differs from what this thread proposed, and that is recorded rather than quietly reversed. You wrote that trimming is a Your ordering hazard is respected and checked, not assumed. The clip rides the aligner, which reads the uBAM the extractor already wrote, so it cannot reach R1 before the UMI is lifted out. There is a test asserting the extractor's command line carries no clip flag. One caveat worth carrying forward: you named three suspects — Tn5 read-through, polyA, and residual oligo-dT. Only the first is fixed. The fate budget shows 13.4% of the freed reads land in Full tables and method: |
Uh oh!
There was an error while loading. Please reload this page.
Roughly 40% of every worm in
aging_SS3is being thrown away at the aligner, and the pipelinehas no trimming step at all. This is a measurement, not yet a diagnosis — the primary-source review
of what to trim is still in flight — but the number is large enough and consistent enough to put
up now.
It surfaced incidentally: I was benchmarking
--outSAMtype BAM SortedByCoordinateagainstmap-then-
samtools sort(separate write-up to follow) and noticed the mapping speed was implausiblylow for a 1.3 GB
ce11index.The measurement
Two independent sources, agreeing.
43 samples from the production run (
ss3-ce11-ws298-ce321d3fc6d4, still in flight onfat02),read straight out of each cell's
Log.final.out:One median worm on an idle node (
day9_N2_3, 12,590,188 pairs,cpu02, 8 threads, nothing elserunning): 41.98% unique, 21.20% multi, 36.74% too short, mapping speed 27.74 M reads/hour.
The production medians are worse than the idle-node figure, which is what 20-way concurrency on one
node does to the speed column; the fractions are a property of the reads and match across both.
Why this is not a quality problem
Three columns rule out the boring explanations:
too shortspecifically — STAR's category for a read whose best alignmentfailed a length-relative filter, not for a read it could not place anywhere.
So ~40% of the reads carry enough clean sequence to be worth sequencing, and are being discarded on
a length test.
The leading hypothesis, labelled as one
STAR's--outFilterScoreMinOverLreadand--outFilterMatchNminOverLreadboth default to0.66and are, as their names say, relative to the full read length — including any part of the read
that is not genomic. A read that is half adapter, TSO, polyA or oligo-dT cannot clear 66% of its
own length in matched bases no matter how good the genomic half is, and lands in
too short.aging_SS3is exactly the shape that would produce this:R1:ATTGCGCAATG@0:umi@11+8:GGG@19:cdna@22— R1opens with 22 bp of non-genomic tag + UMI + motif.
umi_extracttrims R1 to offset 22 to lift the UMI out, so that prefix is handled.residual oligo-dT — SS3 is tagmented, so read-through into the adapter is expected on short
fragments.
I want to be plain that the mechanism above is a hypothesis consistent with the numbers, not
something I have verified against the SS3 protocol or the STAR source yet. A primary-source review
(SS3 methods, zUMIs' actual behaviour, STAR's filter semantics, exact adapter sequences) is running
and I will append its conclusions here rather than guess at them now.
What it costs
Two different bills, and the second is the larger one:
Some fraction of the plate's runtime is being spent to produce nothing.
recoverable by trimming, it is recoverable for every cell, permanently, and it changes the
per-cell depth every downstream analysis sees.
The second is why this is worth doing properly rather than quickly.
What I am not claiming
attempts, but it adds a pass over every FASTQ. Which way that nets out is a measurement nobody here
has made, and I would not put it in a recipe on intuition.
published baseline in hand to compare against. That is one of the things the review is for.
seqforgeresolved the chemistry and the read structure correctly from the bytes. This is a question about
what the recipe should do, which is
processing.yaml's side of the line.Where this would land if it holds up
Trimming is a
processing.yamlconcern, not a manifest one — same data, different recipe, and thedataset hash should not move because we decided to trim. Worth noting there is an ordering hazard
that any implementation has to respect: the UMI lives in the first 19 bp of R1, so anything that
trims R1 before
umi_extractruns destroys it. Trimming has to happen after extraction, or betaught the structure.
Related
produced the two numbers that issue says do not exist, and I will post those with it.
aging_SS3compile this is measured against.Numbers above are reproducible from
Log.final.outin the pipeline'sresults/and from/share/lhqlab/wormbase/inhouse/aging_SS3/script/bench_star_sort/onircbc.All reactions