pixy软件滑动步长补充

pixy软件是比较群体基因组差异的一款软件

在使用时发现只能固定窗口,不能滑动步长,这在联合比较其他算法计算的选择信号时需要用到。

所以记录一下怎么弄吧

1.思路

本身就是计算窗口内的dxy,fst这些吧,,命令可以指定窗口,下面是用法。

image-20240806215608385

1
2
3
4
usage: pixy [-h] --stats {pi,dxy,fst} [{pi,dxy,fst} ...] --vcf [VCF] --populations [POPULATIONS] [--window_size [WINDOW_SIZE]] [--bed_file [BED_FILE]] [--n_cores [N_CORES]]
[--output_folder [OUTPUT_FOLDER]] [--output_prefix [OUTPUT_PREFIX]] [--chromosomes [CHROMOSOMES]] [--interval_start [INTERVAL_START]] [--interval_end [INTERVAL_END]]
[--sites_file [SITES_FILE]] [--chunk_size [CHUNK_SIZE]] [--fst_type {wc,hudson}] [--bypass_invariant_check {yes,no}] [--version] [--citation] [--silent]
pixy: error: the following arguments are required: --stats, --vcf, --populations

那么手动以step空隔出来区间去计算区间内是不是也合理呢。

2.打印命令

那么多窗口手动都不现实,循环又不知道窗口合理大小,那就看一下染色体长度,打印一下命令吧。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash
vcf_file="/home/liuxiao/1254/group1/370.vcf.gz"
window_size=150000
step_size=75000
output_intervals="intervals.txt"

chromosomes=$(bcftools view -h $vcf_file | grep "^##contig" | sed 's/##contig=<ID=//;s/,length=/\t/' | cut -f1,2)


> $output_intervals

while read -r chromosome length; do

length=$(echo $length | tr -d '>')
echo "Processing chromosome $chromosome of length $length"
start=1
end=$window_size

while [ $start -le $length ]; do
if [ $end -gt $length ]; then
end=$length
fi
echo -e "$chromosome\t$start\t$end" >> $output_intervals
start=$((start + step_size))
end=$((start + window_size - 1))
done
done <<< "$chromosomes"

echo "根据染色体规划的窗口输出: $output_intervals"

3.开工

知道窗口了,那这么多窗口一个一个循环计算岂不是慢死了。

parallel启动

把窗口计算完整命令打印一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#!/bin/bash

vcf_file="/home/liuxiao/1254/group1/370.vcf.gz"
populations_file="/home/liuxiao/1254/group1/vcf/dxy/pop/hu_other.txt"
output_prefix="tepedxy_outputwinstep_pophu_other"
intervals_file="intervals.txt"
n_cores=60

temp_dir=$(mktemp -d)
output_folder="$temp_dir/output"

mkdir -p $output_folder

while read -r chromosome start end; do
echo "Processing $chromosome: $start-$end"
pixy --stats dxy --vcf $vcf_file --populations $populations_file --window_size $((end-start+1)) \
--chromosomes $chromosome --interval_start $start --interval_end $end \
--n_cores $n_cores --bypass_invariant_check yes --output_folder $output_folder --output_prefix ${output_prefix}_${chromosome}_${start}_${end}
done < $intervals_file

cat $output_folder/${output_prefix}_* > ${output_prefix}_combined.txt
rm -r $temp_dir

echo "command输出到 ${output_prefix}_combined.txt"

image-20240806220741808

如上图,根据染色体号和区间填充了我们的命令

直接bash就算了,parallel给服务器上上强度

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash

commands_file="pixy_commands.txt"
output_prefix="tepedxy_outputwinstep_pophu_other"
output_folder="hu_other"

mkdir -p $output_folder
parallel --jobs 30 < $commands_file
wait

for chr in $(grep --only-matching --perl-regexp "(?<=--chromosomes )[^\s]+" $commands_file | sort | uniq); do
echo "Merging results for chromosome $chr"
cat ${output_prefix}_${chr}_* > ${output_folder}/combine_${chr}_combined.txt
done
wait

cat ${output_folder}/combine_*_combined.txt > ${output_folder}/${output_prefix}_final_combined.txt
wait

echo "分析完成,结果已复制到${output_folder}/${output_prefix}_final_combined.txt"

一小点点的不足,过程文件太多了,rm处理不了,自己分染色体rm吧

1
2
3
#计算合并的结果已经复制到子文件夹了,放心删除
for i in {1..27}; rm *Chr$i*
rm *tmp

还有坑,合并的子文件标题行。。。

image-20240806221552138

1
awk 'NR==1 || !/^pop1/' combine.txt > cutcombine.txt

排序也不对

image-20240806221819278

1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash

input_file="step.txt"
output_file="step_sorted.txt"
header_file="header.txt"
data_file="data.txt"

head -n 1 $input_file > $header_file
tail -n +2 $input_file > $data_file
sort -k3,3 -k4,4n $data_file > $output_file
cat $header_file $output_file > ${output_file}_final

echo "大功告成了,看看 ${output_file}."

image-20240806221951766

这差不多成功了,

1
cut  -f 3,4,5,6 $output_file > clean_file