リピンスキーの法則

オームの法則ヘンリーの法則、メンデルの法則、ケプラーの法則マーフィーの法則、…
どの分野でも、発見した人の名前に因んだ経験則が受け継がれていますよね。
もちろん創薬分野にもあります。


これまで挙げてきた分子量、LogP、水素結合ドナー/アクセプター数は、
製薬業界では、かなりの頻度で計算されています。
なぜならば、これらの値によって、
くすりの吸収性を大まかに予測することができるからです。
リピンスキー博士は、具体的に、

  • 分子量 ≦ 500
  • LogP ≦ 5
  • 水素結合ドナー数 ≦ 5
  • 水素結合アクセプター数 ≦10

が良いとしました*1。これが「リピンスキーの法則」です。
これらのルールには、なべて5の倍数が絡むために、別名として
ルールオブファイブ(Lipinski's rule of five)」とも呼ばれています。


それでは、入力した分子がルールオブファイブを満たしているか確認してみましょう。


/* rule5.java */

import java.io.*;
import org.openscience.cdk.io.iterator.IteratingSMILESReader;
import org.openscience.cdk.interfaces.IMolecule;
import org.openscience.cdk.qsar.IMolecularDescriptor;
import org.openscience.cdk.qsar.result.DoubleResult;
import org.openscience.cdk.qsar.result.IntegerResult;
import org.openscience.cdk.qsar.descriptors.molecular.WeightDescriptor;
import org.openscience.cdk.qsar.descriptors.molecular.XLogPDescriptor;
import org.openscience.cdk.qsar.descriptors.molecular.HBondAcceptorCountDescriptor;
import org.openscience.cdk.qsar.descriptors.molecular.HBondDonorCountDescriptor;

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

if(args.length!=1){
System.err.println("rule5 <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 lipinskifailures = 0;
IMolecularDescriptor xlogP = new XLogPDescriptor();
Object[] xlogPparams = { Boolean.TRUE, Boolean.TRUE, };
int acceptors = 0;
int donors = 0;
double mwvalue = 0.0;
double xlogPvalue = 0.0;
try {
xlogP.setParameters(xlogPparams);
xlogPvalue = ( (DoubleResult) xlogP.calculate(imol).getValue() ).doubleValue();
IMolecularDescriptor acc = new HBondAcceptorCountDescriptor();
Object[] hBondparams = { Boolean.TRUE };
acc.setParameters(hBondparams);
acceptors = ( (IntegerResult) acc.calculate(imol).getValue() ).intValue();

IMolecularDescriptor don = new HBondDonorCountDescriptor();
don.setParameters(hBondparams);
donors = ( (IntegerResult) don.calculate(imol).getValue() ).intValue();

IMolecularDescriptor mw = new WeightDescriptor();
mwvalue = ( (DoubleResult) mw.calculate(imol).getValue() ).doubleValue();

if (xlogPvalue > 5.0) {
lipinskifailures += 1;
}
if (acceptors > 10) {
lipinskifailures += 1;
}
if (donors > 5) {
lipinskifailures += 1;
}
if (mwvalue > 500.0) {
lipinskifailures += 1;
}
} catch (Exception e1) {
e1.printStackTrace();
}
System.out.printf("%s\t%d\t%.1f\t%.1f\t%d\t%d\n",
id, lipinskifailures, mwvalue, xlogPvalue, acceptors, donors);
}
}
}

一方、CDK (ver 1.2.7)には、RuleOfFiveDescriptorというクラスが用意されています。
ただし、ソースをよく読むと、上の計算とは若干異なることがわかります。


197 if (rotatablebonds > 10.0) {
198 lipinskifailures += 1;
199 }

回転可能結合数(rotatable bond count)も数えていますね。
(しかし、このクラスでは分子量が正しく計算されていないようです。残念ながら、お薦めできません。)

*1: Lipinski et al. Experimental and computational approaches to estimate solubility and permeability in drug discovery and development settings. Adv. Drug Deliv. Rev. (2001) 46, 3-26 PubMed