見出し画像

【W1】ChEMBLから化合物データを取得_09_ChEMBLデータ処理メタノード_Step5

本パートの目的
ChEMBLからデータを抽出する方法の学習:
• ある特定の標的に対して評価済みのリガンドを見つける
• 取得可能な生理活性データでフィルタリング
• pIC50値の計算
• データフレームを結合し、取り出した分子を描画

(引用元) https://magattaca.hatenablog.com/entry/2020/04/11/150334

【Step4までのおさらい】
TeachOpenCADD W1(文頭の図を参照)の
【1.Data acquisition from ChEMBLメタノード】

画像1

の中のStep4まで説明しました。

上記の「本パートの目的」のうち、
「• 取得可能な生理活性データでフィルタリング」まで実はほぼ終わってますが、今回Step5は活性データの名寄せを実装しています。
具体的には全てのモル濃度をnMへ変換処理します。

画像2

ただ、前回説明した通り、Step4で単位(カラム名はstandard_units)がnMの行だけに絞り込んであるので、Step5で実際に単位が変換処理される行はなかったです。

一般的には名寄せは大切なデータ標準化のための前処理なので、中身を見ていきたいと思います。

【String To Number】

技術的なところはまたもやまっきーさんにお任せしてしまいますね。

網羅的な説明で頭が下がる思いです。

ChEMBLでIC50の数値が入っているのがstandard_valueカラムなのですが、現時点では文字列データ扱い(String型)なので、数値(Double型)へデータ型変換します。

今回の場合は下記の通り、First(standard_value)のみを右のIncludeウィンドウに設定しておきます。

画像3

このノードの入力までは

画像4

でしたが実行後の出力は

画像5

一見わかりにくいですが1行目は96,000すなわち9万6千です。3行目の3,276.9などがわかりやすいかもしれません。文字列でなく数値として認識されるようになりましたので、この後の計算処理ができるようになりました。

【Java Snippet】Convert all moler units to nM

とうとうこのノードの中身を説明する時がやってきました。正直これを使ったらノーコードとは謳いがたくなります。

もちろんここもまっきーさんに登場いただきます。

さて、いよいよ中身についてです。最初にお断りしますが私はJavaのコードを1から説明できるほどの力はないので、やっていることの概要を紹介するにとどめます。Configureを見てみましょう。

画像6

Java Snippetタブのみ説明してみましょう。


【Javaで入出力するデータの定義】

左上は、
Column List:このノードに入力されたデータテーブルの各カラム(列)の一覧です。
その下が、
Flow Variable List:このノードに入力された各変数の一覧です。
さらにその下に、
Input:Javaで処理する際の入力データを定義しています。

画像7

今回は幸い2種だけでわかりやすいです。

Name:入力するデータ名

First(standard_units):IC50値の単位です。データ型は「S」すなわち文字列

First(standard_units):IC50値の値です。データ型は「D」すなわち小数を含む数値

Java Type:Javaで扱う際のデータ型
それぞれ上記と同じくStringとDoubleですね。

Java Field:Javaで扱う際のField名
それぞれc_Firststandard_units, c_Firststandard_value

命名のわかりやすさは大切ですね。
(参考)https://qiita.com/rkonno/items/1b30daf83854fecbb814


最下部のウィンドウが

Output:Javaで処理した後出力するデータを定義しています。

画像8

こちらも二つ。今回は上記Inputで設定したJavaの各Fieldと1:1対応になってました。

Field Type:KNIME側にカラムとか変数とかどのようなデータとして扱うかを決めています。今回は2つともカラムとして出力。
Replaceにチェックが入っているので、処理前のデータを上書き更新します。

Name: KNIME側出力先の名前
それぞれのカラムは入力に使った二つですね。

KNIME Type:KNIME側に出力する際のデータ型です。
今回は入力時と一致しています。変えることもできます。

Arrayにはチェックが入っていないので、配列ではない(詳細は省きます)。

Java Type:Javaの処理で生じるFieldのデータ型です。
今回は処理の前後でデータ型は変わらないです。

Java Field:Javaの処理で新たに作成するFieldの名前です。
それぞれout_Firststandard_units, out_Firststandard_value


【Javaでの処理】

コードを引用しながら何をしているか、一緒に考えていきましょう。

// Enter your code here:

の下に処理内容を書いてます。大まかにいうと入力された際の単位を見て条件分けし、それぞれのIC50値をnMだったらいくつになるかと計算して補正していくと言う処理です。

