8 de septiembre de 2021

Análisis de secuencias eficiente con SeqAn

Hola,

hoy he participado en un curso de introducción a SeqAn, una biblioteca Open Source escrita en lenguaje C++ para el análisis eficiente de secuencias biológicas, una tarea de la que ya habíamos hablado en este blog. La versión original se publicó en BMC Bioinformatics y ha evolucionado hasta la actual SeqAn3, que puede obtenerse en https://github.com/seqan/seqan3 y require un compilador g++ con versión >= 7 y el estándar C++17  (g++-7 -std=c++17).

Para programar tus propias aplicaciones deberás tener algo de conocimiento de C++ moderno, en concreto de rangos, funciones lambda y la STL, pero afortunadamente el material del curso es muy ameno y fácil de seguir. Lo puedes encontrar en:

https://seqan.github.io/learning-resources/doc/biocpp/presentation

 

Os dejo un ejemplo que permite filtrar lecturas de secuencia de un fichero FASTQ que superen un cierto umbral de calidad y require leer la documentación de la API

#include <string_view>
#include <seqan3/std/algorithm>
#include <seqan3/io/sequence_file/all.hpp>
#include <seqan3/alphabet/quality/all.hpp>

//ask user a PHRED quality cutoff value
auto ask_quality() -> seqan3::phred42
{
   std::cout<<" Please type read quality cutoff [0,41]\n";
   uint32_t cutoff{};
   std::cin>>cutoff;
        
   return seqan3::assign_rank_to( cutoff, seqan3::phred42{});
}

int main(int argc, const char * argv[])
{

   //note there's no user interface help nor proper arg checking
   std::string_view fastq_path = argv[1];
   std::string_view fasta_path = argv[2];

   // note file formats are deduced from file extensions
   seqan3::sequence_file_input fastq_file_in{fastq_path};
   seqan3::sequence_file_output fasta_file_out{fasta_path};

   // filter reads by quality
   seqan3::quality_alphabet qual_cutoff = ask_quality();
   
   // this is where you need ti understand ranges & lambda functions,
   // plus a little bit about the SeqAnAPI
   for (const auto & [sequence,id,quality] : fastq_file_in)
   {
      if (std::ranges::all_of(quality, [qual_cutoff] (auto const & quality) 
          { return quality >= qual_cutoff; }))
          fasta_file_out.emplace_back(sequence, id);
   }

   return 0;
}

Si te interesa, el próximo curso gratuito será el 14 de septiembre de 16:00 a 19:00 CEST (más información en https://ogy.de/ts51). Hasta pronto,

Bruno

1 comentario: