在 Ubuntu / zsh 环境下用 NASTRA、STRspy、LongTR 与自研软件做系统对比
无论后续用哪款工具,建议都先用 minimap2 把同一批 ONT reads 比对到同一个参考基因组(如 GRCh38),生成排序并建索引的 BAM,作为 NASTRA 和 LongTR 的共同输入;STRspy 如果用 FASTQ 模式,也让它使用同一套 minimap2 参数,避免“比对器不同”成为混杂变量。
# 示例:ONT reads → sorted BAM
minimap2 -ax map-ont -t 16 --MD -Y -L --secondary=no \
GRCh38.fa sample.fastq.gz \
| samtools sort -@ 8 -o sample.sorted.bam
samtools index sample.sorted.bam
🧬 NASTRA:基于 BAM 的 allele reference-free 分型
NASTRA 的核心特点是不依赖 allele 序列数据库,而是根据已知 repeat motif 递归推断每个 read 的重复结构,再做聚类分型。它的输入只需要 BAM,外加可选的 factsheet、panel 和阈值配置文件。
📦 安装
NASTRA 官方推荐用 conda 管理环境,并先安装 samtools v1.9(注意:ARM 环境下不能通过 conda 装 samtools,但你用的是常规 x86 Ubuntu 服务器,不受影响)。
git clone https://github.com/renzilin/NASTRA.git
git clone https://ghfast.top/https://github.com/renzilin/NASTRA.git
cd NASTRA
conda env create -n nastra_env -f env.yaml
conda activate nastra_env
最小用法只需要指定 BAM 和输出文件:
python NASTRA/nastra.py call \ -b sample.sorted.bam \ -o sample.nastra.txt如果要复现论文级别的结果,应显式指定三份配置文件:
python NASTRA/nastra.py call \ -b sample.sorted.bam \ -f NASTRA/cfgs/repeat_structure.pat \ -p NASTRA/cfgs/panel_forenseq.csv \ -c NASTRA/cfgs/threshold.cfg \ -o sample.nastra.txtSTRspy:基于 alignment + quantification 的分型
STRspy 是专门为长读长 forensic STR 分型设计的工具,支持 ONT 和 PacBio,输入可以是 FASTQ 或 BAM。它的逻辑是:先把 reads 比对到 STR 参考等位基因库,再统计每个 allele 的支持 reads 数,取最高的两个作为基因型。
📦 安装
STRspy 有一组第三方依赖需要预先满足:gnu parallel >=20210222、samtools >=v1.12、bedtools >=v2.30.0、minimap2 >=v2.18-r1015、xatlas >=v0.2.1。官方提供了 setup 脚本,会自动创建 conda 环境:
git clone git@github.com:unique379r/strspy.gitcd strspybash setup/STRspy_setup.shconda activate strspy_envbash setup/MakeToolConfig.shmv UserToolsConfig.txt config/conda deactivate如果 STRspy_setup.sh 在你的环境里因权限或网络问题失败,也可以手动建环境后逐项安装上述依赖。
🛠️ 配置与运行
STRspy 把参数分成两个配置文件:InputConfig.txt 和 ToolsConfig.txt。前者描述数据,后者描述各依赖的可执行文件路径。
InputConfig.txt 的关键字段:
字段 含义 INPUT_DIR 输入目录,放 FASTQ 或 BAM INPUT_BAM yes 或 no,指示输入是否为 BAM READ_TYPE ont 或 pb STR_FASTA 每个 STR 区域序列的 FASTA,需含 ±500 bp 侧翼 STR_BED 每个 STR 区域的 BED,同样需含侧翼 GENOME_FASTA 参考基因组 FASTA,FASTQ 输入时必须提供 REGION_BED 所有 STR 区域合并后的单个 BED,用于覆盖度计算 NORM_CUTOFF 归一化阈值,用于选 top two alleles,常用 0.4 OUTPUT_DIR 空目录,用于写结果
配置好后运行:
bash ./STRspy_run_v1.0.sh config/InputConfig.txt config/ToolsConfig.txtSTRspy 仓库自带 testset.tar.gz,官方说明测试数据在简单终端下 <12 秒 即可完成,适合先跑通再上真实数据。如果遇到 wrapper 与 gnu parallel 通信导致流程提前退出的问题,可以改为直接运行 scripts/STRspy_v1.0.sh。
STRspy 需要注意的一点是:它默认使用自己构建的 STR 数据库(v1.0 主要是常染色体 forensic 位点;STRspy2.0 已扩展到 ChrY 并更新了数据库)。如果你的自研软件覆盖的位点集与 STRspy 数据库不一致,比较时应取交集位点,否则覆盖率差异会被误读为灵敏度差异。
LongTR:HipSTR 的长读长版本,输出 VCF
LongTR 是 HipSTR 的长读长改造版,同时支持 STR 和 VNTR,输入为 BAM/CRAM + 参考 FASTA + TR 区域 BED,输出 bgzipped VCF。它更适合做基因组范围的 TR 分型,而不是像 NASTRA/STRspy 那样偏向 forensic panel。
📦 安装
推荐 conda 安装,最省事:
conda install -c conda-forge -c bioconda longtr如需从源码编译,需要 gcc 7+、cmake 3.12+、zlib 和 googletest 1.10.0+;spoa 和 HTSLIB 会在 make 过程中自动拉取。
git clone git@github.com:gymrek-lab/LongTR.gitcd LongTRmake./LongTR --help🛠️ 运行
基础命令:
LongTR \ --bams sample.sorted.bam \ --fasta GRCh38.fa \ --regions tr_regions.bed \ --tr-vcf sample.longtr.vcf.gzSTRinNGS v2.1 提供两种安装路径。在服务器环境下,Docker 是首选,因为源码安装的依赖链比较重。🐳 Docker(推荐)```zshdocker pull bioinformatician/strinngs2```Docker 镜像内已打包所有依赖,无需在宿主机上单独安装 samtools、hisat2 等。运行容器时把数据目录挂载进去即可。🔧 源码安装(Linux)STRinNGS v2.1 的外部依赖明确且版本敏感:依赖 版本要求Python 3.6(含 pip)samtools 1.9hisat2 2.1.0stringtie 2.0.3agrep 需可用T.R.E. 0.8.0安装命令:```zsh# 1. 安装 Python 依赖wget https://bitbucket.org/rirgabiss/strinngs/downloads/requirements.txtpip install -r requirements.txt# 2. 下载并解压 STRinNGS v2.1wget https://bitbucket.org/rirgabiss/strinngs/downloads/strinngs_v2.1.tar.gztar -xvf strinngs_v2.1.tar.gz && rm strinngs_v2.1.tar.gzcd strinngs_v2.1```Python 3.6 这一点需要特别注意:现代 Ubuntu 服务器默认的 Python 版本通常远高于 3.6,直接用系统 Python 安装 requirements.txt 很可能因包版本冲突而失败。建议用 conda 专门建一个 Python 3.6 环境来跑源码安装,或者直接走 Docker 路线绕开这个问题。🧪 测试集验证官方提供了约 290 MB(解压后)的测试集,包含 chr12 参考序列、test.fastq.gz 和 test.ini,以及预期结果:```zshwget https://bitbucket.org/rirgabiss/strinngs/downloads/test_set.tar.gztar -xvf test_set.tar.gz && rm test_set.tar.gz```先跑通测试集,确认环境无误后再上真实数据。---🛠 运行用法📝 最小命令```zsh./src/STRinNGS.py \ -i test_set/test.fastq.gz \ -o ./results/test \ -r test_set/chr12.fa \ -n test_set/test.ini```四个必填参数:· -i / --input:输入文件,必须是 BAM 或 FASTQ 格式。· -o / --outdir:输出目录。· -r / --ref:参考基因组 FASTA。· -n / --nom:.ini 格式的配置文件。⚙ 常用可选参数参数 作用 默认值-t / --threads 多核并行数 1-m / --mism 在 ini 设定基础上额外增加允许的错配数 0-w / --women 判定女性的最大 reads 数 25-s / --snpcheck 已知 SNP 的 VCF,用于补充 rs 编号 None-d / --dir 输入为目录时,指定要搜索的文件类型(如 fastq) None-f / --force 覆盖已有输出 关闭-t 的官方建议是线程数尽量与位点数一致,因为 STRinNGS 的并行是按位点拆分的。---📄 配置文件(.ini):STRinNGS 的核心STRinNGS 不依赖 BED,而是靠 .ini 文件告诉程序每个位点的位置和侧翼信息。每个位点至少需要 4 个必填参数:```ini[locus1]start = 123456 ; STR 起始位置前的最后一个碱基stop = 123499 ; STR 区域的最后一个碱基chr = 4 ; 染色体名称,必须与参考 FASTA 中的写法完全一致```侧翼参数(可选但强烈建议显式设置):· flank_up_length / flank_down_length:默认各 25 bp,用于识别位点和分析侧翼变异。· mism_up / mism_down:允许的错配数,包含替换、插入和缺失。最容易踩的坑是 chr 的写法:如果你的参考 FASTA 里染色体写作 >1,ini 里就必须写 chr = 1;如果写作 >chr1,就必须写 chr = chr1,不匹配会导致程序找不到位点。对于纳米孔数据,建议把 mism_up / mism_down 比默认值调高,因为 ONT 的侧翼区错误率高于 MPS;或者不修改 ini,改用 -m 参数在运行时全局增加错配容忍度。官方也明确建议在测试新群体时用 -m 而不是直接改 ini。---📥 输入与 📤 输出输入格式:FASTQ、FASTA、SAM、BAM、CRAM 均支持;BAM/CRAM 需要配套的 .bai / .crai 索引;.gz 压缩自动识别;不支持 paired-end,因为 STRinNGS 的扩增子逻辑是单端读段。核心输出:· Results.csv:最终结果,包含去噪、注释和计算,可直接用于 STRidER 数据库上传。· Raw_results.csv:原始信息(不含 locus balance 和杂合子平衡)。· Log_日期时间.txt:运行日志。
第一,输入层面的公平性。NASTRA 和 LongTR 直接吃 BAM,STRspy 可以吃 FASTQ 或 BAM。STRinNGS 虽然也支持 BAM,但它的设计初衷是直接从 FASTQ 的侧翼序列识别位点,并不依赖 minimap2 的全基因组比对。如果你为了“统一输入”而强行把 STRinNGS 也指向同一个 minimap2 BAM,需要确认它的内部流程是否仍然会按自己的逻辑重新处理;更稳妥的做法是让 STRinNGS 走 FASTQ 原生模式,并在方法学中明确说明“STRinNGS 使用 FASTQ 输入,其余 BAM 类工具使用统一 minimap2 比对结果”,把这一差异作为已知变量报告,而不是假装完全对齐。第二,位点集取交集。STRinNGS 的 .ini 配置文件决定了它能分析哪些位点。如果你的 .ini 覆盖的位点与 NASTRA 的 panel、STRspy 的数据库、LongTR 的 BED 不完全一致,最终的四工具比较必须限定在四者都能调用的位点交集上,否则覆盖率差异会被误读为灵敏度差异。第三,阈值与过滤策略要报告。STRinNGS 内部有 read depth、noise、locus balance、heterozygote balance 等多层质控;LongTR 有 --min-reads 和 --min-mean-qual;STRspy 有 NORM_CUTOFF。这些阈值各自独立,论文中应给出每款工具实际使用的阈值,并在补充材料中说明是否为了纳米孔数据做过调整。近期那项评估中 STRinNGS 准确性胜出的前提,正是它在复杂等位基因上的序列层面判别能力,而这一优势只有在不把序列差异过度过滤掉的阈值设置下才能体现出来。