ファンデルワールス体積

わざわざ3次元座標を生成しなくても、
各原子の原子タイプから回帰分析により近似できる記述子があります。
たとえば、疎水性(XLogP)、表面積(TPSA)、そして今回、
分子の体積を求めます。


Zhaoら*1によると、
以下の式でファンデルワールス体積Vが近似できるそうです。
 V = Σ(原子の寄与) - 5.92 x (結合の数) - 14.7 x (芳香環の数) - 3.8 x (非芳香環の数)


CDKにも、VABCDescriptorクラスとして実装されています。


/* vabc.java */

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

import java.util.HashMap;
import java.util.Map;
import org.openscience.cdk.CDKConstants;
import org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector;
import org.openscience.cdk.config.AtomTypeFactory;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.ringsearch.SSSRFinder;


class vabc {

private static Map<String,Double> bondiiVolumes = new HashMap<String, Double>() {{
put("H", 7.2382293504);
put("C", 20.5795259250667);
put("N", 15.5985308577667);
put("O", 14.7102267005611);
put("Cl", 22.4492971208333);
put("Br", 26.5218483279667);
put("F", 13.3057882007064);
put("I", 32.5150310206656);
put("S",24.4290240576);
put("P",24.4290240576);
put("As", 26.5218483279667);
put("B", 40.48);
put("Se", 28.7309115245333);
put("Si", 38.7923854248);
}};
private static AtomTypeFactory atomTypeList = null;

public static void main(String args[]){

if(args.length!=1){
System.err.println("vabc <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() ){
IMolecule imol = (IMolecule)isr.next();
String id = (String)imol.getProperty("cdk:Title");

double sum = 0.0;
try{
if (atomTypeList == null) {
atomTypeList = AtomTypeFactory.getInstance(
"org/openscience/cdk/dict/data/cdk-atom-types.owl",
imol.getBuilder() // take whatever we got first
);
}
int totalHCount = 0;
for (IAtom atom : imol.atoms()) {
Double bondiiVolume = bondiiVolumes.get(atom.getSymbol());
if (bondiiVolume == null)
throw new CDKException("Unsupported element.");

sum += bondiiVolume;

// add volumes of implicit hydrogens?
IAtomType type = atomTypeList.getAtomType(atom.getAtomTypeName());
if (type == null)
throw new CDKException("Unknown atom type: " + atom.getSymbol());
if (type.getFormalNeighbourCount() == null)
throw new CDKException("Formal neighbor count not given for : "
+ type.getAtomTypeName());
int hCount = type.getFormalNeighbourCount() -
imol.getConnectedAtomsCount(atom);
sum += (hCount * bondiiVolumes.get("H"));
totalHCount += hCount;
}
sum -= 5.92 * (imol.getBondCount() + totalHCount);

boolean[] originalFlags = imol.getFlags();
CDKHueckelAromaticityDetector.detectAromaticity(imol);
SSSRFinder ringFinder = new SSSRFinder(imol);
IRingSet ringSet = ringFinder.findSSSR();
if (ringSet.getAtomContainerCount() > 0) {
int aromRingCount = 0;
int nonAromRingCount = 0;
for (IAtomContainer ring : ringSet.atomContainers()) {
if (ringIsAromatic(ring)) {
aromRingCount++;
} else {
nonAromRingCount++;
}
}
imol.setFlags(originalFlags);
sum -= 14.7 * aromRingCount;
sum -= 3.8 * nonAromRingCount;
}
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.printf("%s\t%.3f\n", id, sum);
}
}


private static boolean ringIsAromatic(IAtomContainer ring) {
for (IAtom atom : ring.atoms()) {
if (!atom.getFlag(CDKConstants.ISAROMATIC)) return false;
}
return true;
}

}

*1: Zhao et al. Fast Calculation of van der Waals Volume as a Sum of Atomic and Bond Contributions and Its Application to Drug Compounds. J. Org. Chem. (2003) 68, 7368-7373 PubMed