Как я могу искать различные варианты мотивов биоинформатики в строке, используя Perl? - PullRequest
2 голосов
/ 18 сентября 2010

У меня есть вывод программы с одним тандемным повтором в разных вариантах.Можно ли найти (в строке) мотив и указать программе найти все варианты с максимальными "3" несовпадениями / вставками / удалениями?

Ответы [ 3 ]

4 голосов
/ 18 сентября 2010

Я попытаюсь разобраться с предоставленной очень ограниченной информацией.

Сначала короткая дружеская редакционная статья:

<editorial>

Пожалуйста, научитесь задать хороший вопрос и как быть точным .

Как минимум, пожалуйста:

  • Воздерживаться от жаргона, специфичного для предметной области, такого как «мотив» и «тандемный повтор» и «пары оснований», без предоставления ссылок или точных определений;
  • Скажите, какова цель и что вы уже сделали;
  • Внимание! Предоставьте наглядные примеры ввода и желаемого результата.

Потенциальным помощникам на SO не нужно играть 20 вопросов в комментариях, чтобы понять ваш вопрос! Я потратил больше времени на то, чтобы понять, о чем ты спрашиваешь, чем ответить на него.

</editorial>

Следующая программа генерирует строку из 2 пар символов длиной 5428 пар в массиве из 1000 элементов. Я понимаю, что более вероятно, что вы будете читать их из файла, но это всего лишь пример. Очевидно, вы бы заменили случайные строки вашими фактическими данными из любого источника.

Я не знаю, являются ли 'AT','CG','TC','CA','TG','GC','GG', которые я использовал, допустимыми комбинациями базовых пар или нет. (Я проспал биологию ...) Просто отредактируйте пары блоков map для допустимых пар и замените 7 на количество пар, если вы хотите сгенерировать допустимые случайные строки для тестирования.

Если подстрока в точке offset имеет 3 различия или меньше, элемент массива (скалярное значение) сохраняется в анонимном массиве в части значения хэша. Ключевой частью хэша является подстрока, которая почти совпадает. Вместо элементов массива значения могут быть именами файлов, ссылками на данные Perl или другими соответствующими ссылками, которые вы хотите связать с вашим мотивом.

