Chemfiles

Bibliothèque d'entrées-sorties pour la simulation moléculaire

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

EDIT 23/11/15: le nom de la bibliothèque a été changé pour chemfiles, le titre aussi.

Bonjour à tous ! Aujourd'hui est un grand jour, parce que aujourd'hui la version 0.1 de ma bibliothèque Chemharp est rendue publique !

J'avais déjà parlé de cette bibliothèque sur le forum pendant la conception, en voici maintenant la présentation !

C'est quoi le problème ?

Je fait de la simulation moléculaire en recherche. L'idée de la simulation moléculaire, c'est de prendre un ensemble d'atomes ou de molécules, et de faire calculer à l'ordinateur l'évolution temporelle1 de cette ensemble. Ces simulations produisent donc des données sous la forme de positions/vitesses des atomes, que l'on peut ensuite analyser pour en extraire ce qui nous intéresse.

Ces données se ressemblent souvent (positions, vitesses, liaisons entre les atomes, …) mais sont enregistrées dans beaucoup de formats de fichiers différents. Chaque logiciel a son propre format de données, et même si quelques formats sont plus communs et standard que les autres, le simple fait de changer de logiciel de simulation peut demander beaucoup de travail pour écrire les scripts d'analyse.

L'idée dernière Chemharp est de fournir une interface simple, stable et indépendante du format d'entrée pour lire toutes ces données. Ainsi, l'utilisateur de la bibliothèque peut utiliser indifféremment des fichiers PDB, XYZ, XTC ou TNG ; et toujours effectuer la même analyse sur ces fichiers. Chemharp propose donc de lire et d'écrire des Trajectoires dans des fichiers selon un certain nombre de Format. Ces Trajectoires sont composées d'une successions de Frames qui contiennent les informations sur le système.

Les contraintes

J'ai essayé de répondre à plusieurs contraintes en écrivant cette bibliothèque :

  • Avoir une API simple à utiliser, et bien documenté ;
  • Avoir une bibliothèque utilisable depuis plusieurs langages, en particulier les langages scientifiques (C++, C, Fortran, Python)
  • Avoir un code efficace, la plupart des programmes d'analyse de trajectoire étant limités par l'IO. Ce point n'a pas encore été travaillé.

La technique

La bibliothèque est écrite en C++11, avec un certain nombre de classes internes mais seulement 6 classes d'exposées à l'extérieur. Depuis cette bibliothèque, des interfaces sont créées :

  • Une interface C est écrite en C++ avec extern "C" ;
  • Cette interface C est enrobée pour Fortran avec l'aide du module iso_c_binding de la norme 2003. Si ce passage vous intéresse, j'avais fait un post de blog à ce propos. Comme indiqué à la fin, j'ai utilisé un parseur C depuis Python pour générer le code correspondant.
  • La bibliothèque Boost.Python est utilisée pour écrire l'interface vers Python.

À coté de ça, les quelques autres choix techniques que j'ai fait sont :

  • CMake pour le système de compilation. Le code n'a pas encore été testé sous Windows, mais devrait l'être rapidement. Un système de compilation cross-plateform était donc important à mes yeux.
  • Doxygen pour documenter le code C et C++;
  • Sphinx pour créer une documentation propre et lisible depuis la documentation Doxygen. L'extension breathe a été utilisée pour cela.

Le code

Le code est disponible sur Github, sous licence MPL. La documentation est disponible sur readthedocs.

Voilà, je sais qu'il y a quelques chimistes sur ce forums, je veux donc bien des avis sur l'utilisation de ce type de bibliothèque. Et je prend aussi tous les avis sur mon code, d'un point de vue conception, bonnes pratiques ou autre.


  1. Pas toujours … Parfois on utilise plutôt une évolution stochastique, cherchez les méthodes de simulations Monte Carlo pour ça. 

Édité par Luthaf

Mon Github — Tuto Homebrew — Article Julia

+5 -0

Cette réponse a aidé l'auteur du sujet

2 remarques me sont venues en lisant ton code:

pourquoi ne pas utiliser override vu que tu forces C++11 ?

"dimension" ne prend qu'un seul M (NCFile).

Édité par minirop

+1 -0
Auteur du sujet

pourquoi ne pas utiliser override vu que tu forces C++11 ?

Parce que je ne connaissait pas ? Je vais en mettre partout du coup !

"dimension" ne prend qu'un seul M (NCFile).

minirop

Merci !

avoir tous les formats principaux dans un même code serait très pratique.

Rockaround

OpenBabel fait déjà ça, mais quand j'en ai eu besoin, je n'ai rien compris au code … Du coup je vais essayer de faire ça en mode KISS ! La prochaine version devrait avoir une interface vers les plugins molfile de VMD, ce qui m’apporterais plein de format pour pas grand chose, et rendrai la bibliothèque vraiment utilisable.

Édité par Luthaf

Mon Github — Tuto Homebrew — Article Julia

+0 -0

Salut Luthaf,

