2016-09-23 5 views
-1

Я пытаюсь проанализировать несколько тысяч последовательностей для сокращения двойных рестрикционных ферментов. Для этого примера предположим, что этими двумя ферментами являются EcoRI и MspI. Я использую для этого модули Bioperl (см. Код ниже) и может заставить его работать на отдельные ферменты. Просто два фермента, работающие в целом, дают либо странные результаты, либо не работают должным образом.Переваривание двойного рестрикционного фермента в Bioperl

#!/usr/bin/perl 

use strict; 
use Bio::Seq; 
use Bio::SeqIO; 
use Bio::Restriction::Analysis; 
use Bio::Restriction::EnzymeCollection; 
use List::Util qw(min max sum); 

my $usage = "perl $0 <in><out>"; 
my $in = shift or die $usage; 
my $out = shift or die $usage; 

my ($ra, $seq); 
my $enz_collection = Bio::Restriction::EnzymeCollection->new(); 
my (@ecorbp, @ecorsize, @mspbp, @mspsize); 

my $seq_in = Bio::SeqIO->new( 
          -format => 'fasta', 
          -file => $in, 
          ); 
open OUT, ">$out"; 
while ($seq = $seq_in -> next_seq) 
{ 
$ra = Bio::Restriction::Analysis->new(-seq=>$seq); 

#how many times does each enzyme cut 
my $EcoRIcuts = $ra->cuts_by_enzyme('EcoRI'); 
my $MspIcuts = $ra->cuts_by_enzyme('MspI'); 
my $bothcuts = $ra->cuts_by_enzyme('EcoRI', 'MspI'); 
#print $bothcuts."\n"; 

#doing something with bp 
@ecorbp = $ra->positions('EcoRI'); 
@mspbp = $ra->positions('MspI'); 
my $ecorbp_min = min(@ecorbp); 
my $ecorbp_max = max(@ecorbp); 
my $mspbp_min = min(@mspbp); 
my $mspbp_max = max(@mspbp); 
my $ecorbp_avg = sum(@ecorbp)/@ecorbp; 
my $mspbp_avg = sum(@mspbp)/@mspbp; 

#doing something with cut size/fragment 
@ecorsize = $ra->sizes('EcoRI'); 
@mspsize = $ra->sizes('MspI'); 
my $ecorsize_min = min(@ecorsize); 
my $ecorsize_max = max(@ecorsize); 
my $mspsize_min = min(@mspsize); 
my $mspsize_max = max(@mspsize); 
my $ecorsize_avg = sum(@ecorsize)/@ecorsize; 
my $mspsize_avg = sum(@mspsize)/@mspsize; 

my @bothsize = $ra->sizes('EcoRI','MspI'); 
my $bothsize_max = max (@bothsize); 
my $bothsize_min = min (@bothsize); 
print $bothsize_max,"\n"; 
print $bothsize_min,"\n"; 

#do similar thing with the cut positions; this part not written yet 
@bothbp = $ra->positions('EcoRI','MspI'); 

#print OUT "EcoRI cuts ",$seq -> display_id," $EcoRIcuts times with at minimum base position of $ecorbp_min, maximum base position of $ecorbp_max with average base position of $ecorbp_avg to give minimum frament size of $ecorsize_min bp, maximum fragment size of $ecorsize_max bp with average fragment size of $ecorsize_avg bp\n"; 
#print OUT "MspI cuts ",$seq -> display_id," $MspIcuts times with at minimum base position of $mspbp_min, maximum base position of $mspbp_max with average base position of $mspbp_avg to give minimum frament size of $mspsize_min bp, maximum fragment size of $mspsize_max bp with average fragment size of $mspsize_avg bp\n"; 
} 

close OUT; 

Проблема возникает, когда код достигает «bothsize» часть ... номера печати в десятичных знаков для какой-то странной причине.

Вот мой очень короткий входной файл, который я использую для тестирования кода:

>Seq1 
AAAAGAATTCAAAAAAAAGAAAACAATAAGTAAAAGACAGACCGGCAGAGAAAACTTACCCGAC 
>Seq2 
AAACGAGAATTCAAAAAATAGAAAACCGGAATAAGTAAAAGACAGGAATTCAGCAGCCGGAGAA 

код, как ожидается, сообщить о позиции, где оба фермента вырезать (подобно ecorbp, mspbp) & также фрагмент разреза размер (аналогично ecorsize и mspsize).

Я был бы признателен за любую помощь или указатели на то, как я могу закодировать это право. Благодарю.

+0

Что такое ожидаемое поведение? –

+0

Предполагается сообщить положение разреза, а также размер фрагмента разреза. Также отредактировал этот вопрос, чтобы уточнить. – berge2015

+0

Что вы делаете с собственным кодом, зависит от вас. Но если вы просите бесплатную помощь, то довольно грубо выложить блок Perl, который не имеет отступов, чтобы сделать его доступным для чтения. – Borodin

ответ

2

Предложен метод Bio::Restriction::Analysis объекта sizes не принимает несколько ферментов

Второй параметр «т.п.н. с точностью до 0,1 т.п.н.»

+1

@ber Взгляд [по коду] (https://metacpan.org/source/CJFIELDS/BioPerl-1.6.924/Bio/Restriction/Analysis.pm#L618) делает его еще более понятным. «MspI'' передается как второй аргумент. Это истинное значение, поэтому он немного переводит математику в ближайшее 0.1 kb, что бы это ни значило. Все, что вам нужно сделать, это дважды вызвать эту функцию. Для чтения нескольких простых строк кода не требуется знание домена. Но это помогает включить соответствующие знания домена в вопрос, узнать больше о инструментах, которые вы используете, может помочь вам лучше. Если бы ваша бензопила сломалась, вы бы сказали им, насколько велико дерево, не так ли? – simbabque