Attachment Page: https://bioinformatics.cc/unicycler-medaka-hac-polypolish-identify-is-snps-structural-variants-data_tam_methylation_19606wt_adeab_adeij_craa/run_polypolish-sh/
Media File
isfinder.sh_.txt
vs.
-
cat longreads
./cat_longreads.sh
-
Run nextflow bacass
conda deactivate
# Downlod k2_standard_08_GB_20251015.tar.gz from https://benlangmead.github.io/aws-indexes/k2#kraken2--bracken
# Download 20190108_kmerfinder_stable_dirs.tar.gz from https://zenodo.org/records/13447056; 'tar xzf 20190108_kmerfinder_stable_dirs.tar.gz' #The database does not work!
# Download the kmerfinder database: https://www.genomicepidemiology.org/services/ --> https://cge.food.dtu.dk/services/KmerFinder/ --> https://cge.food.dtu.dk/services/KmerFinder/etc/kmerfinder_db.tar.gz #The database works!
# DEBUG: --kmerfinderdb /mnt/nvme1n1p1/REFs/kmerfinder/bacteria/ not working!
nextflow run nf-core/bacass -r 2.6.0 -profile docker --help
nextflow run nf-core/bacass -r 2.6.0 -profile docker \
--input samplesheet_bacass.tsv \
--outdir bacass_out \
--assembly_type hybrid \
--assembler unicycler,dragonflye \
--kraken2db /mnt/nvme1n1p1/REFs/k2_standard_08_GB_20251015.tar.gz \
--skip_kmerfinder \
-resume \
-work-dir bacass_out/work
#We can skip kmerfinder since kraken2 do similar function:
功能,KmerFinder,Kraken2,您的需求
物种鉴定,✅ 基于 k-mer 频率,✅ 基于 k-mer 分类,二者选一即可
污染筛查,✅ 可检测外源序列,✅ 可检测外源序列,✅ 有 Kraken2 足够
数据库大小,~32 GB,~8 GB,Kraken2 更轻量
运行速度,较慢,较快,Kraken2 更快
细菌特异性,✅ 针对细菌优化,✅ 支持细菌,二者均可
# Using Polished genomes for downstream analyses
jhuang@WS-2290C:~/DATA/Data_Tam_DNAseq_2026_An6_BG5/bacass_out/Medaka$ grep ">" An6-unicycler-medaka_polished_genome.fa
jhuang@WS-2290C:~/DATA/Data_Tam_DNAseq_2026_An6_BG5/bacass_out/Medaka$ grep ">" BG5-unicycler-medaka_polished_genome.fa
-
Manually Unicycler+medaka_consensus+Polypolish/Pilon for 19606_adeAB
# See https://bioinformatics.cc/wp-admin/post.php?post=429&action=edit
conda activate /home/jhuang/miniconda3/envs/trycycler # under jhuang@WS-2290C
unicycler -1 /home/jhuang/DATA/Data_Foong_RNAseq_2021_ATCC19606_Cm/X101SC26025981-Z02-J001/01.RawData/19606_adeAB/19606_adeAB_1.fq.gz -2 /home/jhuang/DATA/Data_Foong_RNAseq_2021_ATCC19606_Cm/X101SC26025981-Z02-J001/01.RawData/19606_adeAB/19606_adeAB_2.fq.gz -l /mnt/md1/DATA/Data_Tam_Methylation_19606WT_adeAB_adeIJ_craA/X101SC26036392-Z01-J005/Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606_adeAB/1625_2G_PBM33313_0ff34bb6/merged_19606_adeAB_longreads.fastq.gz --mode normal -t 100 -o adeAB_unicycler_normal
unicycler -1 /home/jhuang/DATA/Data_Foong_RNAseq_2021_ATCC19606_Cm/X101SC26025981-Z02-J001/01.RawData/19606_adeAB/19606_adeAB_1.fq.gz -2 /home/jhuang/DATA/Data_Foong_RNAseq_2021_ATCC19606_Cm/X101SC26025981-Z02-J001/01.RawData/19606_adeAB/19606_adeAB_2.fq.gz -l /mnt/md1/DATA/Data_Tam_Methylation_19606WT_adeAB_adeIJ_craA/X101SC26036392-Z01-J005/Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606_adeAB/1625_2G_PBM33313_0ff34bb6/merged_19606_adeAB_longreads.fastq.gz --mode bold -t 100 -o adeAB_unicycler_bold
unicycler -1 /home/jhuang/DATA/Data_Foong_RNAseq_2021_ATCC19606_Cm/X101SC26025981-Z02-J001/01.RawData/19606_adeAB/19606_adeAB_1.fq.gz -2 /home/jhuang/DATA/Data_Foong_RNAseq_2021_ATCC19606_Cm/X101SC26025981-Z02-J001/01.RawData/19606_adeAB/19606_adeAB_2.fq.gz -l /mnt/md1/DATA/Data_Tam_Methylation_19606WT_adeAB_adeIJ_craA/X101SC26036392-Z01-J005/Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606_adeAB/1625_2G_PBM33313_0ff34bb6/merged_19606_adeAB_longreads.fastq.gz --mode conservative -t 100 -o adeAB_unicycler_conservative
# 1. Confirm Pilon already ran inside Unicycler
grep -i pilon unicycler_out/unicycler.log
# --> No Pilon step at all in the unicycler.log, so the assembly is mostly accurate (from Illumina contigs), but the long-read-derived bridge regions were never corrected with high-accuracy short reads → they may still carry indel/homopolymer errors.
# 2. One long-read polish with Medaka on hamm only for adeAB, since WT and adeIJ
rsync -a -P X101SC26036392-Z01-J005/Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606_adeAB/1625_2G_PBM33313_0ff34bb6/merged_19606_adeAB_longreads.fastq.gz jhuang@10.169.63.113:/home/jhuang/DATA/Data_Tam_19606_WT_adeAB_adeIJ/
rsync -a -P X101SC26036392-Z01-J005/Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606_adeIJ/1625_2G_PBM33313_0ff34bb6/merged_19606_adeIJ_longreads.fastq.gz jhuang@10.169.63.113:/home/jhuang/DATA/Data_Tam_19606_WT_adeAB_adeIJ/
rsync -a -P X101SC26036392-Z01-J005/Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606WT/1625_2G_PBM33313_0ff34bb6/merged_19606WT_longreads.fastq.gz jhuang@10.169.63.113:/home/jhuang/DATA/Data_Tam_19606_WT_adeAB_adeIJ/
cp adeAB_unicycler_conservative/assembly.fasta bacass_out/Unicycler/19606_adeAB-unicycler.scaffolds.fa
rsync -a -P bacass_out/Unicycler/*-unicycler.scaffolds.fa jhuang@10.169.63.113:/home/jhuang/DATA/Data_Tam_19606_WT_adeAB_adeIJ/
(medaka) jhuang@hamm:~/DATA/Data_Tam_19606_WT_adeAB_adeIJ$ medaka tools list_models | grep r1041
Available: r103_fast_g507, r103_fast_snp_g507, r103_fast_variant_g507, r103_hac_g507, r103_hac_snp_g507, r103_hac_variant_g507, r103_sup_g507, r103_sup_snp_g507, r103_sup_variant_g507, r1041_e82_260bps_fast_g632, r1041_e82_260bps_fast_variant_g632, r1041_e82_260bps_hac_g632, r1041_e82_260bps_hac_v4.0.0, r1041_e82_260bps_hac_v4.1.0, r1041_e82_260bps_hac_variant_g632, r1041_e82_260bps_hac_variant_v4.1.0, r1041_e82_260bps_joint_apk_ulk_v5.0.0, r1041_e82_260bps_sup_g632, r1041_e82_260bps_sup_v4.0.0, r1041_e82_260bps_sup_v4.1.0, r1041_e82_260bps_sup_variant_g632, r1041_e82_260bps_sup_variant_v4.1.0, r1041_e82_400bps_bacterial_methylation, r1041_e82_400bps_fast_g615, r1041_e82_400bps_fast_g632, r1041_e82_400bps_fast_variant_g615, r1041_e82_400bps_fast_variant_g632, r1041_e82_400bps_hac_g615, r1041_e82_400bps_hac_g632, r1041_e82_400bps_hac_v4.0.0, r1041_e82_400bps_hac_v4.1.0, r1041_e82_400bps_hac_v4.2.0, r1041_e82_400bps_hac_v4.3.0, r1041_e82_400bps_hac_v5.0.0, r1041_e82_400bps_hac_v5.0.0_rl_lstm384_dwells, r1041_e82_400bps_hac_v5.0.0_rl_lstm384_no_dwells, r1041_e82_400bps_hac_v5.2.0, r1041_e82_400bps_hac_v5.2.0_rl_lstm384_dwells, r1041_e82_400bps_hac_v5.2.0_rl_lstm384_no_dwells, r1041_e82_400bps_hac_v6.0.0, r1041_e82_400bps_hac_v6.0.0_rl_lstm384_dwells, r1041_e82_400bps_hac_v6.0.0_rl_lstm384_no_dwells, r1041_e82_400bps_hac_variant_g615, r1041_e82_400bps_hac_variant_g632, r1041_e82_400bps_hac_variant_v4.1.0, r1041_e82_400bps_hac_variant_v4.2.0, r1041_e82_400bps_hac_variant_v4.3.0, r1041_e82_400bps_hac_variant_v5.0.0, r1041_e82_400bps_sup_g615, r1041_e82_400bps_sup_v4.0.0, r1041_e82_400bps_sup_v4.1.0, r1041_e82_400bps_sup_v4.2.0, r1041_e82_400bps_sup_v4.3.0, r1041_e82_400bps_sup_v5.0.0, r1041_e82_400bps_sup_v5.0.0_rl_lstm384_dwells, r1041_e82_400bps_sup_v5.0.0_rl_lstm384_no_dwells, r1041_e82_400bps_sup_v5.2.0, r1041_e82_400bps_sup_v5.2.0_rl_lstm384_dwells, r1041_e82_400bps_sup_v5.2.0_rl_lstm384_no_dwells, r1041_e82_400bps_sup_variant_g615, r1041_e82_400bps_sup_variant_v4.1.0, r1041_e82_400bps_sup_variant_v4.2.0, r1041_e82_400bps_sup_variant_v4.3.0, r1041_e82_400bps_sup_variant_v5.0.0, r104_e81_fast_g5015, r104_e81_fast_variant_g5015, r104_e81_hac_g5015, r104_e81_hac_variant_g5015, r104_e81_sup_g5015, r104_e81_sup_g610, r104_e81_sup_variant_g610, r941_e81_fast_g514, r941_e81_fast_variant_g514, r941_e81_hac_g514, r941_e81_hac_variant_g514, r941_e81_sup_g514, r941_e81_sup_variant_g514, r941_min_fast_g507, r941_min_fast_snp_g507, r941_min_fast_variant_g507, r941_min_hac_g507, r941_min_hac_snp_g507, r941_min_hac_variant_g507, r941_min_sup_g507, r941_min_sup_snp_g507, r941_min_sup_variant_g507, r941_prom_fast_g507, r941_prom_fast_snp_g507, r941_prom_fast_variant_g507, r941_prom_hac_g507, r941_prom_hac_snp_g507, r941_prom_hac_variant_g507, r941_prom_sup_g507, r941_prom_sup_snp_g507, r941_prom_sup_variant_g507, r941_sup_plant_g610, r941_sup_plant_variant_g610
Default consensus: r1041_e82_400bps_sup_v5.2.0
Default variant: r1041_e82_400bps_sup_variant_v5.0.0
(trycycler) jhuang@WS-2290C:~/DATA/Data_Tam_Methylation_19606WT_adeAB_adeIJ_craA/X101SC26036392-Z01-J005$ find . -name "sequencing_summary*"
./Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606_adeAB/1625_2G_PBM33313_0ff34bb6/sequencing_summary_PBM33313_0ff34bb6_ca9b9600.txt
./Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606WT/1625_2G_PBM33313_0ff34bb6/sequencing_summary_PBM33313_0ff34bb6_ca9b9600.txt
./Release-X101SC26036392-Z01-J005-20260729_01/Data-X101SC26036392-Z01-J005/19606_adeIJ/1625_2G_PBM33313_0ff34bb6/sequencing_summary_PBM33313_0ff34bb6_ca9b9600.txt
# ---- 抓取 Basecalling 模型(如 Dorado)----
# Show the first fastq header lines directly (simplest)
zcat $(find . -name "*.fastq.gz" | head -1) | head -n 4
# Or extract the model string explicitly (stop after a few matches for speed)
zcat $(find . -name "*.fastq.gz" | head -1) | grep -m 10 -o 'dna_r[^ ]*' | sort -u
#--> dna_r10.4.1_e8.2_400bps_hac@v5.2.0_barcode12 DT:Z:2026-07-09T16:27:12.060751+08:00 PU:Z:PBM33313 LB:Z:FOND26H004005-1A SM:Z:barcode12 al:Z:barcode12
# Equivalent:
zcat $(find . -name "*.fastq.gz" | head -1) | grep -m 10 -o 'model_version_id=[^ ]*' | sort -u
# ---- 抓到了!真相大白。这是一个非常关键的发现!----
从你提取出的 fastq header 信息中,我们看到了真实的 Basecalling 模型:
👉 dna_r10.4.1_e8.2_400bps_hac@v5.2.0_barcode12
⚠️ 关键纠正:是 HAC,不是 SUP!
之前我们根据诺禾致源的常规细菌完成图经验,推测他们使用的是超高精度的 SUP (Super Accuracy) 模型。但实际数据证明,他们这批数据使用的是 HAC (High Accuracy) 模型,版本正是 v5.2.0。
在 Medaka 中,模型必须与 Basecalling 模型严格匹配。 如果你用 SUP 模型去抛光 HAC 的数据,神经网络会因为错误特征不匹配而导致抛光效果变差,甚至引入错误。
🎯 最终 100% 匹配的 Medaka 模型
根据你之前 medaka tools list_models 的列表,完美对应的模型是:r1041_e82_400bps_hac_v5.2.0
* R10.4.1: 纳米孔的“物理结构”。代表第 10 代孔蛋白的 4.1 亚型。它的孔径比早期的 R9 更长,能同时容纳更多碱基,从而大幅提高了读取准确度。
* e8.2: 纳米孔的“化学/工程微调”。代表孔蛋白的第 8 大代、第 2 次工程化微调版本(Engineering version)。
* 400 bases per second: 马达蛋白的“测序速度”。DNA 以每秒 400 个碱基的速度穿过纳米孔(早期版本是 450bps,故意降到 400bps 是为了让电信号采样更密集、更清晰)。
* High Accuracy: Basecalling 神经网络的“精度等级”。HAC 是较高精度的标准模型(比 SUP 稍不准,但计算更快)。
🛠️ 最终正确的 Medaka 运行命令 (See bioinformatics.cc/unicyclermedaka_consensuspolypolish-pilon-manually/)
(medaka) jhuang@hamm:~/DATA/Data_Tam_19606_WT_adeAB_adeIJ$ for c in 19606WT 19606_adeAB 19606_adeIJ; do
medaka_consensus -i merged_${c}_longreads.fastq.gz -d ${c}-unicycler.scaffolds.fa -o "$c"/medaka -m r1041_e82_400bps_hac_v5.2.0 -t 20
mv "$c"/medaka/consensus.fasta ${c}-unicycler-medaka_polished_genome.fa
rm -r "$c"/medaka "$c" *.fai *.mmi # clean up
done
mkdir unicycler-medaka_polished_genomes
rsync -a -P jhuang@10.169.63.113:~/DATA/Data_Tam_19606_WT_adeAB_adeIJ/*-unicycler-medaka_polished_genome.fa unicycler-medaka_polished_genomes
# 3. Short-read polish first (the priority) Polish the already-complete, circularized assembly with your Illumina reads.
# 激活环境 (只需在循环外激活一次)
conda activate /home/jhuang/miniconda3/envs/trycycler
bash run_polypolish.sh
# 4. Evaluate before & after with QUAST to confirm improvement
quast.py assembly.fasta polypolished.fasta -o polish_compare
# Confirm: genome size still ~3.9 Mb, circularity preserved, no new fragmentation
-
Structural variant calling using Assemblytics.
conda activate /home/jhuang/miniconda3/envs/bengal3_ac3
# MLST calling
for sample in 19606WT 19606_adeAB 19606_adeIJ; do
mlst unicycler-medaka_polished_genomes/${sample}_polypolished.fasta >> mlst_res
done
conda activate sv_assembly
for sample in 19606WT 19606_adeAB 19606_adeIJ; do
nucmer --maxmatch -l 100 -c 500 CP059040.fasta unicycler-medaka_polished_genomes/${sample}_polypolished.fasta -p ${sample};
delta-filter -1 -q ${sample}.delta > ${sample}.filtered.delta;
#Usage: Assemblytics delta output_prefix unique_length_required min_size max_size
Assemblytics ${sample}.filtered.delta ${sample}_assemblytics 1000 100 500000;
done
./merge_variants.sh
#!/bin/bash
# Define the output file name
OUTPUT="merged_assemblytics_variants.txt"
# 1. Write the header with the new 'Sample' column
# We read the header from the first file, strip the '#', and append 'Sample'
head -n 1 *_assemblytics.variant_preview.txt | grep '^#' | sed 's/^#//' | awk '{print $0 "\tSample"}' > "$OUTPUT"
# 2. Loop through all matching files
for file in *_assemblytics.variant_preview.txt; do
# Extract sample name (e.g., "HD46_Ctrl" from "HD46_Ctrl_assemblytics.variant_preview.txt")
sample=$(echo "$file" | sed 's/_assemblytics\.variant_preview\.txt//')
# Append data lines, skipping the header line (lines starting with '#')
# and append the sample name as the last column
grep -v '^#' "$file" | awk -v samp="$sample" '{print $0 "\t" samp}' >> "$OUTPUT"
done
echo "✅ Successfully merged $(ls *_assemblytics.variant_preview.txt | wc -l) files into $OUTPUT"
#Manually sorted the generated file merged_assemblytics_variants.txt with Qwen.
-
Structural variant report
Based on the `merged_assemblytics_variants.txt` file, here is the summary of structural variants (SVs) identified specifically in your **long-sequencing complete genomes** (`19606WT`, `19606_adeAB`, and `19606_adeIJ`) compared to the reference genome CP059040.
I have separated the **targeted knockouts** from the **inherent background variations** to make it ready for your manuscript or report.
### Table 1: Structural Variants in Complete Long-Read Assemblies (vs. CP059040)
| Strain | Variant Type | Size (bp) | Reference Coordinates (CP059040) | Classification / Biological Significance |
| :--- | :--- | :--- | :--- | :--- |
| **19606WT** | Tandem Contraction | 52,668 | 2,810,861 - 2,863,470 | **Background variation** (inherent to your 19606 lab strain) |
| | Tandem Contraction | 198 | 3,124,916 - 3,125,037 | **Background variation** |
| **19606_adeAB** | **Deletion** | **4,282** | **1,844,323 - 1,848,605** | **Targeted ΔadeAB knockout** |
| | Tandem Contraction | 52,668 | 2,810,861 - 2,863,470 | **Background variation** |
| | Tandem Contraction | 198 | 3,124,916 - 3,125,037 | **Background variation** |
| **19606_adeIJ** | **Deletion** | **4,436** | **737,224 - 741,667** | **Targeted ΔadeIJ knockout** |
| | Tandem Contraction | 52,668 | 2,810,861 - 2,863,470 | **Background variation** |
| | Tandem Contraction | 198 | 3,124,916 - 3,125,037 | **Background variation** |
---
### Table 2: Overall SV Burden Summary
| Strain | Total SVs | Targeted Deletions | Background SVs |
| :--- | :---: | :---: | :---: |
| **19606WT** | 2 | 0 | 2 |
| **19606_adeAB** | 3 | 1 | 2 |
| **19606_adeIJ** | 3 | 1 | 2 |
---
### 💡 Key Takeaways for your Manuscript/Discussion:
1. **Clean and Precise Knockouts:**
The Assemblytics results perfectly validate your genetic engineering. The $\Delta$adeAB mutant shows exactly one major deletion of **4,282 bp**, and the $\Delta$adeIJ mutant shows one deletion of **4,436 bp**. These sizes match the expected lengths of the targeted operons. Crucially, **no other large off-target deletions or unintended rearrangements** occurred during the mutant construction.
2. **High Genome Stability:**
Apart from the intended target deletion, the chromosomes of both mutants are structurally identical to the `19606WT`. This proves that the knockout process did not induce global genomic instability or secondary structural variations.
3. **Strain-Specific Background Variations:**
The ~52.6 kb tandem contraction and the 198 bp contraction are present in the Wildtype as well as both mutants. Therefore, they are **not** artifacts of the knockout process. Instead, they represent natural structural differences (e.g., a prophage loss, genomic island contraction, or repeat variation) between your specific ATCC 19606 lab isolate and the NCBI reference sequence (CP059040). You can briefly mention this in your paper as a "strain-specific structural feature relative to the reference."
-
Identify SNPs (The results are in snps_indels_platformconcordance.xlsx)
We have the ideal data for it: high-accuracy short reads for SNPs + complete long-read assemblies for IS elements (IS copies are near-identical repeats that short reads cannot resolve). Here’s the division of labor and concrete commands:
A. Short reads (gold standard) → snippy (you already have snippy_env)
conda activate /home/jhuang/miniconda3/envs/bengal3_ac3
for s in A6WT 19606adeAB adeIJ; do
snippy --cpus 32 --outdir snippy/$s --ref CP059040.fasta \
--R1 raw_data/${s}_R1.fastq.gz --R2 raw_data/${s}_R2.fastq.gz
done
# Core-genome SNP alignment across strains (for phylogeny / off-target check)
snippy-core --prefix core snippy/19606*
cp snippy/summary_snps_indels.csv summary_snps_indels_SHORT-Illumina_snippy.csv
Outputs snps.tab (position, ref/alt, coverage, quality) per strain.
Alternative (bcftools): bwa mem → samtools sort → bcftools mpileup -f CP059040.fa | bcftools call -mv, then filter (QUAL≥30, DP≥10).
B. Long reads / polished assemblies (validation)
for c in 19606WT 19606_adeAB 19606_adeIJ; do
medaka_variant \
-i merged_${c}_longreads.fastq.gz \
-r CP059040.fasta \
-m r1041_e82_400bps_hac_variant_v5.0.0 \
-t 32 \
-o medaka_var_${c}
done
cd ~/DATA/Data_Tam_19606_WT_adeAB_adeIJ
# 1) Sort + compress + index (bcftools sort reads the plain VCF directly)
for c in 19606WT 19606_adeAB 19606_adeIJ; do
bcftools sort -Oz -o medaka_var_${c}/medaka.annotated.vcf.gz \
medaka_var_${c}/medaka.annotated.vcf
bcftools index -f medaka_var_${c}/medaka.annotated.vcf.gz
done
# 2) Merge into one multi-sample VCF
bcftools merge --force-samples -Oz -o cohort_LONG-ONT_medaka.vcf.gz \
medaka_var_19606WT/medaka.annotated.vcf.gz \
medaka_var_19606_adeAB/medaka.annotated.vcf.gz \
medaka_var_19606_adeIJ/medaka.annotated.vcf.gz
bcftools index -f cohort_LONG-ONT_medaka.vcf.gz
# 3) Sanity check
bcftools query -l cohort_LONG-ONT_medaka.vcf.gz # sample names
bcftools stats cohort_LONG-ONT_medaka.vcf.gz | head -20 # variant counts
C. Intersecting the two platforms
Step A – extract a position table from the long-read VCF
rsync -a -P jhuang@10.169.63.113:~/DATA/Data_Tam_19606_WT_adeAB_adeIJ/cohort_LONG-ONT_medaka.vcf.gz* .
bcftools query -f '%CHROM\t%POS\t%REF\t%ALT\n' cohort_LONG-ONT_medaka.vcf.gz \
| sort -k1,1 -k2,2n > long.tsv
Step B – join with the short-read CSV (pandas, recommended)
Your CSV contains each position twice (a REF-match block and an ALT block) — keep only the ALT rows, then outer-join on CHROM+POS:
import pandas as pd
# short reads (CSV): keep ALT-allele rows only, dedup
df = pd.read_csv('summary_snps_indels_SHORT-Illumina_snippy.csv')
alt = df[df['A6WT'] != df['REF']].drop_duplicates(['CHROM','POS'])
short = alt[['CHROM','POS','REF','TYPE','A6WT','Gene_name','Effect']] \
.rename(columns={'REF':'REF_S','TYPE':'TYPE_S','A6WT':'ALT_S'})
# long reads (VCF table)
long = pd.read_csv('long.tsv', sep='\t', names=['CHROM','POS','REF_L','ALT_L'])
# intersect
m = short.merge(long, on=['CHROM','POS'], how='outer', indicator='platform')
print(m['platform'].value_counts()) # both / left_only(short) / right_only(long)
m.to_csv('snps_indels_platform_concordance.csv', index=False)
both → high-confidence variants (seen by both platforms) → use these for the paper.
left_only → short-read-only calls (often tiny indels/homopolymers missed by ONT, or Illumina artifacts).
right_only → long-read-only calls (often homopolymer indels).
Step C – CLI-only alternative (no Python)
tail -n +2 summary_snps_indels_SHORT-Illumina_snippy.csv | cut -d, -f1,2 | sort -u | tr ',' '\t' > short_pos.tsv
cut -f1,2 long.tsv | sort > long_pos.sorted
sort short_pos.tsv > short_pos.sorted
comm -12 short_pos.sorted long_pos.sorted > shared_positions.tsv # both
comm -23 short_pos.sorted long_pos.sorted > only_SHORT.tsv
comm -13 short_pos.sorted long_pos.sorted > only_LONG.tsv
Two cautions
- Indel positions can be off by 1–5 bp between snippy and medaka (left-alignment differences). If
only_SHORT/only_LONG contain indels at nearly the same position, do a fuzzy match (±5 bp) with bedtools before declaring them discordant:
awk -F'\t' '{OFS="\t"; print $1,$2-6,$2+6}' short_pos.tsv | bedtools intersect -a - -b <(awk -F'\t' '{OFS="\t"; print $1,$2-1,$2+1}' long.tsv) -wa -wb
- Compare ALT alleles, not just positions — e.g., your 198 bp tandem-contraction SNP at 3,124,917 and the inframe deletion at 1,527,276 should show identical ALT on both platforms; homopolymer
ins/del entries (like 194,020 or 3,542,741) are the ones most likely to differ in length between platforms.
The final snps_indels_platform_concordance.csv gives you exactly the table you need for a methods/supplement section: “Variants called independently from Illumina (snippy) and ONT (medaka) reads; only concordant positions were retained.”
Comparison of the three complete genomes against CP059040 identified 27 concordant background SNPs/indels (validated by both Illumina and ONT platforms). No sample-specific point mutations were detected between the wild type and the knockout mutants; the only structural differences were the intended ΔadeAB (4,282 bp) and ΔadeIJ (4,436 bp) deletions.
- IS element identification
📊 总结对比表
| 工具 |
能否发现新 IS |
结构信息 (TIR/TSD) |
精确命名 |
全基因组清单 |
最佳用途 |
| ISEScan |
✅ |
✅ |
❌(家族级) |
✅ |
核心:IS 清单 + 菌株间比较 |
| ISfinder BLAST |
❌ |
❌ |
✅ |
❌ |
命名与分类 |
| ISMapper |
❌ |
❌ |
部分 |
❌(只给差异) |
验证新插入 junction |
| MobileElementFinder |
❌ |
❌ |
✅ |
✅ |
一站式 MGE/AMR 注释 |
🎯 推荐组合
- ISEScan 跑 4 个完整基因组(19606WT、ΔadeAB、ΔadeIJ、CP059040)→ 比较拷贝数/位置/家族;
- ISfinder BLAST 给 ISEScan 预测命名(
gffread 提取序列后 blastn);
- (可选)ISMapper 用短读长验证”突变株特有插入”候选;
- 结论逻辑:WT 与突变株 IS 清单完全一致 → 敲除过程中无 IS 转座;若出现突变株特有插入 → 用 ISEScan + BLAST + ISMapper + IGV 四重证据确认。
一句话总结:ISEScan 负责”发现和定位”,ISfinder 负责”命名”,ISMapper 负责”用原始读长验证”——三者互补,缺一不可单独给出完整答案。
The ISfinder website has known download issues, and the original 2006 paper is indeed old. Here are the current, working alternatives that researchers are actually using in 2024-2026:
Install environment
# Step 1: Get the database of ISfinder (not used for ISEScan)
git clone https://github.com/thanhleviet/ISfinder-sequences.git
cd ISfinder-sequences
# Step 2: Build BLAST database (not used for ISEScan)
makeblastdb -in IS.fna -dbtype nucl -title ISfinder
# Step 3: Run ISEScan (if installed)
mamba create -n isescan -c bioconda isescan -y
conda activate isescan
which isescan.py # confirm it's now on PATH
### Run ISEScan
```bash
cd ~/DATA/Data_Tam_Methylation_19606WT_adeAB_adeIJ_craA
for g in 19606WT_polypolished 19606_adeAB_polypolished 19606_adeIJ_polypolished; do
isescan.py \
--seqfile ./unicycler-medaka_polished_genomes/${g}.fasta \
--output isescan_${g} \
--nthread 120
done
# also run the reference for copy-number comparison
isescan.py --seqfile CP059040.fasta --output isescan_CP059040 --nthread 120
Options worth knowing:
--nthread 32 — speeds up FragGeneScan + HMMER (default is 1!).
--removeShortIS — add this if you want only complete IS elements (drops partial IS < 400 bp or single-copy IS without perfect TIR). For a clean WT-vs-mutant transposition comparison I'd run without it first and filter later, so you don’t lose evidence of truncated/degenerate copies.
Inspect the results
find $d -name "*.gff" 在每个输出目录里找到了两个 GFF:
| 文件 |
内容 |
isescan_*/proteome/.../*.gff |
FragGeneScan 预测的全部蛋白编码基因(~3500 个,即全基因组基因数) |
isescan_*/unicycler-medaka_polished_genomes/*.gff |
真正的 IS 预测结果 |
你的 wc -l 把两个文件加在一起数了,所以数字看起来像全基因组基因数(WT 比突变株多 1 行也只是因为敲除区少预测了几个 ORF,与 IS 无关)。
真实 IS 数量要看带 family= 的行:WT 只有 8 个 IS(IS110×1、IS21×2、IS701×2、IS91×1、ISL3×2)。这完全符合 ATCC 19606 作为非流行株(non-epidemic lineage)的特征——IS 很少,且没有 ISAba1(IS4 家族)。
修正后的统计脚本(排除 proteome 目录)
for d in isescan_*; do
gff=$(find $d -name "*.gff" ! -path "*proteome*")
echo "== $d =="
echo "-- IS 拷贝数:"
grep -cv "^#" "$gff"
echo "-- 家族分布:"
grep -hv "^#" "$gff" | grep -o "family=[^;]*" | sort | uniq -c
echo "-- 坐标 + 家族(菌株间比较用):"
grep -hv "^#" "$gff" | awk -F'\t' '{fam=$9; sub(/.*family=/,"",fam); sub(/;.*/,"",fam); print $1"\t"$4"\t"$5"\t"$7"\t"fam}' | sort -k2,2n
echo
done
Results pasted to AI to summarize the results, see point 8.
结果解读逻辑
- 19606WT vs ΔadeAB vs ΔadeIJ:
- 三者 IS 数量、家族、坐标完全一致 → 敲除过程中没有发生 IS 转座,这就是你要写进论文的关键结论。
- 若某个突变株出现特有插入 → 候选转座事件,再用 ISfinder BLAST + ISMapper + IGV 三重验证。
- 与 CP059040 比较:参考株的 IS 清单大概率与你的 19606 系列不同——这属于菌株背景自然差异(和之前 52 kb contraction 性质相同),不是实验引入的。
先跑修正后的统计循环,把三个 19606 菌株的 IS 坐标表贴出来——如果三张表一模一样,你的”无 IS 转座”结论就直接成立了。
非常干净的结果! 三个 19606 菌株的 IS 内容完全一致,没有任何 IS 转座事件。让我帮你解读:
1. 每个基因组 = 8 个 IS(24 行 = 8 个 IS + 16 个 TIR)
所有四个基因组的 IS 清单完全相同:IS21×2、IS701×2、ISL3×2、IS110×1、IS91×1(没有 ISAba1/IS4,符合 ATCC 19606 非流行株特征)。
2. 坐标比较表(仅 IS 本体,TIR 已排除)
| # |
家族 |
CP059040 |
19606WT |
ΔadeAB |
ΔadeIJ |
| 1 |
IS21 |
23–1702 |
23–1702 |
23–1702 |
23–1702 |
| 2 |
IS701 |
1327451 |
1327500 |
1327500 |
1323064 (−4436) |
| 3 |
IS21 |
2143339 |
2143382 |
2139100 (−4282) |
2138946 (−4436) |
| 4 |
ISL3 |
2755303 |
2755349 |
2751067 (−4282) |
2750913 (−4436) |
| 5 |
ISL3 |
2759762 |
2759808 |
2755526 (−4282) |
2755372 (−4436) |
| 6 |
IS110 |
3447973 |
3395155 |
3390873 (−4282) |
3390719 (−4436) |
| 7 |
IS701 |
3881864 |
3829044 |
3824762 (−4282) |
3824608 (−4436) |
| 8 |
IS91 |
3897676 |
3844856 |
3840574 (−4282) |
3840420 (−4436) |
3. 解读
WT vs 突变株(核心结论):
- ΔadeAB:位于敲除位点(1.84 Mb)下游的所有 IS(#3–#8)统一平移 −4282 bp,正好等于 adeAB 缺失的大小;上游的 #1–#2 不变。
- ΔadeIJ:位于 0.74 Mb 下游的所有 IS(#2–#8)统一平移 −4436 bp,正好等于 adeIJ 缺失大小;#1 不变。
- 没有任何菌株特有的 IS 获得/丢失/新插入 → 敲除过程中未发生 IS 转座。这种”整体坐标平移 = 缺失大小”的模式同时还是组装共线性(collinearity)的完美内参。
19606 vs CP059040(背景差异):
- #6–#8 相对 CP059040 偏移 ~52.8 kb = Assemblytics 发现的 52,668 bp + 198 bp 两个背景 contraction 之和(它们位于这些 IS 上游)。
- #2–#5 仅有 ~43–49 bp 的微小偏移(背景小 indel)。
- IS 清单本身完全相同 → 同样是菌株背景自然差异,与 IS 移动无关。
4. 论文可直接使用的句子
“ISEScan annotation identified an identical repertoire of eight insertion sequences (IS21×2, IS701×2, ISL3×2, IS110, IS91) in the wild-type and both knockout genomes. The only coordinate differences corresponded to uniform downstream shifts equal to the intended deletion sizes (4,282 bp for ΔadeAB; 4,436 bp for ΔadeIJ), demonstrating that no IS transposition occurred during mutant construction.”
5. 下一步(可选):ISfinder 命名
用之前的 gffread + blastn 流程给这 8 个 IS 赋予精确名称(如 ISAbaXX),即可作为补充表提交。
总结:SV(Assemblytics)+ SNP/indel(双平台一致)+ IS(ISEScan)三层证据全部表明——你的敲除株基因组干净、稳定,无脱靶结构变异、无 IS 转座。 可以安心写论文和提交 NCBI 了!
- 完整、可直接复制运行的 ISfinder 命名流程(ISEScan 预测 → 提取 IS 序列 → BLAST 比对 ISfinder → 获得精确 IS 名称):
bash isfinder.sh > isfinder.txt
🎉 非常完美的结果! 脚本运行成功,并且数据极其干净。
从输出中我们可以得出三个极其重要的结论:
- 三个菌株(WT, ΔadeAB, ΔadeIJ)的 IS 清单、命名和鉴定方法 100% 一致,再次确证了敲除过程中绝对没有发生 IS 转座。
- 8 个 IS 的命名层次分明:5 个通过核酸精确匹配,2 个通过蛋白远缘匹配,1 个是潜在的新颖 IS。
- 与参考基因组 CP059040 的 IS 内容完全相同,证明这些 IS 是该谱系的固有特征。
我已经将你的终端输出整理成了一张可以直接放入论文补充材料(Supplementary Table)的标准表格,并为你起草了论文的 Methods 和 Results 描述。
📊 论文补充表草稿 (Supplementary Table: IS elements in A. baumannii ATCC 19606)
| # |
ISEScan Family |
Coordinates (19606WT) |
Strand |
Size (bp) |
ISfinder Name |
Identity (%) |
Annotation Method |
| 1 |
IS21 |
23 – 1,702 |
+ |
1,680 |
Novel / Highly divergent |
N/A |
de novo (ISEScan only) |
| 2 |
IS701 |
1,327,500 – 1,328,600 |
– |
1,101 |
ISAba11 |
98.6% |
Nucleotide BLAST (ISfinder) |
| 3 |
IS21 |
2,143,382 – 2,146,108 |
+ |
2,727 |
ISPa77 |
33.3% (protein) |
Protein BLAST (ISfinder) |
| 4 |
ISL3 |
2,755,349 – 2,758,935 |
– |
3,587 |
IS1396 |
98.2% |
Nucleotide BLAST (ISfinder) |
| 5 |
ISL3 |
2,759,808 – 2,761,588 |
– |
1,781 |
ISPpu12 |
93.4% |
Nucleotide BLAST (ISfinder) |
| 6 |
IS110 |
3,395,155 – 3,397,416 |
+ |
2,262 |
ISEch1 |
40.5% (protein) |
Protein BLAST (ISfinder) |
| 7 |
IS701 |
3,829,044 – 3,830,146 |
– |
1,103 |
ISAba11 |
98.6% |
Nucleotide BLAST (ISfinder) |
| 8 |
IS91 |
3,844,856 – 3,847,489 |
– |
2,634 |
ISVsa3 |
100.0% |
Nucleotide BLAST (ISfinder) |
(注:ΔadeAB 和 ΔadeIJ 的 IS 坐标因目标基因缺失发生了相应的下游平移,但 IS 内容、大小和命名与 WT 完全一致。)
💡 关键结果解读
- ISAba11 (IS701 家族, 2 个拷贝):这是 Acinetobacter 中最著名的 IS 之一。你的数据以 98.6% 的高核酸相似度完美匹配,证明它们是典型的 ISAba11。
- ISPa77 & ISEch1 (蛋白级匹配):这两个 IS(IS21 和 IS110 家族)的核酸序列在进化中分歧太大,导致
blastn 找不到(e-value 不达标)。但它们的转座酶蛋白依然保留了功能结构域,被 blastx 敏锐地捕捉到了(e-value 达到 1e-87 和 1e-60,极其显著)。
- 23-1702 bp 的 IS21 (无匹配):这个位于复制起点附近的 IS21 家族成员,在 ISfinder 数据库中完全没有近缘物。它要么是一个全新未命名的 IS,要么是一个高度退化/嵌合的 IS21 残迹。在论文中将其标注为 “Novel / Highly divergent IS21 family member” 即可。
📝 论文写作素材 (直接可用的英文段落)
Methods 部分 (IS element identification)
“Insertion sequences (IS) were predicted de novo using ISEScan v1.7.3 with default parameters to identify IS families, terminal inverted repeats (TIRs), and precise coordinates. To assign specific IS nomenclature, the predicted IS nucleotide sequences were queried against the ISfinder database using BLASTN (e-value ≤ 1e-20). For IS elements lacking significant nucleotide similarity, protein-level homology searches were performed against the ISfinder transposase database using BLASTX (e-value ≤ 1e-10) to recover divergent family members.”
Results 部分 (Genome stability and IS content)
“Comparative genomic analysis revealed that the wild-type ATCC 19606 strain and its isogenic knockout derivatives ($\Delta$adeAB and $\Delta$adeIJ) share an identical repertoire of eight insertion sequences, comprising two copies of ISAba11 (IS701 family), two ISL3 family members (homologous to IS1396 and ISPpu12), one IS91 family member (ISVsa3), and three highly divergent members of the IS21 and IS110 families (identified via transposase homology to ISPa77 and ISEch1, respectively). Notably, one IS21 family member located near the origin of replication lacked close relatives in the ISfinder database, suggesting it may represent a novel or highly divergent element. Crucially, beyond the uniform coordinate shifts corresponding to the targeted deletions, no strain-specific IS insertions, excisions, or transposition events were detected, confirming the high genomic stability of the engineered mutants.”
⚠️ 关于终端 Warning 的解释
你看到的警告:
Warning: [blastn] Examining 5 or more matches is recommended
这是因为我们在脚本中使用了 -max_target_seqs 1(只输出最佳命中)。NCBI BLAST 官方建议至少看 5 个命中以防漏掉次优结果。对于我们的需求(只取最佳命中进行命名),这个警告完全可以安全忽略,它不影响最佳命中的准确性。
总结: 你的生信分析流程(SV + SNP/Indel + IS)已经全部完美收官!数据质量极高,逻辑链条闭环,完全达到了高质量微生物基因组学论文(如 Nature Communications, mBio, Antimicrobial Agents and Chemotherapy 等)的发表标准。可以放心开始撰写正文了!
- Report
Subject: Genomic Analysis Results Report: SV, SNP/Indel, and IS Analysis of 19606 WT and Knockout Strains
The comprehensive comparative genomic analysis of the 19606 wild-type (WT) and its two knockout derivatives ($\Delta$adeAB and $\Delta$adeIJ) has been fully completed. The overall data quality is exceptionally high, and the evidence from three distinct levels converges perfectly, thoroughly demonstrating that the genomes of our knockout strains are extremely clean and stable. Below is a summary of the core results and methodology:
1. Structural Variants (SVs)
We used Assemblytics to align the three complete genomes against the reference genome (CP059040). The results perfectly validate our knockouts, and no off-target large-scale rearrangements were detected.
- Targeted knockout validation: The $\Delta$adeAB strain contains a precise 4,282 bp deletion, and the $\Delta$adeIJ strain contains a precise 4,436 bp deletion.
- Background variations: All three strains (including the WT) share two tandem contractions (52.6 kb and 198 bp). These are inherent background differences of our 19606 lab strain relative to the CP059040 reference sequence and were not introduced during the knockout process.
| Strain |
Variant Type |
Size (bp) |
Reference Coordinates (CP059040) |
Classification / Biological Significance |
| 19606WT |
Tandem Contraction |
52,668 |
2,810,861 – 2,863,470 |
Background variation (inherent to our 19606 lab strain) |
|
Tandem Contraction |
198 |
3,124,916 – 3,125,037 |
Background variation |
| 19606_adeAB |
Deletion |
4,282 |
1,844,323 – 1,848,605 |
Targeted $\Delta$adeAB knockout |
|
Tandem Contraction |
52,668 |
2,810,861 – 2,863,470 |
Background variation |
|
Tandem Contraction |
198 |
3,124,916 – 3,125,037 |
Background variation |
| 19606_adeIJ |
Deletion |
4,436 |
737,224 – 741,667 |
Targeted $\Delta$adeIJ knockout |
|
Tandem Contraction |
52,668 |
2,810,861 – 2,863,470 |
Background variation |
|
Tandem Contraction |
198 |
3,124,916 – 3,125,037 |
Background variation |
2. Single Nucleotide Polymorphisms and Small Insertions/Deletions (SNPs/Indels)
We cross-validated the variants using a dual-platform approach combining Illumina short reads (Snippy) and ONT long reads (Medaka variant caller) (see attached snps_indels_platform_concordance_.xlsx for details).
- The dual-platform approach consistently identified 27 background SNPs/Indels (relative to CP059040).
- Key conclusion: No strain-specific point mutations were detected between the WT and the two mutants. This proves that the knockout process did not induce global genomic instability or off-target point mutations.
3. Insertion Sequences (IS)
We performed de novo prediction using ISEScan and combined it with the ISfinder database (nucleotide + protein BLAST) for precise naming.
- All three strains share an identical repertoire of 8 IS elements (including 2 copies of ISAba11).
- Key conclusion: Apart from the uniform downstream coordinate shifts caused by the targeted deletions, no IS transposition events occurred. This further confirms the high genetic stability of the mutant strains.
| # |
ISEScan Family |
Coordinates (19606WT) |
Strand |
Size (bp) |
ISfinder Name |
Identity (%) |
Annotation Method |
| 1 |
IS21 |
23 – 1,702 |
+ |
1,680 |
Novel / Highly divergent |
N/A |
de novo (ISEScan only) |
| 2 |
IS701 |
1,327,500 – 1,328,600 |
– |
1,101 |
ISAba11 |
98.6% |
Nucleotide BLAST (ISfinder) |
| 3 |
IS21 |
2,143,382 – 2,146,108 |
+ |
2,727 |
ISPa77 |
33.3% (protein) |
Protein BLAST (ISfinder) |
| 4 |
ISL3 |
2,755,349 – 2,758,935 |
– |
3,587 |
IS1396 |
98.2% |
Nucleotide BLAST (ISfinder) |
| 5 |
ISL3 |
2,759,808 – 2,761,588 |
– |
1,781 |
ISPpu12 |
93.4% |
Nucleotide BLAST (ISfinder) |
| 6 |
IS110 |
3,395,155 – 3,397,416 |
+ |
2,262 |
ISEch1 |
40.5% (protein) |
Protein BLAST (ISfinder) |
| 7 |
IS701 |
3,829,044 – 3,830,146 |
– |
1,103 |
ISAba11 |
98.6% |
Nucleotide BLAST (ISfinder) |
| 8 |
IS91 |
3,844,856 – 3,847,489 |
– |
2,634 |
ISVsa3 |
100.0% |
Nucleotide BLAST (ISfinder) |
4. Methods Summary
If you need to draft the Methods section for the manuscript, you can refer to the following workflow:
- Assembly & Polishing: Hybrid assembly of Illumina short reads and ONT long reads was performed using Unicycler. This was followed by long-read consensus polishing using Medaka (model:
r1041_e82_400bps_hac_v5.2.0) and high-accuracy short-read polishing using Polypolish.
- SV Calling: The polished complete genomes were aligned to the reference sequence (CP059040) using Nucmer, followed by the identification of large insertions, deletions, and rearrangements via Assemblytics.
- Variant Calling (SNP/Indel): Short-read variants were called using Snippy, and long-read variants were called using the Medaka variant caller. The intersection of both platforms was taken to ensure high confidence.
- IS Annotation: ISEScan was used to predict IS families and terminal inverted repeats (TIRs). The predicted sequences were then queried against the ISfinder database using BLASTN and BLASTX to obtain precise nomenclature.
Conclusion:
In summary, the evidence from three levels—SVs, SNPs/Indels, and IS elements—converges perfectly, fully demonstrating that the genomes of our knockout strains are clean, stable, and free of any off-target variations. We can confidently begin writing the main text and preparing for NCBI submission.
The detailed concordance table for SNPs/Indels across both platforms is attached for your review. Please feel free to reach out if you have any questions or need any adjustments!