The aim of this project is to unify functionality commonly found in bioinformatics projects working on DNA. DNA, as opposed to RNA or amino acid sequences, are very long strings. Even bacterial genomes are easily a few megabyte in size. Thus, for efficient analysis the length has to be taken into account in the design of an application. To this end, libdna contains SIMD routines highly optimised for DNA strings. For some functions the library even chooses the optimal implementation depending on the CPU at runtime.
Libdna requires the Meson buildsystem. It is commonly available via package managers. Then execute the following steps to compile and install the latest version of libdna.
git clone https://github.com/kloetzl/libdna.git
meson builddir
cd builddir
meson compile
meson install
Contributors may also want to take a look at the Makefile.Maintainer
. It contains handy shortcuts set up tests, benchmarks and other release related files.
Libdna is both simple, efficient and customizable. For instance, many bioinformatics tools need to compute the reverse complement of some DNA sequence. Now it is just one function call away, dna4_revcomp
. The prefix dna4
indicates that this function is optimised for strings containing only the four canonical nucleotides A, C, G and T. The first parameter is a pointer to the beginning of the string. The second parameter points to the first byte just past the string. So for a string starting at str
of length len
the arguments are str
and str + len
representing the string [str, str+1, …, str+len)
. The last parameter is a pointer to a location with enough space to hold the reverse compliment.
#include <kloetzl/dna.h>
int main()
{
char buffer[] = "ACGT";
char rev[5] = {0};
dna4_revcomp(buffer, buffer + 4, rev);
printf("%s\n", rev);
}
In C++ things are even simpler thanks to a thin wrapper. Instead of raw pointers it uses std::string_view
and std::string
to make the API more convenient.
#include <kloetzl/dna.hpp>
int main()
{
std::cout << dna4::revcomp("ACGT") << "\n";
}
As the wrapper relies on automatic memory management, which can incur a significant runtime overhead, the underlying C functions are still available for use. Don't forget to link with -ldna
.
- libdna comes with man pages for IUPAC codes and the standard genetic code.
- Where a
dna4_
function provides high performance at the expense of limited applicability thednax_
functions provide generality at the expense of speed. - Some functions pick the optimal SIMD instruction set at runtime.
- To prove efficiency, benchmarks with alternate implementations are included.
Copyright © 2018 - 2023 Fabian Klötzl fabian-libdna@kloetzl.info
MIT License