fasta-classes¶
One FASTA file per class, label taken from the filename.
600 coding and 600 intergenomic sequences, each 200 nucleotides, from
Genomic Benchmarks's
demo_coding_vs_intergenomic_seqs.
The only example that is not a table. FASTA carries no label column, so the file is the class.
Run it¶
gb-qc evaluate-classes \
--input examples/fasta-classes/data/coding_seqs.fasta \
--input examples/fasta-classes/data/intergenomic_seqs.fasta \
--out-folder qc-out
Each file becomes one class, and its filename stem becomes the label:
coding_seqs.fasta → coding_seqs. The two labels, ordered alphabetically, give
the report directory class/sequence/coding_seqs_vs_intergenomic_seqs.
Two details that surprise people:
- Classes are always ordered alphabetically by directory name, so the path is the same whichever order you list the files in. Reports are reproducible without you having to remember the order you typed.
- FASTA inputs still land under a
sequence/directory even though there is no sequence column, so the output layout is identical for every input format.
What it produces¶
class/sequence/coding_seqs_vs_intergenomic_seqs — open the report
| Check | Flag | AU-ROC |
|---|---|---|
| Unique bases | Pass | — |
| Sequence Duplications within Labels | Pass | — |
| Duplicate Sequences between Labels | Pass | — |
| Sequence lengths | Pass | 0.500 |
| Per sequence GC content | Fail | 0.844 |
| Per sequence nucleotide content | Fail | 0.825 |
| Per sequence dinucleotide content | Fail | 0.843 |
| Per position nucleotide content | Pass | 0.586 |
| Per position reversed nucleotide content | Pass | 0.586 |
What you should conclude¶
Coding and non-coding DNA differ in composition, strongly. GC content scores AU-ROC 0.844, base composition 0.825, dinucleotide frequencies 0.843. These are the highest per-sequence scores in any example here.
This is real biology — coding sequence is constrained by the genetic code, which constrains its composition — and it makes the dataset an easy benchmark. A model that only counts GC gets 0.84. If you are reporting results on a coding-vs-noncoding task, that is the number to beat, and plenty of published architectures beat it by less than you would hope.
Per-position passes (0.586) while per-sequence composition fails hard. That is the informative contrast: the composition difference is spread evenly through the sequence rather than concentrated at particular positions. Compare hidden-motif, which is the exact opposite — clean per-sequence, failing per-position. The two checks are asking genuinely different questions, and these two examples are the clearest demonstration that they can disagree.
The flagged features list is long — A, C, G, T and ten dinucleotides —
because when overall composition shifts, everything shifts with it. A long list
of flagged features usually means one global difference rather than many separate
ones.
Nothing else is wrong. No duplicates, no non-ACGT bases, and every sequence
is exactly 200 nt so Sequence lengths is exactly 0.500. This is a
well-constructed dataset that happens to be easy.