2015-10-05 2 views
1

The SeqAn tutorial for Pattern Matching упоминает, что StringSet может служить как стогами сена, так и иглами. При попытке использовать StringSet как стог следующим образом,Онлайн-поиск по шаблону StringSet

StringSet<Dna5String> seqs; 

/* do stuff to load sequences into seqs */ 

Finder<StringSet<Dna5String> > finder(seqs); 
Pattern<Dna5String, Simple> pattern(Dna5String("GAATTC")); 

if (find(finder, pattern)) 
{ 
    std::cout << '[' << beginPosition(finder) << ',' << endPosition(finder) 
      << ")\t" << infix(finder) << std::endl; 
} else 
{ 
    std::cout << "No match!"; 
} 

Я получаю ошибку:

error: use of overloaded operator '==' is ambiguous (with operand types 'const const seqan::String, seqan::Alloc >' and 'const seqan::SimpleType')

Кто-нибудь есть идеи о том, как это должно быть сделано правильно?

Использование одного Dna5String в Finder отлично работает. В учебнике показано, как выполнить поиск (т. Е. С индексированием), но это не то, что мне хотелось бы. Я бы предпочел не вручную перебирать по StringSet, если инструменты Finder-Pattern в SeqAn уже обрабатывают его.

ответ

1

вы можете попробовать,

#include <iostream> 
#include <seqan/sequence.h> // CharString, ... 
#include <seqan/find.h> 
#include <seqan/stream.h> 

using namespace seqan; 

typedef Iterator<StringSet<Dna5String> >::Type TStringSetIterator; 

int main(int, char const **) 
{ 
    StringSet<Dna5String> seqs; 
    Dna5String seq1 = 
     "TAGGTTTTCCGAAAAGGTAGCAACTTTACGTGATCAAACCTCTGACGGGGTTTTCCCCGTCGAAATTGGGTG" 
     "TTTCTTGTCTTGTTCTCACTTGGGGCATCTCCGTCAAGCCAAGAAAGTGCTCCCTGGATTCTGTTGCTAACG" 
     "AGTCTCCTCTGCATTCCTGCTTGACTGATTGGGCGGACGGGGTGTCCACCTGACGCTGAGTATCGCCGTCAC" 
     "GGTGCCACATGTCTTATCTATTCAGGGATCAGAATTCATTCAGGAAATCAGGAGATGCTACACTTGGGTTAT" 
     "CGAAGCTCCTTCCAAGGCGTAGCAAGGGCGACTGAGCGCGTAAGCTCTAGATCTCCTCGTGTTGCAACTACA" 
     "CGCGCGGGTCACTCGAAACACATAGTATGAACTTAACGACTGCTCGTACTGAACAATGCTGAGGCAGAAGAT" 
     "CGCAGACCAGGCATCCCACTGCTTGAAAAAACTATNNNNCTACCCGCCTTTTTATTATCTCATCAGATCAAG"; 
    Dna5String seq2 = 
     "ACCGACGATTAGCTTTGTCCGAGTTACAACGGTTCAATAATACAAAGGATGGCATAAACCCATTTGTGTGAA" 
     "AGTGCCCATCACATTATGATTCTGTCTACTATGGTTAATTCCCAATATACTCTCGAAAAGAGGGTATGCTCC" 
     "CACGGCCATTTACGTCACTAAAAGATAAGATTGCTCAAANNNNNNNNNACTGCCAACTTGCTGGTAGCTTCA" 
     "GGGGTTGTCCACAGCGGGGGGTCGTATGCCTTTGTGGTATACCTTACTAGCCGCGCCATGGTGCCTAAGAAT" 
     "GAAGTAAAACAATTGATGTGAGACTCGACAGCCAGGCTTCGCGCTAAGGACGCAAAGAAATTCCCTACATCA" 
     "GACGGCCGCGNNNAACGATGCTATCGGTTAGGACATTGTGCCCTAGTATGTACATGCCTAATACAATTGGAT" 
     "CAAACGTTATTCCCACACACGGGTAGAAGAACNNNNATTACCCGTAGGCACTCCCCGATTCAAGTAGCCGCG"; 

    clear(seqs); 
    appendValue(seqs, seq1); 
    appendValue(seqs, seq2); 

    Pattern<Dna5String, Simple> pattern(Dna5String("GAATTC")); 

    //For each sequence in seqs 
    for (TStringSetIterator it = begin(seqs); it != end(seqs); ++it) 
    { 
     std::cout << *it << std::endl; 
     //I create a finder for each sequence in seqs 
     Finder<Dna5String> finder(*it); 
     if (find(finder, pattern)){ 
      std::cout << '[' << beginPosition(finder) << ',' << endPosition(finder) 
         << ")\t" << infix(finder) << std::endl; 
     }else{ 
      std::cout << "No match!" << std::endl; 
     } 
    } 
    return 0; 
} 

