【问题标题】:Finding Base Overlap Counts and Internal Gap in Two Strings查找两个字符串中的基本重叠计数和内部间隙
【发布时间】:2014-01-14 07:24:00
【问题描述】:

我有这两个长度相等的字符串,我需要比较它们。 我想找到重叠基数(。)和内部间隙(*)。下面是例子:

------ACTAAAAATACAAAAA--TTAGCCAGGCGTGGTGGCAC
-----TACTAAAAATACAAAAAAATTAGCCAGGTGTGGTGG---
      ................**.................

重叠数 = 33。 内部间隙数 = 2。

我没有问题找到重叠的数量。但我有问题 寻找内部差距。以下是我拥有的当前代码。它非常慢。 原则上,我需要计算数百万个这样的对。

#!/usr/bin/perl -w
my $s1 = "------ACTAAAAATACAAAAA--TTAGCCAGGCGTGGTGGCAC";
my $s2 = "-----TACTAAAAATACAAAAAAATTAGCCAGGTGTGGTGG---";

print "$s1\n";
print "$s2\n";


my %base = ("A" => 1, "T" => 1, "C" => 1, "G" => 1);

my $ovlp_basecount = 0;
my $internal_gap = 0;

foreach my $si ( 0 .. length($s1)  ) {


    my $base1 = substr($s1,$si,1);
    my $base2 = substr($s2,$si,1);


    # Overlap
    if ( $base{$base1} && $base{$base2} ) {
        $ovlp_basecount++;
    }

    # Not sure how to compute internal gap

}


print "TOTAL OVERLAP BASE = $ovlp_basecount\n";
print "TOTAL Internal Gap \?\n";

请建议我如何有效地找到内部差距和重叠。

【问题讨论】:

  • 每个字符串中的第 34 个字符不同 (C & T)。这是故意的吗?
  • @Mike:是的,故意的。这叫做不匹配。

标签: string perl bioinformatics


【解决方案1】:

您可以对字符串使用按位或来查找一个字符串中与另一个字符串中的空白区域重叠的区域。这个过程还具有通过将不重叠的字符转换为小写来显示重叠的效果,从而使查找重叠也变得非常简单:

#!/usr/bin/perl

use strict;
use warnings;

my $s1 = "------ACTAAAAATACAAAAA--TTAGCCAGGCGTGGTGGCAC";
my $s2 = "-----TACTAAAAATACAAAAAAATTAGCCAGGTGTGGTGG---";

$s1 =~ tr/-/\x20/;
$s2 =~ tr/-/\x20/;
my $or = $s1 | $s2;
(my $gap) = $or =~ m/^.*[ACTG]([actg]+)[ACTG].*$/;
(my $overlap = $or) =~ s/[^A-Z]//g;

print "s1:      '$s1'\n";
print "s2:      '$s2'\n";
print "OR:      '$or'\n";
printf "Gap:     '%s' (%d)\n", $gap,     length $gap;
printf "Overlap  '%s' (%d)\n", $overlap, length $overlap;

打印:

s1:      '      ACTAAAAATACAAAAA  TTAGCCAGGCGTGGTGGCAC'
s2:      '     TACTAAAAATACAAAAAAATTAGCCAGGTGTGGTGG   '
OR:      '     tACTAAAAATACAAAAAaaTTAGCCAGGWGTGGTGGcac'
Gap:     'aa' (2)
Overlap  'ACTAAAAATACAAAAATTAGCCAGGWGTGGTGG' (33)

有关字符串按位运算的更多信息:

http://teaching.idallen.com/cst8214/08w/notes/bit_operations.txt

【讨论】:

    【解决方案2】:

    假设间隙从不重叠,您可以使用正则表达式解决此问题。这是您的s1 的答案。

    echo '------ACTAAAAATACAAAAA--TTAGCCAGGCGTGGTGGCAC' | perl -ne '$s = 0; foreach(/[GTAC](-+)[GTAC]/) { $s += length($1); } print "$s\n";'
    2
    

    【讨论】:

    • 除非对输入数据有相当严格的限制,否则我认为不太可能假设间隙不会重叠(来自生物 POV)
    • @PhiS 如果这是普通的序列比对,则不应有任何重叠缺口,除非这是多序列比对的结果。
    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2013-07-03
    • 2017-07-06
    • 2018-07-30
    • 2017-07-07
    • 2020-05-28
    • 2013-08-06
    相关资源
    最近更新 更多