MSMC2进行历史有效种群大小计算

好的博客转载保存,原文链接:https://blog.csdn.net/weixin_45694863/article/details/126812038

提到评估有效种群大小的软件,首先想到的肯定的liheng大神开发的PSMC,但是PSMC每次只能计算一个样本,无法进行多样本估计,而MSMC和SMC++就是PSMC代表性的改进方法,SMC++和MSMC2可以进行多个样本的分析,具体原理去文献看,我自身了解的也是马马虎虎,在这里主要说一下分析流程。
先介绍MSMC2,MSMC2是一种隐马尔可夫模型(Hidden Markov Model ),它使用杂合位点(基因型)的密度来估计到最近共同祖先的时间。
在进行安装和分析的过程中需要一些脚本和依赖,以下是具体的分析过程。
1.MSMC2安装

(一)DMD编译器
安装DMD,官网DMD,找到自己系统对应的安装版本,以centos为例:
wget http://downloads.dlang.org/releases/2.x/2.094.2/dmd.2.094.2.linux.tar.xz      #https://dlang.org/dmd-linux.html ubuntu
xz -d dmd.2.094.2.linux.tar.xz ; tar -xvf dmd.2.094.2.linux.tar 
echo  'export PATH=path/dmd2/linux/bin64/:$PATH' >> ~/.bashrc ;source ~/.bashrc #添加环境变量到~/.bashrc 


(二)GNU Scientific library
安装GSL,下载链接GSL
wget http://mirror.rit.edu/gnu/gsl/gsl-2.6.tar.gz    #https://www.gnu.org/software/gsl/
tar -pzxvf gsl-2.6.tar.gz
cd gsl-2.6
./configure --prefix=path/gsl-2.6; make ; make install  #path自定义


(三)msmc2安装
wget https://github.com/stschiff/msmc2/archive/master.zip    
unzip msmc2-master.zip ; cd msmc2-master
编辑Makefile文件,修改以下内容:
GSLDIR=path/gsl-2.6/lib                                 #path为gsl位置
make #安装完毕,执行程序在./build/release/msmc2


(四)msmctools工具包
wget https://github.com/stschiff/msmc-tools


(五)snpable下载
#snpable用于构建genome的mask
http://lh3lh3.users.sourceforge.net/snpable.shtml
wget http://lh3lh3.users.sourceforge.net/download/seqbility-20091110.tar.bz2
#构建映射mask文件还需要makeMappabilityMask.py
tar jxfv seqbility-20091110.tar.bz2;cd seqbility-20091110;make

2.输入文件的准备
(一)

通过bam文件得到mask文件及vcf文件

计算染色体的平均的depth

#仅用了chr1,可以通过for循环分别求各个染色体的mask及vcf
samtools depth -r chr1  | awk '{sum += $3} END {print sum / NR}'
#生成mask文件
#./bamCaller.py来自前面下载的msmctools文件夹
bcftools mpileup -C 50 -u -r  -f   --threads 16 | bcftools call -c -V indels --threads 16 | ./bamCaller.py   | bgzip -c > 

(二)

参考基因组的映射mask文件

https://github.com/jessicarick/msmc2_scripts 里边的run_snpable2.sh为原始代码

#!/bin/sh
# script usage:
# sbatch run_snpable2.sh
snpable_script_path=/xxx/xxx/seqbility-20091110 # snpable scripts所在位置
PATH=$PATH:$snpable_script_path
prefix=/xxx/xxx/genome-mask/prefix                #文件前缀
k=35                                              #k值,35
GENOME=xx/xx/xx.fa                                #基因组位置fasta
OUTDIR=/xxx/xxx/genome-mask/                      #文件输出位置
mkdir ${OUTDIR}/snpable
cd ${OUTDIR}/snpable
echo "Starting extraction of overlapping ${k}-mer subsequences"
splitfa $GENOME $k | split -l 20000000
cat x* >> ${prefix}_split.$k
# if it can't find splitfa, try adding seqbility to the path using 'PATH=$PATH:/project/WagnerLab/jrick/msmc_Sept2017/snpable/scripts'
echo "Aligning ${k}-mer reads to the genome with BWA, then converting to sam file"
# the genome needs to be indexed prior to this step-- if it has not already been indexed, run:
if [ -f "${GENOME}.bwt" ]; then
       echo "$GENOME already indexed"
