Perl 用色谱柱计数氨基酸序列

Perl 用色谱柱计数氨基酸序列,perl,hash,count,Perl,Hash,Count,我试图设计一个Perl脚本,以便在比较不同序列时找到同一列中的最高氨基酸计数 每个序列都已在其自己的行或字符串中找到 格式示例:序列1、2和3 KPKFYALDMFPYPSGAGLHVGHPEGYTATDIVARYKRMTGHN-----------VLHPMGW---DAFGLPAEQYA------IETGTHPSQTTVKN------------------VGRFREQLQSLGFSY-D-WDREVATCDA KPKCYILDMFPYPSGAGLHVGHPLGYTATDILSRFKR

我试图设计一个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);

这是对你需要什么的猜测。您只给出了两个序列作为示例数据,因此为每列选择“多数”是没有意义的。(在任何一点上,要么有两种相同的酸,计数为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";

理想情况下,一个程序应该完全不使用全局变量,但你在程序顶部声明了15个,它构成了你文章的大部分内容。不清楚你期望
@extract=“$column\n”
做什么,但它对你的注释所说的序列长度没有任何作用。你能解释一下你做得更好一点吗?我在看你用
$start
作为氨基酸起始列所说的话,但是你的行只有140列长。当你说你是在每个序列中发现的最高氨基酸时,你是把每行的字母加起来,还是把每列的字母加起来?你能给我们提供更多的数据吗?你期望得到什么,也许你为什么期望得到这些结果?@Borodin我试图把这个变量作为氨基酸字母的临时保管人,以便对它们进行计数,然后继续下一个。我必须提高我的整理技能,并尝试删除一些全局变量,谢谢@戴维德。对不起,我应该解释一下,这是我用来获取示例中的目标序列的代码的一部分。原始序列有我不想要的物种名称和其他数据,所以我删掉了它。我想一列一列地合计,当完成X序列的第一列(字母)时,应该转到下一列(列表中所有序列的列)。非常感谢。我计算的是列(相同的氨基酸位置),而不是同一行(序列)中的字母。@Gyler:请告诉我们您的问题是否已经解决。我正在玩代码,看看它是否符合我的想法。为了测试,我在文件中添加了第三个序列。我会通过“keys$max_count”得到每列氨基酸的最大计数吗?至于连字符,我想计算它们,和氨基酸一样。再次感谢你的时间和帮助。无法让它工作:(如果你对我能做什么有任何想法,请告诉我,更新一下原始问题,感谢你迄今为止的帮助!
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