使用nanopolish从牛津纳米孔测序Reads中分析基因组甲基化

程序安装部署

目前,由于github仓库被墙,单纯按照官网安装说明会存在各种问题。而使用conda安装,则只能安装 v0.4.0版本,而并非最新的v0.13.3版本。所以这个软件若能过成功安装,还是需要各种办法绕过墙。我已经在gitee上克隆了nanopolish及其依赖的各种包的镜像,程序编译依照如下脚本进行:

# 从我复制的gitee镜像拷贝代码
git clone https://gitee.com/wangshun1121/nanopolish.git 

# 克隆nanopolish需要的各种库,并回滚到指定版本
cd ./nanopolish
# fast5 @ 18d6e34
rm -rf fast5
git clone https://gitee.com/huangyaolong/fast5.git 
cd fast5
git reset --hard 18d6e346cadb9990ff8287e54447f90e76dd79bc  # fast5 的 18d6e34 commit
cd ..
# htslib @ 3dc96c5
rm -rf htslib
git clone https://gitee.com/mirrors_samtools/htslib.git
cd htslib
git reset --hard 3dc96c5699a26c5a46e3ccca4092b3801e1874f4  # htslib 的 3dc96c5 commit
cd ..
# minimap2 @ d2de282
rm -rf minimap2
git clone https://gitee.com/W-zhennan/minimap2.git
cd minimap2
git reset --hard d2de282d21e9b621dc5f6cef293cb60b93cc553d  # minimap2 的 d2de282 commit
cd ..
# slow5lib @ 3680e17
rm -rf slow5lib
git clone https://gitee.com/wangshun1121/slow5lib.git
cd slow5lib
git reset --hard 3680e17360366c8cbffb66eb1e07426756665454  # slow5lib 的 3680e17 commit
cd ..
# hdf5-1.8.14 这个文件下载可能比较慢
wget -c https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.8/hdf5-1.8.14/src/hdf5-1.8.14.tar.gz
# eigen-3.3.7
wget -c https://gitlab.com/libeigen/eigen/-/archive/3.3.7/eigen-3.3.7.tar.bz2

# 编译,编译完成会在根目录出现可执行文件nanopolish
make

# ont-vbz-hdf-plugin,这个不部署,后面运行 nanopolish call-methylation时会报错
# 按照 https://github.com/nanoporetech/vbz_compression/issues/5#issuecomment-562476721说的办
# 拷贝这个plugin,以及环境变量永久化,可能需要高权限
wget -c https://github.com/nanoporetech/vbz_compression/releases/download/v1.0.1/ont-vbz-hdf-plugin-1.0.1-Linux-x86_64.tar.gz
tar xzvf ont-vbz-hdf-plugin-1.0.1-Linux-x86_64.tar.gz
cp -r ./ont-vbz-hdf-plugin-1.0.1-Linux/usr/local/hdf5/  /usr/local/.
echo "export HDF5_PLUGIN_PATH=/usr/local/hdf5/lib/plugin" >> /etc/profile # 永久化修改环境变量

这样,经过我的测试,后面一系列的分析能够参照官方甲基化分析说明正常走下去。

这里还有一点要说明:最新版本nanopolish是根据纳米孔R9版本建库试剂盒构建的模型,若测序使用的早期版本的试剂盒,则需要按官方说明下载早期版本的工具。截止到本文发布的时间,已经推出了R10试剂盒,但仅仅提供试用,尚未大规模商用。

甲基化分析

首先,待分析的数据存放于./BMK220118-AT448-01N0001中,数据目录如下:

