前面经过三代数据结合二代数据的组装和polish,已经把基因组组装成了contigs的水平,下一步就是进一步提升到染色体水平。从实现的方式上来说有Bionano的光学图谱技术(作用是减少Scaffold数量,基因组纠错),Hi-C技术,遗传图谱以及依靠算法实现的基于近缘物种参考基因组的染色体水平组装(比如RagTag)。
对于一个没有遗传图谱,也没有近缘物种参考基因组的物种,考虑到光学图谱费用昂贵,一般最划算用的最多的是测一个Hi-C来进行基因组染色体级别组装。一些经典的Hi-C辅助组装的软件应运而生,比如LACHESIS
、3D-DNA
、YaHS
等等。这篇笔记主要记录下软件3D-DNA的
染色体挂载流程。
然而3D-DNA
不能直接处理Hi-C下机数据,因此总的流程是用juicer2
先处理Hi-C数据,再用3D-DNA
进行染色体挂载,最后用Juicebox Assembly Tools (JBAT)
进行手工纠错。流程参考自Baylor College of Medicine & Rice University Aiden团队Genome Assembly Cookbook,这几个软件也是出自他们团队。
juicer2
Juicer是一款非常经典的Hi-C数据处理软件,但是配置运行起来稍微有点麻烦,花了小半天时间踩坑记录一下。需要非常注意的一点,直接从github官网拉取的juicer仓库是juicer2,在release版本中有一个稳定版juicer1.6,两者的配置和产生的结果文件是不一样的!!!
秉着软件用新不用旧的原则,本篇笔记全程用的是juicer2
,如果有软件运行问题可以在3D Genomics - Google 网上论坛交流,或者在github官方提Issues(不建议)。
顺便提一下我使用Juicer2
过程中碰到的版本问题:
juicer2
配置的juicer_tools
版本要在2.0以上,否则会报错Exception in thread "main" java.lang.RuntimeException: Unknown command: statistics
,该报错会直接导致无法生成inter.txt
、inter_hists.m
、inter_30.txt
和inter_30_hists.m
文件,也就是Hi-C互作的统计数据和矩阵。juicer2
结果文件中不会自动产生merged_nodups.txt文件,该文件原本作为3D-DNA
的输入文件,在juicer2
中被同名的merged_nodups.bam
文件和merged*.txt
代替。如果想要merged_nodups.txt
文件,需要加上参数--assembly。
1. 下载和配置juice2
1 | # 拉取最新版本的juicer2仓库(这里用的github镜像,集群可能有dns污染无法直接访问github) |
本来想配置slurm跑的,因为塔大集群使用的是slurm作业调度系统。花了好大功夫配置环境发现运行SLURM/scripts
底下的juicer.sh
还需要配置CUDA,晕,学校的集群没有GPU(怨念 = =)……所以如果集群没有GPU的话就老老实实用CPU
文件夹下的juicer.sh
,按照CPU流程跑后面的程序,缺点是不能用集群提交多线程作业非常难受。
官方也是推荐小的Hi-C实验可以用CPU版本,如果数据量比较大,还是推荐带有GPU加速的集群(最好是SLURM)或者云端跑。如下是官方推荐的两种方式:
Running Juicer on a cluster · aidenlab/juicer Wiki (github.com)
ENCODE-DCC/hic-pipeline: HiC uniform processing pipeline (github.com)
juicer主目录下需要配置两个必需的文件夹reference
和restriction_sites
(第二个在juicer流程中非必须,但是做染色体挂载一定要)
1 | # juicer目录下创建参考基因组文件夹,放入参考基因组(复制或者软链接)和构建参考基因组索引文件(必需用bwa) |
官方的酶切参考基因组的脚本generate_site_positions.py
支持HindIII、DpnII、MboI、Sau3AI和Arima
4种限制性核酸内切酶,如果你Hi-C测序用的是其他酶,可以根据实际修改这个脚本中的字典类型数据patterns,根据实际情况加入键值对信息:
稍微解释一下官网给的awk 'BEGIN{OFS="\t"}{print $1, $NF}'
这个命令,这里awk的程序部分由两部分组成:
BEGIN{OFS="\t"}
:BEGIN块是在处理文件之前执行的代码块。在这里,它设置输出字段分隔符(OFS)为制表符(\t
)。这意味着输出的字段将使用制表符进行分隔。{print $1, $NF}
:这是awk的主要部分,它定义了要执行的操作。在这里,它打印每行的第一个字段$1和最后一个字段(NF)。通过使用逗号分隔它们,它们将以制表符分隔的形式打印出来。
genome.chrom.sizes
文件如下所示:
工作目录下必需配置一个文件夹fastq
,其中存放Hi-C的双端测序数据,命名格式参考juicer.sh
文件中的正则表达式*_R*.fastq*
。
1 | # 工作目录下创建存放hic测序数据的文件夹,我这里为了方便查看,工作目录就是juicer主目录,测序数据可以用软链接的形式存放 |
2. 运行juicer2
官网的juicer.sh
参数非常之多,我这里只展示一些关键的,其他用默认参数即可。1.x
版本可以参考Usage · aidenlab/juicer Wiki (github.com),2.0
版本具体可以用bash juicer.sh -h
查看,两个版本指令稍有不同。CPU版本和其他集群版本也稍有不同,以CPU中的2.0版本为例:
1 | Usage: juicer.sh [-g genomeID] [-d topDir] [-s site] |
因为我不是做三维基因组,Hi-C只测了一个样(主要用于辅助基因组组装,染色体挂载),比如做三维基因组就会有大量的Hi-C数据,juicer也支持多个结果的合并(使用mega.sh
),详细也可以参考上面的juicer Wiki。
上面的限速步骤主要是跑BWA,因为第一次跑juicer不知道要多久,就稍微申请多一点的核数(虽然集群没有GPU,但是CPU资源很充足平常没人用)。
1 | # 创建一个slurm作业 |
juicer.slurm
文件内容如下(再次提醒--assembly 参数非常重要):
1 | #!/bin/bash |
运行时间可以参考一下我这里220 Mb的参考基因组,Hi-C测序数据39G(双端测序,gz文件),实际上运行了13小时才出结果。
运行pipeline成功后会在日志中提示(-: Pipeline successfully completed (-:
3. 结果文件
CPU模式下会在工作目录创建aligned
和splits
文件夹:
- splits 文件夹存放整个pipeline的临时文件,跑完流程并且确认结果没问题后可以运行cleanup.sh或者直接删除(按照帮助文档的说法,–cleanup参数应该可以自动删除,我没有试过)
- aligned 文件夹存放运行结果
- 如果你是用集群模式跑的,比如SLURM,还会生成一个
debug
文件夹(CPU模式下用SLURM跑的没有该文件夹),可以查看各个步骤的error报告和output报告
aligned文件夹有以下结果文件:
我这里实际上是多了一些文件(实际上跑了两遍),因为一开始没有加上--assembly
参数,所以一直运行到出hic结果文件,而且没有merged_nodups.txt
。
我做染色体挂载只需要最后一个文件,第二次运行加了上面的参数,并且加上-S final
参数,这样就省去了前面比对和去重复的时间(90%以上的时间花在这里),一个小时可以重新跑完出结果。
顺便了解一下其他结果文件的用途:
- inter.hic / inter_30.hic: The .hic files for Hi-C contacts at MAPQ > 0 and at MAPQ >= 30, respectively
- merged_nodups.txt: The Hi-C contacts with duplicates removed. This file is also input to the assembly and diploid pipelines (后面跑3D-DNA的输入文件)
- inter.txt, inter_hists.m / inter_30.txt, inter_30_hists.m: The statistics and graphs files for Hi-C contacts at MAPQ > 0 and at MAPQ >= 30, respectively. These are also stored within the respective .hic files in the header. The .m files can be loaded into Matlab. The statistics and graphs are displayed under Dataset Metrics when loaded into Juicebox (可以后续导入juicer box)