1

私はこの2つの同じ長さの弦を持っていますが、これを比較する必要があります。オーバーラップベース(。)と内部ギャップ(*)を見つけたい。以下に例を示します。

------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";

内部ギャップを見つけて効率的にオーバーラップするにはどうすればよいかアドバイスしてください。

4

2 に答える 2

3

文字列に対してビットごとの OR を使用して、一方の文字列の領域が他方の空白領域と重なっている領域を見つけることができます。このプロセスには、重複していない文字を小文字に変換することで重複を明らかにする効果もあるため、重複を非常に簡単に見つけることができます。

#!/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

于 2010-12-04T14:43:49.327 に答える
1

ギャップが重複しないと仮定すると、正規表現を使用してこれを解決できます。これがあなたの答えですs1

echo '------ACTAAAAATACAAAAA--TTAGCCAGGCGTGGTGGCAC' | perl -ne '$s = 0; foreach(/[GTAC](-+)[GTAC]/) { $s += length($1); } print "$s\n";'
2
于 2010-12-04T14:53:36.923 に答える