题目
用perl语言测DNA序列,全部分给你!
首先先说说,DNA的碱基由ATCG四种碱基组成,假如有一段碱基序列,里面有未知的碱基,我们把未知的碱基命名为N.
假如现在有一段碱基序列:ATCGNATCGNAATTCGGNTTGGANATTCGGATGCCNTATCUACGTATNGNTCGATGCNGT
这一段包含着N(也就是未知碱基)的序列我们称之为scaffod
现在我们对scafford上的碱基一个一个地看,逢遇到N就将它剔除,这时,我们会得到很多段小序列,如:ATCG ATCG AATTCGG ……,这些子序列我们称之为contig
现在我们按碱基数的由大到小排列contig
从最长的一列一直往较小一列递加下去,直到加到某一列后,碱基数的总和是所有contig碱基数总和的50%及以上,那一列我们称之为N50
同理,若加到某一列,碱基数的总和是所有contig碱基数总和的90%及以上,那一列我们称之为N90
现在要请用perl语言设计一个算法,测出N50、N90、最长contig的碱基数、最短contig的碱基数、所有contig连起来后的(G+C)/(A+T+G+C)的比例
首先先说说,DNA的碱基由ATCG四种碱基组成,假如有一段碱基序列,里面有未知的碱基,我们把未知的碱基命名为N.
假如现在有一段碱基序列:ATCGNATCGNAATTCGGNTTGGANATTCGGATGCCNTATCUACGTATNGNTCGATGCNGT
这一段包含着N(也就是未知碱基)的序列我们称之为scaffod
现在我们对scafford上的碱基一个一个地看,逢遇到N就将它剔除,这时,我们会得到很多段小序列,如:ATCG ATCG AATTCGG ……,这些子序列我们称之为contig
现在我们按碱基数的由大到小排列contig
从最长的一列一直往较小一列递加下去,直到加到某一列后,碱基数的总和是所有contig碱基数总和的50%及以上,那一列我们称之为N50
同理,若加到某一列,碱基数的总和是所有contig碱基数总和的90%及以上,那一列我们称之为N90
现在要请用perl语言设计一个算法,测出N50、N90、最长contig的碱基数、最短contig的碱基数、所有contig连起来后的(G+C)/(A+T+G+C)的比例
提问时间:2021-01-16
答案
#!usr/bin/perl -w
use strict;
use 5.010;
#打开DNA序列文件句柄
open FILE,"contig"
my %hash;
#读入序列
my $DNA = ;
#按照"N"来拆分序列,并且剔除"N"
my @list = split(/N/,$DNA);
#总长度
my $whole_len = 0;
#最长和最短
my $max = rindex $list[0]."$","$";;
my $min = rindex $list[0]."$","$";;
foreach(@list){
#取得长度
my $len = rindex $_."$","$";
if($max < $len){
$max = $len;
}
if($min > $len){
$min = $len;
}
# 长度=>contig
$hash{$len} = $_;
$whole_len += $len;
}
#输出最长contig的碱基数和最短contig的碱基数
say "最长contig的碱基数:$max ";
say "最短contig的碱基数:$min ";
#求 N50 和 N90
my $links;
my $temp_len;
foreach my $key(reverse sort keys %hash){
$links .= $hash{$key};
$temp_len += $key;
if($temp_len > $whole_len/2){
say "N50是 :$links ";
}
elsif($temp_len > $whole_len*9/10){
say "N90是 :$links ";
}
}
#求(G+C)/(A+T+G+C)的比例
my @list_all = split(//,$DNA);
my ($num_A,$num_T,$num_G,$num_C);
foreach(@list_all){
if($_ eq "A"){
$num_A++;
}
if($_ eq "T"){
$num_T++;
}
if($_ eq "G"){
$num_G++;
}
if($_ eq "C"){
$num_C++;
}
}
my $a = ($num_G+$num_C)/($num_A+$num_T+$num_G+$num_C);
say "(G+C)/(A+T+G+C) = $a";
算法已经测试过了,没啥问题.你需要把DNA序列存在 DNA.txt里面就可以了.然后我只是想帮帮你而已,分数又不能吃饭.
use strict;
use 5.010;
#打开DNA序列文件句柄
open FILE,"contig"
my %hash;
#读入序列
my $DNA = ;
#按照"N"来拆分序列,并且剔除"N"
my @list = split(/N/,$DNA);
#总长度
my $whole_len = 0;
#最长和最短
my $max = rindex $list[0]."$","$";;
my $min = rindex $list[0]."$","$";;
foreach(@list){
#取得长度
my $len = rindex $_."$","$";
if($max < $len){
$max = $len;
}
if($min > $len){
$min = $len;
}
# 长度=>contig
$hash{$len} = $_;
$whole_len += $len;
}
#输出最长contig的碱基数和最短contig的碱基数
say "最长contig的碱基数:$max ";
say "最短contig的碱基数:$min ";
#求 N50 和 N90
my $links;
my $temp_len;
foreach my $key(reverse sort keys %hash){
$links .= $hash{$key};
$temp_len += $key;
if($temp_len > $whole_len/2){
say "N50是 :$links ";
}
elsif($temp_len > $whole_len*9/10){
say "N90是 :$links ";
}
}
#求(G+C)/(A+T+G+C)的比例
my @list_all = split(//,$DNA);
my ($num_A,$num_T,$num_G,$num_C);
foreach(@list_all){
if($_ eq "A"){
$num_A++;
}
if($_ eq "T"){
$num_T++;
}
if($_ eq "G"){
$num_G++;
}
if($_ eq "C"){
$num_C++;
}
}
my $a = ($num_G+$num_C)/($num_A+$num_T+$num_G+$num_C);
say "(G+C)/(A+T+G+C) = $a";
算法已经测试过了,没啥问题.你需要把DNA序列存在 DNA.txt里面就可以了.然后我只是想帮帮你而已,分数又不能吃饭.
举一反三
我想写一篇关于奥巴马的演讲的文章,写哪一篇好呢?为什么好
奥巴马演讲不用看稿子.为什么中国领导演讲要看?
想找英语初三上学期的首字母填空练习……
英语翻译
1,人们染上烟瘾,最终因吸烟使自己丧命.
最新试题
- 1sinx/2的导数为什么等于1/2cosx/2
- 2Could you tell me____?----Of course.This way,please.A.which is the way to the restroom
- 3黄河为什么叫母亲河( 50字以内)
- 4养禽专业户共养鸡、鸭、鹅2500只,鸡占52%,鸭占30%,鹅占18%,鸡有( )只,鸭有( )只,鹅有( )只.
- 5长方体ABCD-A1B1C1D1中,AB=BC=3,AA1=4,异面直线B1D和BC1所成角的余弦值
- 6英语翻译
- 7某厂第一季度用去水费m元,用去水费比电费的2倍少40元,第二季度电费节约了百分之15,水费多支出了百分之5,问该厂第二季度水电费与第一季度相比是超支还是节约,超支或节约多少?
- 8How to Succeed in the Future Career 150字左右,谢谢哈(英语作文,速求)
- 9用于图书馆和阅览室的名句格言?
- 10(1+2x)³的展开式中,x²的系数等于
热门考点
- 1描写暴风雨的词语
- 2He has the a_ to do the hard work.
- 3强调句中强调主语是it was i that met him yesterday,为什么是用i而不用me?
- 4怎样画一个标准的五角星
- 5向钙离子加入氨水可以产生沉淀吗?
- 6我爱我的家乡千岛湖作文
- 7已知有理数p,q,r满足下列三式pq/p+q=5/6 qr/q+r=4/3 rp/r+p=3/2试求p,q,r的解
- 8一个有理数在数轴上对应的点为A,将A点向左移动3个单位长度,再向左移动2个单位长度,得到点B,点B所对应的数和点A对应的数的绝对值相等,求点A的对应的数是什么?
- 9East China前要加定冠词the吗?
- 10海豚擅长游泳,而且惹人喜爱 用英语怎么说