// Convert units to nM
if (c_Firststandard_units.equals("pM") || c_Firststandard_units.equals("10'-12M")) {
out_Firststandard_value = c_Firststandard_value / 1000;
}

もし入力の単位(c_Firststandard_units)が"pM"もしくは"10'-12M"であれば、
値の出力(out_Firststandard_value)へはc_Firststandard_value / 1000の計算結果を代入。pMからnMならそりゃそうですね。また、ChEBMLでは10の-12乗を10'-12って表記する慣習があるんですね。私は知りませんでした。

else if (c_Firststandard_units.equals("10'-11M")) {
out_Firststandard_value = c_Firststandard_value / 100;
}

あるいはもし入力が"10'-11M"であれば、
出力へはc_Firststandard_value / 100の計算結果を代入。これもわかりますね。

else if (c_Firststandard_units.equals("10'-10M")) {
out_Firststandard_value = c_Firststandard_value / 10;
}

これも同様。

else if (c_Firststandard_units.equals("nM") || c_Firststandard_units.equals("10'-9M")) {
out_Firststandard_value = c_Firststandard_value;
}

なるほど値はnM単位へと補正する必要がないですね。

後も同様なんでおそらく大丈夫と省略します。
ただし、

else if (c_Firststandard_units.equals("uM") || c_Firststandard_units.equals("/uM") || c_Firststandard_units.equals("10'-6M")) {
out_Firststandard_value = c_Firststandard_value * 1000;
}

は入力が"uM"もしくは"/uM"もしくは"10'-6M"だったら
出力へはc_Firststandard_value * 1000の計算結果を代入。
ここで、「あー"/uM"って”μM”なのか!!」と驚きました。

これつまり「ネ申」と同様ですよね。私には新しかった。

でまたいくつかは省略して、

else if (c_Firststandard_units.equals("M")) {
out_Firststandard_value = c_Firststandard_value * 1000000000;
}

で一通り列記完了です。これらの各場合をKNIMEのノードだけで分岐処理したら11通りにフローを分岐して、集計して、と大がかりですもんね。

最後にそれ以外の場合、つまり上記で列挙したすべてと入力の単位が一致しなかったら、

else {
out_Firststandard_value = null;
}

値はどう変換していいか決めてないから空白値へと変えておく。

これで出力されるIC50値(out_Firststandard_value)は全てnM単位での値に換算されました。

// Replace all units with nM
out_Firststandard_units = "nM";

 で、最後に入力時は単位はいろいろな種類があったものを、出力する時の単位(out_Firststandard_units)全て"nM"と変える。

 最初に定義した通り、KNIME側としては入力したIC50の単位と値が上記の変換処理後全て上書き更新されて出力されると言うことになります。

 私がくどく書いてしまったんで長くなりました。
Java Snippetが多数の分岐などの複雑な処理を一つのノードで、しかもより高速に実行できることを知ってもらうにはわかりやすい好例だったと思います。


【Row Filterふたたび】Only nM

画像9

前回から同じような使い方ばかり話していますので省略します。
Workflowが正常に動いているなら、このノードで削除される行はないはずです。

【ChEMBLにおける名寄せの大切さ】

今回のデモデータでは特に役立たなかった上記の名寄せ機能は、ChEMBLのデータクレンジングでは一般的には必須です。公共データは提供元が多様なため、バベルの塔のようになっているからです。

上記のJava Snippetは落ち着いて中身を見たらとてもシンプルな作りなので、きっと各種用途に合わせてカスタマイズして利活用できることでしょう。

それではデータがすっかり標準化されたところでStep6へと進めましょう。



閑話休題

【Javaの魔力は万能です】

そもそも
「KNIME Analytics Platform 4.4はEclipseの更新版と、より重要なJavaをベースにしています。」

したがってKNIMEがJavaと最高に相性がいいのはもちろんのことです。

InfocomのOさんについて以前に紹介しました。

なにせKNIMEのextensionsを作って世界に提供する人なので、java「ネ申」でもあります。
多分Oさんが本気を出すと、W1は

画像10

こうなると予想します。
Javaの魔力は万能です!
(参考)https://seijyonomaryoku.jp/

冗談です。


いいなと思ったら応援しよう!

ナイメスト
記事を読んでいただきありがとうございます。 先人の智慧をお借りしつつ、みなさんに役立つ情報が届けられたらと願っています。 もしサポートいただけるなら、そのお金はKNIMEの無料勉強会の開催資金に充てようと思います。