安装使用smc++

smc++又称为smcpp,
从官方github下载文件
https://github.com/popgenmethods/smcpp
git clone https://github.com/popgenmethods/smcpp.git
注意不要下载右侧发布的版本,而是下载项目,这才是最新版。
下载后进入路径,

make -j6
make install

安装完成后,运行smc++ --help
没有报错,但是运行第一步时,报错找不到libgsl.so.0文件
手动从https://mirror.ibcp.fr/pub/gnu/gsl/gsl-latest.tar.gz下载gsl,
在本地执行编译,

./configure --prefix=/share/home/chai/soft/gsl
make -j6
make install

把下面三行文本添加到~/.bashrc文件里。

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/share/home/chai/soft/gsl/lib
export CFLAGS="-I/share/home/chai/soft/gsl/include"
export LDFLAGS="-L/share/home/chai/soft/gsl/lib"

重新进入终端后,查看/share/home/chai/soft/gsl/lib目录里是否有libgsl.so.0文件

find /share/home/chai/soft/gsl/lib -name "libgsl.so.0"
#如果没有上述文件,则运行下面的命令即可
cd /share/home/chai/soft/gsl/lib
ln -s libgsl.so libgsl.so.0

运行smc++ estimate命令时,出现错误“AttributeError: module 'typing' has no attribute '_ClassVar'”

解决方法是:pip uninstall dataclasses -y运行之后,就恢复正常。

运行smc++包括下面的步骤:
注意:输入的vcf是需要使用bgzip压缩的gz文件
getvcfchr.py 的脚本的内容如下:

#!/usr/bin/env python3
#输入 vcf文件和输出文件名
#输出的是vcf的chr的列表

import sys
import gzip

def get_unique_chromosomes_from_vcf(filename):
    chromosomes = set()
    opener = gzip.open if filename.endswith('.gz') else open

    with opener(filename, 'rt') as file:
        for line in file:
            if line.startswith('#'):
                continue
            else:
                chromosome = line.split('\t')[0]
                chromosomes.add(chromosome)
    return sorted(chromosomes)

def write_chromosomes_to_file(chromosomes, output_file):
    with open(output_file, "w") as file:
        for chromosome in chromosomes:
            file.write(f"{chromosome}\n")

if __name__ == "__main__":
    if len(sys.argv) != 3:
        print("python3 getvcfchr.py inputvcf.gz outputtxt")
    else:
        vcf_filename = sys.argv[1]
        output_filename = sys.argv[2]
        unique_chromosomes = get_unique_chromosomes_from_vcf(vcf_filename)
        write_chromosomes_to_file(unique_chromosomes, output_filename)
        print("Chromosomes written to file:", output_filename)

输入文件

  • input.vcf (snp位点的vcf文件,vcf文件必须有头部,即包含了染色体名称和长度信息的行)
    输入的vcf的文件的头部必须包含类似下面的内容的行,smcpp需要从中读取染色体名称和长度,没有这些内容会报错。
    ##contig=<ID=Chr01,assembly=ref.fa,length=12346530>

  • Groupinfo.txt (样本的分群信息)

准备工作

inputvcf="youinput.snp.vcf"
#获取chr的列表
python3 getvcfchr.py ${inputvcf} chr.list
#使用bgzip压缩为gz格式
bgzip ${inputvcf} -c >${inputvcf}.gz
#构建索引
tabix ${inputvcf}.gz

开始第一步分析,获取每条染色体的smc.gz文件

这里的chr.list就是一列染色体的编号的文件,就是vcf文件里的染色体号。
此处示例是样本分为2个群,G1是第一个群的名称,后面的sample11,sample12,sample41,sampleM是属于这个群的样本的名称(一定要和vcf文件里的一致)

如果有多个群,也是一样的方法,依次增加即可。注意输出的文件夹G1这种,一定要自己手动新建。如果目录不存在输出的文件夹,smc++不会自动新建。

mkdir G1
mkdir G2
cat chr.list|while read line;
do
    smc++ vcf2smc ${inputvcf}.gz ./G1/$line.smc.gz $line G1:sample11,sample12,sample41,sampleM
