水素結合アクセプター
前回は、すべての原子について一律に計算しましたが、
今回は、特定の条件を満たす原子についてのみ、計算してみましょう。
あらゆる分子の間にはさまざまな引力や斥力が働いていますが、
くすりの設計において最も注目されるのが「水素結合」です。
水素結合は、その名のとおり、水素を介した結合で、
数あるタイプの結合の中で比較的弱い部類に属します。
でも、その弱さがとても重要で、一過的かつ選択的な作用を
期待するには、水素結合の利用が不可欠となります。
そして、水素結合に関わる原子を見つけることは、
タンパク質への影響度を理解する上で非常に重要なのです。
それでは、水素結合のアクセプター(別の分子の水素と相互作用しうる原子)の数を
数えてみます。
今回も、お手軽クラスHBondAcceptorCountDescriptorを使わずに行きます。
/* HBAcc.java */
import java.io.*;
import org.openscience.cdk.io.iterator.IteratingSMILESReader;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;
import org.openscience.cdk.CDKConstants;
import org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector;class HBAcc {
public static void main(String args[]){if(args.length!=1){
System.err.println("HBAcc <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();
}while( isr.hasNext() ){ // Read a file line by line
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("cdk:Title"); // The 2nd columnint hBondAcceptors = 0;
IAtomContainer ac;
try {ac = (IAtomContainer) imol.clone();
AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(ac);
CDKHueckelAromaticityDetector.detectAromaticity(ac);atomloop:
for (int atomIndex = 0; atomIndex < ac.getAtomCount(); atomIndex++) {
// looking for suitable nitrogen atoms
if (ac.getAtom(atomIndex).getSymbol().equals("N") &&
ac.getAtom(atomIndex).getFormalCharge() <= 0) {
// excluding nitrogens that are adjacent to an oxygen
java.util.List neighbours =
ac.getConnectedAtomsList(ac.getAtom(atomIndex));
for (Object neighbour : neighbours)
if (((IAtom) neighbour).getSymbol().equals("O"))
continue atomloop;
hBondAcceptors++;
}
// looking for suitable oxygen atoms
if (ac.getAtom(atomIndex).getSymbol().equals("O") &&
ac.getAtom(atomIndex).getFormalCharge() <= 0) {
//excluding oxygens that are adjacent to a nitrogen or to an aromatic carbonjava.util.List neighbours = ac.getConnectedAtomsList(ac.getAtom(atomIndex));
for (Object neighbour : neighbours)
if (((IAtom) neighbour).getSymbol().equals("N") ||
(((IAtom) neighbour).getSymbol().equals("C")
&& ((IAtom) neighbour ).getFlag(CDKConstants.ISAROMATIC)))
continue atomloop;
hBondAcceptors++;
}
}
System.out.printf("%s\t%d\n", id, hBondAcceptors);
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
CDKのソースコードを読み解くと、水素結合アクセプターとは:
と定義されていますので、今回はそれに倣いました。
他のソフトではどう計算されているのか、こんど調べてみようと思います。