Hop atlas home · Overview · Changelog · Architecture · Adding_Data · Introgression · Ribbon · Dosage · Phylogeny · Bundle · Ingest · Ingest_Gbs · Ingest_Wgs · Ingest_Grasdi · Ingest_Rnaseq · Ingest_Assembly

Rendered from hop_atlas/ingest/RNASEQ.md (2026-10-13)

Runbook: ingesting RNA-seq samples (SRA/ENA → alignment → NA/EU calls → introgression atlas :8900)

Status: reconstructed 2026-10-08 from project history (scripts, logs, READMEs). Nothing was re-run to write it. Is it generic? No. Only the Wye RNA lane (wyerna, PRJNA694508) has gone all the way to the atlas. Every stage below is a copy-and-edit of that cohort's dated scripts unless it is marked GENERIC. hop_atlas/ADDING_DATA.md rates RNA-seq as "REC" (record only), and this runbook does not change that rating. Conventions: (inferred) marks a step that no record shows being run. [manual] marks a step that was done by hand, with no script. Abbreviations used throughout:

Abbreviation Path
W1 sync/2026-10-01/wye_rnaseq_PRJNA694508/ (download → align → QC → joint calls → identity gate)
W2 sync/2026-10-02/rnaseq_wye_target_x_2_1/ (coverage, StringTie, phasing, fusion, ASE; downstream research)
OA sync/2026-10-02/osu_introgression_atlas/ (o13–o22; the live copies are in /data/hop_data/osu_introgression_atlas/scripts/)
MR sync/2026-09-30/multires_clade/ (m01/m03/m04, the base-atlas counting and calling that o13/o03/o04 copy)
D /data/hop_data/wye_rnaseq_PRJNA694508/ (raw data, BAMs, logs). Archived to PBSS 2026-10-08 (s3://general-purpose/skothenhill/archive/PRJNA694508/), so it may be partially gone locally

1. Scope

Cohort Accession Samples Read layout / platform (measured) Reference(s) used Downstream use Reached the atlas?
Wye Target × BL2/1 leaf RNA-seq (Prentout et al. 2021 New Phytol 231:1599, doi:10.1111/nph.17456) PRJNA694508, SRR13528958–971 14: mother WT_fpa (= Wye Target WGS), father R2_1_mpa (= BL2/1 WGS), 12 F1 (131_*, 132_*). Sample name = library_name with /→_ PE 2×150 bp (the paper says 100 bp), unstranded (featureCounts test, W2/scripts/r60_annotation_and_strand.sh), poly-A, young leaf 21110M male_ref.fa (served lane); also Apollo h1 and MN586 hap2 Introgression atlas wyerna lane (v3, 2026-10-03); coverage, StringTie, phasing, ASE, fusion (W2); Chr01×Chr05 write-up (sync/2026-10-06/wye_target_rnaseq_chr01_chr05/) yes
Apollo (hybrid) RNA-seq atlas PRJEB63995 (Carlsberg / Kale 2026), 71 of 109 runs on disk at /data/hop_data/Apollo_rnaseq_fastq multi-tissue PE 100 bp, HiSeq 2000 (HWI-ST565) although ENA says "NovaSeq 6000" (annevo_eval/docs/NA_EU_APOLLO_DATA_INVENTORY.md §caveats 1–2) none found BRAKER3 annotation evidence (catalog apollo_rnaseq_atlas) no; no alignment record found
ANNEVO comparator hop RNA (8 tissues) ERR11670097/125/127/130/133/137/148/154 8 tissues PE (annevo_eval/data/RNASEQ_PROVENANCE.md) drHumLupu1.1 (GCF_963169125.1); Cascade (HopBase) for BRAKER3 BRAKER3/MAKER comparator, rnaseq_arbitrate.py no. BAMs, index and FASTQ moved to trash_rootdisk/ on 2026-10-02 (annevo_eval/data/humulus/STAR_RNASEQ_BAMS.MOVED.txt; catalog drhumlupu_rnaseq)
Mimulus RNA (comparator) PRJNA1054563, PRJNA1049363 (+ nasutus/tilingii) 7+ PE; HiSeq 2500 / NextSeq 2000 E. guttata GCA_051857295.1 BRAKER3 comparator n/a (not hop)

Provenance conflict (unresolved). RNASEQ_PROVENANCE.md says the 8 ERR11670xxx runs come from PRJEB63995. Catalog drhumlupu_rnaseq says "ENA SRA (drHumLupu / DToL)". Check ENA before reusing them.


2. Stages, in order

Stage 0. Design decisions to make before starting

Stage 1. Download

Scripts D/download_PRJNA694508.sh (documentation of commands), D/run_aria2.sh (resumable run actually used), D/make_manifest.py
Tool + flags ENA filereport curl 'https://www.ebi.ac.uk/ena/portal/api/filereport?accession=<PRJ>&result=read_run&fields=run_accession,library_name,fastq_ftp,fastq_md5,fastq_bytes,read_count,base_count&format=tsv', then aria2c -i aria2_input.txt -d fastq -j 4 -x 2 -s 2 -k 20M -c --check-integrity=true --max-tries=20 --retry-wait=30 --auto-file-renaming=false --allow-overwrite=false --file-allocation=none. aria2_input.txt has one block per file: URL / out= / checksum=md5=<ENA md5>. Its builder is not recorded [manual].
I/O in: ENA filereport. out: D/fastq/<RUN>_{1,2}.fastq.gz, D/manifest_PRJNA694508.tsv (run, library_name, role, sex, file, bytes, md5, md5_ok, read_count), D/md5sum_computed.txt
QC gate make_manifest.py computes the md5 of every file independently and compares it to ENA fastq_md5. It exits 1 on any FAIL. Then peek at the headers to record the instrument and read length as observed (the loop is in download_PRJNA694508.sh).
Gotchas ENA refused connections at -j10 -x8; the run was restarted at -j4 -x2 (run_aria2.sh comment). ENA/SRA instrument and read-length labels are unreliable: Wye is 150 bp, not the paper's 100 bp, and Apollo is HiSeq, not NovaSeq (memory sequencing-platform-labels-unreliable). Verify duplicates by checksum, not size (memory verify-duplicates-by-checksum-not-size). On EOS, stage via PBSS and never re-download there (CLAUDE.md).
Generic? COPY-AND-EDIT. In make_manifest.py, edit D, the filereport name and the hard-coded role/sex rule (WT_fpa → mother, R2_1_mpa → father, else F1 with sex = last character of library_name). Alternatives seen: annevo_eval/scripts/download_rnaseq.sh (prefetch + fasterq-dump + pigz, manifest-driven, used for the comparator) and annevo_eval/scripts/dl_apollo_rnaseq.sh (wget over a URL list).

After download, register the dataset in annevo_eval/data_inventory/catalog.yaml (Wye: entry PRJNA694508_rnaseq_fastq) and run refresh.sh. The Wye catalog entries were written by W2/scripts/r90_catalog_entries.py; the log is D/logs/refresh_catalog_694508.log. PBSS mirror: aws s3 sync of fastq/ to s3://general-purpose/skothenhill/archive/PRJNA694508/fastq/. It ran inside W2/scripts/r30_stage_for_lepton.sh and was size-verified. A grep of archive_ledger.json for PRJNA694508 on 2026-10-08 found no entry, so if today's archive went through archive.sh, check the ledger.

Stage 2. Read QC

Scripts None recorded. No fastp, FastQC or trimming was run on Wye RNA, and STAR soft-clips.
QC actually done md5 (Stage 1), plus post-alignment QC (Stage 3c).
Gotcha --read-files-command zcat is needed for gz FASTQ or STAR dies with "read ID should start with @ or >" (memory parabricks-rnaseq-alignment).
Generic? (inferred) If wanted, cluster/lepton_linear/linear_job.sh has a DO_FASTP switch, but it is a DNA alignment job and has never been used for RNA.

Stage 3a. STAR index

Scripts W1/scripts/r01_star_index.sh (env ARMS, SPARSE); W2/scripts/r30_stage_for_lepton.sh (dense 21110M index for Lepton)
Tool + flags STAR 2.7.2a in quay.io/biocontainers/star:2.7.2a--0 (the version Parabricks 4.7.0 documents): STAR --runMode genomeGenerate --genomeFastaFiles <fa> --runThreadN 12 --genomeSAsparseD <1|2> --genomeSAindexNbases 14 --genomeChrBinNbits 18 --limitGenomeGenerateRAM 55000000000, docker --memory 60g. No GTF / no sjdb (1-pass, de-novo junctions).
Existing indexes /data/hop_data/star_index_21110M (sparseD 2, ~14 GB, CPU), star_index_21110M_sa1 (dense, ~25 GB; built by r30 for Lepton, also uploaded to PBSS PRJNA694508/star_index_21110M_sa1/), star_index_MN586{,_sa1}, star_index_apollo_h1 (sparse 2)
QC gate SAindex and SA non-empty (r01 skips existing ones).
Gotchas GPU STAR in Parabricks 4.7.0 refuses sparse SA indexes (gSAsparseD != 1, was 2), so a dense (--genomeSAsparseD 1) index is required for pbrun. It takes about 15 min and about 45 GB RSS (W1/README.md "Is Parabricks useful here?" item 1). Parabricks does not build indexes. Docker is the host daemon: -v must use host paths for /workspace (memory parabricks-rnaseq-alignment); /data maps 1:1.
Generic? COPY-AND-EDIT: the REF associative array and OUT. Reuse the existing 21110M indexes for an atlas lane.

Stage 3b. Alignment

Two routes were used for Wye. The served atlas lane uses the CPU route on 21110M.

GPU: pbrun rna_fq2bam CPU: STAR + samtools (used for bam_21110M, the atlas input)
Script W1/scripts/r02_pbrun_rna_fq2bam.sh (+ r02w_gpu_wait_wrapper.sh retry loop); MN586 arm W1/scripts/r02c_cpu_star.sh; 21110M and apollo_h1 arms
Command pbrun rna_fq2bam --ref <fa> --genome-lib-dir <idx_sa1> --in-fq R1 R2 --read-files-command zcat --read-group-sm <sm> --read-group-lb <sm> --read-group-pl ILLUMINA --read-group-id-prefix <run> --out-sam-mapq-unique 60 --num-gpus 1 --num-streams-per-gpu 1 --memory-limit 16 --output-dir star_<arm>/<sm> --out-prefix <sm>. --out-duplicate-metrics bam_<arm>/<sm>.dupmetrics.txt --out-bam bam_<arm>/<sm>.cram, container nvcr.io/nvidia/clara/clara-parabricks:4.7.0-1, docker --memory 60g STAR --runThreadN 12 --genomeDir star_index_<arm> --readFilesIn R1 R2 --readFilesCommand zcat --outSAMtype BAM Unsorted --outStd BAM_Unsorted --outSAMmapqUnique 60 --outSAMattrRGline ID:<run>.1 SM:<sm> LB:<sm> PL:ILLUMINA PU:<run>.1 --outFileNamePrefix star_<arm>/<sm>/<sm>. piped to samtools fixmate -m → samtools sort -m 1500M → samtools markdup -s --reference <fa> -O cram (marks duplicates, does not remove them); docker --memory 34g
Defaults 1-pass (--two-pass-mode None); duplicate marking ON (tool default) 1-pass; duplicates marked
I/O D/fastq/ → D/bam_<arm>/<sm>.cram(.crai), D/star_<arm>/<sm>/<sm>.{Log.final.out,SJ.out.tab} same layout + <sm>.markdup_stats.txt
Timing (WT_fpa, 32.4 M pairs) 9.0 min in total on 1 A6000 10 min mapping only (12 threads); 6.5–15 min per sample with sort and markdup (D/logs/r02c_cpu_walltimes.tsv)
Gotchas --num-gpus 2 under a 60 GB cap thrashes (each GPU worker holds a genome copy; pbrun auto-tunes to host RAM, not the cgroup), so use 1 GPU (~57 GB RSS). Libraries over about 50 M pairs with 2-pass OOM on 125 GB, so use --low-memory --memory-limit 100 (memory parabricks-rnaseq-alignment). Speed-up is only about 1.2× on mapping (W1/README.md). waits while /data < 105 GB or RAM < 45 GB (built-in guard)

Stage 3c. Alignment QC and identity gate

Scripts W1/scripts/r03_bam_qc.sh + r03_qc_table.py → D/qc/rnaseq14_alignment_qc.tsv; W1/scripts/r05a_wgs_sites.sh + r05_parent_identity_gate.sh + r05_gate.py → D/calls/gate/parent_identity_gate.tsv; r06_sample_sanity.py → D/calls/rnaseq14_sample_sanity.tsv
Tool + flags samtools flagstat; samtools view -F 0xF04 -q 20 | cut -f3 | uniq -c (per-chromosome usable reads); STAR Log.final.out unique/multi/unmapped %. Gate: WGS parent sites bcftools view -m2 -M2 -v snps -i 'QUAL>=30 && FMT/DP[0]>=10 && FMT/DP[1]>=10 && GT[0]!="mis" && GT[1]!="mis', then RNA parents mpileup -T <sites> --ff UNMAP,SECONDARY,QCFAIL,DUP -q 20 -Q 20 --max-depth 2000 -a FORMAT/AD,FORMAT/DP | call -m -C alleles -T <sites>, compared at DP≥10 in both
QC gate (measured Wye) matching parent pairs: GT concordance 0.79–0.81, opposite-hom 0.003; swapped pairs 0.54–0.58 / 0.02 (W1/README.md). Unique mapping is highest on 21110M (mismatch about 0.4 %) (W2/README.md)
F1 identity / duplicates / mixtures RNA F1 vs the 142 GBS F1: sync/2026-10-01/chr5_inversion_survey/scripts/s28_rnaF1_vs_gbs_identity.py (opposite-hom rate; superseded by sync/2026-10-06/wye_target_rnaseq_chr01_chr05/scripts/w05_identity_sex_chimera.py, tables U1/U1b). Found: 132_82F = 132_81F (0 opp-hom / 112,716 sites); 131_70F mixture-like
Sex check samtools view -c -q 60 -F 0xF04 -T male_ref.fa <cram> ChrY:1-130000000 vs ChrX:1-230000000 (sync/2026-10-06/.../scripts/w05b_sex_msy.sh)
Generic? COPY-AND-EDIT. r05 hard-codes the MN586 arm, the WGS VCF /data/hop_data/wye_refscan/MN586_neomexicanus_HAP2/parents_MN586_neomexicanus_HAP2.vcf.gz and the parent CRAM names. r05 also calls r05_gate.py through a worktree path (.claude/worktrees/chr5-inversion-survey/...); repoint it to sync/.

Stage 3d. Joint RNA VCF (not used by the atlas)

Script W1/scripts/r04_bcftools_joint_call.sh (per chromosome, then concat)
Command bcftools mpileup -f <fa> -b bams.txt --ff UNMAP,SECONDARY,QCFAIL,DUP -q 20 -Q 20 --max-depth 2000 -a FORMAT/AD,FORMAT/DP | bcftools call -m -v → D/calls/<arm>.rnaseq14.vcf.gz (bcftools 1.20, annevo_eval/tools/bin/bcftools)
Gotcha (critical) Do NOT feed this VCF to the atlas. It is variants-only (-v). On the 21110M catalogue REF = EU (A) at 100 % of autosomal sites, so cohort-wide EU sites drop out and NAm/het fractions inflate on AA chromosomes (e.g. Target Chr04 0.40 vs 0.009). The first wyerna build (route V: clade_ab_imputation/scripts/07_extract_cohort.py wyerna <vcf> → 08_impute.py → o04) was superseded and never served (OA/README.md §5; sync/2026-10-03/wye_ancestry_method_validation/README.md; memory variants-only-site-selection-trap). The r40/r94/r107/r108 RNA ancestry numbers in W2 were retracted for the same reason (W2/README.md CORRECTION).
Also r04 hard-errors unless exactly 14 BAMs are present ([[ $n -eq 14 ]]), so edit that for another cohort size. RNA keeps DUP excluded: "this is RNA-seq, the GBS rule does not apply" (W1/README.md).

Stage 4. Allele counts at the diagnostic catalogue sites (pileup)

Script OA/scripts/o13_rna_pileup.sh (a copy of MR/scripts/m01_count_one.sh, WGS branch)
Command bcftools mpileup -f male_ref.fa -T /data/hop_data/clade_ab_imputation/diag/targets_all.tsv.gz --min-MQ 20 --min-BQ 20 --ff UNMAP,SECONDARY,QCFAIL,DUP -a FORMAT/AD -Ou <cram> | bcftools query -f '%CHROM\t%POS\t%REF\t%ALT[\t%AD]\n' | gzip -1, 5 samples in parallel (xargs -P 5)
I/O in D/bam_21110M/<sample>.cram; out /data/hop_data/osu_introgression_atlas/bamcounts/wyerna/<sample>.tsv.gz + .done + .err (about 0.3 GB in total)
QC gate both pipe stages rc 0 and > 1,000 output lines, or FAIL is written to .err
Gotchas Counts all covered catalogue sites, reference reads included; this is the fix for the variants-only trap. DUP is dropped because the CRAMs are duplicate-marked (WGS branch). Never use the GBS branch (keep DUP) on RNA. Conversely, never drop DUP on GBS (CLAUDE.md, ASSAYS.md). MQ20 keeps only STAR-unique reads (MAPQ 60).
Generic? COPY-AND-EDIT: the input glob /data/hop_data/wye_rnaseq_PRJNA694508/bam_21110M/*.cram and OD. m01_count_one.sh <cohort> <sample> <pbss_key> WGS is the generic form, but it streams BAMs from PBSS via presigned URL and writes to multires_clade/bamcounts/, which o03 does not read.

Stage 5. Cohort matrix and NA/EU (clade A/B) calls

Scripts OA/scripts/o03_build_bam_cohort.py (copy of MR m03), OA/scripts/o04_impute_multires.py (copy of m04)
Commands SAMPLES=/data/hop_data/osu_introgression_atlas/wyerna_samples.txt python3 o03_build_bam_cohort.py wyerna, then python3 o04_impute_multires.py wyerna_bam
Method o03: nA/nB = reads matching the catalogue A/B base (no REF/ALT assumption); keep sites with ≥ 1 read in ≥ 5 samples; thin to one site per 150 bp cell (max depth). o04: EM fitted once at 5 Mb on the cohort's own counts, held fixed at 0.5/1/2/5 Mb; tau 0.5; call = pmax ≥ 0.95 and ≥ 3 sites.
I/O wyerna_samples.txt (14 names, one per line, [manual]) + bamcounts/wyerna/ → /data/hop_data/multires_clade/cohorts/wyerna_bam.npz → multires_clade/calls/wyerna_bam_{500kb,1Mb,2Mb,5Mb}_calls.tsv.gz, imputation/wyerna_bam_params.json
QC gate o03 asserts a .done for every sample. Wye EM converged in 10 iterations (Δloglik < 1). Params e 0.0013, eta 0.0228, dA 0.071, dB 0.177, w 0.701; 253,491 sites (OA/README.md EM table).
Gotchas o03 hard-codes the pileup root OSU_BC=/data/hop_data/osu_introgression_atlas/bamcounts (only SAMPLES is an env var). With 14 samples the ≥ 5-sample site rule is strong. Whether new samples should refit the EM or reuse the old parameters is undocumented (ADDING_DATA.md).
Generic? COPY-AND-EDIT (OSU_BC, the cohort name). The cohort name must end _bam for o04 to take the BAM branch.

Stage 6. Evaluation

Script OA/scripts/o16_rna_eval.py
Outputs /data/hop_data/osu_introgression_atlas/tables/R1_wyerna_by_resolution.tsv (callable fraction, RNA parent vs same-plant WGS agreement, duplicate-pair agreement), R2_wyerna_parent_vs_wgs_by_chrom.tsv, R3_wyerna_parent_states_chr04_chr08.tsv
QC gate (Wye) callable 0.83 / 0.94 / 0.99 / 0.99 (500 kb → 5 Mb); RNA parents vs WGS (wye_bam) 0.976 → 0.998; 132_81F vs 132_82F ≥ 0.999. o15 reads R1, so o16 must run before o15.
Generic? COPY-AND-EDIT. These are hard-coded: PAIR = [('WT_fpa','WyeTarget'),('R2_1_mpa','BL2_1')], the WGS comparator wye_bam, the duplicate pair 132_81F/132_82F, and the Chr04/Chr08 focus.

Stage 7. Atlas export (viewer JSON)

Scripts OA/scripts/o15_wyerna_export.py (rows, transitions, similarity, reliability, index.html patch), OA/scripts/o17_detail_osu.py wyerna (per-sample detail files), OA/scripts/o18_y_hover.py (ChrY hover, all cohorts)
Commands ATLAS_DIR=<stage>/introgression_atlas python3 o15_wyerna_export.py; ATLAS_DIR=<stage>/introgression_atlas python3 o17_detail_osu.py wyerna
What o15 writes multires/atlas_{samples,transitions,similarity}_<res>.json, multires/atlas_reliability.json, index.html: PANEL_ORDER entry ['wyerna',['RNA parents','RNA F1s']], per-bin ns (n_sites) in 3 hover tips, preset ?preset=wye_rna. Data-layer label: "RNA (expressed-gene AD at diagnostic sites)", plus a caveat string. Checks → tables/O15_wyerna_export_checks.tsv (asserts all ok).
o17 writes /data/hop_data/universal_introgression_atlas/viewer_detail_mr/{sites,<res>}/wyerna__<sample>.json.gz (served as detail_mr)
Gotchas o15 backs up each file once to viewer_backup_pre_rna/ and every run restarts from those backups (idempotent). Re-running it today on a fresh stage would therefore overwrite later changes: the Pilgrim cohort, lineage and pedigree hooks were added after 10-03, and p05_atlas_export.py string-replaces the wyerna PANEL_ORDER entry. o15 asserts that cohort wyerna is not already present, so it cannot update an existing lane. o17 reads accuracy from M1/O1 tables; there is no wyerna truth plant.
Hard-coded per cohort COH, GROUPS, LAYER/CAVEAT text, NAM/NON carrier sets, the meta() row names/aliases/flags (parents, 131_70F mixture, 132_82F hidden), sample table path W2/tables/sample_table.tsv (written by W2/scripts/r20_datasheet.py)
Generic? COPY-AND-EDIT, high effort. There is no generator for the base viewer (INTROGRESSION_ATLAS_TECHNICAL.md §11.2; components/INTROGRESSION.md §6 stage 7).

Stage 8. Stage → test → deploy

What was done (10-03) built on the OSU staging copy /data/hop_data/osu_introgression_atlas/stage_viewer/introgression_atlas (port 8901). OA/scripts/o09_swap_into_served.sh did an md5-guarded copy into scratch_plots/introgression_atlas, backing up each file once as *.bak_2026-10-02_osu. Tests: for r in 5Mb 2Mb 1Mb 500kb; do bash OA/scripts/viewer_tests/run_tests.sh $r; done (p30 p15 p16 p11 p12 p07 k21 o21 o22), then p08_test_summary.py. All 36 PASS.
What to do now GENERIC: python3 hop_atlas/tools/atlas_layers.py stage --name <n> → apply the Stage 7 scripts with ATLAS_DIR=$STG (inferred) → atlas_layers.py serve $STG --port 8907 → atlas_layers.py test $STG --port 8907 → PI approval → atlas_layers.py deploy $STG → atlas_layers.py test scratch_plots/introgression_atlas --port 8900 (components/INTROGRESSION.md §2). If a cohort script rewrote index.html, run atlas_layers.py patch $STG. Use the stage tool, not o09: o09 is OSU-specific and references viewer_backup_pre_osu.
RNA lane test OA/scripts/viewer_tests/o22_wyerna_lane_test.py (W0 strings == call table with a must-fail shift; W1 groups and annotations; W2 ns == n_sites; W3 preset; W4 detail view). It is not in the generic suite sync/2026-10-07/lineage_refinement_v2/viewer/run_all_checks.sh that atlas_deploy.py test / atlas_layers.py test run. Run it by hand: RES=<res> python3 o22_wyerna_lane_test.py http://localhost:8907/introgression_atlas/ (inferred from run_tests.sh).
After deploy add a hop_atlas/CHANGELOG.md entry; register products (register_product.sh); update the catalog (Wye: products listed under osu_PRJNA1424574_introgression_atlas); write a sync handoff.

3. Per-cohort differences

Item Wye RNA (served) Apollo RNA (PRJEB63995) Comparator hop/Mimulus RNA
Read length / platform 2×150, unstranded, poly-A 2×100 HiSeq 2000 (ENA says NovaSeq) PE; mixed
Download aria2c + ENA md5 manifest dl_apollo_rnaseq.sh (wget, hybrid_atlas_urls.txt, 142 files = 71 runs) download_rnaseq.sh (prefetch / fasterq-dump)
Reference 21110M (atlas), Apollo h1, MN586 not aligned (no record) drHumLupu1.1; Cascade for BRAKER3; E. guttata
Aligner CPU STAR 1-pass (21110M, Apollo h1); GPU pbrun 1-pass (MN586); GPU pbrun with chimeric (Lepton) n/a GPU pbrun 2-pass Basic, 2 GPUs
Duplicates marked; dropped in pileup and calls n/a marked
Parent identity RNA vs WGS gate (r05) + RNA F1 vs GBS F1 n/a (one plant) n/a
Atlas wyerna lane — —
Layers not in lineage COH (e03_viewer_export.py COH lacks wyerna); no sex lane, no phasing (ADDING_DATA.md) — —

For a new cross RNA lane, edit: - the manifest and sample names; - the parent pair in r05, o16 and o15 meta(); - the WGS comparator call set (wye_bam → the cross's <cohort>_bam); - the duplicate / mixture flags; - the carrier annotations (Wye-specific; drop them); - the preset name; - the PANEL_ORDER groups; - the pedigree RNA match basis (p01_pedigree_build.py, components/INTROGRESSION.md §3).


4. Missing, ambiguous or conflicting steps

  1. No generic pipeline. Every stage from 3a to 7 is a Wye/OSU-specific fork with hard-coded paths, sample names and parents (ADDING_DATA.md gaps 1–3).
  2. aria2_input.txt builder not recorded [manual].
  3. No read QC / trimming step for RNA, and none was run.
  4. Alignment-route provenance conflict. Catalog PRJNA694508_rnaseq_alignments says GPU pbrun for all arms. The logs show CPU STAR for 21110M/apollo_h1, and bam_21110M (the atlas input) is CPU STAR + samtools markdup. GPU vs CPU equivalence for the atlas was not tested on 21110M (mapping rates matched on MN586 only: 75.9 % vs 75.7 % unique).
  5. The technical doc is stale for wyerna. annevo_eval/docs/INTROGRESSION_ATLAS_TECHNICAL.md lines 100, 139 and Appendix C2 still describe wyerna as "staged, not served, route V (VCF AD) from 21110M.rnaseq14.vcf.gz". The served lane is the o13 BAM-pileup build (OA/README.md §5, OA/PIPELINE.sh v3).
  6. wyerna_samples.txt (/data/hop_data/osu_introgression_atlas/) creation is not scripted [manual].
  7. EM refit policy when adding samples to an existing RNA cohort is undocumented.
  8. o15 cannot add to or update an existing lane (it asserts the cohort is absent and restarts from 10-02 backups). A re-export on today's served atlas needs a rewrite (inferred).
  9. o22 is not wired into atlas_deploy.py / atlas_layers.py test.
  10. The RNA lane is absent from the lineage/subspecies layers, sex lane, phasing and dosage atlas. There is no record of any attempt.
  11. r05_parent_identity_gate.sh and r00_driver.sh reference a worktree path (.claude/worktrees/chr5-inversion-survey/...). The main checkout has identical copies in sync/2026-10-01/wye_rnaseq_PRJNA694508/scripts/ (diff empty).
  12. Apollo RNA-seq (71 runs) has never been aligned in any record found. The ANNEVO comparator BAMs, index and FASTQ are in trash_rootdisk/ (PI: to be deleted).
  13. ASSAYS.md has no RNA-seq section. Candidate entries are all recorded in W1/README.md:
  14. ENA provenance of the 8 ERR11670xxx runs is inconsistent between RNASEQ_PROVENANCE.md (PRJEB63995) and catalog drhumlupu_rnaseq (DToL).
  15. Local data may be gone after today's PBSS archive. Restore D/bam_21110M (or the FASTQ) from s3://general-purpose/skothenhill/archive/PRJNA694508/ before re-running o13. archive_ledger.json has no PRJNA694508 entry (grep, 2026-10-08).

Scripts worth generalising first: - make_manifest.py (role/sex rule → manifest column); - r01 + r02/r02c (one script, --route gpu|cpu, manifest-driven, any n); - r05 gate (parent pair + WGS VCF as arguments); - o13 (input glob + out dir as arguments; this is m01 WGS branch); - o03 (OSU_BC → argument); - o16 (pairs and duplicate pairs from a manifest); - o15 (rows, groups, labels and preset from a cohort manifest, applied on top of the current stage instead of 10-02 backups); - add o22 to run_all_checks.sh.