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 <in.bam> | awk '{sum += $3} END {print sum / NR}'
#生成mask文件
#./bamCaller.py来自前面下载的msmctools文件夹
bcftools mpileup -C 50 -u -r <chr> -f <ref.fa> <bam> --threads 16 | bcftools call -c -V indels --threads 16 | ./bamCaller.py <mean_cov> <out_mask.bed.gz> | bgzip -c > <out.vcf.gz>

(二)

参考基因组的映射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 --mask xxx.mask.bed.gz xxx.vcf.gz >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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,335评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,895评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,766评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,918评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,042评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,169评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,219评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,976评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,393评论 1 304
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,711评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,876评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,562评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,193评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,903评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,142评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,699评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,764评论 2 351

推荐阅读更多精彩内容