JASONには、NMRデータを処理・解析するための強力なツールが揃っていますが、時にはJASONにはないような処理を行いたいこともあるでしょう。このブログ記事シリーズでは、「外部コマンド」という処理機能の使い方を紹介します。これにより、NMRデータを外部プログラムに渡し、何らかの処理を行わせ、その結果を再度JASONに返すようなことを実行することが出来ます。

この機能はどのような方に適しているでしょうか?例えば、Non-uniformサンプリング再構成法、新しい窓関数、信号処理技術など、新しい処理技術を開発している研究者は、このような機能が不可欠であることに気づくでしょう。実際、利用者はNMRデータの処理過程のどの時点でも、また何回でも、外部プログラムによる処理のためにデータを送ることが出来るので完全に自分のデータをコントロールすることが出来ます。

この機能はどのように動作するのでしょうか? JASONは、HDF5というファイル形式でデータを保存します。この形式は、Python、Matlab、R、Mathematicaなどを含む主要なプログラミング言語のHDF5ライブラリにより、さまざまなツールで読むことが出来ます。つまりあなたの好みの言語を外部スクリプトとして使うことが出来るのです!

データは「外部コマンド」の引数として指定されます。JASONはそれをスリム化されたHDFファイルとして生成し、外部処理に渡します。外部計算が完了すると、JASONは出力を読み返し、処理は処理リストの次の項目に進みます。

このブログでは、簡単なpythonスクリプトを使った外部コマンド処理の使い方を紹介します。ここに紹介した例は、単純にスペクトルを反転させるだけのものですが、もちろん、もっと高度な計算も可能です。限界は、もしあるとすれば、あなたの想像の中だけに存在するものです!

これから説明するpythonスクリプトを以下に示します。Pythonは、h5pyライブラリを使用してHDF5ファイルにアクセスすることができます。h5pyライブラリは、Pythonでの科学計算によく使用されるNumPy配列としてデータを返します。

 

Some Python Code

スクリプトは、python標準ライブラリからh5pyとNumPy、sysをインポートする3つのステートメントから始まります。JASONから送られたHDF5ファイルは、h5py.File()関数を使ってファイルハンドルとして開かれます。セキュリティ上の理由から、NMRデータはJASONからランダムなファイル名で送信されるため、sys.argvリストを通して、これをpythonスクリプトの入力引数の一つとして取り込みます。

ファイルを開くと、その中のNMRデータはpythonのライブラリ構文を使ってアクセスできます。HDF5ファイルはデータを格納するためにパスのような階層構造を使用し、これらのパスはライブラリのキーとして使用されます。例えば、NMRスペクトルの実数部は/JasonDocument/DataPoints/0にあり、/JasonDocument/DataPoints/1は虚数部にあります。

これでデータは NumPy の配列となり、python の通常の機能がすべて使えるようになります。この例ではデータを反転させますが、そのためには配列の各要素の符号を変える NumPy の negative() 関数を使います。データのサイズは変更していないので(データポイントの数は変更していない)、pythonの省略演算子を使ってHDF5ファイル内の適切なパスにデータを書き戻すことができます。

スクリプトを終了するには、ファイルハンドルを閉じ、変更されたデータを一時ファイルに書き戻すだけです。JASONは一時ファイルを読み返し、処理リストの残りの項目を続行します。処理が完了すると、キャンバスに表示されているスペクトルが更新されます。

An image of the Processing tab from the JEOL JASON NMR Software

外部コマンドでは2つのパラメータをとります。1つ目はコマンドで、この最初の例の場合はpythonとなります。2つ目はその引数で、pythonスクリプトへのフルパスになります。その後、処理パネルの下部にある適用ボタンを押すと、処理リストの該当箇所でスクリプトが実行されます。

下図はinvert.pyスクリプトの適用前(左)と適用後(右)です。これらのスペクトルの唯一の違いは、外部コマンド処理によるinvert.pyスクリプトの使用です。

 

An image of two spectra in the JEOL JASON NMR Software. The spectrum on the left is phased positively whilst the spectrum on the right is inverted

2つ目の例として、もう少し複雑なものを示します。以下のdouble.pyスクリプトは、元のデータの右端にスペクトルの反転コピーを付加するというものです。この場合、データポイントの数が変更されるため、関連するメタデータの幾つかのパラメータが更新される必要があります。

スクリプト自体は、前の例と同じように始まります:

 

Some Python Code

元のデータと反転コピーを結合させるために、NumPy の append 関数を利用することが出来ます。外部コマンド処理機能では、NumPy や他のライブラリで利用可能な関数のすべてを使用できるため、非常に強力なツールとなり得ます。さてここでは、2つのデータを結合させたため、データサイズが元のものより大きくなりました。そのため、この属性を更新する必要があります。データのサイズはHDFファイルに添付されている属性の1つで、h5pyライブラリの.attrsメソッドを使って読み取ることができますが、modify() メソッドを使ってこれを更新し、データがJASONに返されたときに、すべてが期待通りに動作するようにつくることが出来ます。

データの処理が終わったら、これを書き戻す必要があります。このとき、変更された配列は読み込んだ配列とは異なるサイズですが、その場で変更することはできません。これはHDF5自体に由来する制限になります。 したがって、del文を使ってHDF5ファイルの適切なエントリーを削除し、それから再作成する必要があります。最後に、開いているファイルハンドルを閉じ、処理したデータをJASONに戻します。下図はdouble.pyスクリプトの適用前(左)と適用後(右)です。違いは外部コマンド処理機能の使用のみになります。

 

外部コマンド処理は、JASONの非常に強力な機能であり、あなたのデータ分析のフローに完全な柔軟性を与えます!

このブログで使用したスクリプトはこちら(https://github.com/ijday/JASON-External_command)で入手可能で、独自の外部コマンド処理のベースとして使用することができます。このシリーズの次の記事では、他の言語を使用する方法を探ります。