本文最后更新于 337 天前,如有失效请评论区留言。
1、正常运行 GenotypeGVCFs
#!/bin/bash
# 设置combined_gvcf文件路径(来自上一步的输出)
combined_gvcf_path="/public1/guop/mawx/workspace/wild_snpcalling/4.gatk_gvcf/combined_raw.gvcf"
# 定义参考基因组文件
reference_genome="/public1/guop/mawx/workspace/wild_snpcalling/0.genome/LYG.hic.fasta"
# 设置gatk文件目录
gatk_dir="/public1/guop/mawx/workspace/wild_snpcalling/4.gatk_gvcf"
# 设置输出的VCF文件路径
output_vcf_path="$gatk_dir/combined_genotyped.vcf"
# 设置日志文件
log_file="$gatk_dir/gatk_GenotypeGVCFs_processing.log"
# 创建输出目录(如果不存在)
mkdir -p "$(dirname "$output_vcf_path")" "$gatk_dir/tmp"
# 记录脚本开始时间
echo "GenotypeGVCFs Script started at $(date)" | tee -a "$log_file"
# 运行GATK GenotypeGVCFs
echo "Running GATK GenotypeGVCFs at $(date)" | tee -a "$log_file"
gatk --java-options "-Xms200G -Xmx200G -XX:ParallelGCThreads=20 -Djava.io.tmpdir=${gatk_dir}/tmp" GenotypeGVCFs \
-R "$reference_genome" \
-V "$combined_gvcf_path" \
-O "$output_vcf_path" 2>&1 | tee -a "$log_file"
echo "GATK GenotypeGVCFs completed at $(date)" | tee -a "$log_file"
# 记录脚本完成时间
echo "GenotypeGVCFs Script completed at $(date)" | tee -a "$log_file"
2、按照染色体分开运行 GenotypeGVCFs
,每个染色体单独生成一个VCF文件。
可以一定程度避免运行中断
#!/bin/bash
# 设置输入的 GVCF 文件路径
combined_gvcf_path="/public1/guop/mawx/workspace/wild_snpcalling/4.gatk_gvcf/combined_raw.gvcf"
# 定义参考基因组文件
reference_genome="/public1/guop/mawx/workspace/wild_snpcalling/0.genome/LYG.hic.fasta"
# 设置输出目录
output_dir="/public1/guop/mawx/workspace/wild_snpcalling/4.gatk_gvcf/per_chromosome_vcf"
log_dir="$output_dir/logs"
mkdir -p "$output_dir" "$log_dir" "$output_dir/tmp"
# 记录脚本开始时间
echo "GenotypeGVCFs per chromosome script started at $(date)" | tee -a "$log_dir/gatk_GenotypeGVCFs_processing.log"
# 定义染色体名称列表 (根据你的染色体命名方式)
chromosomes=("Superscaffold1" "Superscaffold2" "Superscaffold3" ... "Superscaffold23")
# 遍历每个染色体
for chrom in "${chromosomes[@]}"; do
# 设置输出 VCF 文件路径
output_vcf="${output_dir}/${chrom}.vcf"
# 运行 GATK GenotypeGVCFs
echo "Running GATK GenotypeGVCFs for $chrom at $(date)" | tee -a "$log_dir/gatk_GenotypeGVCFs_processing.log"
gatk --java-options "-Xms50G -Xmx50G -XX:ParallelGCThreads=10 -Djava.io.tmpdir=${output_dir}/tmp" GenotypeGVCFs \
-R "$reference_genome" \
-V "$combined_gvcf_path" \
-O "$output_vcf" \
-L "$chrom" 2>&1 | tee -a "$log_dir/gatk_GenotypeGVCFs_${chrom}.log"
echo "GATK GenotypeGVCFs completed for $chrom at $(date)" | tee -a "$log_dir/gatk_GenotypeGVCFs_processing.log"
done
# 记录脚本完成时间
echo "GenotypeGVCFs per chromosome script completed at $(date)" | tee -a "$log_dir/gatk_GenotypeGVCFs_processing.log"
脚本说明:
- 染色体列表:脚本中
chromosomes
数组包含了所有染色体的名称,需要根据实际情况进行调整。 - GATK 命令:对于每个染色体,使用
-L
参数指定染色体范围来运行GenotypeGVCFs
,并将结果保存为对应的VCF文件。 - 日志记录:为每个染色体单独生成一个日志文件,并且记录整体开始和结束的时间。
- 资源配置:根据每个染色体的大小调整
-Xms
和-Xmx
的值。如果你有多个染色体,确保你有足够的内存和线程分配。
运行这个脚本后,将在 output_dir
目录中得到每条染色体的VCF文件。
3、让脚本并行运行23个染色体,以加快处理速度。可以使用 &
符号在后台同时运行多个 GenotypeGVCFs
命令,并使用 wait
命令确保所有染色体的处理完成后脚本才结束。
以下是修改后的脚本示例,支持同时运行多个染色体:
脚本 6.GenotypeGVCFs_parallel.sh
#!/bin/bash
# 设置输入的 GVCF 文件路径
combined_gvcf_path="/public1/guop/mawx/workspace/wild_snpcalling/4.gatk_gvcf/combined_raw.gvcf"
# 定义参考基因组文件
reference_genome="/public1/guop/mawx/workspace/wild_snpcalling/0.genome/LYG.hic.fasta"
# 设置输出目录
output_dir="/public1/guop/mawx/workspace/wild_snpcalling/4.gatk_gvcf/per_chromosome_vcf"
log_dir="$output_dir/logs"
mkdir -p "$output_dir" "$log_dir" "$output_dir/tmp"
# 记录脚本开始时间
echo "GenotypeGVCFs per chromosome script started at $(date)" | tee -a "$log_dir/gatk_GenotypeGVCFs_processing.log"
# 定义染色体名称列表 (根据你的染色体命名方式)
chromosomes=("Superscaffold1" "Superscaffold2" "Superscaffold3" ... "Superscaffold23")
# 遍历每个染色体并行运行
for chrom in "${chromosomes[@]}"; do
# 设置输出 VCF 文件路径
output_vcf="${output_dir}/${chrom}.vcf"
# 运行 GATK GenotypeGVCFs
echo "Running GATK GenotypeGVCFs for $chrom at $(date)" | tee -a "$log_dir/gatk_GenotypeGVCFs_processing.log"
gatk --java-options "-Xms50G -Xmx50G -XX:ParallelGCThreads=10 -Djava.io.tmpdir=${output_dir}/tmp" GenotypeGVCFs \
-R "$reference_genome" \
-V "$combined_gvcf_path" \
-O "$output_vcf" \
-L "$chrom" 2>&1 | tee -a "$log_dir/gatk_GenotypeGVCFs_${chrom}.log" &
# 限制并发数,这里假设同时运行5个
if [[ $(jobs -r -p | wc -l) -ge 5 ]]; then
wait -n # 等待任意一个任务完成
fi
done
# 等待所有任务完成
wait
# 记录脚本完成时间
echo "GenotypeGVCFs per chromosome script completed at $(date)" | tee -a "$log_dir/gatk_GenotypeGVCFs_processing.log"
脚本说明:
- 并行执行:使用
&
将GenotypeGVCFs
命令放入后台执行,每个染色体处理都会并行进行。 - 控制并发数:为了避免同时运行太多任务而导致资源不足,脚本包含一个并发数限制(例子中为5个)。
if [[ $(jobs -r -p | wc -l) -ge 5 ]]; then wait -n; fi
这段代码检查当前正在运行的任务数,并确保最多有5个任务在同时运行。你可以根据服务器资源调整这个数值。 - 等待所有任务完成:使用
wait
命令等待所有后台任务完成后,再记录完成时间。
通过这种方法,你可以显著加快处理速度,同时避免系统资源过载。