Félicitations pour l'initiative et pour l'avoir menée à bout. Je n'ai jamais fait ce genre de simulations donc je ne peux malheureusement pas commenter en tant qu'utilisateur. Par contre c'est vrai qu'on manque souvent d'outils dans ce domaine de la recherche, trop souvent les chimistes n'y connaissent rien à la programmation et vice-versa…

Il y a une année j'avais regardé de près et utilisé un peu la lib OpenBabel dans un petit projet perso en C++ et effectivement c'est lourd et dur à comprendre.

Je garde un oeil sur ton projet. :)

Par respect pour les visiteurs de Zeste de Savoir, je m'engage à ne jamais effacer ce message.

+1 -0
Auteur du sujet

Coucou les gens ! Je viens de lâcher dans la nature la version 0.2 du projet !

Au programme, l'implémentation de la recherche de liaisons, et l'utilisation des plugins de VMD pour lire plus de formats (PDB, DCD, et les formats Gromacs : trr, gro, trj, xtc).

Je pense que je ne vais pas tarder à publier la version 1.0 (API stable), je vais juste lancer un tour de demande de review sur l'API à plusieurs personnes. Donc si vous avez des commentaires à faire, je prend toujours !

Mon Github — Tuto Homebrew — Article Julia

+0 -0

Quand tu dis "recherche de liaisons", tu parles de liens entre atomes qui seraient présents dans certains formats et pas dans d'autres ? (Je ne connais pas les formats dont tu parles)

Si oui, comment est-ce que tu décides ? Les atomes les plus proches ? Un critère sur des angles ?

Je demande juste parce que je suis en train de chercher un critère le plus général possible pour le faire dans des cristaux avec des défauts.

Auteur du sujet

Quand tu dis "recherche de liaisons", tu parles de liens entre atomes qui seraient présents dans certains formats et pas dans d'autres ? (Je ne connais pas les formats dont tu parles)

Yep, c'est ça. Le critère que j'utilise est celui implémenté dans Rasmol, qui s'exprime comme :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
def are_bonded(atom_i, atom_j):
     rad_i = covalent_radius(atom_i)
     rad_j = covalent_radius(atom_j)

     d = distance_with_pbc(atom_i, atom_j)

     if (d > 0.4 and d < rad_i + rad_j + 0.56):
          return true
     else
          return False

Il y a un autre algo utilsé par VMD, qui donne grossièrement les mêmes résultats avec un cirtère différent (basé sur les rayons de Van der Waals). Je pourrais regarder demain si ça t'intéresse. Mais ces algos ne sont pas parfait, et j'ai quelques publis sur la détection automatique de liaisons qui utilisent un algo en deux passes : le critère simple ci-dessus, puis on supprime les liaisons en trop par rapport à la valence maximale théorique des atomes.

Si tu connais un peu ton système (quelle est la géométrie idéale tu peut aussi faire intervenir les angles, mais c'est plus compliqué parce que tu dois être indépendant de ton repère d'origine. J'ai bossé l'an dernier avec un algo qui détectait les clusters de glace dans l'eau en se basant sur les harmoniques sphériques pour filtrer les angles et classifier les particules.

Édité par Luthaf

Mon Github — Tuto Homebrew — Article Julia

+0 -0

Merci pour la réponse.

Les liens que je veux faire apparaitre sont d'ordre esthétique, du coup un critère sur la distance, ca ne va pas marcher. Par exemple, pour une structure BCC, je ne veux pas avoir les liens vers l'atome central, mais dans le cas d'un "self interstitial atom", les liens devraient y être, du coup je ne peux pas imposer du distance minimale.

Enfin bon, j'ai assez détourné ton sujet (désolé). Bon courage pour la suite !

Auteur du sujet

Bonjour à tous! Un message de mise à jour pour la version 0.4 de cette bibliothèque. Depuis la 0.2, elle a gagnée une interface Julia, une interface Rust et un poil de nettoyage interne. L'interface Python est passée à ctypes (au lieu de Boost.Python), que qui me donne la compatibilité Python 2 et 3, et numpy 1.7->1.10.

L'API n'est toujours pas stabilisé, mais je commence à utiliser cette bibliothèque pour d'autres projets, donc normalement ça ne devrais plus trop tarder! Je dois au moins ajouter un accès directe à la mémoire utilisée pour les tableaux de donnée, afin d'éviter les copies inutiles de 5Go et plus …

Mon Github — Tuto Homebrew — Article Julia

+0 -0

Salut Luthaf,

Juste pour te dire que je garde toujours un oeil sur le sujet. ;) Malheureusement comme dit plus haut je ne pourrais pas te donner de retours pertinents.

Par respect pour les visiteurs de Zeste de Savoir, je m'engage à ne jamais effacer ce message.

+0 -0

J'en ai eu fait pendant mes études mais je suis maintenant dans la chimie organique. Malgré tout j'essaie de garder un oeil sur les progrès en cours dans ce domaine et ça m'arrive de bricoler un peu de cheminformatics comme hobby.

Édité par mathiasm

Par respect pour les visiteurs de Zeste de Savoir, je m'engage à ne jamais effacer ce message.

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte