XLogPの計算 (1)

分子量と並んでよく計算されるものに、「LogP(ろぐぴー)」があります。
LogPは、その化合物が油と水のどちらに溶けやすいかを示す指標で、
薬物のADME(吸収、分配、代謝、排泄)を決定する重要な因子となります。
油によく溶ける分子は、体内に吸収されやすく、組織中に長期間貯留しやすくなります。
この性質を利用して、持続効果あるいは一過性効果を狙った薬物デザインが行われています。


厳密に言うと、LogPは計算して得られるものではなく、
分析化学実験により測定して求める値です。
調べたい化合物と水と油(オクタノール)をフラスコに入れ、よく振り混ぜて
どちらの層に化合物が溶けるか分析します。
しかし、実験のコストや手間を考えると、たとえ多少の誤差が含まれても
コンピュータで予測できるとうれしいものです。


LogP予測の研究は、1960年代から続いていて、
物性予測の中でもっとも精力的に行われてきた研究のひとつです。
しかしその分、亜型が多く、初心利用者にはとっつきにくいところがあります。
まず、カテゴリーごとに整理してみます。

  • 部分構造の線形和と考える手法
    • AB/LogP
    • ACD/LogP
    • CLOGP
    • f-SYBYL
    • KowWIN
  • 原子タイプの線形和と考える手法
    • TSAR, MOLCAD
    • ALOGP
    • XLOGP
  • さらに、分子内相互作用も加味する手法
    • CLIP
    • HINT
  • トポロジー記述子(原子間の繋がりを数値化する)による手法
    • MLOGP
    • TLOGP
    • VLOGP
    • ALOGPS
  • 量子化学計算による手法
    • BLOGP
    • QLOGP


基本的に、影響を及ぼしそうな因子(計算可能なものに限る)を列挙し、
回帰分析によって、それぞれの因子に係数を割り当てる、というイメージです。


CDKには、ALOGPとXLOGPが実装されています。
今回、XLOGPを計算してみますが、
コードが長くなりそうなので、お手軽クラスXLogPDescriptorをそのまま使います。


/* xlogp.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.tools.CDKHydrogenAdder;
import org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector;
import org.openscience.cdk.qsar.descriptors.molecular.XLogPDescriptor;

class xlogp {
public static void main(String args[]){

if(args.length!=1){
System.err.println("xlogp <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();
}

XLogPDescriptor xd = new XLogPDescriptor();
Object[] xd_param = new Object[2];
xd_param[0] = new Boolean(true); // checkAromaticity
xd_param[1] = new Boolean(true); // salicylFlag
try{
xd.setParameters(xd_param);
}catch ( Exception e1) {
System.out.println(e1.toString());
}

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

double xlogp = 0.0;
try{
CDKHydrogenAdder adder = CDKHydrogenAdder.getInstance(imol.getBuilder());
adder.addImplicitHydrogens(imol);
AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(imol);
CDKHueckelAromaticityDetector.detectAromaticity(imol);
xlogp = Float.valueOf( xd.calculate(imol).getValue().toString() );
} catch (Exception e1) {
e1.printStackTrace();
}

System.out.printf("%s\t%.3f\n", id, xlogp);
}
}
}