Worked example¶
One genome, end to end, with the real rows. The isolate was chosen because its answer is already known from the literature, so every call can be checked against something external.
Klebsiella pneumoniae ATCC BAA-2146 (GCF_000364385.3) — a complete assembly, one
chromosome and four plasmids, carrying blaNDM-1, blaCTX-M-15, blaOXA-1, blaTEM-1,
blaCMY-6, rmtC and a long list of aminoglycoside, sulfonamide, quinolone, macrolide
and metal-resistance genes. Run as mode: contigs with mobilome.run: true, all four
optional layers configured, and phage.caller: genomad.
The isolates in BacFlux's own validation set are environmental and carry no acquired resistance, so they only ever exercise the bottom of the ladder. This genome exercises almost all of it.
Terms used on this page
| AMR | antimicrobial resistance |
| IS | insertion sequence — the smallest mobile element, carrying only the genes it needs to move itself |
| ICE | integrative and conjugative element — carries its own conjugation machinery, so it can move itself into another cell |
| T4SS | type IV secretion system — the mating apparatus that moves DNA between cells |
| T4CP | type IV coupling protein — links the relaxase to the secretion system |
| HMM | hidden Markov model — a statistical profile of a gene or protein family |
| FDR | false discovery rate |
| EFSA | European Food Safety Authority |
Tier 1 — intrinsic candidate¶
gyrA_S83I tier=1 intrinsic_candidate conf=high
parC_S80I tier=1 intrinsic_candidate conf=high
ompK35_Q92Ter tier=1 intrinsic_candidate conf=high
ramR_Y59CfsTer13 tier=1 intrinsic_candidate conf=high
Point mutations, not acquired genes: chromosomal changes in the bacterium's own gyrA, parC, ompK35 and ramR. Nothing was acquired, so there is nothing to transfer.
They appear at all only because the isolate resolved to Klebsiella_pneumoniae, one of
AMRFinderPlus's curated organisms, so the run passed
--organism Klebsiella_pneumoniae. Without that flag these rows would be silently
absent (Turning it on).
Tier 2 — not reached in this genome¶
No row scores tier 2 here. The rung is for a gene with an IS upstream on its own strand,
where the IS can supply an outward-reading hybrid promoter and raise expression without
making the gene mobile — a real situation, and the one this genome would have produced,
since ISEcp1 sits 48 bp upstream of the chromosomal blaCTX-M-15.
It does not, because that gene is claimed by tier 4: the IS and the gene together are a curated transposon, which is a stronger statement than proximity. See the next section.
Tier 3 — composite transposon¶
aadA2 tier=3 composite_mobilisable_within_cell conf=high
qacEdelta1 tier=3 composite_mobilisable_within_cell conf=high
sul1 tier=3 composite_mobilisable_within_cell conf=high
Three genes flanked by two copies of the same IS family. aadA2 + qacEdelta1 + sul1
is the classic class 1 integron 3′ conserved segment.
Tier 4 — inside a named transposon¶
blaCTX-M-15 (chromosomal copy) tier=4 named_element_mobilisable conf=high
mge_name=TnEcp1.1 mge_context=unit_transposon distance_bp=0
ISEcp1 does not merely sit beside this gene supplying a promoter: it mobilises
it, capturing the gene and moving it as a unit, and TnEcp1.1 is that unit. The match
is 99.9% identity over 87% of the 3,417 bp reference element (MF062700).
This is the one place a curated name changes an answer rather than decorating it.
Without the TnCentral layer the same gene scores tier 2, is_adjacent, at medium
confidence — an IS1380-family element 48 bp away, which is true and a weaker claim than
"the gene sits inside a named transposon that moves it". That is why a curated hit
overrides the pattern-based call instead of merely agreeing with it.
Seven curated elements are named in this genome, and only one produces a tier 4 row. That is the precedence rule working, not a shortfall:
NZ_CP006659.2 chromosome TnEcp1.1 87% → tier 4 ← the only one
NZ_CP006661.1 plasmid, conj. Tn7241 81% → tier 6, replicon evidence wins
NZ_CP006661.1 plasmid, conj. In781_p 82% → tier 6
NZ_CP006661.1 plasmid, conj. Tn3000 100% → tier 6
NZ_CP006662.2 plasmid, mobil. Tn3000 98% → tier 5
NZ_CP006662.2 plasmid, mobil. Tn6320 88% → tier 5
NZ_CP006662.2 plasmid, mobil. Tn1696.1 100% → tier 5
Six of the seven sit on plasmids, and a plasmid is tested before a curated element, so
those genes score 5 or 6 and keep the name in named_element as supporting detail. Only
the chromosomal one is left for tier 4 to claim. A genome can be full of named
transposons and still show a single tier 4 row.
The 80% coverage rule does most of the filtering. 1,554 candidate hits were discarded to produce those seven:
1044 reference_coverage_below_threshold ← the dominant one
318 identity_below_naming_threshold
103 interval_mostly_unaligned
84 tncentral_hit_is_a_plain_is
4 nested_or_overlapping_tncentral_hit
That floor is also why tier 4 is much harder to reach on a draft. On fragmented clinical
assemblies the same TnEcp1.1 is refused outright — "only 12% / 49% of the 3417 bp
reference element is present (needs 80%). A fragment of a transposon is not that
transposon." Here it clears the bar at 87% because the genome is closed. Look in
{sample}_named_elements_discarded.tsv before concluding a genome has no named
transposon in it.
Tier 5 — on a plasmid, two flavours¶
# pHg — Platon: mobilisable (mobilization=1; inc=2)
blaOXA-1, blaTEM-1, blaCTX-M-15, aac(3)-IIe, sul2 …
tier=5 mobilisable_needs_helper conf=high
# pCuAs — Platon: non-mobilisable (inc=2, no mobilisation genes)
tet(A), mph(A), the pco/sil/ars metal-resistance clusters
tier=5 on_plasmid_typed_non_mobilisable conf=high
Both are tier 5 because the gene is on a plasmid — acquired, which is the regulatory
question. The second group carries a different label because tier 5's generic wording,
mobilisable_needs_helper, would contradict our own evidence about a plasmid we had just
typed non-mobilisable.
Tier 6 — predicted self-transmissible¶
blaNDM-1, blaCMY-6, rmtC, aac(6')-Ib3 … (pNDM-US)
tier=6 predicted_self_transmissible conf=high
relaxase=MOBH mpf=F intact=yes
machinery_source=same_replicon:NZ_CP006661.1|conjugative_region-57877:90473
Two independent methods agree here, and that is what the confidence records. Platon typed
the replicon conjugative from its gene counts; CONJscan independently typed a complete
F-type mating apparatus with a MOBH relaxase on the same contig, so the audit carries
plasmid_conjugation_machinery_verified and tier 6 is not capped.
Without that corroboration the same row comes out at medium, with the reason spelled
out: tier 6 would rest on a count of HMM hits rather than on a verified machine. The
effect is discriminating rather than blanket — pHg (relaxase MOBC only) and pCuAs (no
machinery) are untouched and still NA in the machinery columns.
machinery_source says same_replicon, not containing_element: the mating apparatus is
elsewhere on the plasmid, not wrapped around this gene. That is still the right evidence —
a mating apparatus makes the whole replicon transferable, and with it every gene on it —
and the column says so rather than implying containment.
The chromosomal ICE, scored against its curation¶
ICEberg curates an element at exactly this locus, so the call can be scored:
| curated element | ICEKpnATCCBAA-2146-1, CP006659.2:4,603,840–4,661,887 (58,048 bp) |
| our call | 4,603,807–4,658,749 (54,943 bp) |
| start / end offset | −33 bp / −3,138 bp |
| fraction of the curated element recovered | 0.946 |
boundary_method |
tRNA, a 43 bp repeat at tRNA-Phe(gaa) |
| machinery | integrase + relaxase + T4CP + T4SS, all intact |
| confidence | high |
Even at 0.946 the interval is a floor: it ends 3,138 bp inside the curated element, and any AMR gene in that last 3 kb is scored as though it were outside the ICE. That is the general failure mode, and it is much larger on other genomes — see Validation, where 57% of AMR genes inside curated ICE intervals come out at tier 1 precisely because the called edge stopped short.
Two cautions come with that row. CP006659.2 is this isolate's own chromosome
accession — ICEberg catalogued this ICE from this genome, so a 100% identity match
is a self-match, not independent confirmation. And ICEs of one species are near-identical
across strains, so one real element matches dozens of curated entries (30 others fit about
as well here). A name from that layer is a group label, not a unique identification,
which is what the -like suffix is for.
Reading the "why not" trail¶
The audit file is where the module explains itself. For blaNDM-1:
tier_not_raised flanking_is_pair_span_too_long
1 candidate flanking pair(s) rejected. Examples:
...insertion_sequence-108774:110090 (IS110) / ...insertion_sequence-137590:140825 (new):
span 32052 bp > 20000 bp limit
The composite detector found two flanking IS copies and rejected them: 32 kb is beyond
mobilome.max_composite_span_bp. A conservative miss rather than a silent one — the
measured span is in the file.
Two things this run exposed¶
A genuine plasmid can be dropped before the module ever sees it. The input had five
sequences; the mobilome saw four. NZ_CP006660.1 (plasmid pMYS, 2,014 bp) was removed by
the contamination screen as Escherichia, even though its single best BLAST hit was
K. pneumoniae at 100% identity over the full length. BlobTools sums bitscores per taxon
across all 95 hits, and E. coli is hugely over-represented in nt, so Escherichia
summed to 58,709 against Klebsiella's 16,253. The assignment followed database
composition, not biology — and a broad-host-range plasmid can be discarded precisely
because it is mobile. Check contig_taxonomy_decisions.tsv before trusting a plasmid's
absence. See Decontamination.
genomad_fdr is NA, deliberately. geNomad computes an FDR only when its
score-calibration module has run, and that module is off by default. Switching it on is
worse rather than better for an isolate: calibration needs enough sequences to estimate
the sample's composition, and below 1,000 contigs it silently substitutes a metagenome
preset whose assumed composition is 11% virus — which does not describe a finished
bacterial genome. Run on this genome, it collapsed three genuinely different plasmid
scores (0.9925, 0.9937, 0.9943) into one identical 0.9991 with the same FDR for all
three, carrying no discriminating power. Use
plasmid_score, which is populated either way and does discriminate. See
Plasmids.
What this run demonstrates¶
- Point mutations are reported (tier 1) — the category a homology screen cannot see.
- IS-adjacent genes are called expression modulation, not mobilisation (tier 2).
- A class 1 integron's 3′ conserved segment is recovered as a composite (tier 3).
- Plasmid mobility is typed, and a non-mobilisable plasmid is labelled honestly (tier 5).
blaNDM-1, on a conjugative plasmid, reaches tier 6 at high confidence — because CONJscan typed the mating apparatus rather than merely agreeing with a gene count.- The chromosomal ICE is recovered at 0.946 of its curated length with a tRNA-anchored boundary — and still ends 3.1 kb short, because a called interval is a floor.
- Tier 4 is reached once —
blaCTX-M-15 inside TnEcp1.1. Six other curated elements are named in the same genome and none produces a tier 4 row, because they sit on plasmids and the replicon is tested first. - Every rejection carries its evidence in an audit file.
What none of it establishes¶
Every mobility statement here is a prediction made from sequence. "Predicted self-transmissible" means an element carries conjugation machinery that looks complete and intact; it does not mean the element has been shown to move. The confirmatory experiment is a filter or broth mating assay, and no output of this module substitutes for one.
Nor is any of it "EFSA-compliant", a claim BacFlux does not make. What the module produces is supporting evidence for the intrinsic-versus-acquired judgement. The judgement remains the analyst's.
The longer write-up, with the full file inventory and the corrections made to it along
the way, is
mobilome_worked_example.md;
example output files are in
docs/validation/.