Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
A direct command skips the review prompt. Inspect the source before running it.
Detects m6A modifications from Oxford Nanopore direct-RNA-sequencing (ONT DRS) signal data using m6Anet (Hendra 2022 *Nat Methods* 19:1590; multiple-instance-learning neural network over DRACH 5-mer signal). Covers the required upstream pipeline (Dorado / Guppy basecalling -> minimap2 transcriptome alignment with `-ax map-ont -uf -k14 --secondary=no` -> nanopolish eventalign with `--scale-events --signal-index` (m6Anet-required) plus `--summary` / `--threads` housekeeping -> m6anet dataprep -> m6anet inference), per-site vs per-read probability interpretation including the `mod_ratio` per-site stoichiometry column, the DRACH-only modeling constraint, minimum-coverage thresholds (20-50 reads per site for stable probability estimates), multi-condition comparison via xPore (Pratanwanich 2021 *Nat Biotechnol* 39:1394), Nanocompore (Leger 2021 *Nat Commun* 12:7198), ELIGOS (Jenjaroenpun 2021 *NAR* 49:e7), and Dorado native modification calling (RNA004 chemistry, 2024+), reference-transcriptome version pinning, the cDNA-vs-DRS chemistry distinction (cDNA-Nanopore CANNOT be used for modification detection), and orthogonal validation against MeRIP / GLORI. Use when calling m6A from ONT DRS without immunoprecipitation, choosing m6Anet vs xPore vs Nanocompore vs ELIGOS vs Dorado native, interpreting per-site `probability_modified` vs `mod_ratio` vs per-read modification probabilities, comparing methylation between conditions from ONT data, deciding between m6Anet for known DRACH sites and Dorado/Remora for genome-wide screening, pinning RNA002 vs RNA004 chemistry and basecaller model versions, or troubleshooting eventalign / dataprep failures.
If m6anet is invoked as a hyphenated command (m6anet-dataprep), the v1.x CLI is installed; v2.x uses subcommand syntax (m6anet dataprep). Pin m6anet version explicitly in any reproducible analysis. Dorado modification models are versioned independently of the basecaller (m6A_DRACH@v0.1, m6A_DRACH@v1, ...); model versions are NOT directly comparable across releases. RNA002 vs RNA004 nanopore chemistry use different signal characteristics — models trained on RNA002 do NOT transfer to RNA004.
m6Anet Direct-RNA m6A Detection
"Detect m6A from my Nanopore direct RNA data without IP" -> Run the full pipeline from POD5 / FAST5 signal to per-site m6A modification probabilities: Dorado basecalling -> minimap2 alignment to TRANSCRIPTOME (not genome) with -ax map-ont -uf -k14 -> nanopolish eventalign with --scale-events --signal-index (the m6Anet-required pair) -> m6anet dataprep -> m6anet inference. Report per-site probability_modified (model posterior that any reads at the site are modified) AND mod_ratio (per-site stoichiometry, the fraction of reads called modified) with coverage. CRITICAL: m6Anet is DRACH-only — non-DRACH sites are invisible to the model; cDNA-Nanopore data CANNOT be used (PCR erases the signal); RNA002 and RNA004 chemistry require different model versions.
CLI: dorado basecaller rna004_130bps_sup@v5.0.0 --emit-fastq pod5/ -- modern RNA004 basecalling
The Single Most Important Modern Insight -- m6Anet scores per-site DRACH probabilities, but reliability depends on coverage and the model is DRACH-only
Hendra 2022 Nat Methods 19:1590 recommends a minimum 20-50 reads per site for stable per-site probability_modified estimates; sites with <20 reads at probability_modified > 0.9 are likely false positives driven by per-read noise. The per-site mod_ratio column (the fraction of reads called modified at the site) is the stoichiometry-aware signal — informative even when per-site probability_modified is borderline. CRITICAL: m6Anet only scores DRACH 5-mers (D=A/G/U, R=A/G, A=methylated, C=C, H=A/C/U); non-DRACH sites are invisible to the model regardless of methylation status. For non-DRACH discovery, switch to Dorado / Remora modification basecallers (genome-wide; pin the modification-model version explicitly) or to xPore / Nanocompore (which compare two conditions without an a-priori 5-mer restriction). cDNA-Nanopore data cannot be used for m6Anet because PCR amplification erases the modification signal — only direct-RNA-sequencing (ONT DRS, kit SQK-RNA002 or SQK-RNA004) preserves the modification signal in the ionic current. Cross-method comparison: m6Anet ~0.51 recall on the Pratanwanich/Hendra synthetic-mix benchmark at >=10% modification / >=10x coverage; Dorado RNA004 recall is markedly higher (reported ~0.9 at the same threshold in a 2024-2025 RNA004 benchmark) but with higher per-site FDR (~40% at low-prevalence sites) — the two figures are NOT from a head-to-head test set, so treat as bounds rather than a comparable pair. The systematic 10-tool benchmark Zhong 2023 Nat Commun 14:1906 documents broader precision-vs-recall tradeoffs. The right modern pipeline is Dorado native for first-pass discovery -> m6Anet (or CHEUI) for filtering high-confidence subset -> GLORI for orthogonal stoichiometry validation at named loci.
Algorithmic Taxonomy
Tool
Mechanism
RNA002
RNA004
Strength
Fails when
m6Anet (Hendra 2022 Nat Methods 19:1590)
Multiple-instance-learning NN over DRACH 5-mer ionic-current features from nanopolish eventalign
YES
YES (recent)
Best-in-class for DRACH m6A on RNA002; generalises across cell lines
Dorado native modification calling (genome-wide) OR xPore / Nanocompore (5-mer-agnostic)
m6Anet / CHEUI are DRACH-only
Verified cDNA-Nanopore data (no DRS)
None of these tools apply — PCR erases modification signal; modification detection is impossible
Running m6Anet on cDNA returns near-zero modification probabilities everywhere
Cross-laboratory reproducibility
Pin: basecaller version, Dorado modification model version, m6Anet model SHA, nanopolish version, reference transcriptome version (GENCODE / Ensembl release)
Unpinned versions break cross-batch comparability
Absolute stoichiometry needed
NOT direct-RNA alone -- supplement with GLORI on a subset of sites for calibration
Per-read modification rate is a stoichiometry estimate but has ~5-15% per-read error; GLORI is the gold standard
Wanting to validate MeRIP peaks orthogonally
m6Anet at the MeRIP peak positions in DRACH context; report concordance
Cross-method validation by independent technologies is the strongest evidence
Methodology evolves; before any high-stakes m6Anet / direct-RNA analysis, web-search "m6anet v2 release notes", "Dorado modification model release notes", "RNA004 m6A benchmark 2024" for current best practice.
Full m6Anet Pipeline (RNA002 / RNA004 chemistry)
Goal: Take POD5 / FAST5 signal data through basecalling, transcriptome alignment, nanopolish event alignment, and m6anet inference to produce per-site m6A modification probabilities at DRACH 5-mers.
Approach: Basecall with Dorado (modern) or Guppy (legacy); align to TRANSCRIPTOME (not genome) with minimap2 -ax map-ont -uf -k14 --secondary=no; sort and index BAM; run nanopolish eventalign with the m6Anet-required --scale-events --signal-index flag pair (plus --summary / --threads for housekeeping); m6anet dataprep extracts features; m6anet inference produces per-site probability_modified and mod_ratio.
The m6Anet-required nanopolish flags are --scale-events --signal-index; m6Anet was trained on this feature set. The additional --samples --print-read-names flags are sometimes needed by downstream tools (yanocomp, f5c-pipeline interop) but are NOT required by m6Anet itself. Transcriptome alignment with -uf forces the forward-strand interpretation (DRS is directional); -k14 is the recommended k-mer for ONT DRS. Use -ax map-ont against a TRANSCRIPTOME reference (the reference is already spliced); switch to -ax splice -uf -k14 only when aligning DRS reads to a GENOME reference (the lh3 cookbook pattern for SIRV / spike-in genomes).
Filtering and Interpreting m6Anet Results
Goal: Apply minimum-coverage and probability thresholds to data.site_proba.csv to retain high-confidence m6A site calls; report mod_ratio (per-site stoichiometry) alongside probability_modified (per-site model posterior).
Approach: Read the CSV; filter by n_reads >= 20 (conservative) or >= 50 (stringent) AND probability_modified >= 0.9 (high-precision threshold per Hendra 2022); inspect mod_ratio as the per-site stoichiometry estimate. The full column set is transcript_id, transcript_position, n_reads, probability_modified, kmer, mod_ratio.
probability_modified is the per-site model posterior (multiple-instance-learning aggregation over reads); mod_ratio is the per-site stoichiometry (fraction of reads called modified above the model's internal per-read threshold). For stoichiometry claims, mod_ratio is the right column. For genuine per-read output (probability per individual read), enable --read_proba_threshold <T> during inference (NOT --per_read_proba_threshold); per-model defaults are very small (0.033379376 for HCT116_RNA002), so 0.5 is an interpretation threshold on the output column, not the CLI default.
xPore Two-Condition Differential
Goal: Compare m6A modification rate at each DRACH site between two conditions using a Bayesian multi-sample GMM; no matched IVT control needed.
Approach: Run nanopolish eventalign + xpore dataprep separately for each condition; build a YAML config listing conditions and per-condition runs; xpore diffmod tests for differential modification per site.
xPore reports diff_mod_rate (per-site rate difference) AND p-value AND posterior probability. Filter for high-confidence differential by combining diff_mod_rate >= 0.1 (10 percentage points) AND pval < 0.05.
Nanocompore Comparative Modification Detection
Goal: Compare current intensity and dwell time per position between WT and KO (or treated vs control) to detect modification differences via Gaussian mixture comparison.
Approach: nanopolish eventalign per condition; Nanocompore CLI compares the two; outputs per-position differential GMM logit + KS + MWU statistics.
Nanocompore reports GMM_logit_pvalue, KS_dwell_pvalue, KS_intensity_pvalue, MW_dwell_pvalue, MW_intensity_pvalue. The GMM_logit test is the primary modification signal; use as a starting filter, then inspect dwell / intensity for direction. CRITICAL: Nanocompore is modification-type-AGNOSTIC — it detects signal differences which may be any of m6A, m5C, Ψ, or other modifications. Type assignment requires orthogonal information.
Per-Method Failure Modes
cDNA-Nanopore data fed to m6Anet
Trigger: Sequencing run used cDNA-Nanopore (PCR-amplified) rather than DRS (direct RNA); m6Anet pipeline attempted on the output.
Mechanism: Modification detection from nanopore signals (m6Anet, xPore, Nanocompore, ELIGOS, Dorado native) requires the RAW ionic-current signal from direct-RNA sequencing. cDNA-Nanopore amplifies the cDNA via PCR, which erases all modification signal because PCR uses canonical bases. Only DRS protocols (kit SQK-RNA002 or SQK-RNA004; no PCR; RNA-native sequencing with the DNA RT-adapter) preserve the modification signal.
Symptom:nanopolish eventalign runs successfully but produces uniform-looking event distributions; m6anet inference returns near-zero probability_modified everywhere; no DRACH enrichment in flagged sites.
Fix: Confirm DRS protocol BEFORE running any modification-detection pipeline. Check sequencing-core run report for kit (SQK-RNA002 / SQK-RNA004) vs cDNA kit (SQK-PCS, SQK-LSK). If cDNA, modification detection is impossible; defer to MeRIP or chemistry-based methods.
m6Anet run with low-coverage sites at high probability
Trigger: Reporting m6Anet probability_modified > 0.9 at sites with n_reads < 10.
Mechanism: m6Anet's per-site probability is computed via multiple-instance aggregation over reads. With low coverage, per-read predictions are weakly aggregated and per-site probability is noisy. Hendra 2022 recommends 20-50 reads per site minimum for stable calls.
Symptom: Many "high-confidence" m6A sites at sparsely-covered transcripts; per-site probability scatter at low coverage; sites do not validate orthogonally.
Fix: Apply minimum-coverage filter (n_reads >= 20 conservative; >= 50 stringent) BEFORE the probability filter. For high-stakes sites at low coverage, report both per-site probability AND per-read modification rate; orthogonally validate with GLORI / SAC-seq.
Genome alignment instead of transcriptome alignment
Trigger: minimap2 invoked with -ax splice -uf (genome splice-aware) before m6Anet pipeline.
Mechanism: m6Anet expects reads aligned to a TRANSCRIPTOME FASTA (per-transcript coordinates); nanopolish eventalign signal alignment is per-transcript. Genome-aligned reads with splice junctions break the per-transcript signal interpretation.
Symptom: m6anet dataprep fails with chromosome / transcript ID errors; OR runs but produces few site calls; OR per-site probabilities are nonsensical.
Fix: Use minimap2 -ax map-ont -uf -k14 --secondary=no against a TRANSCRIPTOME FASTA for the m6Anet pipeline. For downstream genome-coordinate visualisation, convert site predictions back to genome coordinates via the transcript-to-genome mapping (use the GTF + a custom script or samtools lifting).
Nanopolish eventalign without m6Anet-required flags
Trigger:nanopolish eventalign invoked without --scale-events --signal-index.
Mechanism: m6Anet was trained on the specific eventalign output format produced by --scale-events --signal-index. Without these, the dataprep step fails or produces feature vectors that don't match the model's expected input. The additional --samples --print-read-names flags are commonly added because other downstream tools (yanocomp, f5c interop) need them, but m6Anet itself does NOT require them.
Symptom: m6anet dataprep fails with parse errors; OR runs but produces empty feature files; OR inference returns no calls.
Fix: Always pass --scale-events --signal-index for m6Anet; add --samples --print-read-names only if downstream tools need them. Verify against m6anet quickstart for the installed version.
f5c eventalign substituted for nanopolish without validation
Trigger: GPU-accelerated f5c eventalign used in place of nanopolish for speed; m6Anet model run on f5c output.
Mechanism: f5c is a re-implementation of nanopolish; eventalign output is numerically very close but NOT bit-identical, particularly in event_level_mean and model_kmer columns under certain edge cases. m6Anet was trained on nanopolish output; f5c is empirically usable but not officially supported and can shift per-site probabilities by 5-10% in extreme cases.
Fix: Use nanopolish unless GPU acceleration is required AND the user has validated f5c output equivalence on a control dataset. Document the eventalign source in any published analysis.
Dorado modification model version not pinned
Trigger: SKILL.md / pipeline uses Dorado for m6A modification calling without specifying the model version.
Mechanism: Dorado modification models are versioned independently of the basecaller (m6A_DRACH@v0.1, m6A_DRACH@v1.0, etc.). Calls from different model versions are NOT directly comparable; model retraining shifts per-site probabilities.
Fix: Pin the exact modification model SHA / version in every CLI invocation; record in pipeline metadata. For multi-batch projects, re-call older batches with the new model when upgrading.
Reference transcriptome version drift
Trigger: m6Anet results in batch 1 computed against GENCODE v44 transcripts; batch 2 against GENCODE v45; direct transcript-coordinate comparison.
Mechanism: Transcript IDs include version suffixes (ENST00000123456.1 vs .2); some transcripts change between releases. Site coordinates relative to transcript start may shift.
Fix: Pin GENCODE / Ensembl transcript release for ALL m6Anet runs in a project. Lift over results when upgrading.
Per-read modification rate confused with per-site probability
Trigger: Reporting m6Anet probability_modified as "the fraction of molecules modified at this site".
Mechanism:probability_modified is the model's posterior probability that the site has any modified reads (multiple-instance learning aggregation). It is NOT the per-read modification rate. Per-read modification rate is the fraction of reads at the site whose per-read posterior exceeds 0.5 (or another threshold).
Symptom: Stoichiometry claims based on per-site probability; numbers don't match orthogonal GLORI / SAC-seq stoichiometry estimates.
Fix: For stoichiometry, compute per-read modification rate from per-read output; cross-validate against GLORI at named sites.
RNA002 model run on RNA004 chemistry data
Trigger: Pipeline uses an m6Anet model trained on RNA002 to analyse RNA004 chemistry runs.
Mechanism: RNA002 and RNA004 nanopore chemistry produce different signal characteristics — different motor protein, different translocation kinetics. Models trained on RNA002 do NOT transfer to RNA004 (and vice versa).
Fix: Pin RNA chemistry version per project; use the m6Anet model trained on the matching chemistry. m6Anet v2+ has explicit RNA004 model support; verify against m6anet --help.
Reconciliation: When Methods Disagree
Pattern
Likely cause
Action
m6Anet high-confidence; GLORI does not call
Site in low-stoichiometry tail; GLORI conservatism
Trust GLORI for absolute; m6Anet probability + per-read rate informative for prevalence
m6Anet calls; MeRIP peak in same gene but different position
MeRIP fragment-level vs m6Anet single-base; methylation position offset within peak
Map m6Anet site against MeRIP peak coordinates with tolerance (~100 nt); concordance at gene level
Dorado calls; m6Anet does not at same DRACH
Dorado broader / less conservative; m6Anet model trained more strictly
Use m6Anet for high-precision; Dorado for high-recall first-pass
xPore differential strong; Nanocompore weak
xPore Bayesian multi-sample; Nanocompore pairwise GMM less powered
Trust xPore for multi-sample designs
Per-site probability high but per-read rate low
Few reads contributed strongly; rest were near-threshold
Suspect over-fit per-site at low coverage; verify with higher-coverage replicate
All ELIGOS / EpiNano sites have low signal
Older tools tied to obsolete basecallers; signal interpretation broken
Switch to modern tools (m6Anet, Dorado native)
CHEUI m6A and m5C overlap at same site
Co-occurring modifications OR cross-talk in model
CHEUI is the only published tool that handles co-occurrence; interpret as biological signal if validated
Approximate from per-method validation tables in Liu C 2023 Nat Biotechnol 41:355 and Hu L 2022 Nat Biotechnol 40:1210; verify against current cross-method benchmark
Common-core m6A sites (HEK293T cross-method)
~6,000-15,000
Intersection of orthogonal methods
Common Errors
Error / symptom
Cause
Solution
m6anet-dataprep not found
v1 hyphenated CLI not in installed v2
Use m6anet dataprep (subcommand syntax)
nanopolish eventalign errors with "no event annotation"
FAST5 / POD5 not indexed; OR --scale-events --signal-index missing
Run nanopolish index -d pod5/ reads.fastq first; include the m6Anet-required flag pair
m6anet inference returns empty CSV
dataprep output empty; OR all sites filtered by default coverage threshold
Check dataprep log; verify feature TSV in dataprep output dir
Reads marked as cDNA in run summary
Library prep used cDNA kit (SQK-PCS / SQK-LSK), not DRS
Modification detection impossible; switch to MeRIP / chemistry-based methods
minimap2 -ax splice instead of map-ont
Genome-splice flag used for transcriptome alignment
Switch to -ax map-ont -uf -k14
nanopolish eventalign extremely slow
Single-threaded by default
Pass --threads N
f5c output produces shifted m6Anet probabilities
f5c is numerically near-identical but not bit-identical to nanopolish
Use nanopolish unless GPU acceleration required
Per-site probability high at 5 reads
Low coverage; per-site noise
Filter by n_reads >= 20 before interpretation
xPore diffmod takes hours per condition
Single-threaded default
Pass --n_processes 8
Dorado m6A model not found
Model not downloaded
dorado download --model m6A_DRACH@v1
Transcriptome IDs missing from m6anet output
Reference mismatch between minimap2 input and m6anet config
Use same transcriptome FASTA throughout pipeline
Modification probabilities differ between Dorado releases
Model versioned independently from basecaller
Pin model version explicitly
Per-read CSV not generated
--read_proba_threshold not set (NOT --per_read_proba_threshold)
Add --read_proba_threshold <T> to m6anet inference; T is model-specific (default very small, e.g., 0.033 for HCT116_RNA002)
Anticipated Reviewer Pushback
Pushback
Response
"Why m6Anet over Dorado native?"
m6Anet for high-precision DRACH calling; Dorado for high-recall first-pass; both reported when feasible
"How were non-DRACH sites handled?"
m6Anet is DRACH-only by design; non-DRACH discovery via Dorado / xPore / Nanocompore; cited limitation
"What's the per-site coverage threshold?"
n_reads >= 20 conservative per Hendra 2022; >= 50 for stringent calls
"Was cross-validation against orthogonal methods done?"
Chemistry version pinned per project; m6Anet model selected to match (RNA002 model on RNA002 data, RNA004 on RNA004)
"Was the Dorado modification model version pinned?"
Yes — version recorded in pipeline metadata; rerun batches with new model when upgrading
"Per-site probability vs mod_ratio?"
probability_modified is the per-site model posterior; mod_ratio is the per-site stoichiometry (fraction of reads called modified) — both reported
"Is mod_ratio the same as absolute stoichiometry?"
Approximately; per-read calls have ~5-15% error; for absolute stoichiometry at named loci, cross-validate with GLORI
"Why not just use Tombo / EpiNano?"
Tombo less maintained since 2020; EpiNano tied to obsolete Albacore basecaller; m6Anet / Dorado / CHEUI are modern
"How were f5c vs nanopolish handled?"
Used nanopolish (m6Anet-trained source); did not substitute f5c
References
Hendra C, Pratanwanich PN, Wan YK, Goh WSS, Thiery A, Göke J (2022) Detection of m6A from direct RNA sequencing using a multiple instance learning framework. Nat Methods 19(12):1590-1598. doi:10.1038/s41592-022-01666-1
Pratanwanich PN, Yao F, Chen Y et al (2021) Identification of differential RNA modifications from nanopore direct RNA sequencing with xPore. Nat Biotechnol 39(11):1394-1402. doi:10.1038/s41587-021-00949-w
Leger A, Amaral PP, Pandolfini L et al (2021) RNA modifications detection by comparative Nanopore direct RNA sequencing. Nat Commun 12(1):7198. doi:10.1038/s41467-021-27393-3
Jenjaroenpun P, Wongsurawat T, Wadley TD et al (2021) Decoding the epitranscriptional landscape from native RNA sequences. Nucleic Acids Res 49(2):e7. doi:10.1093/nar/gkaa620
Liu H, Begik O, Lucas MC et al (2019) Accurate detection of m6A RNA modifications in native RNA sequences. Nat Commun 10(1):4079. doi:10.1038/s41467-019-11713-9
Acera Mateos P, Sethi AJ, Ravindran A et al (2024) Prediction of m6A and m5C at single-molecule resolution reveals a transcriptome-wide co-occurrence of RNA modifications. Nat Commun 15:3899. doi:10.1038/s41467-024-47953-7
Stoiber MH, Quick J, Egan R et al (2017) De novo identification of DNA modifications enabled by genome-guided nanopore signal processing. bioRxiv 094672. doi:10.1101/094672
Zhong ZD, Xie YY, Chen HX et al (2023) Systematic comparison of tools used for m6A mapping from nanopore direct RNA sequencing. Nat Commun 14:1906. doi:10.1038/s41467-023-37596-5
Liu C, Sun H, Yi Y et al (2023) Absolute quantification of single-base m6A methylation in the mammalian transcriptome using GLORI. Nat Biotechnol 41(3):355-366. doi:10.1038/s41587-022-01487-9
Hu L, Liu S, Peng Y et al (2022) m6A RNA modifications are measured at single-base resolution across the mammalian transcriptome. Nat Biotechnol 40(8):1210-1219. doi:10.1038/s41587-022-01243-z
Li H (2018) Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics 34(18):3094-3100. doi:10.1093/bioinformatics/bty191
Loman NJ, Quick J, Simpson JT (2015) A complete bacterial genome assembled de novo using only nanopore sequencing data. Nat Methods 12(8):733-735. doi:10.1038/nmeth.3444
Dominissini D, Moshitch-Moshkovitz S, Schwartz S et al (2012) Topology of the human and mouse m6A RNA methylomes revealed by m6A-seq. Nature 485(7397):201-206. doi:10.1038/nature11112
Linder B, Grozhik AV, Olarerin-George AO, Meydan C, Mason CE, Jaffrey SR (2015) Single-nucleotide-resolution mapping of m6A and m6Am throughout the transcriptome. Nat Methods 12(8):767-772. doi:10.1038/nmeth.3453
Related Skills
merip-preprocessing - Genome-aligned MeRIP for cross-validation against direct-RNA calls
m6a-peak-calling - MeRIP fragment-level peaks for orthogonal validation comparison
m6a-differential - Per-site direct-RNA modification rate comparable to MeRIP differential at named loci
modification-visualization - Metagene and browser-track rendering of m6Anet site calls