Я пытаюсь проанализировать несколько тысяч последовательностей для сокращения двойных рестрикционных ферментов. Для этого примера предположим, что этими двумя ферментами являются 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
).
Я был бы признателен за любую помощь или указатели на то, как я могу закодировать это право. Благодарю.
Что такое ожидаемое поведение? –
Предполагается сообщить положение разреза, а также размер фрагмента разреза. Также отредактировал этот вопрос, чтобы уточнить. – berge2015
Что вы делаете с собственным кодом, зависит от вас. Но если вы просите бесплатную помощь, то довольно грубо выложить блок Perl, который не имеет отступов, чтобы сделать его доступным для чтения. – Borodin