アミノ酸を探せ

武道では、「守破離」という修行の順序に関する心得があるそうです。

  1. 「守」 → 所属する流派の教えを忠実に模倣する
  2. 「破」 → 他流派の教えを取り入れ発展させる
  3. 「離」 → 独自で創造的なものを生み出す

何をするにしても、模倣から始めるのが良い気がします。


ペプチドは、生体内で合成され、細胞内外で重要な機能を示す分子です。
ゲノム科学の発達により、多くの内在性ペプチドが見つかっています。
そして、例に漏れず、その機能を再現しようとして、
ペプチドに模倣したくすりの開発が行われています。
「ペプチドミメティクス(peptidomimetics)」と呼ばれているそうです。


ペプチドは通常、20種類のアミノ酸で構成されています。
したがって、化学構造のなかにアミノ酸が含まれているかを調べることは、
ペプチドミメティクスの観点から言えば、意味のあることです。


CDKには、この機能を備えたAminoAcidCountDescriptorクラス
があります。他のソフトではなかなか見られない実装ですね。少し中を覗いてみましょう。


/* aacount.java */

import java.io.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.io.iterator.IteratingSMILESReader;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;

import org.openscience.cdk.interfaces.IAminoAcid;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IAtomContainerSet;
import org.openscience.cdk.isomorphism.UniversalIsomorphismTester;
import org.openscience.cdk.templates.AminoAcids;
import java.util.List;

class aacount {

public static void main(String args[]){

if(args.length!=1){
System.err.println("aacount <smiles-file>");
System.exit(1);
}
FileInputStream fis = null;
IteratingSMILESReader isr = null;
try{
fis = new FileInputStream(new File(args[0]));
isr = new IteratingSMILESReader(fis);
} catch (Exception e) {
e.printStackTrace();
}

/* Generating amino acid patterns */
IAminoAcid[] aas = AminoAcids.createAAs();
IAtomContainerSet substructureSet = aas[0].getBuilder().newAtomContainerSet();
for (IAminoAcid aa : aas) {
substructureSet.addAtomContainer(aa);
}
for (int i = 0; i < aas.length; i++){
System.out.printf("\t%s", aas[i].getProperty(AminoAcids.RESIDUE_NAME_SHORT));
}
System.out.print("\n");

while( isr.hasNext() ){
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("cdk:Title");

int resultLength = substructureSet.getAtomContainerCount();
int [] res = new int[resultLength];
IAtomContainer substr;
for (int i=0; i<resultLength; i++) {
substr = substructureSet.getAtomContainer(i);
List maps;
try {
maps = UniversalIsomorphismTester.getSubgraphMaps(imol, substr);
if (maps == null) continue;
res[i] = maps.size();
} catch (Exception e1) {
e1.printStackTrace();
}

}
System.out.printf("%s", id);
for (int i = 0; i < aas.length; i++){
System.out.printf("\t%s", res[i]);
}
System.out.print("\n");
}
}
}

それぞれのアミノ酸について部分構造検索(UniversalIsomorphismTesterクラス)を行っていますね。
大丈夫なのでしょうか。いずれ検証してみます。