else 
       echo "indexing $GENOME"
       bwa index $GENOME
fi
echo "aligning reads to genome with BWA and converting to sam"
bwa aln -t 8 -R 1000000 -O 3 -E 3 ${GENOME} ${prefix}_split.${k} > ${prefix}_split.${k}.sai
bwa samse -f ${prefix}_split.${k}.sam $GENOME ${prefix}_split.${k}.sai ${prefix}_split.${k}
echo "reads aligned, starting to generate rawMask"
gen_raw_mask.pl ${prefix}_split.${k}.sam > ${prefix}_rawMask.${k}.fa
echo "raw mask created as ${prefix}_rawMask.35.fa, now generating final mask with stringency r=50%"
gen_mask -l ${k} -r 0.5 ${prefix}_rawMask.${k}.fa > ${prefix}_mask.${k}.50.fa
echo "all done! final mask saved as ${prefix}_mask.${k}.50.fa"

上一步得到的结果需要进一步通过makeMappabilityMask.py的到最终mask文件。

#makeMappabilityMask.py修改26行为上一步得到的mask文件  "/xxx/xxx/genome-mask/prefix_mask.35.50.fa"
#修改30行为输出文件,{}为拆分染色体,不用改动            "/xxx/xxx/genome-mask/mask/chr{}.mask.bed.gz"
#运行./makeMappabilityMask.py得到参考基因组的映射mask文件
python2.7 ./makeMappabilityMask.py

3.MSMC2运行
在运行MSMC2之前需要确定好样本,当MSMC2分析超过16个单倍型(8个二倍体样本)时运行速度会很慢,建议尝试运行8个单倍型,即两个种群各2个样本,共四个样本,计算比较快。
官方实例中的样本在https://share.eva.mpg.de/index.php/s/swpTM4mNK7gG7nw中。
一、
生成msmc文件输入格式
例子中仅使用了chr1,实际需要通过for循环把所有常染色体都跑一遍

for i in {1…20};do generate_multihetsep.py --chr i.multihetsep.txt ;done

generate_multihetsep.py来自前面下载的msmctools文件夹

INDIR=/path/to/VCF/and/mask/files   #mask文件位置
OUTDIR=/path/to/output_files        #输出位置
MAPDIR=/path/to/mappability/mask    #genome映射mask文件位置
generate_multihetsep.py --chr 1 \
    --mask $INDIR/NA12878.chr1.mask.bed.gz --mask $INDIR/NA12891.chr1.mask.bed.gz --mask $INDIR/NA12892.chr1.mask.bed.gz \
    --mask $INDIR/NA19240.chr1.mask.bed.gz --mask $INDIR/NA19238.chr1.mask.bed.gz --mask $INDIR/NA19239.chr1.mask.bed.gz \
    --mask $MAPDIR/hs37d5_chr1.mask.bed --trio 0,1,2 --trio 3,4,5 \
    $INDIR/NA12878.chr1.vcf.gz $INDIR/NA12891.chr1.vcf.gz $INDIR/NA12892.chr1.vcf.gz \
    $INDIR/NA19240.chr1.vcf.gz $INDIR/NA19238.chr1.vcf.gz $INDIR/NA19239.chr1.vcf.gz \
    > $OUTDIR/EUR_AFR.chr1.multihetsep.txt
#几个mask对应几个vcf,最后加一个可映射mask
#--trio 表示样本亲缘关系的顺序,child,father,mother,不知道可以不设置,该方法可以根据子代对亲本进行定向。
#--trio设置以后,仅保留父母的4个单倍型,舍弃子代单倍型,如--trio 0,1,2仅保留样本1和2的4个单倍型,舍弃样本0的两个单倍型

#当然也可以亲缘未知,直接处理
for i in {1..19}
do
  generate_multihetsep.py --chr $i \
    --mask sample1.chr$i.mask.bed.gz --mask sample2.chr$i.mask.bed.gz \
    --mask sample3.chr$i.mask.bed.gz --mask sample4.chr$i.mask.bed.gz \
    --mask xxx_chr$i.mask.bed \
    sample1.chr$i.vcf.gz sample2.chr$i.vcf.gz \
    sample3.chr$i.vcf.gz sample4.chr$i.vcf.gz \
    > input_chr$i.txt