done

cat chr.list|while read line;
do
    smc++ vcf2smc ${inputvcf}.gz ./G2/$line.smc.gz $line G2:sample1,sample2,sample4,sampleN
done

运行后会输出结果分别在G1和G2两个文件夹内,如果你的染色体名称是chr1这种格式,G1内会有chr1.smc.gz,chr2.smc.gz这种文件.G2内也是一样。

第2步 使用smc++分析计算(需要使用较多的cpu数量)

普通版

smc++ estimate -o G1 6.9e-09 G1/*.smc.gz --cores 48

默认情况下只需要
-o 指定输出目录
mu 每一代每一碱基对的突变频率
--cores 指定使用的cpu数量

进阶版

smc++ estimate --spline cubic --knots 15 --timepoints 1000 1000000  --cores 48  -o G1 6.9e-09 G1/*.smc.gz

–spline 线条类型 cubic为平滑曲线,
–knots 节点,就是绘图曲线的点数
–timepoints 时间范围,单位为多少代,如1000 1000000 为1000代到1000000代
第2步运行完成后,会在G1目录输出一个文件model.final.json.
运行的时候可能会报错RuntimeError: erroneous average coalescence time.出现这种情况可能是因为你的group内的遗传距离太近了,修改你的mu值,可能会解决这个问题。

第3步,可视化

普通版
smc++ plot plot.G1.pdf G1/*.final.json
输出文件为plot.G1.pdf
进阶版
smc++ plot plot.pdf *.final.json -g 6 --ylim 0 100000000 -c
-c --csv 输出绘图文件,利用该文件在R中绘图(也许可以画折线图)
-g 代数,如人为25,鼠为1 ,牛为6或5
–ylim Y轴范围
–xlim X轴范围

合并计算亚群的分化时间(一次只能比较2个群之间的信息)

mkdir data
cd data
ls ../G1/*.smc.gz|while read line;do ln -s ${line} G1$(basename ${line}); done
ls ../G2/*.smc.gz|while read line;do ln -s ${line} G2$(basename ${line}); done
cd ../
smc++ split -o split/ G1/model.final.json G2/model.final.json data/*.smc.gz
smc++ plot G1.G2.pdf split/model.final.json

一次绘制3个或多个群的信息

#加入分为3个群,分别单独完成运算,生成model.final.json文件
cp G1/model.final.json G1.model.final.json
cp G2/model.final.json G2.model.final.json
cp G3/model.final.json G3.model.final.json
smc++ plot all.pdf *model.final.json

这样就可以一次绘制多个的结果到一张图上

smcpp的教程可以参考

msmc2的教程
msmc-tools/msmc-tutorial/guide.md ·STSCHIFF/MSMC-tools ·GitHub

可以提供基因组的mask文件

ref_genome="~/Gh_meta/ref.genome.fa"
# https://lh3lh3.users.sourceforge.net/snpable.shtml
~/soft/msmc2/seqbility-20091110/splitfa ${ref_genome} 35 > ref.fq 
bwa index -a bwtsw ${ref_genome}
bwa aln -R 1000000 -O 3 -E 3 -t 32 ${ref_genome} ref.fq | bwa samse ${ref_genome} - ref.fq > ref.sam
~/soft/msmc2/seqbility-20091110/gen_raw_mask.pl ref.sam > ref.sam.mask
~/soft/msmc2/seqbility-20091110/gen_mask -l 35 -r 0.5 ref.sam.mask > ref.sam.mask.fa
#makeMappabilityMask.py这个是python2的脚本,原始是msmc2提供的,此处是我修改了支持自定义输入和输出文件
makeMappabilityMask.py ref.sam.mask.fa ref.{}.mask.bed.gz
rm -rf ref.sam
rm -rf ref.fq
rm -rf ref.sam.mask 
#输出的mask结果文件是
#ref.{}.mask.bed.gz

以上的分析步骤已经打包成流程runsmcpp,有问题直接提issue。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容