FAQ¶
Frequently asked questions about the aa-tRNA-seq pipeline.
General Questions¶
What species can I analyze?¶
The pipeline is designed for Saccharomyces cerevisiae tRNAs by default. To use with other species:
- Create a reference FASTA with your tRNA sequences + adapters
- Train or adapt the charging model for your species
- Update the config to point to your reference
What is the charging threshold?¶
The default is cl >= 200 = charged, on a 0-255 scale. It is the operating
point the charging bundle itself declares, characterised against ligation
chemistry: FPR 1.74% on a library that is 0% charged by construction (1 false
call in 58) and TPR 0.939 on one that is 100% charged.
Can I change the charging threshold?¶
Yes — it is config, not code:
| YAML | |
|---|---|
1 2 | |
Whether you should depends on your sample, not on the model. Precision falls as the true charged fraction falls, because the false positives come from a pool that grows as the real signal shrinks:
| true charged fraction | precision at cl >= 200 |
cl needed for 95% |
|---|---|---|
| 0.50 | 0.98 | 128 |
| 0.25 | 0.95 | 205 |
| 0.10 | 0.86 | 248 |
| 0.05 | 0.74 | 254 |
At 10% charged, roughly one in seven "charged" calls at the default is a molecule that cannot be charged. The bundle's own guidance is that a caller wanting different precision should move the threshold and say so.
What modifications are detected?¶
The pipeline calls these modifications via Dorado:
- pseU - Pseudouridine
- m5C - 5-methylcytosine
- m6A - N6-methyladenosine
- inosine - Inosine
How accurate is charging classification?¶
Accuracy depends on:
- Signal quality
- Full-length read retention
- Model training data match
The 6-nucleotide kmer (CCAGGC) provides the classification signal.
Data Requirements¶
What input format is required?¶
POD5 format from Oxford Nanopore sequencing. The pipeline does not accept:
- FAST5 (convert with
pod5 convert) - FASTQ (signal data required)
- BAM (unless from Dorado with move tables)
How should I organize my data?¶
| Text Only | |
|---|---|
1 2 3 4 5 6 7 | |
Can I merge multiple runs per sample?¶
Yes! List the same sample ID multiple times in your samples file:
| Text Only | |
|---|---|
1 2 | |
stage_pod5 symlinks POD5 files from both runs into one sample directory —
nothing is copied — and both dorado and escpod classify read the directory
recursively, so the sample's signal is treated as one store.
What's the minimum read count?¶
There's no hard minimum, but:
- 100+ reads per tRNA recommended for reliable CPM estimates
- 1000+ reads recommended for statistical analysis
Execution Questions¶
How long does the pipeline take?¶
Typical times per sample (GPU):
| Step | Time |
|---|---|
| Stage POD5 (symlinks) | seconds |
| Rebasecall | 30-60 min |
| Alignment + calmd | 5-10 min |
| Classification | 10-30 min |
| Summaries | 5-10 min |
| Total | 1-2 hours |
CPU-only is 10-100x slower.
Can I run without a GPU?¶
Yes, but not recommended. Dorado will fall back to CPU (charging classification defaults to CPU too, unless charging.gpu: true is set and the bundle supports it — see docs/cluster/gpu-configuration.md):
| Bash | |
|---|---|
1 2 | |
Expect significant slowdown.
How much disk space is needed?¶
Per sample (approximate):
| Data | Size |
|---|---|
| Staged POD5 (symlinks) | ~0 (raw run itself is 5-50+ GB, not duplicated) |
| Rebasecalled BAM | 1-5 GB |
| Final BAM | 100-500 MB |
| Summary tables | 10-100 MB |
Plan for the raw run's own size plus a few GB of BAMs per sample during
processing. Run pixi run snakemake clean --configfile=... (see
workflow/rules/clean.smk) to reclaim regenerable intermediates once a run is
done, or set cleanup_intermediates in the config to auto-delete them as the
pipeline goes (see config/README.md).
Can I resume a failed run?¶
Yes! Snakemake automatically resumes:
| Bash | |
|---|---|
1 | |
Only incomplete rules will re-run.
A rule that failed re-runs from the start, with one exception: basecalling
resumes mid-rule. rebasecall and rebasecall_ldx_run go through
workflow/scripts/dorado_basecall_resume.sh, which leaves the partial BAM of a
killed attempt beside the output as a hidden .{name}.partial and passes it back
to dorado as --resume-from next time. So a basecall killed on wall clock costs
the reads it had not reached, not the whole flowcell — just resubmit.
The checkpoint is discarded automatically, and a full basecall done instead, if
the basecalling arguments changed since it was written (a different
base_calling_model, say) or if it is too damaged to read. You should not need
to touch it; if you want to force a clean start anyway, delete the
.{name}.partial, .{name}.resume and .{name}.args files next to the output.
The clean rule already removes them with the rest of bam/rebasecall*/.
escapepod_demux does not resume — escpod has no equivalent of
--resume-from — so an LDX demux killed on wall clock does start over.
Output Questions¶
What does the charging_prob table contain?¶
Per-read charging likelihood scores:
| Column | Description |
|---|---|
| read_id | Nanopore read ID |
| tRNA | Aligned tRNA reference |
| charging_likelihood | Score 0-255 (≥200 = charged) |
What does the CPM table contain?¶
Per-tRNA aggregated counts:
| Column | Description |
|---|---|
| tRNA | Reference name |
| counts_charged | Charged read count |
| counts_uncharged | Uncharged read count |
| cpm_charged | Charged CPM |
| cpm_uncharged | Uncharged CPM |
Why is the charging score in a cl tag instead of ML/MM?¶
ML/MM are the standard SAM modification tags, and Dorado already uses them
for the base modifications modkit reads. The charging call gets its own cl
tag (uint8, round(P(charged) * 255)), written directly by
escpod classify, so the two never collide.
Historically the charging score did arrive in ML/MM — Remora emitted it
there, clobbering the modbase calls — and a transfer_bam_tags step existed
purely to rename them to cl/cm. That step and the cm tag are both gone.
How do I visualize results?¶
Load output files in:
- IGV: BAM files, BedGraph coverage
- R/Python: TSV tables for statistical analysis
- Downstream repo: github.com/rnabioco/aa-tRNA-seq
Configuration Questions¶
What's the difference between config files?¶
| File | Purpose |
|---|---|
config-base.yml |
Default parameters (always loaded) |
config-test.yml |
Test data paths |
config-preprint.yml |
Full preprint analysis |
config-demux-test.yml |
Demultiplexing test |
Your config only needs to override what's different.
How do I add a new sample?¶
-
Add to samples.tsv:
Text Only 1new_sample /path/to/data -
Run pipeline:
Bash 1pixi run snakemake --configfile=config/config.yml
Only new samples will be processed.
Can I use a custom reference?¶
Yes, set in your config:
| YAML | |
|---|---|
1 | |
The reference should include adapter sequences matching your library prep.
Demultiplexing Questions¶
When should I use demultiplexing?¶
When samples were pooled with WarpDemuX barcodes during library preparation.
Which barcode kit should I use?¶
| Kit | Barcodes | Recommendation |
|---|---|---|
WDX4_tRNA_rna004_v1_0 |
03, 04, 05, 07 | Recommended |
WDX4b_tRNA_rna004_v1_0 |
04, 05, 07, 11 | Alternative |
Why are my demux reads unbalanced?¶
Common causes:
- Library concentration differences
- Barcode ligation efficiency variation
- Loading bias
Check demux_summary.tsv.gz for distribution.
Can I mix demux and direct samples?¶
Yes, in YAML format use ~ for direct samples:
| YAML | |
|---|---|
1 2 3 4 5 6 7 | |
Troubleshooting Questions¶
Why did my job fail?¶
-
Check the log file:
Bash 1cat results/logs/<rule>/<sample> -
Check cluster job output:
Bash 1 2
# LSF bjobs -l <job_id>
How do I force re-run a rule?¶
| Bash | |
|---|---|
1 | |
How do I clean up and start fresh?¶
| Bash | |
|---|---|
1 2 3 4 5 | |
Where can I get help?¶
- GitHub Issues: github.com/rnabioco/aa-tRNA-seq-pipeline/issues
- Documentation: This site
- Downstream analysis: github.com/rnabioco/aa-tRNA-seq