水素結合アクセプター

前回は、すべての原子について一律に計算しましたが、
今回は、特定の条件を満たす原子についてのみ、計算してみましょう。


あらゆる分子の間にはさまざまな引力や斥力が働いていますが、
くすりの設計において最も注目されるのが「水素結合」です。
水素結合は、その名のとおり、水素を介した結合で、
数あるタイプの結合の中で比較的弱い部類に属します。
でも、その弱さがとても重要で、一過的かつ選択的な作用を
期待するには、水素結合の利用が不可欠となります。
そして、水素結合に関わる原子を見つけることは、
タンパク質への影響度を理解する上で非常に重要なのです。


それでは、水素結合のアクセプター(別の分子の水素と相互作用しうる原子)の数を
数えてみます。
今回も、お手軽クラス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 column

int 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 carbon

java.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のソースコードを読み解くと、水素結合アクセプターとは:

  • 電荷を帯びていない窒素原子のうち、酸素原子に隣接していないもの
  • 電荷を帯びていない酸素原子のうち、窒素原子または芳香性炭素原子に隣接していないもの

と定義されていますので、今回はそれに倣いました。
他のソフトではどう計算されているのか、こんど調べてみようと思います。