2006年08月13日

CDKでMDL形式の読み込み

CDKにおけるMDL形式(mol,sdf)ファイルの入力方法をメモしたいと思います。CDKのバージョンは、cdk-20060718を用いて行います。

まずは、1分子のみ(mol形式)の入力方法です。分子の入力確認をするために、とりあえずは、getAtomCount()メソッドで原子数を表示させています。
 
 fr = new FileReader(new File(filename));
 mr = new MDLReader(fr);
 mol = (IMolecule)mr.read(new Molecule());
 //原子数の表示
 System.out.println(mol.getAtomCount()); 

次は、複数の分子が入っているファイル(sdf形式)から一分子づつ入力する方法です。

 fr = new FileReader(new File(filename));
 imr = new IteratingMDLReade(fr,
        DefaultChemObjectBuilder.getInstance());
 while (imr.hasNext()){
  mol = (IMolecule)imr.next();
  //原子数の表示
  System.out.println(mol.getAtomCount());
 }

一分子づつ入力しますので、大規模なsdf形式の入力に適しています。

最後は、sdf形式を一度に入力する方法です。

 fr = new FileReader(new File(filename));
 mr = new MDLReader(fr);
 chemfile = (IChemFile)mr.read(new ChemFile()); ←@
 //原子数の表示
 for(int i=0;i<chemfile.getChemSequenceCount();i++){
  IChemSequence cs = chemfile.getChemSequence(i);
   for(int j=0;j<cs.getChemModelCount();j++){
    IChemModel cm = cs.getChemModel(j);
    ISetOfMolecules sms = cm.getSetOfMolecules();
     for(int k=0;k<sms.getMoleculeCount();k++){
      IMolecule mol = sms.getMolecule(k);
      System.out.println(mol.getAtomCount());
     }
   }
 }

上記ソースの@の行のみで複数の分子(sdf形式)を一度に入力しています。入力された各分子の原子数を知るためには、"//原子の表示" 以下の作業が必要となります。ChemSequenceクラス, ChemModelクラス, Moleculeクラスの関係が理解できると思います。


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 09:24| Comment(3) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
CDK って G 指定(グループ・残基指定)のある molfile の読み込みが
変じゃありませんか(下記の molfile 参照)? 僕は(G 指定を無視する)修正を
CDK のソースに施して対応しているのですが,何かいい方法は
ありませんかね?

-ISIS- 09150608382D

13 14 0 0 0 0 0 0 0 0999 V2000
-0.0931 0.1209 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
-0.0943 -0.7065 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6206 -1.1194 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.3370 -0.7060 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1.3341 0.1245 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
0.6188 0.5336 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.0471 0.5397 0.0000 O 0 0 0 0 0 0 0 0 0 0 0 0
2.7631 0.1299 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
2.7628 -0.6928 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
3.4780 -1.1025 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
4.1919 -0.6872 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
4.1861 0.1420 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
3.4704 0.5480 0.0000 C 0 0 0 0 0 0 0 0 0 0 0 0
1 2 2 0 0 0 0
5 7 1 0 0 0 0
7 8 1 0 0 0 0
3 4 2 0 0 0 0
8 9 2 0 0 0 0
4 5 1 0 0 0 0
9 10 1 0 0 0 0
2 3 1 0 0 0 0
10 11 2 0 0 0 0
5 6 2 0 0 0 0
11 12 1 0 0 0 0
6 1 1 0 0 0 0
12 13 2 0 0 0 0
13 8 1 0 0 0 0
G 8 7
Ph
M STY 1 1 SUP
M SLB 1 1 1
M SAL 1 6 8 9 10 11 12 13
M SBL 1 1 3
M SMT 1 Ph
M SBV 1 3 -0.7200 0.4100
M END
Posted by ktaz at 2006年09月15日 08:42
ktazさん:
 CDKでは、Group Abbreviationの処理が、MDL CTFile Formatsに記載されている内容と異なっているようです。CDKでは単純に、'G aaappp'中のaaaに記述されている番号の原子を単純にその次の行のLabelに置き換えているだけのようで、pppは読み込みもしていません(cdk-20060714では)。
 解決策としては、自分で実装しなおすしかないと思います。ktazさんの分子を例にしますと、removeBondメソッドを使って8-7を削除し、ConnectivityCheckerクラスを用いて、分子を分割し、8が属している方の分子をPhと定義することにより、比較的シンプルに実装可能ではないかと思います。と言いつつも私は、Group Abbreviationを使ったことがないので、間違っていたらごめんなさい。
Posted by わばのり at 2006年09月15日 13:26
そうか…やっぱりソース修正しかないのか…….
分子量の分布や Fragment の解析を行うときに
Group Abbreviation で PseudoAtom に変換されて
しまうのは避けたかったんですが……しばらくは
自分でパッチあてて使っていきます
Posted by ktaz at 2006年09月15日 22:26
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント:

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
この記事へのトラックバックURL
http://blog.seesaa.jp/tb/22275040

この記事へのトラックバック
×

この広告は1年以上新しい記事の投稿がないブログに表示されております。