通过柱计数氨基酸序列

时间:2014-02-25 23:09:31

标签: perl hash count

我正在尝试设计一个Perl脚本,以便在比较不同序列时找到同一列中找到的最高氨基酸数。

每个序列都已在自己的行或字符串中找到。

格式示例:序列1,2和3.

KPKFYALDMFPYPSGAGLHVGHPEGYTATDIVARYKRMTGHN-----------VLHPMGW---DAFGLPAEQYA------IETGTHPSQTTVKN------------------VGRFREQLQSLGFSY-D-WDREVATCDA
KPKCYILDMFPYPSGAGLHVGHPLGYTATDILSRFKRMKGFN-----------VLHPMGW---DAFGLPAEQYA------IETGTHPKITTERN------------------IERFRTQLKSLGFSY-D-WDREISTTEP
KPKCYILDMFPYPSGAGLHVGHPLGYTATDILSRFKRMQGFN-----------VLHPMGW---DAFGLPA

EQYA ------ IQTGTHPKFTTAQN ------------------ IDRFRTQLKSLGFSY-d-WDREISTTEP

我希望输出是每个序列中发现的最高氨基酸K及其出现的次数(对于第一个氨基酸),然后进入下一个氨基酸。序列(P)直到$end amount

到目前为止,这是我写的。任何有关如何使其更清晰或更有效的帮助都是可以做到的。

我在计算部分时遇到问题,并且在下一次计数时移到下一列。

#! /usr/bin/perl -w
use strict;
use warnings;

#use diagnostics;

open(S, "Leu Mito Align.txt") || die "cannot open FASTA file to read: $!";
open(OUTPUT, ">output.txt");

my @lines = <S>;
my $lines;
my @seq;
my $seq;
my $line;
my $count;
my $start = 140;    # amino acid column start
my $end   = 150;    # amino acid column end
my $final = 150;    # end of count
my $column;
my @extract;
my $extract;
my $aa = 0;         # get the first amino acid, should increment by one until it reaches end of string, which should be $ae.
my $ae = 1;
my @count;

foreach $seq (@seq) {    #original sequence
  $seq =~ s/^>.*]//g;
  $column = substr($seq, $start, $end); # selects amino acid sequence from $start to $end
  @extract = "$column\n";               # Sequence length

  #print OUTPUT @extract;

  for $extract (@extract) {

    #print OUTPUT $extract;
    $count = substr($extract, $aa, $ae); # Count amino acids individually one   by one until it reaches ae.

    #print $count;
    @count = "$count\n";
    @count = (split /\s/, $count);

这是我陷入困境的部分。我尝试创建哈希以计算不同的字母,但没有运气。

while (@count) {
  foreach $AA (@count) {
    $AA++ foreach ($_);
  }
}

1 个答案:

答案 0 :(得分:0)

这是对你需要的猜测。您只给出了两个序列作为样本数据,因此为每列选择“多数”是没有意义的。 (在任何一点上,都有两个相同的酸,其数量为2,或两个不同的酸,每个的计数为1.因此,永远不会有多数。)。另外,你没有说明如何处理序列字符串中的连字符。

该程序期望输入文件的路径作为命令行上的参数。

use strict;
use warnings;

my @counts;

while (<>) {
  chomp;
  my @acids = split //;
  for my $i (0 .. $#acids) {
    my $acid = $acids[$i];
    ++$counts[$i]{$acid};
  }
}

my $max_seq = join '', map {
  my ($chosen_acid, $max_count);
  while (my ($acid, $count) = each %$_) {
    unless ($max_count and $max_count < $count) {
      $chosen_acid = $acid;
      $max_count = $count;
    }
  }
  $chosen_acid;
} @counts;

print $max_seq, "\n";

<强>输出

KPKCYILDMFPYPSGAGLHVGHPEGYTATDIVARYKRMKGHN-----------VLHPMGW---DAFGLPAEQYA------IETGTHPKITTVKN------------------VERFREQLKSLGFSY-D-WDREVATCEP