Site WWW de Laurent Bloch
Slogan du site

ISSN 2271-3905
Cliquez ici si vous voulez visiter mon autre site, orienté vers des sujets moins techniques.

Pour recevoir (au plus une fois par semaine) les nouveautés de ce site, indiquez ici votre adresse électronique :

Un dépôt GitHub pour mes programmes Rust
Article mis en ligne le 9 novembre 2021
dernière modification le 10 novembre 2021

par Laurent Bloch

Agencer les modules pour construire un exécutable

Ne reculant devant aucune vanité, je décide de placer mes programmes dans un dépôt GitHub. Auparavant, il faut que ces programmes soient organisés de façon à pouvoir construire un exécutable binaire, ce qui impose quelques corrections. Certaines subtilités de l’organisation des cageots (crates) et des modules m’échappent encore mais grâce à la coopération des internautes (merci Stack Overflow !) j’arrive à quelque chose qui fonctionne.

Pour construire l’exécutable je m’en remets à Cargo. Il faut lui indiquer que j’utilise un cageot externe, en l’occurrence simple-matrix de Nicolas Memeint, ce qui s’écrit ainsi dans le fichier Cargo.toml :

Le contenu du répertoire src est modifié comme suit.

Programme principal

Lire les séquences

Construire la matrice d’alignement, calculer les scores

Créer un dépôt Git

Avec Git, chaque arborescence de répertoires qui contient le code source d’un projet devient un dépôt de ce projet, cf. cet excellent manuel en ligne (en français, ou presque toute autre langue au choix). Il suffit de lancer la commande d’initialisation du dépôt :

qui créera les répertoires .git (données de référence du dépôt), src (le code des programmes) et target (les exécutables, données de déboguage et autres).

Il faut ensuite ajouter au dépôt les fichiers intéressants, ainsi par exemple :

Il est bon, pardon, indispensable, pour un dépôt public, de prévoir un document de licence, pour ce qui me concerne j’ai choisi la licence Apache, moins rigide que la GPL ou même que la LGPL, mais après tout dépend du contexte dans lequel vous travaillez et de vos jugements sur la question.

Il est très souhaitable de rédiger un document d’introduction qui explique ce que fait votre programme et comment il s’utilise. GitHub semble préférer que ce texte soit écrit selon le langage de balisage Markdown et se nomme README.md, vous pouvez consulter ici leREADME.md du projet concerné, que j’ai baptisé fasebare.

Les commandes précédentes programment des opérations mais ne les effectuent pas, il faudra pour cela les commettre, au moyen de la commande de commission, qui vous demandera de rédiger quelques mots pour expliquez ce que vous commettez :

GitHub

GitHub est de nos jours le dépôt de codes source à la mode pour les logiciels libres, bien que ce soit une entreprise commerciale, rachetée par Microsoft. Dès la page d’accueil on vous propose d’ouvrir un compte, c’est ainsi que tout commence. Une fois le compte créé vous pouvez créer un projet. Le site vous propose une interface Web, soit un cliquodrome, je trouve que c’est plus simple d’usage par ligne de commande. Pour ce faire GitHub vous demandera de créer un token d’authentification pour pouvoir accéder à votre dépôt depuis votre machine locale.

Ensuite, pour envoyer votre projet sur GitHub (où j’ai créé le projet fasebare, vide, mon identifiant est laubloch), depuis le répertoire racine de votre dépôt local, c’est simple :

Construire un exécutable

Oui, pour créer un binaire exécutable avec Cargo :

Le binaire sera ici :

Importer le projet dans Framagit

Framagit est un autre dépôt de projets au format Git, basé sur le logiciel GitLab. C’est un des nombreux services libres créés par l’association Framasoft, il aurait donc été incorrect que je n’y publie pas mon code. Rien n’est plus simple : aussitôt identifié sur Framagit, on me propose d’importer des projets depuis d’autres dépôts, notamment GitHub. Voilà qui fut fait. Mon programme d’écolier est maintenant doublement immortel.

README du paquet # fasebare

Synopsis

The crate needleman_wunsch of the fasebare package consists of two Rust modules :

* fasta_multiple_cmp provides functions to read biological sequences (DNA, RNA or proteins) in FASTA formatted files ;
* sequences_matrix provides functions to build an alignment matrix of two sequences and to compute their similarity score, according to the Needleman-Wunsch algorithm.

The Data directory contains test data with artificial sequence data, and also true sequences extracted from the Genbank databank, in order to try the programs.

The cargo build system will build a standalone program to be invoked from the command line. The program has been built and run only with the Linux OS, but maybe it would run with other OS.

Motivation

The first aim of this package was for the author to learn the programming language Rust, and to apply it to a domain he knows a bit, Bioinformatics. The author’s site gives some explanations of this approach (in French...).

These programs are intended for pedagogic use, if you use them for professional or scientific projects, it will be at your own risks.

Credits

These programs invoke the following crate :

* simple_matrix

To take into account the dependency to this package, the Cargo.toml file must be :

The author found hints and inspiration from totof2000, Unknown, Nicolas Memeint.

Principle of operations (summary)

Usually biologists work about a sequence of interest, which we will name the “query sequence”, and they try to compare it with a batch of sequences, the “bank”, in order to select the sequences of the bank with the higher similarity scores.

The similarity scores between two sequences are computed according to the Needleman-Wunsch algorithm. This algorithm build an alignment matrix. One sequence has its letters placed horizontally on the top of the matrix, each letter on the top of a column. The second sequence has its letter placed vertically on the left of the matrix, each letter on the left of a row. One extra line is placed below the top sequence, and one extra column is placed on the right of the left sequence. Each cell of the matrix will contain the score of each individual pair of letters.

To fill the matrix, the program computes each score for each individual pair of letters according to one of three situations (definitions borrowed from Wikipedia) :

* Match : The two letters at the current index are the same.
* Mismatch : The two letters at the current index are different.
* Gap : The best alignment involves one letter aligning to a gap in the other sequence.

So the algorithm needs two parameters to work : the value of the gap penalty, and the value of the mismatch penalty (or, alternatively, the value of the match bonus, which is the solution adopted for our program).

You could refer to the Wikipedia article for further explanations and details.

To build and invoke the program :

For the developper, the command line to build the program is (from the base directory of the project) :

Then, you can invoke the program is as follows :

For instance, with test files from this repository :

To build an executable binary file proceed as follows :

The executable file will be there :

Remember, with Rust, no runtime, so this executable is executable anywhere with your data.