一、Getting Started
1. Sequence correction
安装软件后,medaka可以使用其默认设置运行medaka_consensus
。该程序使用samtools
和minimap2
,如果medaka是使用from-source方法安装的,那么这些将出现在medaka环境中,否则需要用户提供。
source ${MEDAKA} # i.e. medaka/venv/bin/activate
NPROC=$(nproc)
BASECALLS=basecalls.fa
DRAFT=draft_assm/assm_final.fa
OUTDIR=medaka_consensus
medaka_consensus -i ${BASECALLS} -d ${DRAFT} -o ${OUTDIR} -t ${NPROC} -m r941_min_fast_g330
当medaka_consensus
运行完成后,consensus将保存到${OUTDIR}/consensus.fasta
中.
Warning
为了获得最佳结果,根据使用的basecaller,指定正确的模型-m
是很重要的。允许的值可以通过运行medaka tools list_models
找到。
Medaka模型的命名
i) the pore type,
ii) the sequencing device (MinION or PromethION),
iii) the basecaller variant,
iv) the basecaller version:
{pore}_{device}_{caller variant}_{caller version}
例如,模型r941_min_fast_g303
i) R9.4.1 flowcells
ii) 测序设备MinION
iii) 使用fast Guppy basecaller
iv) basecaller 版本3.0.3
模型r941_prom_hac_g303
i) R9.4.1 flowcells
ii) 测序设备PromethION
iii) 高精度basecaller (Guppy配置文件中称为“hac”)
iv) basecaller 版本3.0.3
如果使用的Guppy版本没有完全对应的medaka模型,则应选择最高版本等于或小于Guppy版本的medaka模型。
2. 提高并行性
medaka_consensus
程序适用于简单的数据集,但对于运行大型数据集可能不是最佳选择。可以通过独立运行medaka_consensus
的组件步骤,实现更高级别的并行性。该程序执行三项tasks:
- reads比对到基因组(通过
mini_align
,它是minimap2
上的一个包装) - 在assembly 区域运行consensus算法(
medaka consensus
,注意不要下划线!) - 对第二步产生的结果聚合。创建consensus sequences (
medaka stitch
)
这三个步骤是分离的,可以独立运行。在大多数情况下,步骤2是瓶颈,可以简单地并行化。medaka consensus
可以提供一个--regions
参数,该参数将限制其在步骤1中输出的.bam
文件中的特定组装基因组序列。因此,可以同时为多个组装基因组序列运行单个作业。在最后一步中,medaka stitch
可以将步骤2输出的一个或多个.hdf
文件作为输入。
# align reads to assembly
mini_align \
-i basecalls.fasta \
-r assembly.fasta \
-P -m \
-p calls_to_draft.bam \
-t <threads>
# run lots of jobs like this, change model as appropriate
mkdir results
medaka consensus calls_to_draft.bam results/contigs1-4.hdf \
--model r941_min_fast_g303 --batch 200 --threads 8 \
--region contig1 contig2 contig3 contig4
...
# wait for jobs, then collate results
medaka stitch results/*.hdf polished.assembly.fasta
不建议为medaka consensus
指定一个大于8的--threads
值,因为超过这个值计算效率很差。还请注意,medaka consensus
可能会使用相当于<threads> + 4
的资源,因为另外4个线程用于读取和准备输入数据。
二、Benchmarks
三、Walkthrough
下面展示了如何根据从R9.4 flowcells和ligation sequencing试剂盒获得的测序数据训练和使用一种简单形式的 consensus 模型。
下面是一个简单的演示过程。它并不代表 best-practices 或state-of-the-art workflow。为了能很好的训练出适用性更广的模型,需要准备更大的数据集。Medaka的标准模型是用katuali训练的.
获取数据和软件
下载ONT的basecalls的训练数据:
WALKTHROUGH=${PWD}/medaka_walkthrough
mkdir -p ${WALKTHROUGH} && cd ${WALKTHROUGH}
wget https://s3-eu-west-1.amazonaws.com/ont-research/medaka_walkthrough_no_reads.tar.gz
tar -xvf medaka_walkthrough_no_reads.tar.gz
DATA=${PWD}/data
提取的文件还包含在以下过程中创建的所有中间输出文件。只需将必需的子文件夹从${DATA}
目录复制到${WALKTHROUGH}
目录,就可以跳过任何步骤。
The necessary software can be sourced using:
cd ${WALKTHROUGH}
git clone https://github.com/nanoporetech/pomoxis --recursive
git clone https://github.com/nanoporetech/medaka
# While it is possible to install pomoxis and medaka into the same
# virtual environment, we will install each package into its own
# environment for simplicity. For more details see the readme for
# each of the packages.
cd pomoxis && make install && cd ..
cd medaka && make install && cd ..
POMOXIS=${WALKTHROUGH}/pomoxis/venv/bin/activate
MEDAKA=${WALKTHROUGH}/medaka/venv/bin/activate
Creating a Draft Assembly
基于pomoxis
,使用miniasm和racon 生成draft assembly,可以从提供的basecalls生成草案程序集。或者,在这一步可以使用canu 。
cd ${WALKTHROUGH}
NPROC=$(nproc)
BASECALLS=data/basecalls.fa
source ${POMOXIS}
mini_assemble -i ${BASECALLS} -o draft_assm -p assm -t ${NPROC}
这将生成draft_assm/assm_final.fa
.
mini_assemble
脚本有两个有用的选项,此处未使用:
- 指定
-c
将对reads 运行porechop去除测序接头; - 指定
-e 10
将在组装之前对前10%长的reads执行error correction(类似于canu的策略);
这两个步骤都可以在牺牲速度的前提下,提高装配质量。
可以检查assembled contigs 的数量和长度
DRAFT=draft_assm/assm_final.fa
awk '{if(/>/){n=$1}else{print n " " length($0)}}' ${DRAFT}
预期输出是contig长为4,703,280 bp(utg00001c)。
Polishing a Consensus
在执行完Creating a Draft Assembly的所有步骤之后,可以使用medaka
的默认模型运行以下命令来生成consensus 。使用从大肠杆菌、酿酒酵母和智人样本中获得的数据对该模型进行训练。
cd ${WALKTHROUGH}
source ${MEDAKA}
CONSENSUS=consensus
DRAFT=draft_assm/assm_final.fa
medaka_consensus -i ${BASECALLS} -d ${DRAFT} -o ${CONSENSUS} -t ${NPROC}
要使用另一个模型polish an assembly,请使用-m
选项指定模型的文件路径。
可使用pomoxis的assess_assembly
计算Alignment statistics :
cd ${WALKTHROUGH}
source ${POMOXIS}
TRUTH=${DATA}/truth.fasta
DRAFT2TRUTH=draft_to_truth
CONSENSUS2TRUTH=${CONSENSUS}_to_truth
echo "Draft assembly"
assess_assembly -i ${DRAFT} -r ${TRUTH} -p ${DRAFT2TRUTH} -t ${NPROC}
echo "Medaka consensus"
assess_assembly -i ${CONSENSUS}/consensus.fasta -r ${TRUTH} -p ${CONSENSUS2TRUTH} -t ${NPROC}
应观察到错误率从0.367%下降到0.070%。
Training a Consensus Network
为了训练一个bespoke network,首先执行包括创建上面的Creating a Draft Assembly的所有步骤。consensus network的最终目的是预测从 basecalls到draft的truth sequence。这需要理解basecalls如何与draft 对齐,以及如何编辑draft 以获得truth。draft充当了basecalls和 truth之间的共同参照系。
basecalls和truth序列与draft align。对于后者,这是分块(chunks)执行的。
cd ${WALKTHROUGH}
DRAFT=draft_assm/assm_final.fa
TRUTH=${DATA}/truth.fasta
source ${POMOXIS}
CHUNKSIZE=100000
CALLS2DRAFT=calls2draft
TRUTH2DRAFT=truth2draft
mini_align -P -m -r ${DRAFT} -i ${BASECALLS} -t ${NPROC} -p ${CALLS2DRAFT}
mini_align -c ${CHUNKSIZE} -P -m -r ${DRAFT} -i ${TRUTH} -t ${NPROC} -p ${TRUTH2DRAFT}
这些raw alignments必须转换为features输入到神经网络。为了减少训练期间的任何IO瓶颈,可以使用 -\\-batch_size
选项将训练数据成批写入HDF5
文件。选项-\\-read_fraction
用于随机subsample reads,当使用模型进行预测时,其效果是使生成的模型more robust to variations in pileup depth 。
cd ${WALKTHROUGH}
source ${MEDAKA}
REFNAME=utg000001c
TRAINEND=3762624
TRAINFEATURES=train_features.hdf
BATCHSIZE=100
medaka features ${CALLS2DRAFT}.bam ${TRAINFEATURES} --truth ${TRUTH2DRAFT}.bam --threads ${NPROC} --region ${REFNAME}:-${TRAINEND} --batch_size ${BATCHSIZE} --chunk_len 1000 --chunk_ovlp 0
现在一切就绪,可以通过medaka train
训练consensus网络:
cd ${WALKTHROUGH}
source ${MEDAKA}
TRAINNAME=training
medaka train ${TRAINFEATURES} --train_name ${TRAINNAME} --epochs 10
根据可用的计算资源,此步骤可能需要一些时间。在训练过程中,定期检查模型,以便在训练中断时可以很容易地恢复训练。在训练结束时,我们有一些输出模型,尤其包括:
-
model.best.hdf5
: 在训练集中具有最佳精度的模型 -
model.best.val.hdf5
: 在验证集上具有最佳精度的模型
要使用模型,请运行medaka_consensus
,使用-m
选项指定模型的完整绝对路径:
cd ${WALKTHROUGH}
source ${MEDAKA}
CONSENSUS=consensus_trained
MODEL=${PWD}/${TRAINNAME}/model.best.val.hdf5
medaka_consensus -i ${BASECALLS} -d ${DRAFT} -o ${CONSENSUS} -t ${NPROC} -m ${MODEL}
Training with multipe data types
Medaka支持创建推理网络,处理不同来源的数据,例如两个不同的纳米孔。通过在输入.bam
文件中使用alignment标记来启用。
为了训练一个可以处理多个数据类型的模型,在medaka feature
步骤之前,对所有的数据类型都遵循相同的操作。在此之前,合并.bam
文件,同时向文件添加DT
字符串标记。例如,要组合R9和R10孔隙的数据:
samtools view r9.bam | awk 'BEGIN{OFS="\t"}{print $0, "DT:Z:r9"}' > r9.sam
samtools view r10.bam | awk 'BEGIN{OFS="\t"}{print $0, "DT:Z:r10"}' > r10.sam
samtools view -H r9.bam | cat - r9.sam r10.sam | samtools view -bS | samtools sort > all_reads.bam
samtools index all_reads.bam
只需要对medaka features
附加一个参数,就可以对组合数据类型训练模型:
medaka features all_reads.bam ... --feature_encoder_args dtypes=r9,r10
为了使用多个数据类型训练的模型来创建consensus序列,medaka consensus
的输入.bam
文件应该将`DT标记适当地添加到所有reads中。如果不将此标记添加到输入文件中,多个数据类型训练的模型将无法起作用。
Automated training pipeline
有了 katuali,现在可以用一个命令从fast5s文件夹开始训练medaka模型:
katuali medaka_train_replicates --keep-going
执行上面的操作将会
- basecall all multiple runs of data,
- align所有basecall与reference序列
- 在reference序列和深度上创建basecalls的subsampled sets
- 将这些basecalls组装成draft assemblies
- 为所有assemblies创建medaka training features
- 在多个重复中训练一个medaka
- 根据测试数据评估模型。
四、Origin of the draft sequence
Much has been discussed in the popular press on the nature and origin of the expected draft sequence for medaka
. Here we give some background of previous workflow recommendations by exploring how medaka works and what this may imply for how it should be used.
Note
建议在运行medaka
之前至少运行一轮racon
。racon
的进一步应用可能是徒劳的。
1. Medaka’s Algorithm
到目前为止,所有的medaka
发行版都在很大程度上利用了一个对草图序列进行read堆积的思想,为神经网络创建输入数据。medaka
的训练方法是创建这样的堆积,并通过将参考序列与相同的草图序列对齐,用真正的base (或 gap)对每列进行注释。
在机器学习领域,一个相当普遍的概念是将模型泛化为用于训练的集合之外的数据,或者是概念上相似的数据,或者是具有特征的新形式。下面的讨论重点介绍了medaka
的输入数据可以变得与模型训练时相似或明显不同的方式。
Aligners
在alignment 过程,创建草稿序列的read堆积。medaka
性能的第一个关注点是(至少在概念上,如果不是实际的话)结果可能对用于align reads的aligner敏感。此外,对任何一个aligner使用的alignment 参数可能有一个敏感度。
medaka_consensus
,使用的aligner 与medaka
模型训练期间使用的aligner 相同,即minimap2。然而,medaka consensus
将把所有创建的alignment文件.bam
作为输入。
这种对aligner结果的敏感性很大程度上源于gaps是如何计算和记录在alignment中的:具有不同参数化的不同aligner可能导致堆积中不同的gaps结构。这将导致神经网络的输入不同,可能是网络不期望的输入。举个例子,想象一个机器学习算法,训练它从照片中识别不同的苹果品种。当看到一张梨的照片时,这个算法要做什么?它肯定不会给使用这个系统的人一个有意义的答案。medaka
的情况可能不像苹果和梨那样严重,尽管关于什么是有效输入的概念仍然存在。
Basecallers
这并不是简单地选择aligner。当然,选择basecaller是一个考虑因素:不同的basecaller将产生具有不同error profiles特征的call(相对于真正序列)。同样,这将影响神经网络输入的性质,并可能导致 basecallers之间缺乏泛化。正是因为这个原因,medaka
保守地为各种basecaller和basecaller模型提供了模型。
The draft sequence
也许更微妙的是draft input sequence的影响。draft sequences errors的可变性,例如由使用不同组装方法或程序引起的误差,可能导致不同的神经网络输入。关键点在于,如果草图和reads之间的替换、插入和删除的相对速率与在训练过程中呈现给算法的速率不同,那么性能可能会降低。
Sequencing depth
read堆的结构也受测序深度的影响。这在alignment 查看器(如IGV)中并不十分明显,它们倾向于在视图中squeeze-out insertions。Consider the case where an insertion occurs in one read with respect to the draft sequence or to other reads.。目前在medaka中的实现使用单独的简基创建了一个额外的pileup列。在更高的测序深度,出现更多的来自随机插入事件的插入列:在较高的测序深度,堆积层相对于truth逐渐被延伸。这种影响在用于训练medaka
模型的技术中得到了明显的缓解。
Discussion
正是出于这些和类似的考虑,以前关于如何产生草图序列的建议有些严格。这些建议是基于medaka
模型训练的具体方式,预期将产生看起来像苹果而不是梨的神经网络输入!这些建议本质上是悲观的,在向medaka
展示一个轻微擦伤的苹果时,推断错误似乎很小。
在twitter conversation中,Devin sounde提供了一个有用的例子,他在使用medaka之前,测试了运行racon不同次数的效果。结果是得到的准确度没有变化。迭代racon过程是否实际产生了不同的结果?当然,如果draft在迭代过程中没有演变,那么medaka
的输出也不会有任何变化。
Using the scripts for assembly benchmark from @nanopore (https://t.co/ezulj7RFN2) I also calculated consensus Q-scores. For this example, I achieved > Q35 pic.twitter.com/XLPdvUFZYr
— Devin Drown (@devindrown) August 7, 2019
需要注意的一点是,对于比Devin使用过的旧的basecaller,assembler 输出的质量较低,随着racon
的后续应用,草图质量将得到改善。随着最新的basecallers提高草图的准确度可以使上述问题变得不那么敏感;medaka
现在可能对草图的精确性的变化不那么敏感了
How should I create my draft sequence
鉴于上述讨论,问题仍然存在,如何组装草图序列以实现运行medaka
后的最佳结果?如前所述,先前的建议是根据medaka
模型如何训练而提出的。越来越多的经验证据表明,medaka
对草图输入的性质并不过分敏感。Devin的数据确实显示出对总体质量水平仍有一定的依赖性。需要对这个例子进行更多的调试,但总体效果可能是racon
的单个应用比没有racon
的情况更好的原因:草图质量的提高导致medaka
的有效覆盖率,因为更多的reads与改进的草图 align 。应当强调的是,总体质量与前面讨论的草案性质和error profiles之间的概念存在差异。两个草图可以有非常相似的总体质量,但有非常不同的错误概况(error profiles)。
有一种已知的情况是,有可能对草图序列进行过度润色(over-polish):
Why 4x, have seen good evidence >1 racon corrupts repeats in assembly, especially of diploids. Examples for canu of correctly resolved BACs: 0=74%, 1 = 77%, 2=70%, 3=63%. For miniasm: 0= 21%, 1=60%, 2=52%. Identity does go up but very slightly. I'd vote for 1 round.
— Sergey Koren (@sergekoren) August 6, 2019
其中一个原因是,因为overlap错误的repeat拷贝。reads可以被计算;racon
(或 medaka
)的迭代应用可能导致这些重复的平均值,而不是保持它们的不同序列。
Recommendations
很难推荐一个single best-practice workflow来获得所有数据集的最佳结果。但是,仍然建议在向medaka提供数据集之前至少运行一次racon。这样做的主要效果是无论使用的那款assembler 进行的组装,都标准化草图的error profile。随着basecall质量和assembler 输出质量的提高,当质量差异和error profiles 之间的区别变得模糊时,这个规范化步骤可能变得多余。
在训练medaka
期间,与racon
一起使用非默认参数值。上述使用的参数,对reads和草图之间的indel 频率具有相关性。因此,建议在使用 medaka
之前将其与racon一起使用:
racon -m 8 -x -6 -g -8 -w 500 ...
在最近的basecallers,来源于这一方法的影响还没有进行过探讨,很可能medaka
对这些数值的变化不太敏感。
Future developments
一个悬而未决的问题是如何完全消除medaka结果对draft sequence的依赖性,至少在某种程度上,所需的只是一个合理准确的 draft。目前正在探索从计算中完全删除草图以及按 face value检查read数据的方法。此外,更充分地利用assemblers输出的方法正在开发中,以避免一些更微妙的问题。作为一种单独的、更简单的可能性,用户可能希望根据他们选择的assembler 的输出来训练medaka
模型。
https://github.com/nanoporetech/medaka
https://nanoporetech.github.io/medaka/installation.html