вы получите:

 
TAGGTTTTCCGAAAAGGTAGCAACTTTACGTGATCAAACCTCTGACGGGGTTTTCCCCGTCGAAATTGGGTGTTTCTTGTCTTGTTCTCACTTGGGGCATCTCCGTCAAGCCAAGAAAGTGCTCCCTGGATTCTGTTGCTAACGAGTCTCCTCTGCATTCCTGCTTGACTGATTGGGCGGACGGGGTGTCCACCTGACGCTGAGTATCGCCGTCACGGTGCCACATGTCTTATCTATTCAGGGATCAGAATTCATTCAGGAAATCAGGAGATGCTACACTTGGGTTATCGAAGCTCCTTCCAAGGCGTAGCAAGGGCGACTGAGCGCGTAAGCTCTAGATCTCCTCGTGTTGCAACTACACGCGCGGGTCACTCGAAACACATAGTATGAACTTAACGACTGCTCGTACTGAACAATGCTGAGGCAGAAGATCGCAGACCAGGCATCCCACTGCTTGAAAAAACTATNNNNCTACCCGCCTTTTTATTATCTCATCAGATCAAG 
[247,253) GAATTC 
ACCGACGATTAGCTTTGTCCGAGTTACAACGGTTCAATAATACAAAGGATGGCATAAACCCATTTGTGTGAAAGTGCCCATCACATTATGATTCTGTCTACTATGGTTAATTCCCAATATACTCTCGAAAAGAGGGTATGCTCCCACGGCCATTTACGTCACTAAAAGATAAGATTGCTCAAANNNNNNNNNACTGCCAACTTGCTGGTAGCTTCAGGGGTTGTCCACAGCGGGGGGTCGTATGCCTTTGTGGTATACCTTACTAGCCGCGCCATGGTGCCTAAGAATGAAGTAAAACAATTGATGTGAGACTCGACAGCCAGGCTTCGCGCTAAGGACGCAAAGAAATTCCCTACATCAGACGGCCGCGNNNAACGATGCTATCGGTTAGGACATTGTGCCCTAGTATGTACATGCCTAATACAATTGGATCAAACGTTATTCCCACACACGGGTAGAAGAACNNNNATTACCCGTAGGCACTCCCCGATTCAAGTAGCCGCG 
No match! 

EDIT, я надеюсь, что это поможет вам

.... 
#include <seqan/index.h> 
.... 

Pattern<Dna5String> pattern(Dna5String("GAATTC")); 
Index< StringSet<Dna5String > > myIndex(seqs); 
Finder< Index<StringSet<Dna5String > > > finder(myIndex); 
while (find(finder, pattern)){ 
    std::cout << '[' << beginPosition(finder) << ',' << endPosition(finder) 
       << ")\t" << infix(finder) << std::endl; 
} 
.... 

вы получите,

 
[< 0 , 247 >,< 0 , 253 >) GAATTC 
+0

Как уже было сказано, я понимаю, что это вариант, но в документации библиотеки звучит так, как будто вам не нужно вручную выполнять итерацию. – merv

+0

Я не знал, я прочитаю документацию –

+0

@merv Я добавляю альтернативное решение .... Мне пришлось удалить 'Simple' из декларации' Pattern' –

Смежные вопросы