./BMK220118-AT448-01N0001
├── cell_1
│   ├── fast5_0.fast5
│   ├── fast5_1.fast5
│   ├── fast5_2.fast5
│   ├── fast5_3.fast5
...
│   ├── fast5_19.fast5
│   ├── fastq_0.fastq
│   ├── fastq_1.fastq
│   ├── fastq_2.fastq
│   ├── fastq_3.fastq
...
│   ├── fastq_19.fastq
├── cell_2
│   ├── fast5_0.fast5
│   ├── fast5_1.fast5
│   ├── fast5_2.fast5
│   ├── fast5_3.fast5
...
│   ├── fast5_18.fast5
│   ├── fastq_0.fastq
│   ├── fastq_1.fastq
│   ├── fastq_2.fastq
│   ├── fastq_3.fastq
...
│   ├── fastq_18.fastq
├── cell_3
│   ├── fast5_0.fast5
│   ├── fast5_1.fast5
│   ├── fast5_2.fast5
│   ├── fast5_3.fast5
│   ├── fast5_4.fast5
│   ├── fast5_5.fast5
│   ├── fast5_6.fast5
│   ├── fastq_0.fastq
│   ├── fastq_1.fastq
│   ├── fastq_2.fastq
│   ├── fastq_3.fastq
│   ├── fastq_4.fastq
│   ├── fastq_5.fastq
│   ├── fastq_6.fastq
├── cell_4
│   ├── fast5_0.fast5
│   ├── fastq_0.fastq
│   └── sequencing_summary_0.txt
└── N0001.md5
    ├── cell1
    │   └── data.md5
    ├── cell2
    │   └── data.md5
    ├── cell3
    │   └── data.md5
    └── cell4

上述文件来自测序商。校验完文件,将所有fastq文件合并压缩:

