Reference-guided reanalysis of published drought-response RNA-seq in finger millet (Eleusine coracana (L.) Gaertn.) against the chromosome-scale KNE 796-S genome assembly, cataloguing transcripts absent from the current annotation.
results_v2/is the corrected re-analysis and supersedes everything inresults_v1/. Use v2 numbers.
results_v1/is the April 2026 analysis exactly as performed. It is retained unmodified so published claims can be traced to the files that produced them — and because four defects were found in it that a reader needs to be able to verify. Its numbers should not be quoted.The full reconciliation is in
docs/DE_COMPARISON.md; the consequences for the manuscript drafts are indocs/MANUSCRIPT_CORRECTIONS.md; the pre-publication audit of this package is indocs/VERIFICATION.md.
Published drought RNA-seq for finger millet was originally analysed without a chromosome-scale reference. This project reanalyses those data against the KNE 796-S assembly (GCA_032690845.1, 2023), which resolves both subgenomes of the allotetraploid (2n = 4x = 36, AABB) into 18 pseudomolecules.
Headline result (corrected analysis):
Novel intergenic transcripts detected (gffcompare class u) |
21,864 |
| Significantly drought-upregulated (padj < 0.05, log₂FC ≥ 1.5) | 2,422 |
| Of those, no Swiss-Prot homolog at E ≤ 1e-5 | 1,532 (63.3%) |
| Mobile-element derived | 203 (8.4%) |
| Novel transcripts with a Swiss-Prot hit, across all 21,864 | 6,106 (27.9%) |
Tier distribution of the 2,422, from the corrected BLASTx join with word-boundary keyword matching:
| Tier | Count |
|---|---|
| Tier 1 — no homolog, highly induced (log₂FC ≥ 3) | 1,184 |
| Tier 1 — no homolog | 348 |
| Tier 2 — stress-related homolog | 50 |
| Tier 3 — other homolog | 840 |
For like-for-like comparison, the original 2,354-transcript set re-annotated with the same corrected join gives 63.5% with no homology (1,494 of 2,354) and tiers 1,168 / 326 / 56 / 804.
The first version of this analysis reported 99.6% of drought-upregulated novel transcripts as having no Swiss-Prot homolog, and built an argument on it. That figure was a software defect, not a finding — the annotation join never matched (see Known defects below). The true rate is ≈63%.
≈63% is consistent with published expectations for intergenic transcribed regions in the grasses. Lloyd et al. (2019) found that only 16–23% of intergenic transcribed regions (ITRs) in their survey had detectable protein-level similarity, i.e. roughly 77–84% did not — so a novel-transcript set that is ~63% homology-free is, if anything, better annotated than the ITR background. No claim of an unusually novel gene repertoire is supportable from this rate.
Lloyd JP, Bowman MJ, Azodi CB, Sowers RP, Moghe GD, Childs KL, Shiu S-H (2019). Evolutionary characteristics of intergenic transcribed regions indicate rare novel genes and widespread noisy transcription in the Poaceae. Scientific Reports 9:12122. doi:10.1038/s41598-019-47797-y
The interesting question this dataset can support is not "why is so much unknown?" but "which specific loci are worth following up?"
One candidate survives systematic re-examination. Every statement below is traceable to a deposited file.
Locus. CM064427.1 (chromosome 6A) : 16,937,315–16,938,027, minus strand, 713 bp.
Single-exon, so it is unaffected by the unspliced-extraction defect described below.
Expression. baseMean 575.6, log₂FC 4.434 (apeglm-shrunk 4.382), padj 1.56 × 10⁻³². Rank 4 of 2,422 by padj. Stable across the unpaired model, the paired model and apeglm shrinkage — the shrunk and unshrunk estimates differ by 1.2%, which indicates a well-measured transcript rather than a low-count artefact.
Protein. 104 aa, cysteine-rich. Complete ORF with a genuine start and stop codon at
nt 108–422 of the extracted interval. Signal peptide predicted at residues
1–28 (SignalP-EUK) and 1–32 (Phobius); Phobius annotates residues 33–104 as
extracellular (NON_CYTOPLASMIC_DOMAIN).
It is secreted, not membrane-associated. SignalP-EUK's own verdict is
SignalP-noTM— it explicitly calls no transmembrane region. TMHMM's "TMhelix 7–29" lies inside the signal peptide (Phobius H-region 12–23, cleavage at 28) and is the standard TMHMM/signal-peptide confusion. The only TM-positive call comes fromSignalP_GRAM_POSITIVE, a bacterial model.
Homology. No Swiss-Prot hit at E ≤ 1e-5, confirmed with the corrected join. But the ColabFold MSA finds 27 distinct homologs (32 aligned rows, 5 exact duplicates) across seven grass genera and twelve species in three subfamilies:
| Subfamily | Genera |
|---|---|
| Oryzoideae | Oryza (6 species), Leersia |
| Panicoideae | Setaria, Dichanthelium, Sorghum, Zea |
| Arundinoideae | Arundo |
Best E = 7.3 × 10⁻³¹ at 30.0% identity. Twenty-three rows are annotated only as
"uncharacterized protein"; every UniProt-derived row is unreviewed TrEMBL and none is in
Swiss-Prot — which is precisely why BLASTx against Swiss-Prot returns nothing. All
share an invariant C-terminal cysteine module. The per-row table is deposited at
structures/MSTRG_31255_1/MSA_composition.tsv.
Gene family. tblastn of the 104 aa peptide against the assembly recovers a small family: a 100%-identity self-match at 6A:16,937,920–16,937,609, a tandem paralog on 6A at 16,932,988–16,933,233 (79.3% identity, 4.4 kb upstream, same strand), and a homoeologous copy on 6B at 17,668,818–17,669,132 (88.6%), plus two more diverged 6B copies. The 6A/6B pair is exactly what an AABB allotetraploid predicts. None of the family members is annotated in the reference.
Structure — low confidence. ColabFold 1.6.1 / AlphaFold2-ptm: mean pLDDT 59.95, pTM 0.390, MSA depth 34. Only residues ~66–104 exceed pLDDT 70; 41 of 104 residues fall below 50. The model supports a disulfide-stabilised C-terminal cysteine module and nothing more. It is far too weak to assign a fold or a repeat architecture, and any description of confident flanking helices is unsupported.
What this does and does not support. The evidence supports a small secreted cysteine-rich protein family conserved across the grasses and uncharacterised throughout. It does not support "finger millet-specific". No Chloridoideae sequence appears in the alignment, so conservation within Eleusine's own subfamily has never been tested — a targeted tblastn against E. indica and Oropetium thomaeum would settle it.
Both inputs are public and were used under their respective terms.
| Resource | Accession | Source |
|---|---|---|
| RNA-seq, control | DRR095904, DRR095905, DRR095906 | DDBJ Sequence Read Archive |
| RNA-seq, drought | DRR095907, DRR095908, DRR095909 | DDBJ Sequence Read Archive |
| Sample / BioProject | DRS049651 / PRJDB5606 | Hatakeyama et al. (2018) |
| Reference genome | GCA_032690845.1 (Eleusine_coracana_v1.0, cv. KNE 796-S) | NCBI GenBank / Phytozome |
| Protein database | UniProt Swiss-Prot, 574,627 sequences / 208,482,574 residues | UniProt Consortium |
Assembly as used: 532 sequences (18 pseudomolecules + 514 unplaced scaffolds), 1,111,714,373 bp, N50 61,270,980 bp.
The reference is not the Hatakeyama assembly. GCA_032690845.1 is a 2023 chromosome-scale assembly of Kenyan cultivar KNE 796-S (WGS project JASSVF, Phytozome locus prefix
ELECO.r07). Hatakeyama et al. 2018 describes a different, short-read assembly of a different accession. The 2018 paper is the correct citation for the RNA-seq data, not for the genome.
Stages 1–5 and the Swiss-Prot annotation step are defined in the Snakemake workflow. Stages 6 onward were executed interactively — see Reproducibility.
| Stage | Tool | Version |
|---|---|---|
| Quality control | FastQC / MultiQC | 0.12.1 / 1.33 |
| Trimming | Trimmomatic | 0.40 |
| Alignment | HISAT2 | 2.2.2 |
| Assembly, quantification | StringTie | 3.0.0 |
| Transcript comparison | gffcompare | 0.12.10 |
| Count matrices | prepDE.py (StringTie 3.0.0) |
— |
| Independent count check | featureCounts (subread) | 2.1.1 |
| Differential expression | DESeq2 / apeglm, R 4.5.3 | 1.50.2 / 1.32.0 |
| ORF prediction | TransDecoder | 5.7.1 |
| Domain annotation | InterProScan 5 | EBI REST service |
| Homology search | BLAST+ | 2.17.0 |
| Structure prediction | ColabFold / AlphaFold2-ptm | 1.6.1, web service |
| Structural homology | Foldseek | web API |
| Workflow engine | Snakemake | 9.19.0 |
Full parameters are in the deposited scripts and in docs/MANIFEST.md.
Read length was measured, not assumed. prepDE.py was run at the mean aligned read
length of 142 bp, sampled across four 4 Mb windows on chromosomes 1A, 3B, 6A and 9A in
every BAM. Modal length is 151 bp, but reads are Trimmomatic-trimmed. Matrices at both
lengths are deposited; the 151 bp version rescales all counts by a uniform 0.9405, which
DESeq2's size factors absorb entirely, so the choice affects no result.
workflow/ Snakefile, config.yaml, setup.sh, LICENSE 4 files
scripts/ maintained analysis scripts (v1 and v2) + LICENSE 10 files
reconstructed/ 20 scripts recovered verbatim from shell history + README 21 files
results_v1/ ORIGINAL analysis — superseded, retained as record 18 files
novel_genes/ novel_genes.gtf, blast_results.txt
synteny/ vs_sorghum.txt, vs_rice.txt, vs_foxtail.txt
transdecoder/ top50_transcripts.fa
final_report/ candidate_genes_final.tsv (provenance unknown — see below)
sequences/ peptide FASTAs + provenance sidecars
results_v2/ CORRECTED re-analysis — use these 32 files
de/ DESeq2 output, both models, diagnostics
counts/ prepDE + featureCounts matrices, sample sheet
annotation/ corrected BLASTx join, all three annotation tables
blast/ raw BLASTx output, query BED, run script
structures/ ColabFold models, MSAs, scores, query CSVs 101 files
figures_v2/ 11 plots, all reproducible from deposited inputs 11 files
logs/ run logs 5 files
manuscript/ finger_millet_preprint_v2.md — the live draft 1 file
archive/ 17 Apr originals (.md + .html), superseded v1, README 6 files
docs/ MANIFEST + three audit / reconciliation documents 4 files
(root) LICENSE, CITATION.cff, README.md, .gitignore 4 files
217 files, ~156.5 MB.
To run any deposited script, first make results_v1 visible under the name the scripts
expect:
ln -s results_v1 results # or: mv results_v1 results
export FM_ROOT="$PWD" # v2 scripts read this; default is "."All four were found by audit, are fixed or quantified in results_v2/, and are
documented in full in docs/DE_COMPARISON.md.
-
DESeq2 was not given read counts.
scripts/de_analysis.Rparses thecovattribute from the StringTie GTFs and computesround(cov * 100)— per-base coverage scaled by an arbitrary constant. StringTie was run with-e -Band did produce genuine count tables; they were never used.lfcShrink()was never called. Consequence: the negative-binomial variance assumption was violated, p-values were far too extreme (6.7 × 10⁻⁶⁶ became 1.4 × 10⁻³⁷), and fold changes for transcripts with zero control counts were inflated by ~3 log₂ units. Fold changes for transcripts with any control signal were essentially unaffected (median shift −0.02, r = 0.974). -
The BLASTx annotation join never matched.
bedtools getfasta -namewas given a GTF, so it wrote the feature type — the literal stringtranscript— as the FASTA name. All 21,864 query IDs readtranscript::<chrom>:<start>-<end>while the DE table was keyed onMSTRG.x.y. Thehow="left"merge assigned NaN to every row. Consequence: the pipeline reported zero annotations; the "99.6% no homology" claim is an artefact. The re-run confirms the original BLASTx itself was correct — 51,468 hit lines in both runs, columns 2–7 byte-identical. This affected only the whole-set extraction; the top-50 extraction used a BED with correct IDs. -
STRESS_WORDSmatched substrings, not words.ABAmatched tababacum;LEAmatched nuclear and nuclease. 58% of Tier 2 had no word-boundary match. The most frequent "stress-related" annotation was a tobacco retrotransposon. Consequence: Tier 2 is 50, not 119 — and even those 50 are 46 ×kinase, 2 ×stress, 2 ×peroxidase. "Stress-related" operationally means "contains a kinase" and should be rebuilt by curation. -
Sequence extraction lost exon structure.
novel_genes.gtfretains transcript records but no exon records, sobedtools getfasta -splithad nothing to split on and returned whole genomic intervals. The top-50 extraction ran without-splitat all. Consequence: all extracted sequences include introns. 47 of the top 50 candidates are multi-exon, so any ORF called on them may be a chimera of exonic and intronic sequence — confirmed for MSTRG.45757.2, whose 197 aa prediction is 42.4% intronic and antisense to the annotated transcript. The DE analysis is unaffected (it usesmerged_assembly.gtf, which retains exons). Single-exon candidates, including MSTRG.31255.1, are unaffected.
These constrain interpretation and cannot be fixed by re-analysis.
- Treatment is confounded with plant age — this is the largest single constraint on the central claim. No time-matched well-watered control was sampled at day seven: the control libraries were taken at the start of the experiment and the drought libraries after seven days of withheld water. Every transcript called drought-responsive is equally consistent with being development-responsive over a seven-day window in a young plant. Nothing in this dataset can separate the two. Detailed environmental information for the growth period — watering amount and timing, temperature — was not retained, so the size of the developmental component cannot be bounded from the record either.
- The six libraries are treated as independent samples. Whether the control and
drought libraries derive from the same individual plants cannot be established, from
either the data or the surviving experimental records; the original laboratory notes no
longer exist. A surviving sample-name table pairs matched replicate numbers with a
_Dsuffix for the drought samples, which suggests that a correspondence was intended, but there is no documentation confirming that the same individuals were sampled twice. The pairing is therefore not sufficiently documented to justify treating the design as confirmed repeated measures. The data agree: a paired model (~ plant + condition) was fitted using the ENA library-name suffixes and rejected — it increased dispersion (asymptDisp 0.786 → 0.880; median 0.913 → 1.497) and cost 8,239 transcripts their testability, and all six possible control↔drought pairings absorb 49.1–51.0% of within-condition variance, statistically indistinguishable, with the suffix-inferred pairing not even the best. The suffixes do not encode plant identity, and no pairing is recoverable from the counts. Treating the libraries as independent, as~ conditiondoes, is the appropriate choice. - Replication is biological, but is not declared in the archive. Within each sampling
group the three libraries were prepared from separate plants, so the replication is
biological rather than technical. This is not recorded in the archive metadata: all 18
runs of PRJDB5606 sit under a single BioSample,
SAMD00076255. - The plants derive from highly inbred seed obtained from GKVK Bangalore and originally from ICRISAT, so the sampled individuals should be genetically very similar.
- The libraries were not generated for this experiment. They were produced primarily to support genome annotation rather than as a designed differential-expression experiment. Study title: "Finger millet genome assembly." No growth protocol, drought severity or timepoint is recorded.
- Condition assignment rests on library names (
Illumina_RNA_ctl_1-3/dry_1-3), which corroborateconfig.yamlbut assume the run accessions map in order.
- Dispersion is extreme.
asymptDisp = 0.786implies ~89% coefficient of variation between replicates at high expression — 20–80× typical for controlled plant RNA-seq. The replicates are biological, not technical, so this is genuine between-plant variation in material that was not collected under a controlled experimental protocol. Genetic heterogeneity is largely excluded as an explanation, because the plants derive from highly inbred seed, which makes the magnitude of the dispersion more notable rather than less. Do not quote p-values to more than an order of magnitude. - Sequencing depth is confounded with condition (drought libraries 21.0–36.4 M assigned fragments vs control 18.5–22.0 M). Depth itself is excluded as an explanation for the detection asymmetry: a depth-matched pair (DRR095905 at 21,011,330 vs DRR095909 at 20,994,628, 0.08% apart) still differs by 31.8% in transcripts detected, and 96.4% of the 1,278 zero-in-all-controls transcripts are detected in DRR095909 alone with a median 231 fragments. Whether this reflects genuine transcriptional activation or a library-preparation difference between the two collection dates cannot be determined.
- 8.4% of the drought-upregulated set (203 of 2,422) is mobile-element derived. No
repeat-masking was performed before novelty assessment. The figure is reproducible from
results_v2/annotation/candidate_genes_v2_annotated.tsvby case-insensitive match of theannotationfield againsttransposon|retrovirus|pol polyprotein|gag-pol|reverse transcriptase|integrase|LINE-1|retrotransposon(theLINE-1term is required: 28 rows hitLINE-1 retrotransposable element ORF2 protein, which none of the other terms match). It is a lower bound — it counts only transcripts whose best Swiss-Prot hit is explicitly a mobile-element protein. The most frequent Swiss-Prot subjects across the whole annotated set are mobile-element proteins. Two of the ten top-ranked candidates are Ty3/Gypsy retrotransposons (MSTRG.4687.1, E = 2.0 × 10⁻¹⁰⁶; MSTRG.45758.1, E = 4.5 × 10⁻⁷²), confirmed independently by BLASTx, InterProScan and Foldseek. Transposon insertions are lineage-specific by nature and will score as species-specific for reasons unrelated to novel gene content. - The cross-species screen was underpowered and its "species-specific" calls are
unreliable. It used
blastn(nucleotide) at E ≤ 1e-5 against three genomes. For MSTRG.31255.1 this returned no hits, yet the MSA for the same protein finds 27 distinct homologs across seven genera at 22–34% amino acid identity — a divergence at which nucleotide alignment fails regardless of threshold. Protein-level search (tblastn) is the appropriate method. Every lineage-specificity call inherits this limitation. - The screen is homology detection, not synteny: no collinearity or orthology assignment
was performed, and
-max_target_seqs 1was used, which does not reliably return the best hit. - No Chloridoideae genome was included. The three comparison genomes (Sorghum bicolor, Oryza sativa, Setaria italica) are Panicoideae and Oryzoideae, so conservation among Eleusine's close relatives was never tested.
- Absence of a BLAST hit is not evidence of gene absence.
- Only 10 of 50 candidates were classified, and the list is hard-coded in the scripts.
- The candidate set has an untraced origin.
results_v1/final_report/candidate_genes_final.tsv, from which the top-50 were selected, has no recorded creating script or command — no Snakefile rule and no shell-history line produces it, and it contains four tier strings wheremerge_results.pycan emit only three. This is a break in the chain of custody affecting all downstream candidate selection. The file is deposited; its provenance is not recoverable. - A MAPQ ≥ 20 filter discards reads mapping ambiguously between the A and B subgenomes.
- GO enrichment was attempted and is excluded: wrong organism (A. thaliana), 9 of 29 accessions mapped, and no drought-, ABA-, ROS- or osmotic-stress term among the 28 returned.
- Co-expression values are not re-derived at run time —
stage10dhard-codes its expression matrices as literals. They were independently verified against the StringTie count files (10/10 exact), but re-running the script replays rather than recomputes. - Computational analysis only. No experimental validation has been performed, and this work has not been peer reviewed.
results_v2/is fully reproducible from deposited files.de_analysis_v2.R,de_analysis_v2_paired.Randrebuild_annotation_v2.pyeach have all their inputs in the package.results_v1/DE tables are not. They needresults/counts/*_counts.gtf(~600 MB), which is too large to deposit. The Snakefile rule that produces it is included and its inputs are the public reads and the public genome.- Twenty analysis scripts were never saved as files. Stages 6, 8, 9, 10 and 11 were
executed as shell heredocs and survive only in shell history. They are recovered
verbatim in
scripts/reconstructed/, unmodified — including hard-coded values, absolute paths and internal inconsistencies. Seescripts/reconstructed/README.md. config.yamlhas been corrected in this copy. The original reference URLs pointed at GCA_002477235.1, a different assembly from the one used. The original file is unmodified in the source project. Seedocs/MANIFEST.md§6.novel_transcripts_named.fa(72 MB) is omitted and regenerable — seeresults_v2/blast/run_blastx_v2.shfor thebedtools getfastacommand andresults_v2/blast/novel_transcripts.bedfor the intervals.- Six ChimeraX renders were withdrawn.
analyze_structures.cxccannot run as written (three of fouropenpaths name non-existent model files) and never opens the lead candidate, so the images' subjects could not be established. The script is retained as a provenance artefact with a header stating the defect. Seedocs/VERIFICATION.md§1.4. - Some result tables are not deposited: promoter-scan output, co-expression matrices,
the g:Profiler CSV, and Foldseek result directories. Reasons are in
docs/MANIFEST.md§8.
Anthropic's Claude was used at several stages of this project and its use is disclosed here in full.
Original analysis (April 2026). Claude (via claude.ai) was used to plan the pipeline, draft the Snakemake workflow and R scripts, troubleshoot software installation, and interpret intermediate results. All commands were executed by the author.
Audit and re-analysis (August 2026). Claude Code was used to audit the completed
workflow against the filesystem, recover analysis scripts from shell history, re-run the
differential expression analysis using proper count matrices, re-run BLASTx with corrected
sequence identifiers, and compile the corrections document. The scripts
de_analysis_v2.R, de_analysis_v2_paired.R and rebuild_annotation_v2.py were written
with Claude Code and reviewed by the author.
Author responsibility. All analytical decisions, all interpretation, and all claims in
this deposit are the author's. AI output was reviewed rather than accepted; several
AI-generated conclusions were found to be incorrect during the audit and are documented as
corrections in docs/DE_COMPARISON.md and docs/MANUSCRIPT_CORRECTIONS.md.
This package is dual-licensed:
| Contents | Licence |
|---|---|
Everything in scripts/ — including scripts/reconstructed/ |
MIT (see scripts/LICENSE) |
workflow/Snakefile and workflow/setup.sh — executable code |
MIT (see workflow/LICENSE) |
Everything else — data tables, structures, figures, documentation, and workflow/config.yaml |
CC BY 4.0 |
The two workflow/ scripts are MIT so they can be reused and modified without the
ambiguity a Creative Commons licence introduces for software. workflow/config.yaml is
configuration data, not code, and stays under CC BY 4.0.
Full texts of both licences, and the statement of which applies to what, are in
LICENSE.
Third-party inputs (the RNA-seq reads, the reference assembly, Swiss-Prot) are not covered by these licences and remain under their original terms.
If you use this work, cite the Zenodo record — see CITATION.cff.
Please also cite the underlying data and reference genome:
- Hatakeyama M, et al. (2018). Multiple hybrid de novo genome assembly of finger millet, an orphan allotetraploid crop. DNA Research 25(1), 39–47. (Source of the RNA-seq data, DRS049651 — not of the reference genome.)
- Eleusine coracana subsp. coracana cv. KNE 796-S genome assembly (GCA_032690845.1). NCBI GenBank / Phytozome.
Joash Joshua Ayo — Independent Researcher, Kampala, Uganda ORCID 0009-0007-1642-0172 — joashjoshua789@gmail.com
Feedback and correction are welcome. This work has not been peer reviewed and no experimental validation has been performed.