使用Rfam和Infernal注释基因组的非编码RNA

180

1. 全过程

官网:https://rfam.org/
官网给的Rfam/Infernal基因组注释教程: https://docs.rfam.org/en/latest/genome-annotation.html
简书文章:https://www.jianshu.com/p/ca3f382c1941

conda create -n rna -y
conda activate rna
conda install -y infernal
cd /mnt/caigui/41_sk_genome_129M/36_infernal

# 我当前下载的是Rfam14.9(2022年11月版本,4108 families,点开https://rfam.org/就可以看到最新版本号了)
wget ftp://ftp.ebi.ac.uk/pub/databases/Rfam/CURRENT/Rfam.cm.gz
gunzip Rfam.cm.gz
wget ftp://ftp.ebi.ac.uk/pub/databases/Rfam/CURRENT/Rfam.clanin

# 建立索引文件
cmpress Rfam.cm

# 获得基因组大小
# method1
python ~/scripts/genomesize.py xiaocuiyun_genome_20211217.fa 
# method2
locate esl-seqstat
/home/caigui/miniconda3/envs/SubPhaser/bin/esl-seqstat xiaocuiyun_genome_20211217.fa
# method3
conda install -y easel
esl-seqstat xiaocuiyun_genome_20211217.fa
# 获得基因组大小后,计算Z值 = 132374076*2/1000000=264.748152

# 运行
nohup cmscan -Z 264.748152 --cut_ga --rfam --nohmmonly --tblout sk-genome.tblout --fmt 2 --clanin Rfam.clanin Rfam.cm xiaocuiyun_genome_20211217.fa > sk-genome.cmscan &

# 关于这个Z值如何计算,有两种不同的说法。Rfam的方法就是以上方法。但是infernal的教程中还要乘以一个模型数量(模型数量获得方法:cat Rfam.cm | grep 'NAME'|sort|wc -l)。
# 为了解决这个问题,我写了封邮件,如下
# rfam-help@ebi.ac.uk
# Hello,
# I hope this message finds you well. I have a question regarding the calculation of Z-values on the webpage "https://docs.rfam.org/en/latest/genome-annotation.html". On page 39 of "http://eddylab.org/infernal/Userguide.pdf", it is mentioned that when calculating Z-values using cmscan, it should be multiplied by "the number of models in the target CM database". I am a bit confused about this and would appreciate it if you could clarify how the Z-value is actually calculated.
# Thank you very much for your help. Have a great day!

# 获得两个结果文件
$ ls sk-genome.*
sk-genome.cmscan sk-genome.tblout

# 从tblout文中删除得分较低的重叠
grep -v " = " sk-genome.tblout > sk-genome.deoverlapped.tblout

# Rfam/Infernal可以预测所有类型的RNA
# 以下是另外几种用于搜索特定类型RNA的工具
# tRNAscan-SE for tRNAs
# RNAMMER for rRNA
# snoscan for snoRNAs
# SRPscan for SRP RNA

# 提取需要保存的信息
awk 'BEGIN{OFS="\t";}{if(FNR==1) print "target_name\taccession\tquery_name\tquery_start\tquery_end\tstrand\tscore\tEvalue"; if(FNR>2 && $20!="=" && $0!~/^#/) print $2,$3,$4,$10,$11,$12,$17,$18; }' sk-genome.deoverlapped.tblout > sk-genome.deoverlapped.clean.tblout

# 获得注释,https://rfam.org/search,Entry type,勾选全部类型,Submit,划到页面最下面,保存unformatted list格式
vim rfam.annot.txt #粘贴以上部分

# 提取注释文件第三列信息
cat rfam.annot.txt | awk 'BEGIN {FS=OFS="\t"}{split($3,x,";");class=x[2];print $1,$2,$3,class}' > rfam.annot.modif.txt

# 统计小RNA种类
awk 'BEGIN{OFS=FS="\t"} ARGIND==1{a[$2]=$4;} ARGIND==2{type=a[$1];if(type=="") type="Others";count[type]+=1;} END{for(type in count) print type, count[type];}' rfam.annot.modif.txt sk-genome.deoverlapped.clean.tblout
#  riboswitch	2
#  ribozyme	3
#  tRNA	599
#  Others	10
#  miRNA	14
#  rRNA	364
#  sRNA	1
#  snRNA	336