cat ./BMK220118-AT448-01N0001/cell_*/*.fastq |gzip -c > map.N0001_clean.fq.gz

压缩后的fastq文件只有5G多,但配套的fast5文件则超过100G。

然后,使用 nanopolish index 将fastq文件与fast5文件进行关联:

./nanopolish/nanopolish index -v \
  -d ./BMK220118-AT448-01N0001/cell_1 \
  -d ./BMK220118-AT448-01N0001/cell_2 \
  -d ./BMK220118-AT448-01N0001/cell_3 \ 
  -d ./BMK220118-AT448-01N0001/cell_4 \
  map.N0001_clean.fq.gz

nanopolish index-d参数可以给出多个。

于此同时,使用minimap2对序列进行比对,并使用sambamba按比对位置排序:

# 直接使用nanopolish目录中编译好的minimap2进行比对
./nanopolish/minimap2/minimap2 -t 48 -a -x map-ont ref.fa  map.N0001_clean.fq.gz | \
  sambamba view -t 4 -S -f bam /dev/stdin | \
  sambamba sort -o output.sorted.bam -t 4 /dev/stdin

比对完成,产生的结果为output.sorted.bam,且对应的index也已经生成。

之后,使用nanopolish分析其中一小段的区间的甲基化:

# 这里再强调一遍,务必保证环境变量 HDF5_PLUGIN_PATH 对应的 hdf5 plugin设置正确!
# export HDF5_PLUGIN_PATH=/usr/local/hdf5/lib/plugin
./nanopolish/nanopolish call-methylation -t 48 \
  -r map.N0001_clean.fq.gz \
  -b output.sorted.bam \ 
  -g ref.fa \ 
  -w "1:500000-1000000" > methylation_calls.tsv

上面的-w参数,并未出现在软件自带的帮助信息中,只在官方说明的mannual里面才出现。

methylation_calls.tsv为每一条Reads上的甲基化位点,最后使用nanopolish附属的脚本calculate_methylation_frequency.py得到单个位点的甲基化水平:

./nanopolish/scripts/calculate_methylation_frequency.py methylation_calls.tsv > methylation_frequency.tsv

分析流程的封装与改进

试跑完,我发现流程有下面一些问题需要改进:

  • 1、整个基因组nanopolish call-methylation直接跑下来,速度非常慢,而且后续calculate_methylation_frequency.py必须将Reads上单碱基甲基化结果methylation_calls.tsv全部吞进去,才能够产生单个位点的甲基化水平。后者单线程运行,速度非常慢;
  • 2、单碱基甲基化水平,首先按Reads在基因组的位置排序,而并非甲基化位点在基因组的位置排序的,导致接下来数据压缩后无法直接读取特定位置的甲基化中间结果;
  • 3、目前,nanopolish call-methylation 提供了4种甲基化模式,分别解释如下:

cpg

5'-----CG-----3'
3'-----GC-----5'

gpc

5'-----GC-----3'
3'-----CG-----5'

dam

5'-----GATC-----3'
3'-----CTAG-----5'

dcm

5'-----CC[A/T]GG-----3'
3'-----GG[T/A]CC-----5'

若针对医学,则一个cpg模式已经足够。但分析植物,现有的几种模式仍不够;

  • 4、calculate_methylation_frequency.py分析单个位点甲基化,并没有区分正负链,所以得到的位点甲基化水平并非单个位点的结果,而是相邻反向互补的GC碱基甲基化水平按Reads覆盖程度的加权平均值,以cpg模式为例,若正链甲基化水平代表C碱基,则负链则是接下来G碱基匹配的那个C碱基的甲基化水平,这两者有必要区分开来。

根据工具自身的情况,我尝试进行如下改造。首先,尝试压缩methylation_frequency.tsv并构建索引:

awk -F "\t" '{print $1"\t"$3"\t"$4"\t"$5"\t"$11"\t"$2"\t"$6"\t"$7"\t"$8"\t"$9"\t"$10}' methylation_frequency.tsv|head -n 1>compressed.methcall.txt
awk -F "\t" '{print $1"\t"$3"\t"$4"\t"$5"\t"$11"\t"$2"\t"$6"\t"$7"\t"$8"\t"$9"\t"$10}' methylation_frequency.tsv| \
  grep -v start | \
  bedtools sort -i - >> compressed.methcall.txt
bgzip  compressed.methcall.txt
tabix -p bed -S 1 compressed.methcall.txt.gz

上述操作,将正负链信息Strands放在第6列,这样文件结构会跟bed格式非常相似。同时保留表头,则即使行列顺序改变,仍然不影响calculate_methylation_frequency.py后续分析。最后,当调整后的文件用bgzip压缩,就能够成功构建index,方便提取指定位置的位点甲基化信息。

然后,若拆分正负链分别得到单个位点甲基化水平,则用下面的命令:

# 正链,使用调整列顺序压缩后的数据,正负链信息在第六列
gunzip -c compressed.methcall.txt.gz| \
  awk -F "\t" '{if($6!="-"){print}}' | \
  ./nanopolish/scripts/calculate_methylation_frequency.py -s /dev/stdin >Plus.txt
# 负链
gunzip -c compressed.methcall.txt.gz| \
  awk -F "\t" '{if($6!="+"){print}}' | \
  ./nanopolish/scripts/calculate_methylation_frequency.py -s /dev/stdin >Minus.txt

经过上述验证尝试,我编写了一份封装脚本Nanopolish_Methyl.pl,对nanopolish分析甲基化的过程进行了封装。只需将脚本Nanopolish_Methyl.pl放在nanopolish源文件的目录下,按照操作说明安装相应perl包,再按说明依次操作即可。

纳米孔数据分析碱基修饰

纳米孔数据可以完成多种碱基修饰,不仅仅是甲基化。而目前,使用nanopolish,并不能够将所有5mC甲基化的情况都能够分析。但是,甲基化碱基修饰分析的潜力仍有待挖掘,分析工具层出不穷。接下来简要介绍几篇文献:

Liu, Y., Rosikiewicz, W., Pan, Z. et al. DNA methylation-calling tools for Oxford Nanopore sequencing: a survey and human epigenome-wide evaluation. Genome Biol 22, 295 (2021). https://doi.org/10.1186/s13059-021-02510-z
7种针对纳米孔人类CpG甲基化分析的工具测评

Liu, Q., Fang, L., Yu, G. et al. Detection of DNA base modifications by deep recurrent neural network on Oxford Nanopore sequencing data. Nat Commun 10, 2449 (2019). https://doi.org/10.1038/s41467-019-10168-2
机器学习方法分析甲基化流程DeepSignal,王凯、肖传乐教授通讯作者

Ni, P., Huang, N., Nie, F. et al. Genome-wide detection of cytosine methylations in plant from Nanopore data using deep learning. Nat Commun 12, 5976 (2021). https://doi.org/10.1038/s41467-021-26278-9
针对纳米孔植物甲基化分析流程DeepSignal-plant,使用机器学习方法,可以分析CpG,CHG,CHH三种甲基化模式(对植物学很重要),肖传乐教授为通讯作者之一

Leger, A., Amaral, P.P., Pandolfini, L. et al. RNA modifications detection by comparative Nanopore direct RNA sequencing. Nat Commun 12, 7198 (2021). https://doi.org/10.1038/s41467-021-27393-3
使用纳米孔分析RNA 的 m6A修饰

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

推荐阅读更多精彩内容