示例命令
- 命令参数
- i,指定输入基因组文件
- t,指定使用的线程数量
- d,指定额外的重复序列库(来自公共数据库或者近缘物种的重复序列注释)
nohup bash repeat_anno.sh -i test.fasta -t 40 -d other_repeat.fasta & README
README: Script and Docker Image Usage for Repeat Annotation
All software for repeat annotation was installed using Miniconda or cloned from GitHub and installed in /home/soft/.
Usage:
bash repeat_anno.sh -i test.fasta -t 40
Options:
-i: Specify the genome sequence file in FASTA format.
-t: Indicate the number of CPU/threads for parallel processing.
-d: Specify an additional library containing repeat sequences used for masking. (Optional)
Output:
The following files will be generated in the results/ directory:
ltr_repeat: Predicted LTR (Long Terminal Repeat) candidates identified by LTRharvest and LTR_FINDER_parallel.
repeatmodeler: Predicted repeat sequences identified by RepeatModeler.
results:
Repeat annotation in GFF3 format (describes repeat locations).
Soft-masked genome sequence (genome with repeats in lowercase letters).
Hard-masked genome sequence (genome with repeats replaced by 'N').
Statistics Table for Repetitive Elements (table summarizing the types and counts of repeats).
Notes:
Ensure the input FASTA file is formatted correctly.
The -t option allows parallel processing to speed up repeat annotation.
The -d option is optional and can enhance repeat masking by using an additional repeat library.输出文件
使用脚本后,会把基因组序列文件名作为前缀,生成一个后缀是“_dir”的文件夹,下方是这三个
- ltr_repeat:LTR逆转座子的预测结果(scn)、注释、库文件(fasta)
- repeatmodeler:该工具预测的重复序列,分类后的各种重复序列(fasta格式)
- results:软屏蔽和硬屏蔽后的基因组序列,重复序列注释文件,统计表信息
源代码
#!/bin/bash
# 初始化变量
input=""
threads=""
repeat_lib=""
# 使用 getopts 来处理 -i, -t 和 -d 参数,将参数后面的值赋给变量
while getopts "i:t:d:" opt; do
case $opt in
i) # 处理 -i 参数
input=$OPTARG # 将 -i 参数后面的值存储在变量 input 中
;;
t) # 处理 -t 参数
threads=$OPTARG # 将 -t 参数后面的值存储在变量 threads 中
;;
d) # 处理 -d 参数
repeat_lib=$OPTARG # 将 -d 参数后面的值存储在变量 repeat_lib 中
;;
\?) # 处理无效参数
echo "无效参数:-$OPTARG"
exit 1
;;
esac
done
mkdir -p "${input}_dir"
# 原本打算在cp的时候顺便改个名,结果无法执行,这一部分只能拆开来分成两步走
cp "$input" target.fasta
mv target.fasta "${input}_dir"
cd "${input}_dir"
# 参考文章:https://www.jianshu.com/p/f7c0115e1d89
# 第一部分,LTRs鉴定
# 创建ltr_repeat文件夹,ltrs的鉴定放在该文件夹下方
mkdir ltr_repeat
cd ltr_repeat
# ltr_finder_parallel鉴定ltrs,输出文件:target.fasta.finder.combine.scn
# 参数设定依据:https://github.com/oushujun/LTR_FINDER_parallel?tab=readme-ov-file
/home/soft/LTR_FINDER_parallel/LTR_FINDER_parallel -seq ../target.fasta -threads $threads -w 2 -C -D 15000 -d 1000 -L 7000 -l 100 -p 20 -M 0.85 -harvest_out &
# ltrharvest建立索引
gt suffixerator -db ../target.fasta -indexname target -tis -suf -lcp -des -ssp -sds -dna
# ltrharvest鉴定ltrs,输出文件:target.harvest.scn
gt ltrharvest -index target -similar 85 -vic 10 -seed 20 -seqids yes -minlenltr 100 -maxlenltr 7000 -mintsd 4 -maxtsd 6 -motif TGCA -motifmis 1 > target.harvest.scn &
# 在两个ltr后面加上&,后台运行,wait等待两个ltr完成运行后再继续运行后面的命令
wait
# 合并ltrharvest和ltr_finder_parallel鉴定出来的两个库文件
cat target.fasta.finder.combine.scn target.harvest.scn > all.scn
# 用ltr_retriever对两个库文件进行合并,然后屏蔽,得到ltrs的库文件和第一次屏蔽后的重复序列
/home/soft/LTR_retriever/LTR_retriever -genome target.fasta -inharvest all.scn -threads $threads
# 对库文件进行重命名
mv *.LTRlib.fa LTR.lib
chmod 777 LTR.lib
cp LTR.lib ..
# 将经过屏蔽的基因组文件中的重复序列(N)删除掉
tr -d 'nN' < target.fasta.masked | seqkit seq > target.rmmasked.fasta
cp target.rmmasked.fasta ..
# 高量化部分重要中间文件,便于后续检查
chmod 777 target.harvest.scn target.fasta.finder.combine.scn all.scn target.fasta.masked target.rmmasked.fasta
# 回到上一级目录,在基因组_repeat文件夹下方
cd ../
# 第二部分,repeatmodeler鉴定重复序列
# 创建文件夹,进入文件夹
mkdir repeatmodeler
mv target.rmmasked.fasta repeatmodeler
cd repeatmodeler
# 如果输入了重复序列库(-d),则使用该库
if [ -n "$repeat_lib" ]; then
echo "使用提供的重复序列库: $repeat_lib"
# 可以根据需求在这里添加使用该重复序列库的代码(如添加额外步骤)
cp "$repeat_lib" repeat_lib
fi
# 建立索引
BuildDatabase -engine ncbi -name target target.rmmasked.fasta
# 运行repeatmodeler
RepeatModeler -threads $threads -engine ncbi -database target
# 进入repeatmodeler的输出文件夹中,RM开头的
cd RM*
# 按照标识符是否为unknown进行分类,分为已知和未知的文件
seqkit grep -nrp 'Unknown' consensi.fa.classified > repeatmodeler_unknowns.fasta
seqkit grep -vnrp 'Unknown' consensi.fa.classified > repeatmodeler_identities.fasta
# 转座酶数据库建立索引
makeblastdb -in /home/data/Tpases020812 -dbtype prot -out Tpases020812
# 和转座酶数据库进行比对,如果能够比对的上,就归类到已知的
blastx -query repeatmodeler_unknowns.fasta -db Tpases020812 -evalue 1e-10 -num_descriptions 10 -num_threads $threads -out modelerunknown_blast_results.txt
# 解析比对结果,提取已知的转座子(重复序列的一种类型)
perl /home/soft/CRL_Scripts1.0/transposon_blast_parse.pl --blastx modelerunknown_blast_results.txt --modelerunknown repeatmodeler_unknowns.fasta
# 文件重命名,顺便高亮,还有复制移动
cp unknown_elements.txt ModelerUnknown.lib
cat identified_elements.txt repeatmodeler_identities.fasta > ModelerID.lib
chmod 777 ModelerUnknown.lib ModelerID.lib
cp ModelerUnknown.lib ModelerID.lib ../../
cd ../../
#第三部分,屏蔽重复序列(这里融合了同源找到的重复序列鉴定的一步,不过不是很重要了)
#合并文件
#KnownRepeats.lib,已知分类的重复序列库
#allrepeats.lib是全部的重复序列库,包括unclassfied的部分
#因为我们的主要目的是预测蛋白编码基因,所以这里把鉴定到的重复序列全部屏蔽了
# 判断 $repeat_lib 是否为空,如果为空就不包含它
if [ -n "$repeat_lib" ]; then
cat LTR.lib ModelerID.lib "$repeat_lib" > KnownRepeats.lib
else
cat LTR.lib ModelerID.lib > KnownRepeats.lib
fi
cat KnownRepeats.lib ModelerUnknown.lib > allRepeats.lib
#开始对基因组上的重复序列进行硬屏蔽和软屏蔽
mkdir repeatmasker
cd repeatmasker/
#硬屏蔽
mkdir hard
cd hard/
# 计算线程数,每个进程分配的线程数,向下取整
RepeatMasker -e ncbi -pa $((threads / 4)) -gff -lib ../../allRepeats.lib ../../target.fasta -dir ./
cd ..
#软屏蔽
mkdir soft
cd soft/
RepeatMasker -xsmall -e ncbi -pa $((threads / 4)) -gff -lib ../../allRepeats.lib ../../target.fasta -dir ./
#结果文件处理
mv target.fasta.masked $input.soft.masked.fasta
cd ..
mv hard/target.fasta.masked hard/$input.hard.masked.fasta
mv hard/target.fasta.tbl hard/$input.repeat.tbl
mv hard/target.fasta.out.gff hard/$input.repeat.gff
cd ..
mkdir results
mv repeatmasker/soft/$input.soft.masked.fasta results/
mv repeatmasker/hard/$input.hard.masked.fasta results/
mv repeatmasker/hard/$input.repeat.tbl results/
mv repeatmasker/hard/$input.repeat.gff results/
rm target.fasta *.lib
rm repeatmodeler/target.rmmasked.fasta
rm -rf repeatmasker/