⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 alogp.java

📁 化学图形处理软件
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/* $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 + -