Le format CML (Chemical Markup Language) est un dérivé du XML, donc une approche qui utilise des balises (tags) pour délimiter des blocs de données hiérarchisés. Cela ne veut pas forcément dire que toute la molécule est traduite en arbre, très souvent lorsque une molécule est enregistrée sous ce type de format, il reste des blocs sérialisés, donc des tables à l’intérieur d’un arbre. Ce qui, finalement, limite l’impact de ce type de formats.
Publication initiale sur buildblog.buidez.net (2014) – Article mis à jour en Décembre 2024.
Navigation dans le guide
Guide [ Formats moléculaires (chimie) ]
1. Un premier exemple
Afin de visualiser une molécule au format CML on peut utiliser Chemaxon Marvin (sketcher) pour dessiner une molécule de Triclosan puis sauver la structure au format MRV:
![]() |
Les numéros en bleu correspondent aux numéros d’atomes dans la molécule. Le format MRV (ChemAxon Marvin) est natif de l’application et correspond à une déclinaison du CML.
Si nous affichons la structure dans un éditeur de texte nous constaterons la présence de différents blocs de données, qui sont inclus dans un bloc molécule, lui même inclus dans d’autres blocs de niveaux supérieurs:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
<cml> <MDocument> <MChemicalStruct> <molecule molID="m1"> <atomArray atomID="a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16 a17" elementType="C C C C C C O C C C C C C O Cl Cl Cl" x2="-5.994999885559082 -7.3286692266073405 -7.3286692266073405 -5.994999885559082 4.6613305445108235 -4.6613305445108235 -3.327651422682788 -1.993972300854752 -0.6603029598064936 -1.993972300854752 -0.6603029598064936 0.673366381241765 0.673366381241765 -0.6603029598064935 2.0070455030698007 -5.994999885559082 -8.662348348435376" y2="0.16503388111808093 -0.6049830594409595 -2.1450169405590405 -2.915033881118081 -2.1450169405590405 -0.6049830594409595 0.16501694055904037 -0.6049830594409595 0.16503388111808093 -2.1450169405590405 -2.915033881118081 -2.1450169405590405 -0.6049830594409595 1.705033881118081 -2.9150169405590405 1.705033881118081 -2.915016940559041" /> <bondArray> <bond atomRefs2="a1 a2" order="2" /> <bond atomRefs2="a1 a6" order="1" /> <bond atomRefs2="a2 a3" order="1" /> <bond atomRefs2="a3 a4" order="2" /> <bond atomRefs2="a4 a5" order="1" /> <bond atomRefs2="a5 a6" order="2" /> <bond atomRefs2="a6 a7" order="1" /> <bond atomRefs2="a7 a8" order="1" /> <bond atomRefs2="a9 a8" order="2" /> <bond atomRefs2="a8 a10" order="1" /> <bond atomRefs2="a9 a13" order="1" /> <bond atomRefs2="a10 a11" order="2" /> <bond atomRefs2="a11 a12" order="1" /> <bond atomRefs2="a12 a13" order="2" /> <bond atomRefs2="a9 a14" order="1" /> <bond atomRefs2="a12 a15" order="1" /> <bond atomRefs2="a1 a16" order="1" /> <bond atomRefs2="a3 a17" order="1" /> </bondArray> </molecule> </MChemicalStruct> </MDocument> </cml></pre> |
Nous distinguons un bloc de coordonnées moléculaires <atomArray> organisé sous la forme d’une table: une colonne par atome, et une ligne pour un identificateur d’atome (a1, a2 …), une ligne pour l’élément (C, O, Cl), une ligne pour les coordonnées en x, et une autre pour les coordonnées en y, il n’y a pas de coordonnées en z, la molécule étant strictement plane.
Nous distinguons aussi un bloc <bondArray> de topologie ou connectivité, il décrit les liaisons chimiques, c’est à dire quel atome (identificateur défini au bloc précédent) est lié avec un autre, et l’ordre de la liaison (liaison simple, double, aromaticité, etc).
2. CML vs. MRV
La molécule est englobée dans un tag <cml>, mais il peut y avoir des différences avec d’autres déclinaisons. Si l’on sauve la même molécule au format CML et non MRV, nous aurons:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?xml version="1.0" ?> <cml> <molecule id="m1"> <atomArray> <atom id="a1" elementType="C" x2="-5.994999885559082" y2="0.16503388111808093" /> <atom id="a2" elementType="C" x2="-7.3286692266073405" y2="-0.6049830594409595" /> <atom id="a3" elementType="C" x2="-7.3286692266073405" y2="-2.1450169405590405" /> <atom id="a4" elementType="C" x2="-5.994999885559082" y2="-2.915033881118081" /> <atom id="a5" elementType="C" x2="-4.6613305445108235" y2="-2.1450169405590405" /> <atom id="a6" elementType="C" x2="-4.6613305445108235" y2="-0.6049830594409595" /> <atom id="a7" elementType="O" x2="-3.327651422682788" y2="0.16501694055904037" /> <atom id="a8" elementType="C" x2="-1.993972300854752" y2="-0.6049830594409595" /> <atom id="a9" elementType="C" x2="-0.6603029598064936" y2="0.16503388111808093" /> <atom id="a10" elementType="C" x2="-1.993972300854752" y2="-2.1450169405590405" /> <atom id="a11" elementType="C" x2="-0.6603029598064936" y2="-2.915033881118081" /> <atom id="a12" elementType="C" x2="0.673366381241765" y2="-2.1450169405590405" /> <atom id="a13" elementType="C" x2="0.673366381241765" y2="-0.6049830594409595" /> <atom id="a14" elementType="O" x2="-0.6603029598064935" y2="1.705033881118081" /> <atom id="a15" elementType="Cl" x2="2.0070455030698007" y2="-2.9150169405590405" /> <atom id="a16" elementType="Cl" x2="-5.994999885559082" y2="1.705033881118081" /> <atom id="a17" elementType="Cl" x2="-8.662348348435376" y2="-2.915016940559041" /> </atomArray> <bondArray> <bond atomRefs2="a1 a2" order="2" /> <bond atomRefs2="a1 a6" order="1" /> <bond atomRefs2="a2 a3" order="1" /> <bond atomRefs2="a3 a4" order="2" /> <bond atomRefs2="a4 a5" order="1" /> <bond atomRefs2="a5 a6" order="2" /> <bond atomRefs2="a6 a7" order="1" /> <bond atomRefs2="a7 a8" order="1" /> <bond atomRefs2="a9 a8" order="2" /> <bond atomRefs2="a8 a10" order="1" /> <bond atomRefs2="a9 a13" order="1" /> <bond atomRefs2="a10 a11" order="2" /> <bond atomRefs2="a11 a12" order="1" /> <bond atomRefs2="a12 a13" order="2" /> <bond atomRefs2="a9 a14" order="1" /> <bond atomRefs2="a12 a15" order="1" /> <bond atomRefs2="a1 a16" order="1" /> <bond atomRefs2="a3 a17" order="1" /> </bondArray> </molecule> </cml> |
Dans ce cas la lecture du bloc <bondArray> est beaucoup plus simple: <bond atomRefs2="a1 a2" order="2" /> signifie que l’atome 1 est connecté avec l’atome 2 avec une liaison covalente d’ordre 2 (double liaison). Ce qui se vérifie sur la formule développée en début de l’article.
3. Avec deux molécules ?
CML est en principe multi-moléculaire puisque le format est hiérarchisé: nous avons un bloc <molecule>. Prenons le cas de ces deux molécules, que l’on dessine (Marvin Sketch) dans la même feuille :
![]() |
Si nous sauvons en CML les molécules vont être ajoutées l’une après l’autre, mais sans séparation particulière, par exemple le bloc <atomArray> va passer de 17 à 39 atomes et rester unique (extraits) :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
<?xml version="1.0" ?> <cml> <molecule id="m1"> <atomArray> <atom id="a1" elementType="C" x2="-10.504999876022339" y2="2.4200338763497093" /> <atom id="a2" elementType="C" x2="-11.838669217070597" y2="1.6500169357906689" /> <atom id="a3" elementType="C" x2="-11.838669217070597" y2="0.10998305467258795" /> ... <atom id="a14" elementType="O" x2="-5.17030295026975" y2="3.9600338763497094" /> <atom id="a15" elementType="Cl" x2="-2.502954487393456" y2="-0.6600169453274121" /> <atom id="a16" elementType="Cl" x2="-10.504999876022339" y2="3.9600338763497094" /> <atom id="a17" elementType="Cl" x2="-13.172348338898633" y2="-0.6600169453274125" /> <atom id="a18" elementType="C" x2="-9.964294988904882" y2="-7.402137754310872" /> <atom id="a19" elementType="C" x2="-11.495858707772026" y2="-7.563111587743058" /> <atom id="a20" elementType="C" x2="-12.401047996302434" y2="-6.317225416405638" /> ... <atom id="a37" elementType="C" x2="5.069792037227003" y2="-7.437284854912765" /> <atom id="a38" elementType="C" x2="6.403471159055037" y2="-8.207284854912764" /> <atom id="a39" elementType="C" x2="7.737150280883075" y2="-7.437284854912764" /> </atomArray> <bondArray> <bond atomRefs2="a1 a2" order="2" /> <bond atomRefs2="a1 a6" order="1" /> <bond atomRefs2="a2 a3" order="1" /> ... <bond atomRefs2="a36 a37" order="1" /> <bond atomRefs2="a37 a38" order="1" /> <bond atomRefs2="a38 a39" order="1" /> </bondArray> </molecule> </cml> |
Nous voyons la fin du triclosan avec l’oxygène et les trois chlore (ids a14 à a17) puis le début de l’autre molécule. Le cas étant plus compliqué en MRV qu’en CML à cause de la structure de la table <atomArray>. Si nous sauvons le fichier en SDF nous avons le même problème, par exemple (extraits) :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
Marvin 01101418112D 39 41 0 0 0 0 999 V2000 -5.6277 1.2964 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 -6.3421 0.8839 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 -6.3421 0.0589 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 ... -2.7698 2.1214 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0 -1.3409 -0.3536 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 -5.6277 2.1214 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 -7.0566 -0.3536 0.0000 Cl 0 0 0 0 0 0 0 0 0 0 0 0 -5.3380 -3.9654 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 -6.1585 -4.0517 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 -6.6434 -3.3842 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 ... 2.7160 -3.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 3.4304 -4.3968 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 4.1449 -3.9843 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0 1 2 2 0 0 0 0 1 6 1 0 0 0 0 2 3 1 0 0 0 0 ... 36 37 1 0 0 0 0 37 38 1 0 0 0 0 38 39 1 0 0 0 0 M END $$$$ |
Avec Sybyl MOL2 c’est le même comportement, mais dans ce dernier cas on aura l’avantage d’avoir une marque de fragment (fragment1 et fragment2) :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
@<TRIPOS>MOLECULE 39 41 2 SMALL NO_CHARGES @<TRIPOS>ATOM 1 C1 -10.5050 2.4200 0.0000 C.2 1 fragment1 2 C2 -11.8387 1.6500 0.0000 C.2 1 fragment1 3 C3 -11.8387 0.1100 0.0000 C.2 1 fragment1 ... 14 O2 -5.1703 3.9600 0.0000 O.3 1 fragment1 15 Cl1 -2.5030 -0.6600 0.0000 Cl 1 fragment1 16 Cl2 -10.5050 3.9600 0.0000 Cl 1 fragment1 17 Cl3 -13.1723 -0.6600 0.0000 Cl 1 fragment1 18 C13 -9.9643 -7.4021 0.0000 C.2 2 fragment2 19 C14 -11.4959 -7.5631 0.0000 C.2 2 fragment2 20 C15 -12.4010 -6.3172 0.0000 C.2 2 fragment2 ... 37 C28 5.0698 -7.4373 0.0000 C.3 2 fragment2 38 C29 6.4035 -8.2073 0.0000 C.3 2 fragment2 39 C30 7.7372 -7.4373 0.0000 C.3 2 fragment2 @<TRIPOS>BOND 1 1 2 2 2 1 6 1 3 2 3 1 ... 39 36 37 1 40 37 38 1 41 38 39 1 @<TRIPOS>SUBSTRUCTURE 1 fragment1 1 2 fragment2 18 |
Ce qui montre que c’est plus un problème de formats que d’application, Marvin sait très bien qu’il y a deux molécules. Au passage, un copier coller au format SMILES est sans ambiguïté, le point est bien présent pour séparer les deux molécules :
OC1=C(OC2=CC=C(Cl)C=C2Cl)C=CC(Cl)=C1.CCCCCCCCN1C=C(N=N1)C(=O)CC1=CC=CC=C1 |
C’est souvent le problème que nous avons avec nos collègues chimistes habitués à dessiner des molécules au format ChemDraw (CDX) sur une feuille (par exemple pour écrire des réactions) puis nous envoient ces données (qui devront donc être reprises). Une approche chemo-informatique associée à une collecte de données devra tenir compte cette problématique, il faudra communiquer et réfléchir à la meilleure manière de limiter le travail (inutile) pour chaque partie. Sans recette précise, car cela dépendra du contexte, mais avec l’éclairage amené par une bonne connaissance des formats.
4. Conclusion
Dans mon contexte CML est très peu utilisé, par contre comme le format MRV qui est natif des applications ChemAxon, nous l’utilisation parfois comme master s’il y a des problématiques telles que (symétries, radicaux, charges, délocalisations … Un master est une copie de la molécule qui est stockée en tant que référence afin d’être réutilisée pour régénérer une structure si celle ci au fur et à mesure des manipulations s’est dégradée et pose des problèmes (difficultés de chargement dans un logiciel, atomes ou liaisons aberrantes, etc). Reste à bien nommer le master si on a beaucoup de molécules sous forme de fichiers individuels, ce qui nous ramènera invariablement à quelques questions posées dans l’article [ Des noms de molécules ] sur ce blog.
Liens et lectures
- Chemical Markup Language [ http://fr.wikipedia.org/wiki/Chemical_Markup_Language ].
- Chemical Markup Language [ http://en.wikipedia.org/wiki/Chemical_Markup_Language ].
- XML (Extensible Markup Language) [ http://fr.wikipedia.org/wiki/Extensible_Markup_Language ].
- ChemAxon Marvin Sktech [ https://chemaxon.com/marvin ].

