mb_language("uni"); mb_internal_encoding("utf-8"); mb_http_input("auto"); mb_http_output("utf-8"); ?>
CMLは,化学に関連した産業,研究,教育などの分野で広く利用できるボキャブラリです。CMLの開発は,英国のMurray-Rust氏とRzepa氏らが中心で,1979年にMDL社が開発した商用の化学構造データベースの交換用データ形式「Molfile」を基に,1997年以来開発が続いています。CMLの最新バージョンは2です。CML開発プロジェクトでは,様々なブラウザやコンバータを開発し公開していますので,ぜひお試しください。
一方,通常のWebブラウザでMolfileを閲覧できるプラグインが配布されていますので,Molfileは事実上の標準と思われます。W3Cにおいて,CMLは,同じ科学的ボキャブラリであるMathMLと一緒に検討が始まりましたが,MathMLと違って勧告となっていないのは,そのあたりの事情が関係しているのかもしれません。
先ず,簡単な有機化学の例を見てみましょう。私たちが食事(タンパク質などの窒素化合物)を摂ると,身体の中で代謝され,尿素(urea)が生じます。その物質の化学式は,H2NCONH2で表わされます。これをCMLで表わすと,図1のようになります。図1が意味する分子構造を図2に示します(各原子のZ座標はゼロに近いので,Z軸を省略し,2次元座標で表わしました)。図1と図2を併せ読めば,おおよその記述内容が理解できるでしょう。
▼図1 CMLで表わした尿素の分子構造
<?xml version="1.0"?>
<cml >
<molecule title="urea"> <!-- 原子,結合,その他の分子の集合を容れる一般的なコンテナ -->
<formula>H2 N C O N H2</formula> <!-- 分子構造を容れる一般的なコンテナ -->
<float title="molecular weight">60.06</float> <!-- 分子量 -->
<atomArray> <!-- 原子の集まりについての記述 -->
<atom id="a_1"> <!-- 原子についての記述 id属性でこのatom要素を識別する -->
<!-- オングストローム(10-10m)単位のデカルト座標 -->
<float builtin="x3" units="A">0.8677</float> <!-- X座標 -->
<float builtin="y3" units="A">0.9897</float> <!-- Y座標 -->
<float builtin="z3" units="A">0.0065</float> <!-- Z座標 -->
<string builtin="elementType">N</string> <!-- 窒素 -->
</atom>
<atom id="a_2">
<float builtin="x3" units="A">2.0602</float>
<float builtin="y3" units="A">1.7285</float>
<float builtin="z3" units="A">0.0810</float>
<string builtin="elementType">C</string> <!-- 炭素 -->
</atom>
<atom id="a_3">
<float builtin="x3" units="A">3.2925</float>
<float builtin="y3" units="A">1.0548</float>
<float builtin="z3" units="A">0.1093</float>
<string builtin="elementType">N</string> <!-- 窒素 -->
</atom>
<atom id="a_4">
<float builtin="x3" units="A">2.0250</float>
<float builtin="y3" units="A">2.9598</float>
<float builtin="z3" units="A">0.1192</float>
<string builtin="elementType">O</string> <!-- 酸素 -->
</atom>
<atom id="a_5">
<float builtin="x3" units="A">0.0000</float>
<float builtin="y3" units="A">1.4665</float>
<float builtin="z3" units="A">0.0095</float>
<string builtin="elementType">H</string> <!-- 水素 -->
</atom>
<atom id="a_6">
<float builtin="x3" units="A">0.8675</float>
<float builtin="y3" units="A">0.0000</float>
<float builtin="z3" units="A">0.0000</float>
<string builtin="elementType">H</string> <!-- 水素 -->
</atom>
<atom id="a_7">
<float builtin="x3" units="A">3.3478</float>
<float builtin="y3" units="A">0.0679</float>
<float builtin="z3" units="A">0.0607</float>
<string builtin="elementType">H</string> <!-- 水素 -->
</atom>
<atom id="a_8">
<float builtin="x3" units="A">4.1324</float>
<float builtin="y3" units="A">1.5785</float>
<float builtin="z3" units="A">0.1411</float>
<string builtin="elementType">H</string> <!-- 水素 -->
</atom>
</atomArray>
<bondArray> <!--結合の集まりについての記述 -->
<bond id="b_1"> <!--結合についての記述 -->
<!-- 結合する原子 -->
<string builtin="atomRef">a_1</string> <!-- id属性がa_1であるatom要素を参照する -->
<string builtin="atomRef">a_2</string> <!-- id属性がa_2であるatom要素を参照する -->
<string builtin="order" convention="MDL">1</string> <!-- 単結合 -->
</bond>
<bond id="b_2">
<string builtin="atomRef">a_1</string>
<string builtin="atomRef">a_5</string>
<string builtin="order" convention="MDL">1</string> <!-- 単結合 -->
</bond>
<bond id="b_3">
<string builtin="atomRef">a_1</string>
<string builtin="atomRef">a_6</string>
<string builtin="order" convention="MDL">1</string> <!-- 単結合 -->
</bond>
<bond id="b_4">
<string builtin="atomRef">a_2</string>
<string builtin="atomRef">a_3</string>
<string builtin="order" convention="MDL">1</string> <!-- 単結合 -->
</bond>
<bond id="b_5">
<string builtin="atomRef">a_2</string>
<string builtin="atomRef">a_4</string>
<string builtin="order" convention="MDL">2</string> <!-- 二重結合 -->
</bond>
<bond id="b_6">
<string builtin="atomRef">a_3</string>
<string builtin="atomRef">a_7</string>
<string builtin="order" convention="MDL">1</string> <!-- 単結合 -->
</bond>
<bond id="b_7">
<string builtin="atomRef">a_3</string>
<string builtin="atomRef">a_8</string>
<string builtin="order" convention="MDL">1</string> <!-- 単結合 -->
</bond>
</bondArray>
</molecule>
</cml>
▼図2 尿素の分子構造図
前回のビジネス・グラフ(チャート)のボキャブラリの話の中で,表データからチャートを表わすSVGへXSL変換(XSLT)しようとしても,XSLTの基本関数が足らないために,何らかの拡張が必要になる,と書きましたが,CMLデータから分子構造図を表わすSVGへXSLTしようとすると,やはり同じ問題が生じます。ちなみに,XSLTでは,基本関数を超える関数(例えば,三角関数)については拡張要素や拡張関数で対応することを定義しており,そうした機能を実現したXSLTプロセッサが幾つか存在します。しかし,それらに合わせたスタイルシートの相互運用性が低いことは明らかです。もしかしたら,XSLTはサーバー側で用いられることが多いので,そのことは余り問題にはならないのかもしれません。
一方,W3Cで提案されているXML Binding Language(XBL)というボキャブラリは,XSLTよりも豊富な関数が利用できるECMAScript(いわゆるJavascript)を包含したHTML文書と同様に,XML文書でもJavascriptを包含できるようにしたものです。例えば,クライアント側においてCMLデータをXBL結合(binding)によってSVGへ変換して閲覧できるようになります。周知の通り,Javascriptを包含したHTML文書においては,特定の文書要素(例えば,input)の中にonLoad,onClick,onChangeといったイベント属性を指定することによって対応するスクリプトの関数手続きを呼び出します。XBLもそれに似た仕組みですが,対象となるのはXML文書ですので,文書要素と手続きの結合方法は,少し複雑な形をしています。
ここでは,SVG Open 2005 conferenceで発表されたCMLボキャブラリをSVGで表示するためのsXBL(SVG's XML Binding Language)の事例を紹介します。図3は,SVG 1.2で表わしたSVG文書の中に,CML文書と,その表示をDOM水準3を介して制御するsXBL文書を包含した複合文書です(この複合文書では三つの名前空間でそれぞれの要素を区別していることに注目してください)。sXBLでは文書要素に対する制御のスクリプトをハンドラとして記述します。図3では,詳細な記述は省略しましたが,おおよその機能をご理解いただけるのではないかと思います。その詳細については該当のWebサイトをご覧ください。
▼図3 SVG文書の中にCML文書とsXBL文書を包含した複合文書
<s:svg xmlns:s="http://www.w3.org/2000/svg" version="1.2"
xmlns:b="http://www.w3.org/2004/xbl"
xmlns:c="http://www.xml-cml.org/schema/cml2/core">
<!-- SVGとsXBLの記述 -->
<s:defs>
<b:xbl>
<!-- cml要素に対する結合の定義 -->
<b:definition id="cml" element="c:cml">
<b:template> <!-- SVGルートを生成するテンプレート -->
<s:svg><b:content /></s:svg>
</b:template>
</b:definition>
<!-- molecule要素に対する結合の定義 -->
<b:definition id="molecule" element="c:molecule">
<b:template> <!-- molecule要素の子要素についてのテンプレート -->
<b:content includes="atomArray|atom|bondArray|bond" />
</b:template>
</b:definition>
<!-- atom要素に対する結合の定義 -->
<b:definition id="atom" element="c:atom">
<b:template> <!-- 原子を円として描くcircle要素のテンプレート -->
<s:circle cx="" cy="" r="" />
</b:template>
<b:handlerGroup> <!-- ECMAScriptで記述するハンドラ -->
<s:handler>
<!-- 原子の座標として円の中心(cx属性とcy属性)と半径(r属性)を設定する -->
<!-- 原子の種類に応じて円の塗りつぶし色を設定する -->
</s:handler>
</b:handlerGroup>
</b:definition>
<!-- bond要素に対する結合の定義 -->
<!-- (略) -->
</b:xbl>
</s:defs>
<!-- CMLの記述(図1を参照) -->
<c:cml>
<c:molecule title="urea">
<c:atomArray>
<c:atom id="a_1">
<!-- 原子についての記述 -->
<!-- (略) -->
</c:atom>
<!-- その他の原子についての記述 -->
<!-- (略) -->
</c:atomArray>
<c:bondArray>
<c:bond id="b_1">
<!-- 結合についての記述 -->
<!-- (略) -->
</c:bond>
<!-- その他の結合についての記述 -->
<!-- (略) -->
</c:bondArray>
</c:molecule>
</c:cml>
</s:svg>
SVGに積極的に取り組んでいるWebブラウザのMozillaでも,SVG 1.2がまだ作業案の段階ということもあってか,sXBLはまだ実現してないようです。そこで私は,sXBLとは全く異なるソリューションであるオーサリング・ツールのxfyでCMLViewerで実現しました。それはオープンソースのmolecule.xslとchimeral.xslを翻案したもので,XSLTのロジックをxfyのロジックへ置き換えた例です。CMLViewerは,CML文書を読んで分子構造図を表示します。その閲覧では,原子の表現(記号や球体)[図4,図5を参照],倍率,各軸の回転などの条件を変更でき,さらにCML文書に質量スペクトルのデータが含まれていれば,それも図示できます。また,内部的にSVGへ変換した分子構造図や質量スペクトル図[図6を参照]をファイルへ保存できます。ぜひダウンロードしてお試しください。
▼図4 尿素の分子構造図(記号表現)
▼図5 尿素の分子構造図(球体表現)
▼図6 尿素の質量スペクトル図
▲このページのTOPへ