Хотя я только что посмотрел на символьные различия между строками, вы можете поместить любую конкретную логику, которую вам нужно посмотреть, заменив строку foreach my $j (0..$#a1) { $diffs++ unless ($a1[$j] eq $a2[$j]); } на логику сравнения, которая работает для вашей проблемы. Я не знаю, как mismatches/insertions/deletions представлены в вашей строке, поэтому я оставляю это в качестве упражнения для читателя. Возможно Алгоритм :: Diff или String :: Diff из CPAN?

Легко изменить эту программу, чтобы иметь ввод с клавиатуры для $target и $offset или чтобы строка поиска начиналась с конца до конца, а не несколько строк с фиксированным смещением. Еще раз: было не совсем понятно, какова ваша цель ...

use strict; use warnings;

my @bps;
push(@bps,join('',map { ('AT','CG','TC','CA','TG','GC','GG')[rand 7] } 
       0..5428)) for(1..1_000);

my $len=length($bps[0]);
my $s_count= scalar @bps;

print "$s_count random strings generated $len characters long\n" ;

my $target="CGTCGCACAG";
my $offset=832;
my $nlen=length $target;
my %HoA;
my $diffs=0;
my @a2=split(//, $target);
substr($bps[-1], $offset, $nlen)=$target; #guarantee 1 match
substr($bps[-2], $offset, $nlen)="CATGGCACGG"; #anja example

foreach my $i (0..$#bps) {
    my $cand=substr($bps[$i], $offset, $nlen);
    my @a1=split(//, $cand);
    $diffs=0;
    foreach my $j (0..$#a1) { $diffs++ unless ($a1[$j] eq $a2[$j]); }
    next if $diffs > 3;
    push (@{$HoA{$cand}}, $i); 
}

foreach my $hit (keys %HoA) {
    my @a1=split(//, $hit);
    $diffs=0;
    my $ds="";
    foreach my $j (0..$#a1) { 
        if($a1[$j] eq $a2[$j]) {
            $ds.=" ";
        } else {
            $diffs++;
            $ds.=$a1[$j];
        }
    }   
    print "Target:       $target\n",
          "Candidate:    $hit\n",
          "Differences:  $ds       $diffs differences\n",
          "Array element: ";
    foreach (@{$HoA{$hit}}) {
         print "$_ " ;
     }
     print "\n\n";
}

Выход:

1000 random strings generated 10858 characters long
Target:       CGTCGCACAG
Candidate:    CGTCGCACAG
Differences:                   0 differences
Array element: 999 

Target:       CGTCGCACAG
Candidate:    CGTCGCCGCG
Differences:        CGC        3 differences
Array element: 696 

Target:       CGTCGCACAG
Candidate:    CGTCGCCGAT
Differences:        CG T       3 differences
Array element: 851 

Target:       CGTCGCACAG
Candidate:    CGTCGCATGG
Differences:         TG        2 differences
Array element: 986 

Target:       CGTCGCACAG
Candidate:    CATGGCACGG
Differences:   A G    G        3 differences
Array element: 998 

..several cut out.. 

Target:       CGTCGCACAG
Candidate:    CGTCGCTCCA
Differences:        T CA       3 differences
Array element: 568 926 
1 голос
/ 19 сентября 2010

Я считаю, что в BioPerl есть процедуры для такого рода вещей.

В любом случае, вы можете получить лучшие ответы, если спросите об этом на BioStar, обмен стека биоинформатики .

0 голосов
/ 01 апреля 2016

Когда я учился на Perl в первые пару лет, я написал то, что сейчас считаю очень неэффективным (но функциональным) тандемным механизмом поиска повторов (который раньше был доступен на веб-сайте моей старой работы) под названием tandyman. Я написал нечеткую версию этого пару лет спустя под названием cottonTandy. Если бы я переписал его сегодня, я бы использовал хеши для глобального поиска (учитывая допустимые ошибки) и использовал бы сопоставление с образцом для локального поиска.

Вот пример того, как вы его используете:

#!/usr/bin/perl
use Tandyman;

$sequence = "ATGCATCGTAGCGTTCAGTCGGCATCTATCTGACGTACTCTTACTGCATGAGTCTAGCTGTACTACGTACGAGCTGAGCAGCGTACgTG";

my $tandy = Tandyman->new(\$sequence,'n'); #Can't believe I coded it to take a scalar reference! Prob. fresh out of a cpp class when I wrote it.

$tandy->SetParams(4,2,3,3,4);
#The parameters are, in order:
# repeat unit size
# min number of repeat units to require a hit
# allowed mistakes per unit (an upper bound for "mistake concentration")
# allowed mistakes per window (a lower bound for "mistake concentration")
# number of units in a "window"

while(@repeat_info = $tandy->FindRepeat())
  {print(join("\t",@repeat_info),"\n")}

Вывод этого теста выглядит следующим образом (и на его запуск уходит ужасные 11 секунд):

25  32  TCTA    2   0.87    TCTA TCTG
58  72  CGTA    4   0.81    CTGTA CTA CGTA CGA
82  89  CGTA    2   0.87    CGTA CGTG
45  51  TGCA    2   0.87    TGCA TGA
65  72  ACGA    2   0.87    ACGT ACGA
23  29  CTAT    2   0.87    CAT CTAT
36  45  TACT    3   0.83    TACT CT TACT
24  31  ATCT    2   1   ATCT ATCT
51  59  AGCT    2   0.87    AGTCT AGCT
33  39  ACGT    2   0.87    ACGT ACT
62  72  ACGT    3   0.83    ACT ACGT ACGA
80  88  ACGT    2   0.87    AGCGT ACGT
81  88  GCGT    2   0.87    GCGT ACGT
63  70  CTAC    2   0.87    CTAC GTAC
32  38  GTAC    2   0.87    GAC GTAC
60  74  GTAC    4   0.81    GTAC TAC GTAC GAGC
23  30  CATC    2   0.87    CATC TATC
71  82  GAGC    3   0.83    GAGC TGAGC AGC
1   7   ATGC    2   0.87    ATGC ATC
54  60  CTAG    2   0.87    CTAG CTG
15  22  TCAG    2   0.87    TCAG TCGG
70  81  CGAG    3   0.83    CGAG CTGAG CAG
44  50  CATG    2   0.87    CTG CATG
25  32  TCTG    2   0.87    TCTA TCTG
82  89  CGTG    2   0.87    CGTA CGTG
55  73  TACG    5   0.75    TAGCTG TAC TACG TACG AG
69  83  AGCG    4   0.81    ACG AGCTG AGC AGCG
15  22  TCGG    2   0.87    TCAG TCGG

Как видите, он допускает инделы и SNP. Столбцы в порядке:

  1. Начальная позиция
  2. Стоп
  3. Консенсусная последовательность
  4. Количество найденных единиц
  5. Показатель качества из 1
  6. Повторяющиеся единицы, разделенные пробелами

Обратите внимание, что параметры (как вы можете видеть из вышеприведенного вывода) легко указать, которые будут выводить ненужные / незначительные «повторы», но если вы знаете, как предоставлять хорошие параметры, он может найти то, что вы установили, найдя .

К сожалению, пакет не является общедоступным. Я никогда не удосужился сделать его доступным, так как он настолько медленный и не поддается даже поискам генома прокариотического размера (хотя это будет работать для отдельных генов). В те дни, когда я начинал программировать, я начал добавлять функцию, принимающую «состояние» в качестве входных данных, чтобы я мог запускать его на секциях последовательности параллельно, и я так и не закончил, когда узнал, что хэши сделают его намного быстрее. К этому моменту я перешел к другим проектам. Но если это будет соответствовать вашим потребностям, напишите мне, я могу отправить вам копию по электронной почте.

Это просто скромно из 1000 строк кода, но в нем много наворотов, таких как допуск кодов неоднозначности IUPAC (BDHVRYKMSWN). Он работает как для аминокислот, так и для нуклеиновых кислот. Он отфильтровывает внутренние повторы (например, не сообщает TTTT или ATAT как 4nt консенсуса).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...