From: <raj...@us...> - 2007-11-20 16:30:54
|
Revision: 9470 http://cdk.svn.sourceforge.net/cdk/?rev=9470&view=rev Author: rajarshi Date: 2007-11-20 08:30:46 -0800 (Tue, 20 Nov 2007) Log Message: ----------- Update the AlogP descriptor with the code provided by Nina and Nick, which now correctly evaluates the descriptor. Also updated the EState atom type matcher to correctly match the required atom types Modified Paths: -------------- trunk/cdk/src/org/openscience/cdk/atomtype/EStateAtomTypeMatcher.java trunk/cdk/src/org/openscience/cdk/qsar/descriptors/molecular/ALOGP.java Modified: trunk/cdk/src/org/openscience/cdk/atomtype/EStateAtomTypeMatcher.java =================================================================== --- trunk/cdk/src/org/openscience/cdk/atomtype/EStateAtomTypeMatcher.java 2007-11-20 15:51:24 UTC (rev 9469) +++ trunk/cdk/src/org/openscience/cdk/atomtype/EStateAtomTypeMatcher.java 2007-11-20 16:30:46 UTC (rev 9470) @@ -25,47 +25,56 @@ import org.openscience.cdk.CDKConstants; import org.openscience.cdk.interfaces.*; -import org.openscience.cdk.ringsearch.AllRingsFinder; /** * Determines the EState atom types. - * - * @author Todd Martin + * + * @author Todd Martin + * @author nick * @cdk.module standard - * @cdk.svnrev $Revision: 9162 $ + * @cdk.svnrev $Revision: 9162 $ */ + + + public class EStateAtomTypeMatcher implements IAtomTypeMatcher { - public IAtomType findMatchingAtomType(IAtomContainer atomContainer, IAtom atom) { + IRingSet ringSet = null; + + public void setRingSet(IRingSet rs) + { + ringSet = rs; + } + + public IAtomType findMatchingAtomType(IAtomContainer atomContainer, IAtom atom) + { + IAtomType atomType = null; - try { - String fragment; - - AllRingsFinder arf = new AllRingsFinder(); - IRingSet rs = arf.findAllRings(atomContainer); - + String fragment = ""; + int NumHAtoms = 0; int NumSingleBonds2 = 0; int NumDoubleBonds2 = 0; int NumTripleBonds2 = 0; int NumAromaticBonds2 = 0; int NumAromaticBondsTotal2 = 0; - + String element = atom.getSymbol(); - - java.util.List<IAtom> attachedAtoms = atomContainer.getConnectedAtomsList(atom); - + + java.util.List attachedAtoms = atomContainer.getConnectedAtomsList(atom); + for (int j = 0; j <= attachedAtoms.size() - 1; j++) { - IAtom attached = attachedAtoms.get(j); + IAtom attached = (IAtom)attachedAtoms.get(j); IBond b = atomContainer.getBond(atom, attached); - + if(attached.getSymbol().equals("H")) + NumHAtoms++; + if (atom.getFlag(CDKConstants.ISAROMATIC) - && attached - .getFlag(CDKConstants.ISAROMATIC)) { - + && attached.getFlag(CDKConstants.ISAROMATIC)) { + boolean SameRing = inSameAromaticRing(atomContainer, atom, - attached, rs); - + attached, ringSet); + if (SameRing) { NumAromaticBonds2++; if (element.equals("N")) { @@ -82,9 +91,9 @@ if (b.getOrder() == 3) NumTripleBonds2++; } - + } else { - + if (b.getOrder() == 1) NumSingleBonds2++; if (b.getOrder() == 2) @@ -93,81 +102,78 @@ NumTripleBonds2++; } } - + NumSingleBonds2 = NumSingleBonds2 - NumHAtoms; + // assign frag here fragment = "S"; - + for (int j = 0; j <= NumTripleBonds2 - 1; j++) { fragment += "t"; } - + for (int j = 0; j <= NumDoubleBonds2 - 1; j++) { fragment += "d"; } - + for (int j = 0; j <= NumSingleBonds2 - 1; j++) { fragment += "s"; } - + for (int j = 0; j <= NumAromaticBonds2 - 1; j++) { fragment += "a"; } - + fragment += element; - + if (atom.getFormalCharge() == 1) { fragment += "p"; } else if (atom.getFormalCharge() == -1) { fragment += "m"; } - - fragment += "*";// flag it as unassigned fragment - - // for now set #H = 0 TODO- add routine to figure out #Hs for - // possible valence states - atom.setHydrogenCount(0); + if (NumHAtoms == 1) + fragment += "H"; + else + if (NumHAtoms > 1) + fragment += ("H" + NumHAtoms); + + //atom.setHydrogenCount(0); + atomType = atom.getBuilder().newAtomType(fragment, atom.getSymbol()); atomType.setFormalCharge(atom.getFormalCharge()); if (atom.getFlag(CDKConstants.ISAROMATIC)) atomType.setFlag(CDKConstants.ISAROMATIC, true); - + } catch (Exception e) { e.printStackTrace(); } - + return atomType; } public static boolean inSameAromaticRing(IAtomContainer m, IAtom atom1, - IAtom atom2, IRingSet rs) { - - for (int i = 0; i <= rs.getAtomContainerCount() - 1; i++) { + IAtom atom2, IRingSet rs) + { + for (int i = 0; i <= rs.getAtomContainerCount() - 1; i++) + { IRing r = (IRing) rs.getAtomContainer(i); - - if (!r.getFlag(CDKConstants.ISAROMATIC)) - continue; - - // ArrayList al=new ArrayList(); - - boolean HaveOne = false; - boolean HaveTwo = false; - - for (int j = 0; j <= r.getAtomCount() - 1; j++) { - if (m.getAtomNumber(r.getAtom(j)) == m.getAtomNumber(atom1)) - HaveOne = true; - if (m.getAtomNumber(r.getAtom(j)) == m.getAtomNumber(atom2)) - HaveTwo = true; + if (r.contains(atom1) && r.contains(atom2)) + { + if (isAromaticRing(r)) + return(true); } - - if (HaveOne && HaveTwo) { - return true; - } - - } // end ring for loop - + } return false; } - - + + + static boolean isAromaticRing(IRing ring) + { + for (int i = 0; i < ring.getAtomCount(); i++) + if(!ring.getAtom(i).getFlag(CDKConstants.ISAROMATIC)) + return(false); + + return(true); + } + } Modified: trunk/cdk/src/org/openscience/cdk/qsar/descriptors/molecular/ALOGP.java =================================================================== --- trunk/cdk/src/org/openscience/cdk/qsar/descriptors/molecular/ALOGP.java 2007-11-20 15:51:24 UTC (rev 9469) +++ trunk/cdk/src/org/openscience/cdk/qsar/descriptors/molecular/ALOGP.java 2007-11-20 16:30:46 UTC (rev 9470) @@ -25,7 +25,6 @@ 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; @@ -35,12 +34,21 @@ import org.openscience.cdk.qsar.result.IDescriptorResult; import org.openscience.cdk.ringsearch.AllRingsFinder; import org.openscience.cdk.tools.AtomicProperties; +import org.openscience.cdk.tools.LoggingTool; import java.lang.reflect.Method; /** * This class calculates ALOGP (Ghose-Crippen LogKow) and the * Ghose-Crippen molar refractivity. + * + * <b>Note</b> The code assumes that aromaticity has been detected before + * evaluating this descriptor. The code also expects that the molecule + * will have hydrogens explicitly set. For SD files, this is usually not + * a problem since hydrogens are explicit. But for the case of molecules + * obtained from SMILES, hydrogens must be made explicit. + * + * * <p>TODO: what should sub return if have missing fragment? * Just report sum for other fragments? Or report as -9999 and @@ -69,1862 +77,1936 @@ * </ol> * * @author Todd Martin - * @cdk.module nocompile - * @cdk.svnrev $Revision: 9162 $ + * @cdk.module qsar + * @cdk.svnrev $Revision: 9162 $ * @cdk.set qsar-descriptors + * @cdk.keyword logP + * @cdk.keyword lipophilicity + * @cdk.keyword refractivity + * @see org.openscience.cdk.tools.HydrogenAdder + * @see org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector */ public class ALOGP implements IMolecularDescriptor { + private LoggingTool logger; - IAtomContainer atomContainer; - IRingSet rs; - String[] fragment; // estate fragments for each atom + private boolean printDebugInfo = false; + 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=""; + AtomicProperties ap; // needed to retrieve electronegativities - double ALOGP = 0.0; - double AMR = 0.0; - double ALOGP2 = 0.0; + 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 + String UnassignedAtoms=""; - 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; + double ALOGP = 0.0; + double AMR = 0.0; + double ALOGP2 = 0.0; - // 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; + public void setDebugOn() { + printDebugInfo = true; + } - - - try { - ap = AtomicProperties.getInstance(); - } catch (Exception e) { - e.printStackTrace(); - } + public ALOGP() { + logger = new LoggingTool(this); - } + // 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; - - private void findUnassignedAtoms() { - UnassignedAtoms=""; + // 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; - for (int i = 0; i <= atomContainer.getAtomCount() - 1; i++) { - if (alogpfrag[i]==0) UnassignedAtoms+=(i+1)+"("+fragment[i]+"),"; - } - - } + try { + ap = AtomicProperties.getInstance(); + } catch (Exception e) { + e.printStackTrace(); + } + } - public void calculate(IAtomContainer atomContainer, String[] fragment, IRingSet rs) { - this.atomContainer = atomContainer; - this.fragment = fragment; - this.rs = rs; + private void findUnassignedAtoms() { + UnassignedAtoms=""; - alogpfrag = new int[atomContainer.getAtomCount()]; + for (int i = 0; i <= atomContainer.getAtomCount() - 1; i++) { + if (alogpfrag[i]==0) UnassignedAtoms+=(i+1)+"("+fragment[i]+"),"; + } + } - for (int i = 1; i <= 120; i++) { - frags[i] = 0; - } + private void calculate(IAtomContainer atomContainer, String[] fragment, IRingSet rs) { + this.atomContainer = atomContainer; + this.fragment = fragment; + this.rs = rs; + ALOGP = 0.0; + AMR = 0.0; + ALOGP2 = 0.0; - for (int i = 0; i <= atomContainer.getAtomCount() - 1; i++) { + alogpfrag = new int[atomContainer.getAtomCount()]; - 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(); + for (int i = 1; i <= 120; i++) { + frags[i] = 0; + } - 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")) { + for (int i = 0; i <= atomContainer.getAtomCount() - 1; i++) { - Object[] objs = { new Integer(i) }; - //Object[] objs = { (int)(i) }; - method.invoke(this, objs); - } - } - } + 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(); - } catch (Exception e) { - e.printStackTrace(); - } - } // end i atom loop + 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")) { - for (int i = 1; i <= 120; i++) { - ALOGP += fragval[i] * frags[i]; - AMR += refracval[i]*frags[i]; - } - ALOGP2 = ALOGP*ALOGP; - - this.findUnassignedAtoms(); - - } + Object[] objs = { new Integer(i) }; + //Object[] objs = { (int)(i) }; + method.invoke(this, objs); + } + } + } - 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; - } + } catch (Exception e) { + e.printStackTrace(); + } + } // end i atom loop - } + logger.debug("\nFound fragments and frequencies "); - } + for (int i = 1; i <= 120; i++) { + ALOGP += fragval[i] * frags[i]; + AMR += refracval[i] * frags[i]; + if (frags[i] > 0) { + logger.debug("frag " + i + " --> " + frags[i]); + } + } + ALOGP2 = ALOGP * ALOGP; - private void calcGroup002_006_007(int i) { - // C in CH2RX + this.findUnassignedAtoms(); - if (fragment[i].equals("SssCH2")) { + } - java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + private void calcGroup001_005(int i) { + // C in CH3R + if (fragment[i].equals("SsCH3")) { + java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + int htype = getHAtomType(atomContainer.getAtom(i), ca); + for (int j = 0; j < ca.size(); j++) + { + if (((IAtom)ca.get(j)).getSymbol().equals("C")) { + frags[1]++; + alogpfrag[i] = 1; + } + else + if (((IAtom)ca.get(j)).getSymbol().equals("H")) + { + frags[htype]++; + } + else + { + frags[5]++; + alogpfrag[i] = 5; + } + } + } - 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++; - } + private void calcGroup002_006_007(int i) { + // C in CH2RX - 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; - } + if (fragment[i].equals("SssCH2")) { - } + java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + int htype = getHAtomType(atomContainer.getAtom(i), ca); + 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 + if (((IAtom)ca.get(j)).getSymbol().equals("H")) + { + frags[htype]++; + } + 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) { + private void calcGroup003_008_009_010(int i) { - if (fragment[i].equals("SsssCH")) { + if (fragment[i].equals("SsssCH")) { - java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + int htype = getHAtomType(atomContainer.getAtom(i), ca); + 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 + if (((IAtom)ca.get(j)).getSymbol().equals("H")) + { + frags[htype]++; + } + else + HeteroCount++; + } - int CarbonCount = 0; - int HeteroCount = 0; + 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; + } + } + } - // logger.debug("here"); - for (int j = 0; j <= ca.size() - 1; j++) { - if (((IAtom)ca.get(j)).getSymbol().equals("C")) - CarbonCount++; - else - HeteroCount++; - } + private void calcGroup004_011_to_014(int i) { + // C in CH2RX + if (fragment[i].equals("SssssC")) { + 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; - } + if (CarbonCount == 4 && HeteroCount == 0) { + frags[4]++; + alogpfrag[i] = 4; + } else if (CarbonCount == 3 && HeteroCount == 1) { + frags[11]++; + alogpfrag[i] = 11; + } else if (CarbonCount == 2 && HeteroCount == 2) { + frags[12]++; + alogpfrag[i] = 12; + } else if (CarbonCount == 1 && HeteroCount == 3) { + frags[13]++; + alogpfrag[i] = 13; + } else if (CarbonCount == 0 && HeteroCount == 4) { + frags[14]++; + alogpfrag[i] = 14; + } + } + } - } + private void calcGroup015(int i) { + if (fragment[i].equals("SdCH2")) { + frags[15]++; + alogpfrag[i] = 15; + int htype = getHAtomType(atomContainer.getAtom(i), null); + frags[htype]+=2; + } + } - } + private void calcGroup016_018_036_037(int i) { - private void calcGroup004_011_to_014(int i) { - // C in CH2RX + IAtom ai = atomContainer.getAtom(i); + if (!fragment[i].equals("SdsCH")) + return; - if (fragment[i].equals("SssssC")) { + java.util.List ca = atomContainer.getConnectedAtomsList(ai); + int htype = getHAtomType(atomContainer.getAtom(i), ca); + frags[htype]++; - java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + boolean HaveCdX = false; + boolean HaveCsX = false; + boolean HaveCsAr = false; - int CarbonCount = 0; - int HeteroCount = 0; + for (int j = 0; j <= ca.size() - 1; j++) { + if (((IAtom)ca.get(j)).getSymbol().equals("H")) + continue; - // logger.debug("here"); - for (int j = 0; j <= ca.size() - 1; j++) { - if (((IAtom)ca.get(j)).getSymbol().equals("C")) - CarbonCount++; - else - HeteroCount++; - } + if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1) { + if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { + HaveCsX = true; + } - if (CarbonCount == 4 && HeteroCount == 0) { - frags[4]++; - alogpfrag[i] = 4; - } else if (CarbonCount == 3 && HeteroCount == 1) { - frags[11]++; - alogpfrag[i] = 11; - } else if (CarbonCount == 2 && HeteroCount == 2) { - frags[12]++; - alogpfrag[i] = 12; - } else if (CarbonCount == 1 && HeteroCount == 3) { - frags[13]++; - alogpfrag[i] = 13; - } else if (CarbonCount == 0 && HeteroCount == 4) { - frags[14]++; - alogpfrag[i] = 14; - } + if (((IAtom)ca.get(j)).getFlag(CDKConstants.ISAROMATIC)) { + HaveCsAr = true; + } - } + } else if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 2) { + if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { + HaveCdX = true; + } + } + } - } + if (HaveCdX) { + if (HaveCsAr) { + frags[37]++; + alogpfrag[i] = 37; + } else { + frags[36]++; + alogpfrag[i] = 36; + } + } else { + if (HaveCsX) { + frags[18]++; + alogpfrag[i] = 18; + } else { + frags[16]++; + alogpfrag[i] = 16; + } + } + } - private void calcGroup015(int i) { - if (fragment[i].equals("SdCH2")) { - frags[15]++; - alogpfrag[i] = 15; - } + private void calcGroup017_019_020_038_to_041(int i) { - } + IAtom ai = atomContainer.getAtom(i); - private void calcGroup016_018_036_037(int i) { + if (!fragment[i].equals("SdssC")) + return; - IAtom ai = atomContainer.getAtom(i); + java.util.List ca = atomContainer.getConnectedAtomsList(ai); - if (!fragment[i].equals("SdsCH")) - return; + int RCount = 0; + int XCount = 0; + boolean HaveCdX = false; + int AliphaticCount = 0; + int AromaticCount = 0; - java.util.List ca = atomContainer.getConnectedAtomsList(ai); + for (int j = 0; j <= ca.size() - 1; j++) { + if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1) { + if (((IAtom)ca.get(j)).getSymbol().equals("C")) { + RCount++; + } else { + XCount++; + } - boolean HaveCdX = false; - boolean HaveCsX = false; - boolean HaveCsAr = false; + if (!((IAtom)ca.get(j)).getFlag(CDKConstants.ISAROMATIC)) { + AliphaticCount++; + } else { + AromaticCount++; + } - for (int j = 0; j <= ca.size() - 1; j++) { - if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1) { - if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { - HaveCsX = true; - } + } else if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 2) { + if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { + HaveCdX = true; + } + } + } - if (((IAtom)ca.get(j)).getFlag(CDKConstants.ISAROMATIC)) { - HaveCsAr = true; - } + if (HaveCdX) { + if (AromaticCount >= 1) { // Ar-C(=X)-R + // TODO: add code to check if have R or X for nonaromatic + // attachment to C? + // if we do this check we would have missing fragment for + // Ar-C(=X)-X + // TODO: which fragment to use if we have Ar-C(=X)-Ar? Currently + // this frag is used - } else if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 2) { - if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { - HaveCdX = true; - } + frags[39]++; + alogpfrag[i] = 39; + } else if (AromaticCount == 0) { + if (RCount == 1 && XCount == 1) { + frags[40]++; + alogpfrag[i] = 40; + } else if (RCount == 0 && XCount == 2) { + frags[41]++; + alogpfrag[i] = 41; + } else { + frags[38]++; + alogpfrag[i] = 38; + } - } - } + } - if (HaveCdX) { - if (HaveCsAr) { - frags[37]++; - alogpfrag[i] = 37; - } else { - frags[36]++; - alogpfrag[i] = 36; - } - } else { - if (HaveCsX) { - frags[18]++; - alogpfrag[i] = 18; - } else { - frags[16]++; - alogpfrag[i] = 16; - } - } - } + } else { + if (RCount == 2 && XCount == 0) { + frags[17]++; + alogpfrag[i] = 17; + } else if (RCount == 1 && XCount == 1) { + frags[19]++; + alogpfrag[i] = 19; + } else if (RCount == 0 && XCount == 2) { + frags[20]++; + alogpfrag[i] = 20; + } + } - private void calcGroup017_019_020_038_to_041(int i) { + } - IAtom ai = atomContainer.getAtom(i); + private void calcGroup021_to_023_040(int i) { - if (!fragment[i].equals("SdssC")) - return; + java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + IAtom ai = atomContainer.getAtom(i); - java.util.List ca = atomContainer.getConnectedAtomsList(ai); + if (fragment[i].equals("StCH")) { + frags[21]++; + alogpfrag[i] = 21; + int htype = getHAtomType(atomContainer.getAtom(i), ca); + frags[htype]++; + } else if (fragment[i].equals("SddC")) { + if (((IAtom)ca.get(0)).getSymbol().equals("C") && ((IAtom)ca.get(1)).getSymbol().equals("C")) {// R==C==R + frags[22]++; + alogpfrag[i] = 22; + } else if (!((IAtom)ca.get(0)).getSymbol().equals("C") + && !((IAtom)ca.get(1)).getSymbol().equals("C")) {// X==C==X + frags[40]++; + alogpfrag[i] = 40; + } + } else if (fragment[i].equals("StsC")) { - int RCount = 0; - int XCount = 0; - boolean HaveCdX = false; - int AliphaticCount = 0; - int AromaticCount = 0; + boolean HaveCtX = false; + boolean HaveCsX = false; - for (int j = 0; j <= ca.size() - 1; j++) { - if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1) { - if (((IAtom)ca.get(j)).getSymbol().equals("C")) { - RCount++; - } else { - XCount++; - } + for (int j = 0; j <= ca.size() - 1; j++) { + if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1) { + if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { + HaveCsX = true; + } + } else if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 3) { + if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { + HaveCtX = true; + } + } + } - if (!((IAtom)ca.get(j)).getFlag(CDKConstants.ISAROMATIC)) { - AliphaticCount++; - } else { - AromaticCount++; - } + if (HaveCtX && !HaveCsX) { + frags[40]++; + alogpfrag[i] = 40; + } else if (HaveCsX) {// #C-X + frags[23]++; + alogpfrag[i] = 23; + } else if (!HaveCsX) { // #C-R + frags[22]++; + alogpfrag[i] = 22; + } + } + } - } else if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 2) { - if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { - HaveCdX = true; - } - } - } + private void calcGroup024_027_030_033_042(int i) + { + // 24: C in R--CH--R + // 27: C in R--CH--X + // 30: C in X--CH--X + // 33: C in R--CH...X + // 42: C in X--CH...X - if (HaveCdX) { - if (AromaticCount >= 1) { // Ar-C(=X)-R - // TODO: add code to check if have R or X for nonaromatic - // attachment to C? - // if we do this check we would have missing fragment for - // Ar-C(=X)-X - // TODO: which fragment to use if we have Ar-C(=X)-Ar? Currently - // this frag is used + if (!fragment[i].equals("SaaCH")) + return; + // logger.debug("here"); + //IAtom ai = atomContainer.getAtom(i); + java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + int htype = getHAtomType(atomContainer.getAtom(i), ca); + frags[htype]++; + IAtom ca0; + IAtom ca1; + //Determinig which neigbour is the H atom + if (((IAtom)ca.get(0)).getSymbol().equals("H")) + { + ca0 = (IAtom)ca.get(1); + ca1 = (IAtom)ca.get(2); + } + else + { + if (((IAtom)ca.get(1)).getSymbol().equals("H")) + { + ca0 = (IAtom)ca.get(0); + ca1 = (IAtom)ca.get(2); + } + else + { + ca0 = (IAtom)ca.get(0); + ca1 = (IAtom)ca.get(1); + } + } - frags[39]++; - alogpfrag[i] = 39; - } else if (AromaticCount == 0) { - if (RCount == 1 && XCount == 1) { - frags[40]++; - alogpfrag[i] = 40; - } else if (RCount == 0 && XCount == 2) { - frags[41]++; - alogpfrag[i] = 41; - } else { - frags[38]++; - alogpfrag[i] = 38; - } - } + if (ca0.getSymbol().equals("C") && ca1.getSymbol().equals("C")) { + frags[24]++; + alogpfrag[i] = 24; + return; + } - } else { - if (RCount == 2 && XCount == 0) { - frags[17]++; - alogpfrag[i] = 17; - } else if (RCount == 1 && XCount == 1) { - frags[19]++; - alogpfrag[i] = 19; - } else if (RCount == 0 && XCount == 2) { - frags[20]++; - alogpfrag[i] = 20; - } - } + // check if both hetero atoms have at least one double bond + java.util.List bonds = atomContainer.getConnectedBondsList(ca0); + boolean HaveDouble1 = false; + for (int k = 0; k <= bonds.size() - 1; k++) + { + if (((IBond)bonds.get(k)).getOrder() == 2) { + HaveDouble1 = true; + break; + } + } - } + bonds = atomContainer.getConnectedBondsList(ca1); + boolean HaveDouble2 = false; + for (int k = 0; k <= bonds.size() - 1; k++) { + if (((IBond)bonds.get(k)).getOrder() == 2) { + HaveDouble2 = true; + break; + } + } - private void calcGroup021_to_023_040(int i) { + if (!(ca0).getSymbol().equals("C") && !((IAtom)ca.get(1)).getSymbol().equals("C")) { + if (HaveDouble1 && HaveDouble2) { // X--CH--X + frags[30]++; + alogpfrag[i] = 30; + } else { // X--CH...X + frags[42]++; + alogpfrag[i] = 42; + } - java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); - IAtom ai = atomContainer.getAtom(i); + } else if (ca0.getSymbol().equals("C") && !ca1.getSymbol().equals("C") + || (!ca0.getSymbol().equals("C") && ca1.getSymbol().equals("C"))) { - if (fragment[i].equals("StCH")) { - frags[21]++; - alogpfrag[i] = 21; - } else if (fragment[i].equals("SddC")) { - if (((IAtom)ca.get(0)).getSymbol().equals("C") && ((IAtom)ca.get(1)).getSymbol().equals("C")) {// R==C==R - frags[22]++; - alogpfrag[i] = 22; - } else if (!((IAtom)ca.get(0)).getSymbol().equals("C") - && !((IAtom)ca.get(1)).getSymbol().equals("C")) {// X==C==X - frags[40]++; - alogpfrag[i] = 40; - } - } else if (fragment[i].equals("StsC")) { + if (HaveDouble1 && HaveDouble2) { // R--CH--X + frags[27]++; + alogpfrag[i] = 27; + } else {// R--CH...X + frags[33]++; + alogpfrag[i] = 33; - boolean HaveCtX = false; - boolean HaveCsX = false; + } + } + } - for (int j = 0; j <= ca.size() - 1; j++) { - if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1) { - if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { - HaveCsX = true; - } - } else if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 3) { - if (!((IAtom)ca.get(j)).getSymbol().equals("C")) { - HaveCtX = true; - } - } + private void calcGroup025_026_028_029_031_032_034_035_043_044(int i) { + // 25: R--CR--R + // 26: R--CX--R + // 28: R--CR--X + // 29: R--CX--X + // 31: X--CR--X + // 32: X--CX--X + // 34: X--CR...X + // 35: X--CX...X + // 43: X--CR...X + // 43: X--CX...X - } + if (!fragment[i].equals("SsaaC") && !fragment[i].equals("SaaaC")) + return; - if (HaveCtX && !HaveCsX) { - frags[40]++; - alogpfrag[i] = 40; - } else if (HaveCsX) {// #C-X - frags[23]++; - alogpfrag[i] = 23; - } else if (!HaveCsX) { // #C-R - frags[22]++; - alogpfrag[i] = 22; - } + IAtom ai = atomContainer.getAtom(i); + java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); - } + IAtom[] sameringatoms = new IAtom[2]; + IAtom nonringatom = atomContainer.getBuilder().newAtom(); - } + int sameringatomscount = 0; + for (int j = 0; j <= ca.size() - 1; j++) { + if (inSameAromaticRing(atomContainer, ai, ((IAtom)ca.get(j)), rs)) { + sameringatomscount++; + } - private void calcGroup024_027_030_033_042(int i) { - // 24: C in R--CH--R - // 27: C in R--CH--X - // 30: C in X--CH--X - // 33: C in R--CH...X - // 42: C in X--CH...X + } - if (!fragment[i].equals("SaaCH")) - return; - // logger.debug("here"); + if (sameringatomscount == 2) { + int count = 0; + for (int j = 0; j <= ca.size() - 1; j++) { + if (inSameAromaticRing(atomContainer, ai, ((IAtom)ca.get(j)), rs)) { + sameringatoms[count] = (IAtom)ca.get(j); + count++; + } else { + nonringatom = (IAtom)ca.get(j); + } - IAtom ai = atomContainer.getAtom(i); - java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); - IAtom ca0 = (IAtom)ca.get(0); - IAtom ca1 = (IAtom)ca.get(1); + } + } else { // sameringsatomscount==3 + // arbitrarily assign atoms: (no way to decide consistently) + sameringatoms[0] = (IAtom)ca.get(0); + sameringatoms[1] = (IAtom)ca.get(1); + nonringatom = (IAtom)ca.get(2); + } - if (ca0.getSymbol().equals("C") && ca1.getSymbol().equals("C")) { - frags[24]++; - alogpfrag[i] = 24; - return; - } + // check if both hetero atoms have at least one double bond + java.util.List bonds = atomContainer.getConnectedBondsList(sameringatoms[0]); - // check if both hetero atoms have at least one double bond - java.util.List bonds = atomContainer.getConnectedBondsList(ca0); + boolean HaveDouble1 = false; - boolean HaveDouble1 = false; + for (int k = 0; k <= bonds.size() - 1; k++) { + if (((IBond)bonds.get(k)).getOrder() == 2) { + HaveDouble1 = true; + break; + } - for (int k = 0; k <= bonds.size() - 1; k++) { - if (((IBond)bonds.get(k)).getOrder() == 2) { - HaveDouble1 = true; - break; - } + } - } + bonds = atomContainer.getConnectedBondsList(sameringatoms[1]); - bonds = atomContainer.getConnectedBondsList(ca1); + boolean HaveDouble2 = false; - boolean HaveDouble2 = false; + for (int k = 0; k <= bonds.size() - 1; k++) { + if (((IBond)bonds.get(k)).getOrder() == 2) { + HaveDouble2 = true; + break; + } - for (int k = 0; k <= bonds.size() - 1; k++) { - if (((IBond)bonds.get(k)).getOrder() == 2) { - HaveDouble2 = true; - break; - } + } - } + if (!sameringatoms[0].getSymbol().equals("C") + && !sameringatoms[1].getSymbol().equals("C")) { + if (HaveDouble1 && HaveDouble2) { // X--CR--X + if (nonringatom.getSymbol().equals("C")) { + frags[31]++; + alogpfrag[i] = 31; + } else { // X--CX--X + frags[32]++; + alogpfrag[i] = 32; + } - if (!(ca0).getSymbol().equals("C") && !((IAtom)ca.get(1)).getSymbol().equals("C")) { - if (HaveDouble1 && HaveDouble2) { // X--CH--X - frags[30]++; - alogpfrag[i] = 30; - } else { // X--CH...X - frags[42]++; - alogpfrag[i] = 42; - } + } else { - } else if (ca0.getSymbol().equals("C") && !ca1.getSymbol().equals("C") - || (!ca0.getSymbol().equals("C") && ca1.getSymbol().equals("C"))) { + if (nonringatom.getSymbol().equals("C")) { // X--CR..X + frags[43]++; + alogpfrag[i] = 43; - if (HaveDouble1 && HaveDouble2) { // R--CH--X - frags[27]++; - alogpfrag[i] = 27; - } else {// R--CH...X - frags[33]++; - alogpfrag[i] = 33; + } else { // X--CX...X + frags[44]++; + alogpfrag[i] = 44; + } - } + } + } else if (sameringatoms[0].getSymbol().equals("C") + && sameringatoms[1].getSymbol().equals("C")) { - } + if (nonringatom.getSymbol().equals("C")) {// R--CR--R + frags[25]++; + alogpfrag[i] = 25; + } else { // R--CX--R + frags[26]++; + alogpfrag[i] = 26; + } - } + } else if ((sameringatoms[0].getSymbol().equals("C") && !sameringatoms[1] + .getSymbol().equals("C")) + || (!sameringatoms[0].getSymbol().equals("C") && sameringatoms[1] + .getSymbol().equals("C"))) { - private void calcGroup025_026_028_029_031_032_034_035_043_044(int i) { - // 25: R--CR--R - // 26: R--CX--R - // 28: R--CR--X - // 29: R--CX--X - // 31: X--CR--X - // 32: X--CX--X - // 34: X--CR...X - // 35: X--CX...X - // 43: X--CR...X - // 43: X--CX...X + if (HaveDouble1 && HaveDouble2) { // R--CR--X + if (nonringatom.getSymbol().equals("C")) { + frags[28]++; + alogpfrag[i] = 28; + } else { // R--CX--X + frags[29]++; + alogpfrag[i] = 29; + } - if (!fragment[i].equals("SaasC") && !fragment[i].equals("SaaaC")) - return; + } else { - IAtom ai = atomContainer.getAtom(i); - java.util.List ca = atomContainer.getConnectedAtomsList(atomContainer.getAtom(i)); + if (nonringatom.getSymbol().equals("C")) { // R--CR..X + frags[34]++; + alogpfrag[i] = 34; - IAtom[] sameringatoms = new IAtom[2]; - IAtom nonringatom = atomContainer.getBuilder().newAtom(); + } else { // R--CX...X + frags[35]++; + alogpfrag[i] = 35; + } + } + } + } - int sameringatomscount = 0; - for (int j = 0; j <= ca.size() - 1; j++) { - if (inSameAromaticRing(atomContainer, ai, ((IAtom)ca.get(j)), rs)) { - sameringatomscount++; - } - } + private int getHAtomType(IAtom ai, java.util.List connectedAtoms) + { + //ai is the atom connected to a H atoms. + //ai environment determines what is the H atom type + //This procedure is applied only for carbons + //i.e. H atom type 50 is never returned - if (sameringatomscount == 2) { - int count = 0; - for (int j = 0; j <= ca.size() - 1; j++) { - if (inSameAromaticRing(atomContainer, ai, ((IAtom)ca.get(j)), rs)) { - sameringatoms[count] = (IAtom)ca.get(j); - count++; - } else { - nonringatom = (IAtom)ca.get(j); - } + java.util.List ca; + if (connectedAtoms == null) + ca = atomContainer.getConnectedAtomsList(ai); + else + ca = connectedAtoms; - } - } else { // sameringsatomscount==3 - // arbitrarily assign atoms: (no way to decide consistently) - sameringatoms[0] = (IAtom)ca.get(0); - sameringatoms[1] = (IAtom)ca.get(1); - nonringatom = (IAtom)ca.get(2); - } + // first check for alpha carbon: + if (ai.getSymbol().equals("C") && !ai.getFlag(CDKConstants.ISAROMATIC)) { + for (int j = 0; j <= ca.size() - 1; j++) + { + if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1 && ((IAtom)ca.get(j)).getSymbol().equals("C")) { // single bonded + java.util.List ca2 = atomContainer.getConnectedAtomsList((IAtom)ca.get(j)); - // check if both hetero atoms have at least one double bond - java.util.List bonds = atomContainer.getConnectedBondsList(sameringatoms[0]); + for (int k = 0; k <= ca2.size() - 1; k++) + { + IAtom ca2k = (IAtom)ca2.get(k); + if (!ca2k.getSymbol().equals("C")) + { + if (atomContainer.getBond(((IAtom)ca.get(j)), ca2k).getOrder() >= 2) + return 51; - boolean HaveDouble1 = false; + if (((IAtom)ca.get(j)).getFlag(CDKConstants.ISAROMATIC) + && ca2k.getFlag(CDKConstants.ISAROMATIC)) { + if (inSameAromaticRing(atomContainer, ((IAtom)ca.get(j)), ca2k, rs)) + { + return 51; + } + } + } // end !ca2[k].getSymbol().equals("C")) + } // end k loop + } // end if (atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder() == 1) { + }// end j loop + } // end if(ai.getSymbol().equals("C") && !ai.getFlag(CDKConstants.ISAROMATIC)) - for (int k = 0; k <= bonds.size() - 1; k++) { - if (((IBond)bonds.get(k)).getOrder() == 2) { - HaveDouble1 = true; - break; - } + java.util.List bonds = atomContainer.getConnectedBondsList(ai); + int doublebondcount = 0; + int triplebondcount = 0; + String hybrid = ""; - } + for (int j = 0; j <= bonds.size() - 1; j++) + { + if (((IBond)bonds.get(j)).getOrder() == 2) + doublebondcount++; + else + if (((IBond)bonds.get(j)).getOrder() == 3) + triplebondcount++; + } - bonds = atomContainer.getConnectedBondsList(sameringatoms[1]); + if (doublebondcount == 0 && triplebondcount == 0) + hybrid = "sp3"; + else + if (doublebondcount == 1 && triplebondcount == 0) + hybrid = "sp2"; + else + if (doublebondcount == 2 || triplebondcount == 1) + hybrid = "sp"; + int OxNum = 0; + int XCount = 0; - boolean HaveDouble2 = false; + for (int j = 0; j <= ca.size() - 1; j++) + { + //String s = ((IAtom)ca.get(j)).getSymbol(); + // if (s.equals("F") || s.equals("O") || s.equals("Cl") + // || s.equals("Br") || s.equals("N") || s.equals("S")) + if (ap.getNormalizedElectronegativity(((IAtom)ca.get(j)).getSymbol()) > 1) + { + java.util.List bonds2 = atomContainer.getConnectedBondsList(((IAtom)ca.get(j))); + boolean HaveDouble = false; + for (int k = 0; k <= bonds2.size() - 1; k++) + { + if (((IBond)bonds2.get(k)).getOrder() == 2) + { + HaveDouble = true; + break; + } + } + if (HaveDouble && ((IAtom)ca.get(j)).getSymbol().equals("N")) + OxNum += 2; // C-N bond order for pyridine type N's is considered to be 2 + else + OxNum += atomContainer.getBond(ai, ((IAtom)ca.get(j))).getOrder(); + } + java.util.List ca2 = atomContainer.getConnectedAtomsList(((IAtom)ca.get(j))); - for (int k = 0; k <= bonds.size() - 1; k++) { - if (((IBond)bonds.get(k)).getOrder() == 2) { - HaveDouble2 = true; - break; - } + for (int k = 0; k <= ca2.size() - 1; k++) + { + String s2 = ((IAtom)ca2.get(k)).getSymbol(); + if (!s2.equals("C")) + XCount++; + } + }// end j loop - } + if (OxNum == 0) + { + if (hybrid.equals("sp3")) + { + if (XCount == 0) + return 46; + else if (XCount == 1) + return 52; + else if (XCount == 2) + return 53; + else if (XCount == 3) + return 54; + else if (XCount >= 4) + return 55; + } + else if (hybrid.equals("sp2")) + return 47; + } + else if (OxNum == 1 && hybrid.equals("sp3")) + return 47; + else if ((OxNum == 2 && hybrid.equals("sp3")) + || (OxNum == 1 && hybrid.equals("sp2")) + || (OxNum == 0 && hybrid.equals("sp"))) + return 48; + else if ((OxNum == 3 && hybrid.equals("sp3")) + || (OxNum >= 2 && hybrid.equals("sp2")) + || (OxNum >= 1 && hybrid.equals("sp"))) + return 49; - if (!sameringatoms[0].getSymbol().equals("C") - && !sameringatoms[1].getSymbol().equals("C")) { - if (HaveDouble1 && HaveDouble2) { // X--CR--X - if (nonringatom.getSymbol().equals("C")) { - frags[31]++; - alogp... [truncated message content] |