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 | このブログの読者になる | 更新情報をチェックする

2006年08月12日

CDKで隣接・結合行列の取得 その2

先日の記事では、隣接・結合行列を取得するためにAdjacencyMatrixクラスとConnectionMatrixクラスを用いました。CDKでは、これらクラスを利用しなくても簡単に隣接・結合行列を作成できます。ソースコードを載せておきますので、メソッドの使い方等の参考になればと思います。

Matrix.java



banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 12:49| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年08月11日

CDKで隣接・結合行列の取得

隣接行列と結合行列は、計算機上での分子の表現の基礎ともいえる重要な表現方法です。今回はCDKを用いてこれら行列の取得の仕方をメモしたいと思います。

CDKではorg.openscience.cdk.graph.matrixパッケージに含まれるAdjacencyMatrixクラスConnectionMatrixクラスを用いて取得できます。

 System.out.println("AdjacencyMatrix");
 int am[][] = AdjacencyMatrix.getMatrix(mol);
 for(int i=0;i<am.length;i++){
  for(int j=0;j<am[i].length;j++){
   System.out.print(am[i][j]+" ");
  }
  System.out.println();
 }

 System.out.println("\nConnectionMatrix");
 double cm[][] = ConnectionMatrix.getMatrix(mol);
 for(int i=0;i<cm.length;i++){
  for(int j=0;j<cm[i].length;j++){
   System.out.print(cm[i][j]+" ");
 }
  System.out.println();
 }

例として、以下の構造を入力してみます。
mat.png
結果:
AdjacencyMatrix
0 0 0 1 1 1
0 0 0 0 0 1
0 0 0 0 0 1
1 0 0 0 0 0
1 0 0 0 0 0
1 1 1 0 0 0

ConnectionMatrix
0.0 0.0 0.0 1.0 2.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0
0.0 0.0 0.0 0.0 0.0 1.0
1.0 0.0 0.0 0.0 0.0 0.0
2.0 0.0 0.0 0.0 0.0 0.0
1.0 1.0 1.0 0.0 0.0 0.0

隣接行列は、原子同士が結合していれば1を、そうでなければ0を当てはめます。一方、結合行列は、原子同士が結合していれば結合次数を、そうでなければ0を当てはめます。結合行列がdouble型の要素をもつ理由は、aromatic bondなどを1.5と表記したいためです。


banner_02.gif
人気ブログランキング(クリックして応援してね)

posted by わばのり at 07:51| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年08月09日

CDKとJmolの連携

CDKからJmolを利用する方法についてメモしたいと思います。最も簡単な方法は、CDK News, 2.1(2005)で記載されているCdkJmol3DPanelクラスの利用だと思います。ただし、私の利用したCDK及びJmolのバージョン(cdk-20050826,Jmol 10.00)では、CdkJmol3DPanelクラスは動作しませんでした。ネットで調べると、CdkJmol3DPanelクラスとほぼ同等のJmolPanelクラスが公開されており、こちらでは問題なく動作しました。ソースを見るとJmolViewerクラスの使い方が異なっていることが分かりました。また、CDKとJmolの連携に重要なCdkJmolAdapterクラスの使い方もJmolPanelクラスから知ることができます。

JmolPanelクラスさえ使えればあとは簡単です。

 JmolPanel jp = new JmolPanel();
 jp.setMol(mol);
 JFrame frame = new JFrame();
 Container cont = frame.getContentPane();
 cont.add(jp);
 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
 frame.pack();
 frame.setBounds(10,10,300,300);
 frame.setVisible(true);

こんな感じでJmolが利用できます。
cdkjmol.png


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 07:55| Comment(2) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年08月03日

CDKでfingerprint

CDKでは、Fingerprinterクラスを用いてfingerprintの生成を行います。先日メモしたJOELibでのfingerprint生成法とは異なり各ビットの特性を事前に定義する必要はありません。

CDKのfingerprint生成の概要ですが、まず、ある原子をrootとし、そこから任意の深さ(searchDepth)まで、DFS(Depth-First Search)を行い、経由した経路をSMILESなどの線形表記で文字列に置き換えます。次に、任意の最大値(size)を設定したハッシュ関数により文字列をハッシュ値に変換します。最後に、このハッシュ値に位置するビットを1にセットすることによりfingerprintを生成します。sizeとsearchDepthを適切に設定しないとハッシュ値の衝突や異なる分子で同じfingerprintが多発するという現象が生じます。

Fingerprinterクラスのデフォルトでは、size=1024, searchDepth=6となっています。JOELibで生成した葉酸のfingerprintと比較するためにsize=54, searchDepth=3としてfingerprintを生成したいと思います。

 mol = (Molecule)mr.read(new Molecule());
 BitSet finger = Fingerprinter.getFingerprint(mol,54,3);
 for(int i=0;i<54;i++){
  if(finger.get(i)){
   System.out.print("1");
 }else{
   System.out.print("0");
 }

folic.png
              ↓
Fingerprint:
111001011110111110111111111110111111101111101101111111


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:54| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年08月01日

CDKでASAの計算

Acessible Surface Area(ASA)の計算を行ってみます。CDKでは、NumericalSurfaceクラスを用いてASAの計算ができます。デフォルトの溶媒半径は1.4Åです。一般的に解析的な計算手法と比較して精度は落ちますが、計算速度が速いという特徴があります。

まずは、AtomContainerを引数にしてインスタンスを作成します。

 NumericalSurface ns = new NumericalSurface(mol);

ASAの計算は、calculateSurface()メソッドで実施します。

 ns.calculateSurface();

最後に、getTotalSurfaceArea()メソッドによりASAを出力します。

 System.out.println("Total ASA: "+ns.getTotalSurfaceArea());

原子ごとのASAがほしい場合は、getSurfaceArea(int atomIdx)メソッドを用います。

 for(int i=0;i<mol.getAtomCount();i++){
 try {
  double atom_asa = ns.getSurfaceArea(i);
  System.out.println("Atom "
     + (i+1)
     + " "+atom_asa);
 } catch (CDKException e) {
  e.printStackTrace();
 }

例として、ALAのASAを計算してみます。

ASA.png

出力:
Total ASA: 371.2141660913026
Atom 1 19.422585694045885
Atom 2 5.849449171443343
Atom 3 30.096359446619783
Atom 4 12.202076766236653
Atom 5 65.96169616886122
Atom 6 47.21116324776361
Atom 7 30.572670707796863
Atom 8 26.5907020193718
Atom 9 16.790634636192344
Atom 10 23.64846959959106
Atom 11 31.103599866253536
Atom 12 24.997914544001777
Atom 13 36.766844223124735


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 07:52| Comment(3) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月23日

CDKでMaximum Common Substructure

CDKで最大共通部分構造(Maximum Common Substructure:MCS)を検出する方法をメモしたいと思います。
MCSは、UniversalIsomorphismTesterクラスを用いて検出します。検出の流れを下図に示しています。まずは、getOverlaps(mol1,mol2)を用いて、Common Substructureを取得します。ここではmol1をTarget Structure、mol2をQuery Structureとします。

 List mcs_list = UniversalIsomorphismTester.getOverlaps(mol1,mol2);

次に、Common Substructureの入ったmcs_listの中から原子数が最大のものを検索します。これがMCSとなります。

 AtomContainer mcs_mol = (AtomContainer)mcs_list.get(0);
 int mcs_size = mcs_mol.getAtomCount();
 for(int i=1;i<mcs_list.size();i++){
  AtomContainer tmp_mol = (AtomContainer)mcs_list.get(i);
  if(tmp_mol.getAtomCount()>mcs_size){
   mcs_mol = tmp_mol;
   mcs_size = tmp_mol.getAtomCount();
 }
 mw.write(new Molecule(mcs_mol));

MCS.png



banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 12:19| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月22日

CDKで分子の重ね合わせ

CDKを使った分子の重ね合わせについてメモしたいと思います。CDKではKabschのアルゴリズムを用いて重ね合わせを行っており、このアルゴリズムは、CDK以外にも多くのソフトウェアで採用されています。以下に原著論文を挙げておきます。

Kabsch, W. A solution for the best rotation to relate two sets of vectors. Acta. Crystal, (1976) 32A:922-923.

Kabsch, W. A discussion of the solution for the best rotation to related two sets of vectors. Acta. Crystal, (1978) 34A:827-828.

今回は、2つのフェノール分子の重ね合わせを行ってみます。
重ね合わせには、KabchAlignmentクラスを利用します。まず、重ね合わせたい2つの分子mol1,mol2(IAtomContainerクラス)を引数として、インスタンスを作成します。この場合、mol1にmol2を重ねることになります。次に、align()メソッドで重ね合わせを行います。そして、getRMSD()メソッドにより、2つの分子の重なり具合を示すRMSDを得ることができます。

 KabschAlignment kca=null;
 try {
  kca = new KabschAlignment(mol1,mol2);
  kca.align();
  System.out.println(kca.getRMSD());
 } catch (CDKException e) {
  e.printStackTrace();
 }

重ね合わせを行ったmol2の座標がほしい場合は、まず、getCenterOfMass()メソッドによりmol1の中心座標を取得し、mol2を平行移動します。次に、rotateAtomContainer(IAtomContainer ac)メソッドを用いて、回転させることにより得ることができます。

 Point3d mol1_mass = kca.getCenterOfMass();
 for(int i=0;i<mol2.getAtomCount();i++){
  Atom atom = (Atom)mol2.getAtomAt(i);
  atom.setX3d(atom.getX3d() - mol1_mass.x);
  atom.setY3d(atom.getY3d() - mol1_mass.y);
  atom.setZ3d(atom.getZ3d() - mol1_mass.z);
 }
 kca.rotateAtomContainer(mol2);

sp.PNG

ただし、この例では、2つのフェノールの原子の番号付けは同じになっています。番号付けが異なる場合は、そのまま対応する原子同士で重ね合わせが行われるため、適切な結果を得ることができません。対策として、Morgan法などで番号付けを揃えておく、または、obfitのように部分構造検索を利用して重ね合わせる原子ペアを取得するなどが考えられます。



banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 15:02| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月19日

JChemPaint Applet

Java Applet版のJChemPaintですが、思ったよりも起動時間が短くなかなか良いと思います。以下で実際にJChemPaint Appletが使用できますので、お試しください。Canvas上でW-clickすると別Windowで操作できます。





Mol file

Applet版の分子エディタといえばJMEが多くのサイトで利用されていますが、CDKユーザとしては、JChemPaintがどれだけ普及するか楽しみにしています。


banner_02.gif
人気ブログランキング(クリックして応援してね)


posted by わばのり at 08:45| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月18日

CDK最新版(20060714)のリリース

CDKの最新版であるCDK-20060714がリリースされました。まだ、HP上では具体的な変更点(ChangeLog)やAPI documentは前回のバージョン(CDK-20050826)のままですので、詳細は分かりませんが、早速、javadocを使って、API documentを作成し、チェックしています。何かおもしろい機能が追加されていれば、メモしたいと思います。


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:19| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月13日

CDKで塩・溶媒分子の除去

mol形式には一つの分子だけでなく下図のように2つ以上の分子(塩・溶媒分子など)が含まれているケースがよくあります。これはこれでいいのですが、ドッキングや物性計算を行う場合、塩・溶媒分子などは除去したいことがあります。

remove.png

先日、分子のfragmentationで利用したConnectivityCheckerクラスを用いれば、上記内容を実装できます。ただし、今回は、“mol形式に含まれる最も大きな分子を残して、あとは除去”というシンプルな手段で代替したいと思います。

fragmentationの時と同様にpartitionIntoMolecules(Molecule mol)メソッドを使って分割を行います。

 SetOfMolecules result = ConnectivityChecker.
  partitionIntoMolecules(mol);
 Molecule mols[] = result.getMolecules();


次に、Mwの方が適切かもしれませんが、もっとも多く原子を有している分子を検索します。

 int max_size=mols[0].getAtomCount();
 int max_mol=0;
 for(int i=1;i<mols.length;i++){
  if(max_size < mols[i].getAtomCount()){
    max_size = mols[i].getAtomCount();
    max_mol = i;
  }
 }

最後に、検索された分子のみを出力します。
 try {
  mw.writeMolecule(mols[max_mol]);
 } catch (Exception e1) {
 e1.printStackTrace();
 }

単純ですが、少し手を加えれば実際に利用できると思います。


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 07:52| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月11日

CDKで分子のfragmentation その2

前回は、削除するbondを手動で設定しました。今回は、削除の候補となるbondを“Ringに含まれない単結合”と定義して、これを列挙する方法をメモしたいと思います。

まず、SSSRFinderクラスを用いて、Smallest Set of Smallest Rings (SSSR)の検出を行います。

 SSSRFinder sssr = new SSSRFinder(mol);
 RingSet rs = sssr.findSSSR();

次にMoleculeクラスのgetBondAt(int number)メソッドを用いて、bondを列挙し、各bondはRingSetクラスのgetRings(Bond bond)によりSSSRに含まれていないかチェックを行います。bondがSSSRに含まれていなければ、このメソッドは空のVectorを返しますので、これを利用します。単結合の判定はBondクラスのgetOrder()メソッドを用いて行うことができます。

 for(int i=0;i<mol.getBondCount();i++){
  Bond b = mol.getBondAt(i);
  Vector v = rs.getRings(b);
  if(v.size()==0&&b.getOrder()==1.0){
  System.out.println("bond_"+i);
  }
 }

もっとスマートな方法があるかもしれませんが、私は上記のような方法で“Ringに含まれない単結合”の判定を行っています。


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:17| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月10日

CDKで分子のfragmentation

CDKを用いたシンプルな分子のfragmentation法についてメモしたいと思います。分子のfragmentationといえばRECAP(Retrosynthetic Combinatorial Analysis Procedure)法が有名なアルゴリズムですね。

RECAP:J Chem Inf Comput Sci. 1998;38(3):511-522

さて、ここでは、単純に分子中の任意の1つのbondを削除し、生成された2つの分子を取得したいと思います。
任意のbondとして下図左のbond(7-8)を削除したいと思います。Moleculeクラス(AtomContainerクラス)のremoveBond(Atom atom1, Atom atom2)メソッドを用いて削除しますが、CDKでは、原子の番号は0からn-1になりますので、以下のように記述します。

 mol.removeBond(mol.getAtomAt(6),mol.getAtomAt(7));

次に、ConnectivityCheckerクラスのpartitionIntoMolecules(AtomContainer atomContainer)メソッドを用いて共有結合で結ばれている原子の集合を分子とし、分割を行います。

 SetOfMolecules result = ConnectivityChecker.
  partitionIntoMolecules(mol);

最後に、SetOfMoleculeクラスのgetMolecules()メソッドによりfragmentを取得します。

 Molecule mols[] = result.getMolecules();

あとは、以下のように単純にファイル出力することにより、fragmentをsdf形式等で取得できます。

 for(int i=0;i<mols.length;i++){
  Molecule frag = mols[i];
  try {
   mw.writeMolecule(frag);
  } catch (Exception e) {
   e.printStackTrace();
  }
 }

シンプルですが、便利な機能だと思います。

frag.png


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:14| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月09日

CDKでsmi2sdf その2

CDKを使って化合物の2次元座標を生成するソースコード(smi2D.java)を下に示します。参考にしてください。
さて、今回はsmi2Dを使って、実際にSMILESから2次元座標を生成したいと思います。例として用いる化合物を下記に示します。

examples.smi:
 [N+](=O)([O-])c1cc(cc(c1O)Cl)[N+](=O)[O-] CompA
 Oc1c2c(nc(n1)N)[nH]nc2 CompB
 C[C]12[CH]([CH]3[CH]([C]4(C)C(=CC(=O)CC4) \
 CC3)[CH](C1)O)CC[C]2(C(=O)COC(=O)C)O CompC

実行:
 $ java smi2D examples.smi examples.sdf

生成された2次元座標は次のようになります。画像はbabelの小技mol2psを使って作成しました。

2dcoord.png

うまく生成できていると思います。
大量の化合物の2次元座標を生成すると、中には生成できない構造もあります。その場合、sdf中のx,y,z座標のところに?が入ります。このsdfをそのままbabelにかけるとうまく動作しないようですので、?を0などの適当な数値に変換することにより、とりあえずは動作するようになります。

smi2D.java



banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 11:00| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年07月08日

CDKでsmi2sdf

CDKでは、化合物の2次元座標の生成ができます。最近、Web上で公開されている分子ファイルは3次元座標であることも多いのですが、いろいろな面で2次元座標も必要になることがあるので、CDKのこの機能は重宝しています。

まずは、連続してSMILESが格納されているファイルの読み込みには、IteratingSMILESReaderクラスを利用します。基本的な使い方を以下に示しますが、以前メモしたIteratingMDLReaderクラスと同じですね。

FileReader fr = null;
fr = new FileReader(new File(filename));
IteratingSMILESReader isr = new IteratingSMILESReader(fr);
while(isr.hasNext()){
 mol = (Molecule)isr.next();
}

2次元座標の生成には、StructureDiagramGeneratorクラスを利用します。setMolecule(Molecule mol)メソッドで分子をセットし、generateCoordinates()メソッドで2次元座標の生成を行い、最後に、getMolecule()メソッドで取得となります。

StructureDiagramGenerator sdg = new StructureDiagramGenerator();
sdg.setMolecule(mol);
sdg.generateCoordinates();
mol = sdg.getMolecule();


banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:49| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年06月16日

CDKで"rule of five"フィルタの作成 2

RuleOfFiveDescriptorクラスには、以下6つのメソッドがあります。

 calculate(AtomContainer mol)
 getParameterNames()
 getParameters()
 getParameterType(java.lang.String name)
 getSpecification()
 setParameters(java.lang.Object[] params)

APIの説明を読むと、getParameterNames()及びTypeあたりでクラス内で使われているdescriptorを知り、setParameters(java.lang.Object[] params)でそのdescriptorの値を任意に指定できるのかなと思いました。デフォルトでは、Lipinski's Ruleだろうけど、Mw<350などに設定したい場合があるので結構親切じゃんっと思い込んだわけです。ただ、calculate(AtomContainer mol)の説明に以下のような不可解な文書が記載されています。

 the method take a boolean checkAromaticity: if the boolean is  
 true, it means that aromaticity has to be checked

checkAromaticityがtrueならaromaticityのチェックをするんだなということは分かりますが、どうやって設定するの?と思ってしまいます。aromaticityのチェックはしておかないと特にXLogPの計算結果に影響しそうなので...もしかしてデフォルトでFALSEではないよな...など心配になってきたので、ソースコードを見ることにしました。

まずは、setParameters(java.lang.Object[] params)を見ると次のようなコードが書かれていました。

 if (params.length > 1) {
   throw new CDKException("RuleOfFiveDescriptor only expects one
   parameter");
  }
if (!(params[0] instanceof Boolean)) {
throw new CDKException("The first parameter must be of type
Boolean");
}
checkAromaticity = ((Boolean) params[0]).booleanValue();

えっ!このメソッドからcheckAromaticityがセットできることは分かりましたが、いろんなパラメータのセットができるという私の推測は見事にはずれてしまいました。ということで、以下のコードでcheckAromaticityをTRUEにできます。

 // checkAromaticityをTRUEにする
 Boolean param[] = new Boolean[1];
 param[0] = Boolean.TRUE;
 try {
  rule5.setParameters(param);
 } catch (CDKException e1) {
  System.err.println(e1.toString());
 }

本当は、コード作成者は、複数のパラメータをセットできるようにしたかったのではないかな.....
ちなみにcheckAromaticityはデフォルトでは、falseですので、注意してください。あと、当然ですが、getParameterNames()でも返ってくるのは、"checkAromaticity"だけです。

ということで、RuleOfFiveDescriptorクラスは、checkAromaticityをTRUEかFALSEに設定して、calculate()すればよい(それしかない)と思われます。

前回も記載しましたが、"rule of five"フィルタのコアになるコードは以下のようになります。
 
 //RuleOf5の計算
 dv = rule5.calculate((AtomContainer)mol);
 IntegerResult ir = (IntegerResult)dv.getValue();

 //RuleOf5を満たすものをファイル出力
 if(ir.intValue() == 0){
  mw.writeMolecule(mol);
  count++;
 }

これで、"rule of five"フィルタの完成です。
注意点としては、CDKにおける水素結合のドナー、アクセプターの定義を確認しないとせっかくの有望な化合物がこぼれてしまう可能性があること。また、CDKのlogPの計算方法(精度)も把握しておかないと同様の心配がありますので、このあたりもそのうち取り上げてみます。

CDKex2.java



banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:03| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年06月15日

CDKで"rule of five"フィルタの作成 1

CDKには、"rule of five"フィルタを簡単に構築できるRuleOfFiveDescriptorクラスがあります。"rule of five"とは、Lipinskiにより提案された化合物のDrug-likeness(薬らしさ)を評価する方法の1つです。

RuleOfFiveDescriptorクラスでは、以下のように"rule of five"の各項目を満たさなければlipinskifailuresに1を加えています。すなわち、"rule of five"を全て満たした化合物は、lipinskifailuresが0となるわけです。

 if(xlogPvalue > 5.0) { lipinskifailures += 1; }
 if(acceptors > 10) { lipinskifailures += 1; }
 if(donors > 5) { lipinskifailures += 1; }
 if(mwvalue > 500.0) { lipinskifailures += 1; }
 if(rotatablebonds > 10.0) { lipinskifailures += 1; }

今回は、sdf形式のファイルを入力し、"rule of five"を満たす化合物のファイルを出力するプログラムを作成したいと思います。

 Usage: CDKex2 data.sdf data_passed.sdf

まずは、概略ですが、data.sdfに含まれる化合物を順次取り込むために、前回用いたMDLReaderクラスではなく、IteratingMDLReaderクラスを用います。

 IteratingMDLReader itr = new IteratingMDLReader(fr);
 while(itr.hasNext())
   mol =(Molecule)itr.next();

sdf形式のファイル中にH原子が付加されていない場合は、HydrogenAdderクラスを用いて付加できます。

 HydrogenAdder adder = new HydrogenAdder();
 adder.addExplicitHydrogensToSatisfyValency(mol);

"rule of five"の評価はRuleOfFiveDescriptorクラスのcalculate()メソッドにより実施し、getValue()メソッドを用いて前述したlipinskifailuresの値を取得します。

 RuleOfFiveDescriptor rule5 = new RuleOfFiveDescriptor();
 dv = rule5.calculate((AtomContainer)mol);
 IntegerResult ir = (IntegerResult)dv.getValue();
 if(ir.intValue() == 0)
   mw.writeMolecule(mol);

RuleOfFiveDescriptorクラスはちょっとクセ(問題)のあるクラスですので、これも含め、次回、実際のコードを用いてプログラムの解説をしたいと思います。



banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 08:49| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年06月11日

CDK:出力形式について

昨日の記事で、CDKを用いてMDL mol形式の入出力を行いました。出力されたmolファイルを分子Viewerに読み込ませても表示されないという方がいるかもしれません。

この原因は、CDKの出力するmol形式のBond Blockにあります。CDKではBond Blockは例のように第7fieldまで出力します。

例:
2 1 1 0 0 0 0

私の記憶では、この第7fieldは“reacting center status”だったと思いますので、CDKの出力は妥当だと思うのですが...?(仕様書確認しないと)

一部の分子Viewerでは、この第7fieldがあると分子が表示されないことがあるようですので、解決策として、以下のように第7fieldを単純に削除すればOKです。

例:
2 1 1 0 0 0

この作業を全て手作業でやるのは大変ですので、スクリプトを書くか、もしくは、babelでmol形式からmol形式に変換することにより解決できます。

$ babel -imol input.mol -omol output.mol

babelも第7field出さないみたい....



banner_02.gif
人気ブログランキング(クリックして応援してね)

posted by わばのり at 07:29| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年06月10日

CDK:ファイル入出力

CDKを使って分子ファイルの入出力を行いたいと思います。まずは、ビルドされたCDKのjarファイルを取得し、クラスパスに追加してください。

http://sourceforge.net/project/showfiles.php?group_id=20024

Eclipseを利用されている方は、[Project]->[Properties]->[Java Build Path]を選択->[Libraries]タブをクリック->[Add External JARs]をクリックし、cdk-20050826.jarを追加してください。

今回は、MDL molファイルを入力し、単純に出力することにします。インラインフレームにソースコードを載せていますので、参考にしてください。
molファイルの入力には、MDLReaderクラスを利用します。ここで、ちょっと分かりにくい部分は、readメソッドの使い方だと思います。readメソッドは、引数にChemObjectのサブクラスのオブジェクトを渡す必要があります。今回はMoleculeクラス(ChemObjectのサブクラスの1つです)を使いますので、以下のように記述します。

mol = (Molecule)mr.read(new Molecule());

出力はMDLWriterクラスを使います。

mw.writeMolecule(mol);

その他の分子フォーマットの入出力を行いたい場合、例えば、PDB形式であれば、PDBReader, PDBWriterクラスを使えばできます。利用法もほぼ同じですので、必要に応じてXXXReader, XXXWriterクラスを探してみてください。
CDK API: http://cdk.sourceforge.net/api/





banner_02.gif
人気ブログランキング(クリックして応援してね)


posted by わばのり at 11:35| Comment(0) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

2006年06月02日

Javaでケムインフォ

The Chemistry Development Kit(CDK)は、Javaのケム/バイオインフォマティクス用ライブラリです。Cologne University Bioinformatics CenterのSteinbeck博士らにより開発がはじめられ、今では10以上の研究機関が開発に参加しています。

CDKには、ケムインフォマティクスに関する様々なクラスが用意されています。あまりにもいろんなクラスが含まれているので、まずは、APIを覗いてみましょう。
http://cdk.sourceforge.net/api/
おお!クラス名を見るだけでワクワクしますね。
さらに、CDK Newsというものも発行されており、CDKに関する最新の話題など、情報がゲットできます。

CDKを使えば様々なことが簡単にプログラミングできるのですが、特に、以前の記事でも触れましたが、2D->3Dコンバータも作れます(ただし、その精度は各自が利用してみて判断してください)。

今回は、まず、CDKで何ができるのかを知るために、CDKを使ったWebサイトを利用することにします。
以下のサイトにアクセスして下さい。
http://www.chemistry-development-kit.org/
"Input"にあるJChemPaintに分子構造を入力し、[Import from editor]ボタンを押します。そうすると"QSAR"にAtomic polarizabilitiesなどのDiscriptorが計算されます。XLogPもありますね。その他に、"Analyze"には、分子量やSMILES表記が、"Atomic Qsar"には、部分電荷が、"Render3D"では、分子の3D座標がJmolにより表示されます。

CDKWeb.png

CDKを使うことにより、このようなシステムを容易に構築できるのです。

CDKは魅力いっぱいのライブラリです。インストール方法や、クラスの使い方など、これから少しずつメモを積み重ねていきたいと思います。



banner_02.gif
人気ブログランキング(クリックして応援してね)
posted by わばのり at 07:57| Comment(5) | TrackBack(0) | CDK | このブログの読者になる | 更新情報をチェックする

広告


この広告は60日以上更新がないブログに表示がされております。

以下のいずれかの方法で非表示にすることが可能です。

・記事の投稿、編集をおこなう
・マイブログの【設定】 > 【広告設定】 より、「60日間更新が無い場合」 の 「広告を表示しない」にチェックを入れて保存する。


×

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