# 统计小RNA长度
awk 'BEGIN{OFS=FS="\t"}ARGIND==1{a[$2]=$4;}ARGIND==2{type=a[$1]; if(type=="") type="Others"; if($6=="-")len[type]+=$4-$5+1;if($6=="+")len[type]+=$5-$4+1}END{for(type in len) print type, len[type];}' rfam.annot.modif.txt sk-genome.deoverlapped.clean.tblout
#  riboswitch	204
#  Others	1694
#  ribozyme	712
#  tRNA	44286
#  miRNA	1571
#  rRNA	215788
#  sRNA	379
#  snRNA	46451

# 附上以上命令的注释,出自chatGPT
awk 'BEGIN{OFS=FS="\t"} # 设置输入输出字段分隔符为tab
ARGIND==1{a[$2]=$4;} # 处理第一个文件,将第二列作为关键字,第四列作为值存储在一个名为a的数组中
ARGIND==2{ # 处理第二个文件
    type=a[$1]; # 根据第一列的值从a数组中获取类型
    if(type=="") type="Others"; # 如果类型为空,则将其设置为Others
    if($6=="-")len[type]+=$4-$5+1; # 如果第6列的值为负号,则使用第四列的值减去第五列的值加1来更新该类型的长度
    if($6=="+")len[type]+=$5-$4+1 # 如果第6列的值为正号,则使用第五列的值减去第四列的值加1来更新该类型的长度
}
END{ # 处理完两个文件后,进行最终的输出
    for(type in len) # 遍历len数组中的每个类型
        print type, len[type]; # 输出类型和对应的长度
}' rfam.annot.modif.txt sk-genome.deoverlapped.clean.tblout

2. 修改Z值重新预测一下,比较一下什么结果

万一人家不回邮件呢,咱再试试。理论上来说,这个Z值好像只影响E值的计算结果吧?

# cd /mnt/caigui/41_sk_genome_129M/36_infernal/Z_big
cat Rfam.cm | grep 'NAME'|sort|wc -l
# 8216
# 132374076*2*8216/1000000 = 2175171
nohup cmscan -Z 2175171 --cut_ga --rfam --nohmmonly --tblout sk-genome.tblout --fmt 2 --clanin Rfam.clanin Rfam.cm xiaocuiyun_genome_20211217.fa > sk-genome.cmscan &

# 经过比较,确实只有E值改变了,而检测出来的基因种类数量都完全没有变。
# 再比较一下,基因E值,在Z值乘了8216倍后,变大了很多。但这个玩意是越小表明显著性越高。
# 随便算了算,Z值变大的倍数也基本上就是变大了8216倍左右。

3. 试一试对拟南芥进行注释

因为注释出来的ncRNA数量好像不是很多,所以对拟南芥试试看,使用big Z。

nohup cmscan -Z 1966380 --cut_ga --rfam --nohmmonly --tblout at-genome.tblout --fmt 2 --clanin Rfam.clanin Rfam.cm Athaliana_447_TAIR10.fa > at-genome.cmscan &

# 统计小RNA种类
#  riboswitch	1
#  ribozyme	2
#  tRNA	658
#  Others	42
#  miRNA	398
#  antisense	1
#  rRNA	561
#  snRNA	654
#  sRNA	9

# 统计小RNA长度
#  riboswitch	128
#  ribozyme	500
#  tRNA	49842
#  Others	6132
#  miRNA	61678
#  antisense	187
#  rRNA	85627
#  snRNA	71522
#  sRNA	1788

4. 比较一下SK和AT注释出来的关于miRNA的内容

# 小翠云miRNA个数
grep -E "MIR|mir-" sk-genome.deoverlapped.clean.tblout | wc -l
# 14个
# 小翠云miRNA种类
grep -E "MIR|mir-"  sk-genome.deoverlapped.clean.tblout | awk '{print $1}' | sort | uniq| wc -l
# 5种

# 拟南芥miRNA个数
grep -E "MIR|mir-"  at-genome.deoverlapped.clean.tblout| wc -l
# 398个
# 拟南芥miRNA种类
grep -E "MIR|mir-"  at-genome.deoverlapped.clean.tblout | awk '{print $1}' | sort | uniq| wc -l
# 74种

在Rfam中大概看了下,小翠云有的这几个miRNA确实在很多植物中都是特别保守的,但是种类和个数确实是很少啊。

5. 邮件后续

简单来说,Rfam的维护者Blake表示也对这个问题感到迷惑,并帮我咨询了Infernal的作者Eric,Eric表示就按Rfam文档中的来就好,不用乘以模型数量。
附上Eric的详细解释如下:

这么说,这是全世界第一份关于这个问题的正确解释了?