生物信息学与算法转录组入门专题生物信息杂谈

Trinity软件的运行原理01

2018-05-26  本文已影响71人  飞翔的仔仔

通过阅读Trinity的源码,学习Trinity的运行过程以及使用的算法,写这篇博客的时候已经阅读Trinity的源码有一段时间了,但是觉得很多细节的地方还是理解不透彻,所以把能理解的部分先写出来,方便感兴趣的人一起学习


  1. 我们会对得到的contig根据长度进行过滤,去掉小于100bp的contig

inchworm.K25.L25.fa通过脚本过滤得到了inchworm.K25.L25.fa.min100

  1. 利用bowtie2将both.fa(所有的reads)比对到inchworm.K25.L25.fa.min100得到比对的bam文件

  2. 根据reads的比对结果和inchworm.K25.L25.fa得到初步聚类的contig文件iworm_scaffolds.txt

overlap的判断条件条件有两种情况:

  1. 通过GraphFromFasta将iworm_scaffolds.txt的结果进一步聚类得到iworm_cluster_welds_graph.txt

这里是根据overlap继续进行判断:这一步的输入文件为iworm_scaffolds.txt,线性的contig结果,both.fa文件。首先会读入iworm_scaffolds.txt存一个map,map的结构是key是读入的id,value是一个Pool类

  1. 利用BubbleUpClustering根据iworm_cluster_welds_graph.txt的结果得到聚类的contig文件

聚类本质是将有联系的contig放在一个pool也就是一个类里面进行输出,没有聚类的contig单独进行输出,得到一个fasta格式的文件。

如果我来做这一步可能会用比较笨的思路:就是从第一行开始与每一行分别求取交集,有交集就合并,没有就下一个循环,遍历完一遍之后再用新的集合再与剩下的元素进行一次遍历,如此重复一个集合与其他的集合都没有交集,就输出这个集合,然后从第二个集合开始重复进行相同的操作,直到最后一个集合。但是这样应该会耗费很多时间来进行遍历

  1. 利用CreateIwormFastaBundle将属于同一类的contig合并得到bundled_iworm_contigs.fasta

这一步比较简单,将属于一个类(pool)的序列用X连接在一起输出成一条序列

  1. 通过ReadsToTranscripts将both.fa比对到bundled_iworm_contigs.fasta得到readsToComponents.out同时进行排序

  2. 将分类的reads分别再运行一次Trinity,这一步是作者写了一个多线程的工具Parafly来运行,同时在对于每一类reads重新运行Trinity时会调用了Butterfly这个jar包,Butterfly这个jar包是利用德布鲁因图的算法来得到拼接完成的contig信息。最后将每一类的trinity结果进行合并得到最终的Trinity.fasta


  1. 读入iworm_scaffolds.txt 文件
  1. 读入contig序列文件

contig文件格式:

>a1

GTGCTGTTTGGTT

GTGCTGTTTGGT => [(a1,0)]

TGCTGTTTGGTT => [(a1,1)]

>a2

GTGCTGTTTGGTA

GTGCTGTTTGGT => [(a1,0),(a2,0)]

TGCTGTTTGGTA => [(a2,2)]

  1. 然后再遍历一遍contig序列,将contig打断成24kmer的长度

48bp序列的延伸方式如下


contig1:----------------`---------------`

                                   `--------------------`--------------- contig2

contig1:             `------------------`---------

                -----------`------------------`                contig2

contig1:------------`-------------------`

                              `--------------------`---------------   contig3

contig1:             `------------------`---------

                -----------`------------------`                contig3

contig2:------------`-------------------`

                              `--------------------`---------------   contig3

contig2:             `------------------`--------

                ----------`-------------------`                contig3


1 -> 6

2 -> 6

3 -> 6

4 -> 7

5 -> 7

6 -> 1 2 3 8

8 -> 6 7 9

7 -> 8 4 5

15 -> 16

16 -> 15

9 -> 8

  1. 首先读入文件,将文件存为一个向量 ,向量的元素为Pool类型,Pool的m_id为每一行的第一个元素

m_index的元素为 ->之后的元素。然后对这个向量进行排序,Pool的大小,由小到大进行排序。

1 -> 6

2 -> 6

3 -> 6

4 -> 7

5 -> 7

9 -> 8

15 -> 16

16 -> 15

8 -> 6 7 9

7 -> 8 4 5

6 -> 1 2 3 8

  1. 开始遍历这个向量:

pool_idx_to_containment[id].clear()

正常情况下会对向量元素进行两边遍历,保证聚类的结果是独立的

然后对聚类后的结果进行输出,属于一个类别的就输出,保证同一个类别的序列长度不小于200,对于没有聚类的序列单独作为一类进行输出,序列长度也不小于200


reads进行分类 * 首先将contig打断成kmer,k的长度为25,这个时候会储存kmer属于哪一条序列的角标,然后

上一篇 下一篇

猜你喜欢

热点阅读