done

二、
有效种群大小的计算
例子,仅用了chr1,当你得到所有染色体的文件时,可以通过$INPUTDIR/EUR_AFR.chr*.multihetsep.txt 调用文件

msmc2 -t 6 -p 1*2+15*1+1*2 -o $OUTDIR/EUR.msmc2 -I 0,1,2,3 $INPUTDIR/EUR_AFR.chr1.multihetsep.txt
msmc2 -t 6 -p 1*2+15*1+1*2 -o $OUTDIR/AFR.msmc2 -I 4,5,6,7 $INPUTDIR/EUR_AFR.chr1.multihetsep.txt

#-t CPU数 
#-p 时间间隔 默认1*2+25*1+1*2+1*3,单个染色体则1*2+15*1+1*2,更好则1*2+50*1+1*2+1*3
#-I 为样本单倍型,一般设置相同种群的所有单倍型,如0,1,2,3为EUR种群的亲本的4个单倍型
#-i 迭代数

实际上multihetsep.txt文件中第四列就是各个样本的单倍型,根据-I和单倍型顺序选择种群。
三、

种群分离的计算

#step1
msmc2 -t 4 -I 0-4,0-5,0-6,0-7,1-4,1-5,1-6,1-7,2-4,2-5,2-6,2-7,3-4,3-5,3-6,3-7 -s -p 1*2+15*1+1*2 -o $OUTDIR/AFR_EUR.msmc2 $INPUTDIR/EUR_AFR.chr1.multihetsep.txt
#-p 时间间隔 默认1*2+25*1+1*2+1*3,单个染色体则1*2+15*1+1*2
#-I 设置每个组样本与另一个组样本单倍型两两计算
#-s 跳过具有不明确阶段的站点
#step2
#combineCrossCoal.py来自前面下载的msmctools文件夹
combineCrossCoal.py $DIR/EUR_AFR.msmc2.final.txt $DIR/EUR.msmc2.final.txt \
    $DIR/AFR.msmc2.final.txt > $DIR/EUR_AFR.combined.msmc2.final.txt
#需要两个群体有效种群大小文件和种群分离文件

四、绘图
需要知道mutation rate以及每一代的间隔多少,一般在其他人的文献中可以找到

#绘图
#有效种群大小
mu <- 1.25e-8
gen <- 30
afrDat<-read.table("results/AFR.msmc2.final.txt", header=TRUE)
eurDat<-read.table("results/EUR.msmc2.final.txt", header=TRUE)
plot(afrDat$left_time_boundary/mu*gen, (1/afrDat$lambda)/(2*mu), log="x",ylim=c(0,100000),
     type="n", xlab="Years ago", ylab="effective population size")
lines(afrDat$left_time_boundary/mu*gen, (1/afrDat$lambda)/(2*mu), type="s", col="red")
lines(eurDat$left_time_boundary/mu*gen, (1/eurDat$lambda)/(2*mu), type="s", col="blue")
legend("topright",legend=c("African", "European"), col=c("red", "blue"), lty=c(1,1))

#种群分离
mu <- 1.25e-8
gen <- 30
crossPopDat<-read.table("results/EUR_AFR.combined.msmc2.final.txt", header=TRUE)
plot(crossPopDat$left_time_boundary/mu*gen, 2 * crossPopDat$lambda_01 / (crossPopDat$lambda_00 + crossPopDat$lambda_11),
     xlim=c(1000,500000),ylim=c(0,1), type="n", xlab="Years ago", ylab="relative cross-coalescence rate")
lines(crossPopDat$left_time_boundary/mu*gen, 2 * crossPopDat$lambda_01 / (crossPopDat$lambda_00 + crossPopDat$lambda_11), type="s")
image.png

image.png

注意,MSMC2有效种群大小精确度有限,一边范围为距今1e4到1e6,种群分离一般观察relative cross-coalescence rate为0.5时的时间点。
实际上MSMC2还是无法运行大量样本,而对应的SMC++及stairway plot可以解决这个问题,之后我再说这几个软件。
参考:
https://github.com/stschiff/msmc2
https://github.com/stschiff/msmc-tools/blob/master/msmc-tutorial/guide.md
https://github.com/jessicarick/msmc2_scripts

你可能感兴趣的:(MSMC2进行历史有效种群大小计算)