4.8.1 smORF scanner¶
Function¶
smorf_scanner scans transcript-centric candidate small open reading frames (smORFs) from a genome FASTA file and a genePred annotation file.
It reconstructs spliced transcript sequences from the genome, searches candidate ORFs using user-defined start codons and ORF length limits, classifies ORF categories by their position relative to the annotated CDS, optionally marks nested and overlapping ORFs, and writes four output files: an ORF annotation table, a full ORF information table, and the nucleotide and peptide FASTA files.
The scanner is designed for large genomes: each reading frame is translated exactly once and candidate ORFs reuse slices of the cached frame peptide, so nested ORFs are not translated independently. Multiprocessing (-t) splits the transcript set across workers.
Workflow¶
genome FASTA + genePred annotation → smorf_scanner → smorf.raw.genePred / message.txt / nt.fa / pep.fa → smorf_cluster
The command runs in two steps:
- Checking the input arguments – validate the genome and annotation files and the ORF scanning parameters.
- Scanning ORFs from transcript sequences – reconstruct transcript sequences, scan the reading frames, classify categories, and write all output files. With
-t 1a single-process streaming path is used; with-t > 1transcripts are processed in parallel and the output is written in balanced partitions.
Input files¶
| Input | Required | Description |
|---|---|---|
| Genome FASTA | Yes | Genome sequence used to reconstruct spliced transcript sequences. |
| genePred annotation | Yes | Transcript annotation in genePred format. |
Parameters¶
| Parameter | Required | Description |
|---|---|---|
-g, --genome |
Yes | Input genome sequence file in FASTA or FASTA.GZ format. |
-a, --annotation |
Yes | Input transcript annotation file in genePred format. |
-o, --out-prefix |
No | Prefix of all output files. Default: ORF. |
-p, --orf-prefix |
No | Prefix used to generate stable ORF identifiers. Default: ORF. |
-s, --start-codons |
No | Comma-separated start codons used for ORF scanning. RNA U is converted to T. Default: ATG. |
-m, --min-aa |
No | Minimum ORF peptide length in amino acids. Default: 8. |
-M, --max-aa |
No | Maximum ORF peptide length in amino acids. Default: 10000. |
-x, --scan-strand |
No | Strand mode for scanning: sense, antisense, or both. Default: sense. |
-u, --kozak-up |
No | Number of upstream nucleotides extracted for the Kozak context. Default: 6. |
-d, --kozak-down |
No | Number of downstream nucleotides after the start codon extracted for the Kozak context. Default: 6. |
-I, --include-stop |
No | Keep the stop-codon symbol in peptide sequences. Default: False. |
-O, --mark-overlap |
No | Mark nested or overlapping ORFs after scanning. Default: False. |
-R, --remove-discarded |
No | Remove same-frame internal ORFs that the classifier labels as discarded. Default: False. |
-t, --thread |
No | Number of worker processes. Default: 1. |
Output files¶
Assuming -o gmx4, the command writes:
| Output | Description |
|---|---|
gmx4.genePred |
ORF annotation in a genePredExt-like format. |
gmx4.message.txt |
Full ORF information table. This is the main input for smorf_cluster. |
gmx4.nt.fa |
Candidate ORF nucleotide sequences in FASTA format. |
gmx4.pep.fa |
Candidate ORF peptide sequences in FASTA format. |
ORF information table (gmx4.message.txt)¶
One row per candidate ORF, tab-separated:
orf_id gene_id transcript_id chrom strand source_strand category priority overlap_type
frame tx_orf_start tx_orf_end genomic_start genomic_end start_codon stop_codon
nt_length aa_length kozak_seq completeness exon_count exon_starts exon_ends
kozak_start_index ambiguous_codon_count
| Column | Description |
|---|---|
orf_id |
Generated stable ORF identifier (for example ORF00000001). |
gene_id / transcript_id |
Source gene and transcript of the ORF. |
chrom / strand |
Genomic location and strand of the ORF. |
source_strand |
Scanning orientation relative to the transcript: sense or antisense. |
category |
Positional ORF category assigned by the classifier (see below). |
priority |
Overlap-filtering priority: primary, secondary, or discarded. |
overlap_type |
Relationship to overlapping ORFs (only filled with -O). |
frame |
Reading frame in the scanned sequence. |
tx_orf_start / tx_orf_end |
ORF boundaries in transcript coordinates. |
genomic_start / genomic_end |
Minimum/maximum genomic coordinate covered by the ORF. |
start_codon / stop_codon |
Detected start codon; stop codon, or NA for a partial ORF. |
nt_length / aa_length |
ORF nucleotide length (including the terminal stop codon when present) and peptide length. |
kozak_seq |
Fixed-width, N-padded start-codon context. |
completeness |
complete or 3prime_partial. |
exon_count / exon_starts / exon_ends |
ORF exon structure in ascending genomic order. |
kozak_start_index |
Zero-based start-codon index in kozak_seq. |
ambiguous_codon_count |
Number of ORF codons containing non-ACGT characters. |
Category classification¶
ORFs are classified by their position relative to the annotated CDS of the transcript:
| Category | Meaning |
|---|---|
annotated_ORF |
Matches the annotated CDS (highest priority). |
uORF |
Fully upstream of the CDS (5' UTR). |
dORF |
Fully downstream of the CDS (3' UTR). |
emORF |
Contains the CDS start or end (extended / merged ORF). |
same_frame_iORF |
Internal to the CDS, same reading frame (marked discarded by default). |
iORF |
Internal to the CDS, different reading frame. |
overlap_uORF |
Overlaps the CDS start. |
overlap_dORF |
Overlaps the CDS end. |
lncORF |
Found on a non-coding transcript. |
antisense_ORF |
Found on the antisense strand. |
other_ORF |
Any other configuration. |
Sequence FASTA files¶
The FASTA headers carry the ORF metadata, for example:
>ORF00000001 gene=GlmaCp001 transcript=GlmaCp001 type=annotated_ORF strand=- length=1062
ATGACTGCAATTTTAGAGAGACGCGAGAGCGAAAGCCTATGGGGTCGCTTCTGTAACTGG
gmx4.nt.fa– nucleotide sequences in coding orientation; the header includeslength=.gmx4.pep.fa– translated peptide sequences; the header includesaa_length=. The terminal stop symbol is kept only with-I.
Examples¶
Use the common scanning setup on a large genome¶
cd ./sce/5.smorf/01.scanner
smorf_scanner \
--genome ~/gmx/genome/GCF_000004515.6_Glycine_max_v4.0_genomic.fna \
--annotation ~/gmx/norm/gmx4.genepred \
--out-prefix gmx4 \
--start-codons ATG,CTG,GTG,TTG,ACG,ATA,ATT,ATC \
--min-aa 8 \
--max-aa 10000 \
--scan-strand sense \
--kozak-up 6 \
--kozak-down 6 \
--mark-overlap \
--remove-discarded \
--thread 20 \
&> gmx4.scan.log
This example scans the soybean genome (93,168 transcripts). With 20 workers it finished in about a minute and wrote 13,347,430 candidate ORFs into gmx4.genePred, gmx4.message.txt, gmx4.nt.fa, and gmx4.pep.fa (approximately 1.5–2.8 GB each).
Notes¶
--scan-strand sensescans ORFs on the annotated transcript strand only;--scan-strand antisensescans the reverse-complemented transcript sequences;--scan-strand bothcovers both but substantially increases the number of candidates.-O/--mark-overlapis recommended when downstream filtering should distinguish primary, nested, or overlapping candidates; without itoverlap_typeis left atnone.-R/--remove-discardedremoves complete same-frame internal ORFs that the classifier labels asdiscarded; keep it enabled for cleaner candidate sets.- The scanner only generates candidate ORFs: scanner output alone should not be treated as evidence of translation.
- Scanner output is a candidate set. Use
smorf_cluster(4.8.2) andsmorf_evidence(4.8.3) before prioritizing translated smORFs.