📄 alogp.java
字号:
/* $RCSfile: $
* $Author: egonw $
* $Date: 2006-05-04 19:29:58 +0000 (Thu, 04 May 2006) $
* $Revision: 6171 $
*
* Copyright (C) 2006-2007 Todd Martin (Environmental Protection Agency)
*
* Contact: cdk-devel@lists.sourceforge.net
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public License
* as published by the Free Software Foundation; either version 2.1
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*/
package org.openscience.cdk.qsar.descriptors.molecular;
import org.openscience.cdk.CDKConstants;
import org.openscience.cdk.atomtype.EStateAtomTypeMatcher;
import org.openscience.cdk.atomtype.IAtomTypeMatcher;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.qsar.DescriptorSpecification;
import org.openscience.cdk.qsar.DescriptorValue;
import org.openscience.cdk.qsar.IMolecularDescriptor;
import org.openscience.cdk.qsar.result.DoubleArrayResult;
import org.openscience.cdk.qsar.result.IDescriptorResult;
import org.openscience.cdk.ringsearch.AllRingsFinder;
import org.openscience.cdk.tools.AtomicProperties;
import java.lang.reflect.Method;
/**
* This class calculates ALOGP (Ghose-Crippen LogKow) and the
* Ghose-Crippen molar refractivity.
*
* <p>TODO: what should sub return if have missing fragment?
* Just report sum for other fragments? Or report as -9999 and
* then dont use descriptor if have this value for any
* chemicals in cluster?
*
* <p>This descriptor uses these parameters:
* <table border="1">
* <tr>
* <td>Name</td>
* <td>Default</td>
* <td>Description</td>
* </tr>
* <tr>
* <td></td>
* <td></td>
* <td>no parameters</td>
* </tr>
* </table>
*
* Returns three values
* <ol>
* <li>ALogP - Ghose-Crippen LogKow
* <li>ALogP2
* <li>AMR - molar refractivity
* </ol>
*
* @author Todd Martin
* @cdk.module nocompile
* @cdk.set qsar-descriptors
*/
public class ALOGP implements IMolecularDescriptor {
IAtomContainer atomContainer;
IRingSet rs;
String[] fragment; // estate fragments for each atom
AtomicProperties ap; // needed to retrieve electronegativities
int[] frags = new int[121]; // counts of each type of fragment in the molecule
public int[] alogpfrag; // alogp fragments for each atom (used to see which atoms have missing fragments)
double[] fragval = new double[121];// coefficients for alogp model
double[] refracval = new double[121]; // coefficients for refractivity model
public String UnassignedAtoms="";
double ALOGP = 0.0;
double AMR = 0.0;
double ALOGP2 = 0.0;
public ALOGP() {
// fragments for ALOGP from Ghose et al., 1998
fragval[1] = -1.5603;
fragval[2] = -1.012;
fragval[3] = -0.6681;
fragval[4] = -0.3698;
fragval[5] = -1.788;
fragval[6] = -1.2486;
fragval[7] = -1.0305;
fragval[8] = -0.6805;
fragval[9] = -0.3858;
fragval[10] = 0.7555;
fragval[11] = -0.2849;
fragval[12] = 0.02;
fragval[13] = 0.7894;
fragval[14] = 1.6422;
fragval[15] = -0.7866;
fragval[16] = -0.3962;
fragval[17] = 0.0383;
fragval[18] = -0.8051;
fragval[19] = -0.2129;
fragval[20] = 0.2432;
fragval[21] = 0.4697;
fragval[22] = 0.2952;
fragval[23] = 0;
fragval[24] = -0.3251;
fragval[25] = 0.1492;
fragval[26] = 0.1539;
fragval[27] = 0.0005;
fragval[28] = 0.2361;
fragval[29] = 0.3514;
fragval[30] = 0.1814;
fragval[31] = 0.0901;
fragval[32] = 0.5142;
fragval[33] = -0.3723;
fragval[34] = 0.2813;
fragval[35] = 0.1191;
fragval[36] = -0.132;
fragval[37] = -0.0244;
fragval[38] = -0.2405;
fragval[39] = -0.0909;
fragval[40] = -0.1002;
fragval[41] = 0.4182;
fragval[42] = -0.2147;
fragval[43] = -0.0009;
fragval[44] = 0.1388;
fragval[45] = 0;
fragval[46] = 0.7341;
fragval[47] = 0.6301;
fragval[48] = 0.518;
fragval[49] = -0.0371;
fragval[50] = -0.1036;
fragval[51] = 0.5234;
fragval[52] = 0.6666;
fragval[53] = 0.5372;
fragval[54] = 0.6338;
fragval[55] = 0.362;
fragval[56] = -0.3567;
fragval[57] = -0.0127;
fragval[58] = -0.0233;
fragval[59] = -0.1541;
fragval[60] = 0.0324;
fragval[61] = 1.052;
fragval[62] = -0.7941;
fragval[63] = 0.4165;
fragval[64] = 0.6601;
fragval[65] = 0;
fragval[66] = -0.5427;
fragval[67] = -0.3168;
fragval[68] = 0.0132;
fragval[69] = -0.3883;
fragval[70] = -0.0389;
fragval[71] = 0.1087;
fragval[72] = -0.5113;
fragval[73] = 0.1259;
fragval[74] = 0.1349;
fragval[75] = -0.1624;
fragval[76] = -2.0585;
fragval[77] = -1.915;
fragval[78] = 0.4208;
fragval[79] = -1.4439;
fragval[80] = 0;
fragval[81] = 0.4797;
fragval[82] = 0.2358;
fragval[83] = 0.1029;
fragval[84] = 0.3566;
fragval[85] = 0.1988;
fragval[86] = 0.7443;
fragval[87] = 0.5337;
fragval[88] = 0.2996;
fragval[89] = 0.8155;
fragval[90] = 0.4856;
fragval[91] = 0.8888;
fragval[92] = 0.7452;
fragval[93] = 0.5034;
fragval[94] = 0.8995;
fragval[95] = 0.5946;
fragval[96] = 1.4201;
fragval[97] = 1.1472;
fragval[98] = 0;
fragval[99] = 0.7293;
fragval[100] = 0.7173;
fragval[101] = 0;
fragval[102] = -2.6737;
fragval[103] = -2.4178;
fragval[104] = -3.1121;
fragval[105] = 0;
fragval[106] = 0.6146;
fragval[107] = 0.5906;
fragval[108] = 0.8758;
fragval[109] = -0.4979;
fragval[110] = -0.3786;
fragval[111] = 1.5188;
fragval[112] = 1.0255;
fragval[113] = 0;
fragval[114] = 0;
fragval[115] = 0;
fragval[116] = -0.9359;
fragval[117] = -0.1726;
fragval[118] = -0.7966;
fragval[119] = 0.6705;
fragval[120] = -0.4801;
// fragments for AMR from Viswanadhan et al., 1989
refracval[1]=2.968;
refracval[2]=2.9116;
refracval[3]=2.8028;
refracval[4]=2.6205;
refracval[5]=3.015;
refracval[6]=2.9244;
refracval[7]=2.6329;
refracval[8]=2.504;
refracval[9]=2.377;
refracval[10]=2.5559;
refracval[11]=2.303;
refracval[12]=2.3006;
refracval[13]=2.9627;
refracval[14]=2.3038;
refracval[15]=3.2001;
refracval[16]=4.2654;
refracval[17]=3.9392;
refracval[18]=3.6005;
refracval[19]=4.487;
refracval[20]=3.2001;
refracval[21]=3.4825;
refracval[22]=4.2817;
refracval[23]=3.9556;
refracval[24]=3.4491;
refracval[25]=3.8821;
refracval[26]=3.7593;
refracval[27]=2.5009;
refracval[28]=2.5;
refracval[29]=3.0627;
refracval[30]=2.5009;
refracval[31]=0;
refracval[32]=2.6632;
refracval[33]=3.4671;
refracval[34]=3.6842;
refracval[35]=2.9372;
refracval[36]=4.019;
refracval[37]=4.777;
refracval[38]=3.9031;
refracval[39]=3.9964;
refracval[40]=3.4986;
refracval[41]=3.4997;
refracval[42]=2.7784;
refracval[43]=2.6267;
refracval[44]=2.5;
refracval[45]=0;
refracval[46]=0.8447;
refracval[47]=0.8939;
refracval[48]=0.8005;
refracval[49]=0.832;
refracval[50]=0.8;
refracval[51]=0.8188;
refracval[52]=0.9215;
refracval[53]=0.9769;
refracval[54]=0.7701;
refracval[55]=0;
refracval[56]=1.7646;
refracval[57]=1.4778;
refracval[58]=1.4429;
refracval[59]=1.6191;
refracval[60]=1.3502;
refracval[61]=1.945;
refracval[62]=0;
refracval[63]=0;
refracval[64]=11.1366;
refracval[65]=13.1149;
refracval[66]=2.6221;
refracval[67]=2.5;
refracval[68]=2.898;
refracval[69]=3.6841;
refracval[70]=4.2808;
refracval[71]=3.6189;
refracval[72]=2.5;
refracval[73]=2.7956;
refracval[74]=2.7;
refracval[75]=4.2063;
refracval[76]=4.0184;
refracval[77]=3.0009;
refracval[78]=4.7142;
refracval[79]=0;
refracval[80]=0;
refracval[81]=0.8725;
refracval[82]=1.1837;
refracval[83]=1.1573;
refracval[84]=0.8001;
refracval[85]=1.5013;
refracval[86]=5.6156;
refracval[87]=6.1022;
refracval[88]=5.9921;
refracval[89]=5.3885;
refracval[90]=6.1363;
refracval[91]=8.5991;
refracval[92]=8.9188;
refracval[93]=8.8006;
refracval[94]=8.2065;
refracval[95]=8.7352;
refracval[96]=13.9462;
refracval[97]=14.0792;
refracval[98]=14.073;
refracval[99]=12.9918;
refracval[100]=13.3408;
refracval[101]=0;
refracval[102]=0;
refracval[103]=0;
refracval[104]=0;
refracval[105]=0;
refracval[106]=7.8916;
refracval[107]=7.7935;
refracval[108]=9.4338;
refracval[109]=7.7223;
refracval[110]=5.7558;
refracval[111]=0;
refracval[112]=0;
refracval[113]=0;
refracval[114]=0;
refracval[115]=0;
refracval[116]=5.5306;
refracval[117]=5.5152;
refracval[118]=6.836;
refracval[119]=10.0101;
refracval[120]=5.2806;
try {
ap = AtomicProperties.getInstance();
} catch (Exception e) {
e.printStackTrace();
}
}
private void findUnassignedAtoms() {
UnassignedAtoms="";
for (int i = 0; i <= atomContainer.getAtomCount() - 1; i++) {
if (alogpfrag[i]==0) UnassignedAtoms+=(i+1)+"("+fragment[i]+"),";
}
}
public void calculate(IAtomContainer atomContainer, String[] fragment, IRingSet rs) {
this.atomContainer = atomContainer;
this.fragment = fragment;
this.rs = rs;
alogpfrag = new int[atomContainer.getAtomCount()];
for (int i = 1; i <= 120; i++) {
frags[i] = 0;
}
for (int i = 0; i <= atomContainer.getAtomCount() - 1; i++) {
alogpfrag[i] = 0;
try {
// instead of calling hardcoded methods here, use retrospection
// and run all methods whos name start with 'calc' except for
// 'calculate'. Nice :)
Method[] methods = this.getClass().getDeclaredMethods();
if (fragment[i] instanceof String) {
for (int j = 0; j <= methods.length - 1; j++) {
Method method = methods[j];
if (!method.getName().equals("calculate") && method.getName().startsWith("calc")) {
Object[] objs = { new Integer(i) };
//Object[] objs = { (int)(i) };
method.invoke(this, objs);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
} // end i atom loop
for (int i = 1; i <= 120; i++) {
ALOGP += fragval[i] * frags[i];
AMR += refracval[i]*frags[i];
}
ALOGP2 = ALOGP*ALOGP;
this.findUnassignedAtoms();
}
private void calcGroup001_005(int i) {
// C in CH3R
if (fragment[i].equals("SsCH3")) {
java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i));
if (((IAtom)ca.get(0)).getSymbol().equals("C")) {
frags[1]++;
alogpfrag[i] = 1;
} else {
frags[5]++;
alogpfrag[i] = 5;
}
}
}
private void calcGroup002_006_007(int i) {
// C in CH2RX
if (fragment[i].equals("SssCH2")) {
java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i));
int CarbonCount = 0;
int HeteroCount = 0;
// logger.debug("here");
for (int j = 0; j < ca.size(); j++) {
if (((IAtom)ca.get(j)).getSymbol().equals("C"))
CarbonCount++;
else
HeteroCount++;
}
if (CarbonCount == 2 && HeteroCount == 0) {
frags[2]++;
alogpfrag[i] = 2;
} else if (CarbonCount == 1 && HeteroCount == 1) {
frags[6]++;
alogpfrag[i] = 6;
} else if (CarbonCount == 0 && HeteroCount == 2) {
frags[7]++;
alogpfrag[i] = 7;
}
}
}
private void calcGroup003_008_009_010(int i) {
if (fragment[i].equals("SsssCH")) {
java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i));
int CarbonCount = 0;
int HeteroCount = 0;
// logger.debug("here");
for (int j = 0; j <= ca.size() - 1; j++) {
if (((IAtom)ca.get(j)).getSymbol().equals("C"))
CarbonCount++;
else
HeteroCount++;
}
if (CarbonCount == 3 && HeteroCount == 0) {
frags[3]++;
alogpfrag[i] = 3;
} else if (CarbonCount == 2 && HeteroCount == 1) {
frags[8]++;
alogpfrag[i] = 8;
} else if (CarbonCount == 1 && HeteroCount == 2) {
frags[9]++;
alogpfrag[i] = 9;
} else if (CarbonCount == 0 && HeteroCount == 3) {
frags[10]++;
alogpfrag[i] = 10;
}
}
}
private void calcGroup004_011_to_014(int i) {
// C in CH2RX
if (fragment[i].equals("SssssC")) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -