/* $Revision$ $Author$ $Date$ * * Copyright (C) 2005-2007 Christian Hoppe <chhoppe@users.sf.net> * * 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._3pq.jgrapht.graph.SimpleGraph; import org.openscience.cdk.CDKConstants; import org.openscience.cdk.annotations.TestClass; import org.openscience.cdk.annotations.TestMethod; import org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.graph.BFSShortestPath; import org.openscience.cdk.graph.MoleculeGraphs; import org.openscience.cdk.interfaces.*; import org.openscience.cdk.interfaces.IAtomType.Hybridization; import org.openscience.cdk.isomorphism.UniversalIsomorphismTester; import org.openscience.cdk.isomorphism.matchers.*; import org.openscience.cdk.isomorphism.matchers.smarts.AnyOrderQueryBond; import org.openscience.cdk.isomorphism.matchers.smarts.AromaticAtom; import org.openscience.cdk.isomorphism.matchers.smarts.AromaticQueryBond; import org.openscience.cdk.isomorphism.mcss.RMap; import org.openscience.cdk.qsar.DescriptorSpecification; import org.openscience.cdk.qsar.DescriptorValue; import org.openscience.cdk.qsar.IMolecularDescriptor; import org.openscience.cdk.qsar.result.DoubleResult; import org.openscience.cdk.qsar.result.IDescriptorResult; import org.openscience.cdk.ringsearch.SSSRFinder; import org.openscience.cdk.tools.CDKHydrogenAdder; import org.openscience.cdk.tools.manipulator.AtomContainerManipulator; import org.openscience.cdk.tools.manipulator.RingSetManipulator; import java.util.ArrayList; import java.util.Iterator; import java.util.List; /** * <p>Prediction of logP based on the atom-type method called XLogP. <b>Requires * all hydrogens to be explicit</b>. * <p>For description of the methodology see Ref. @cdk.cite{WANG97} and @cdk.cite{WANG00} * or <a href="http://www.chem.ac.ru/Chemistry/Soft/XLOGP.en.html">http://www.chem.ac.ru/Chemistry/Soft/XLOGP.en.html</a>. * Actually one molecular factor is missing (presence of para Hs donor pair). * * <p>This descriptor uses these parameters: * <table border="1"> * <tr> * <td>Name</td> * <td>Default</td> * <td>Description</td> * </tr> * <tr> * <td>checkAromaticity</td> * <td>false</td> * <td>True is the aromaticity has to be checked</td> * </tr> * <tr> * <td>salicylFlag</td> * <td>false</td> * <td>True is to use the salicyl acid correction factor</td> * </tr> * </table> * * <p>changed 2005-11-03 by chhoppe<br> * -Internal hydrogen bonds are implemented<br> * CDK IDescriptor was validated against xlogp2.1<br> * As mentioned in the xlogP tutorial don't use charges, always draw bonds. To some extend we can support charges * but not in every case. * <p>CDK follows the program in following points (which is not documented in the paper):<br> * -Atomtyp 7 is -0.137<br> * -Atomtype 81 is -0.447<br> * -pi system does not consider P or S<br> * -ring system >3<br> * -aromatic ring systems >=6<br> * -N atomtypes: (ring) is always (ring)c<br> * -F 83 is not 0.375, the program uses 0.512 [2005-11-21]<br> * -hydrophobic carbon is 1-3 relationship not 1-4 [2005-11-22]<br> * -Atomtyp C 34/35/36 perception corrected [2005-11-22]; before Atomtyp perception ring perception is done -> slows run time<br> * * * * <p>In question:<br> * -Correction factor for salicylic acid (in paper, but not used by the program)<br> * -Amid classification is not consequent (in 6 rings (R2)N-C(R)=0 is eg 46 and in !6 membered rings it is amid)<br> * -sometimes O=C(R)-N(R)-C(R)=O is an amid ... sometimes not<br> * -Value for internal H bonds is in paper 0.429 but for no454 it is 0.643<br> * -pi system defintion, the neighbourhood is unclear<br> * * <p>changed 2005-11-21 by chhoppe<br> * -added new parameter for the salicyl acid correction factor<br> * -Corrected P and S perception for charges<br> * * *@author mfe4, chhoppe *@cdk.created 2004-11-03 *@cdk.module qsarmolecular * @cdk.githash *@cdk.set qsar-descriptors * @cdk.dictref qsar-descriptors:xlogP * * @cdk.keyword XLogP * @cdk.keyword descriptor */ @TestClass("org.openscience.cdk.qsar.descriptors.molecular.XLogPDescriptorTest") public class XLogPDescriptor implements IMolecularDescriptor { private boolean checkAromaticity = false; private boolean salicylFlag=false; private SSSRFinder ssrf=null; private static final String[] names = {"XLogP"}; /** * Constructor for the XLogPDescriptor object. */ public XLogPDescriptor() { } /** * Gets the specification attribute of the XLogPDescriptor object. * *@return The specification value */ @TestMethod("testGetSpecification") public DescriptorSpecification getSpecification() { return new DescriptorSpecification( "http://www.blueobelisk.org/ontologies/chemoinformatics-algorithms/#xlogP", this.getClass().getName(), "$Id$", "The Chemistry Development Kit"); } /** * Sets the parameters attribute of the XLogPDescriptor object. * *@param params The new parameters value *@exception CDKException Description of the Exception *@see #getParameters */ @TestMethod("testSetParameters_arrayObject") public void setParameters(Object[] params) throws CDKException { if (params.length != 2) { throw new CDKException("XLogPDescriptor expects two parameter"); } if (!(params[0] instanceof Boolean)) { throw new CDKException("The first parameter must be of type Boolean"); }else if(!(params[1] instanceof Boolean)) { throw new CDKException("The second parameter must be of type Boolean"); } // ok, all should be fine checkAromaticity = (Boolean) params[0]; salicylFlag= (Boolean) params[1]; } /** *Gets the parameters attribute of the XLogPDescriptor object. * *@return The parameters value [boolean checkAromaticity, boolean salicylFlag] *@see #setParameters */ @TestMethod("testGetParameters") public Object[] getParameters() { // return the parameters as used for the descriptor calculation Object[] params = new Object[2]; params[0] = checkAromaticity; params[1] = salicylFlag; return params; } @TestMethod(value="testNamesConsistency") public String[] getDescriptorNames() { return names; } private DescriptorValue getDummyDescriptorValue(Exception e) { return new DescriptorValue(getSpecification(), getParameterNames(), getParameters(), new DoubleResult(Double.NaN), getDescriptorNames(), e); } /** * Calculates the xlogP for an atom container. * * If checkAromaticity is true, the method check the aromaticity, if false, means that the aromaticity has * already been checked. It is necessary to use before the call of this mehtod the * addExplicitHydrogensToSatisfyValency method (HydrogenAdder classe). * *@param atomContainer AtomContainer *@return XLogP is a double */ @TestMethod("testCalculate_IAtomContainer") public DescriptorValue calculate(IAtomContainer atomContainer) { IAtomContainer ac; try { ac = (IAtomContainer) atomContainer.clone(); AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(ac); CDKHydrogenAdder hAdder = CDKHydrogenAdder.getInstance(ac.getBuilder()); hAdder.addImplicitHydrogens(ac); AtomContainerManipulator.convertImplicitToExplicitHydrogens(ac); } catch (CloneNotSupportedException e) { return getDummyDescriptorValue(e); } catch (CDKException e) { return getDummyDescriptorValue(e); } IRingSet rs = (IRingSet) new SSSRFinder(ac).findSSSR(); IRingSet atomRingSet=null; if (checkAromaticity) { try { CDKHueckelAromaticityDetector.detectAromaticity(ac); } catch (CDKException e) { return getDummyDescriptorValue(e); } } double xlogP = 0; // SmilesParser sp = new SmilesParser(DefaultChemObjectBuilder.getInstance()); String symbol = ""; int bondCount = 0; int atomCount = ac.getAtomCount(); int hsCount = 0; double xlogPOld=0; IBond.Order maxBondOrder = IBond.Order.SINGLE; List<Integer> hBondAcceptors=new ArrayList<Integer>(); List<Integer> hBondDonors=new ArrayList<Integer>(); int checkAminoAcid=1;//if 0 no check, if >1 check IAtom atomi = null; for (int i = 0; i < atomCount; i++) { atomi = (IAtom)ac.getAtom(i); // Problem fused ring systems atomRingSet= rs.getRings(atomi); atomi.setProperty("IS_IN_AROMATIC_RING", false); atomi.setProperty(CDKConstants.PART_OF_RING_OF_SIZE, 0); //logger.debug("atomRingSet.size "+atomRingSet.size()); if (atomRingSet.getAtomContainerCount()>0){ if (atomRingSet.getAtomContainerCount()>1){ Iterator containers = RingSetManipulator.getAllAtomContainers(atomRingSet).iterator(); atomRingSet = rs.getBuilder().newRingSet(); while (containers.hasNext()) { ssrf = new SSSRFinder((IAtomContainer)containers.next()); atomRingSet.add(ssrf.findEssentialRings()); } //logger.debug(" SSSRatomRingSet.size "+atomRingSet.size()); } for (int j=0;j<atomRingSet.getAtomContainerCount();j++){ if (j==0){ atomi.setProperty(CDKConstants.PART_OF_RING_OF_SIZE, ((IRing) atomRingSet.getAtomContainer(j)).getRingSize()); } if (((IRing)atomRingSet.getAtomContainer(j)).contains(atomi)){ if (((IRing)atomRingSet.getAtomContainer(j)).getRingSize()>=6 && atomi.getFlag(CDKConstants.ISAROMATIC)){ atomi.setProperty("IS_IN_AROMATIC_RING", true); } if (((IRing)atomRingSet.getAtomContainer(j)).getRingSize()< (Integer) atomi.getProperty(CDKConstants.PART_OF_RING_OF_SIZE)){ atomi.setProperty(CDKConstants.PART_OF_RING_OF_SIZE, ((IRing) atomRingSet.getAtomContainer(j)).getRingSize()); } } } }//else{ //logger.debug(); //} } for (int i = 0; i < atomCount; i++) { atomi = (IAtom)ac.getAtom(i); if (xlogPOld==xlogP & i>0 & !symbol.equals("H")){ //logger.debug("\nXlogPAssignmentError: Could not assign atom number:"+(i-1)); } xlogPOld=xlogP; symbol = atomi.getSymbol(); bondCount = ac.getConnectedBondsCount(atomi); hsCount = getHydrogenCount(ac, atomi); maxBondOrder = ac.getMaximumBondOrder(atomi); if (!symbol.equals("H")){ //logger.debug("i:"+i+" Symbol:"+symbol+" "+" bondC:"+bondCount+" Charge:"+atoms[i].getFormalCharge()+" hsC:"+hsCount+" maxBO:"+maxBondOrder+" Arom:"+atoms[i].getFlag(CDKConstants.ISAROMATIC)+" AtomTypeX:"+getAtomTypeXCount(ac, atoms[i])+" PiSys:"+getPiSystemsCount(ac, atoms[i])+" C=:"+getDoubleBondedCarbonsCount(ac, atoms[i])+" AromCc:"+getAromaticCarbonsCount(ac,atoms[i])+" RS:"+((Integer)atoms[i].getProperty(CDKConstants.PART_OF_RING_OF_SIZE)).intValue()+"\t"); } if (symbol.equals("C")) { if (bondCount == 2) { // C sp if (hsCount >= 1) { xlogP += 0.209; //logger.debug("XLOGP: 38 0.209"); } else { if (maxBondOrder == IBond.Order.DOUBLE) { xlogP += 2.073; //logger.debug("XLOGP: 40 2.037"); } else if (maxBondOrder == IBond.Order.TRIPLE) { xlogP += 0.33; //logger.debug("XLOGP: 39 0.33"); } } } if (bondCount == 3) { // C sp2 if ((Boolean) atomi.getProperty("IS_IN_AROMATIC_RING")) { if (getAromaticCarbonsCount(ac, atomi) >= 2 && getAromaticNitrogensCount(ac,atomi)==0) { if (hsCount == 0) { if (getAtomTypeXCount(ac, atomi) == 0 ) { xlogP += 0.296; //logger.debug("XLOGP: 34 0.296"); } else { xlogP -= 0.151; //logger.debug("XLOGP: 35 C.ar.x -0.151"); } } else { xlogP += 0.337; //logger.debug("XLOGP: 32 0.337"); } //} else if (getAromaticCarbonsCount(ac, atoms[i]) < 2 && getAromaticNitrogensCount(ac, atoms[i]) > 1) { } else if (getAromaticNitrogensCount(ac, atomi) >= 1) { if (hsCount == 0) { if (getAtomTypeXCount(ac, atomi) == 0) { xlogP += 0.174; //logger.debug("XLOGP: 36 C.ar.(X) 0.174"); } else { xlogP += 0.366; //logger.debug("XLOGP: 37 0.366"); } } else if (getHydrogenCount(ac, atomi) == 1) { xlogP += 0.126; //logger.debug("XLOGP: 33 0.126"); } } //NOT aromatic, but sp2 } else { if (hsCount == 0) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) <= 1) { xlogP += 0.05; //logger.debug("XLOGP: 26 0.05"); } else { xlogP += 0.013; //logger.debug("XLOGP: 27 0.013"); } } else if (getAtomTypeXCount(ac, atomi) == 1) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.03; //logger.debug("XLOGP: 28 -0.03"); } else { xlogP -= 0.027; //logger.debug("XLOGP: 29 -0.027"); } } else if (getAtomTypeXCount(ac, atomi) == 2) { if (getPiSystemsCount(ac, atomi) ==0) { xlogP += 0.005; //logger.debug("XLOGP: 30 0.005"); } else { xlogP -= 0.315; //logger.debug("XLOGP: 31 -0.315"); } } } if (hsCount == 1) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.466; //logger.debug("XLOGP: 22 0.466"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP += 0.136; //logger.debug("XLOGP: 23 0.136"); } } else { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.001; //logger.debug("XLOGP: 24 0.001"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.31; //logger.debug("XLOGP: 25 -0.31"); } } } if (hsCount == 2) { xlogP += 0.42; //logger.debug("XLOGP: 21 0.42"); } if (getIfCarbonIsHydrophobic(ac, atomi)) { xlogP += 0.211; //logger.debug("XLOGP: Hydrophobic Carbon 0.211"); } }//sp2 NOT aromatic } if (bondCount == 4) { // C sp3 if (hsCount == 0) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.006; //logger.debug("XLOGP: 16 -0.006"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.57; //logger.debug("XLOGP: 17 -0.57"); } if (getPiSystemsCount(ac, atomi) >= 2) { xlogP -= 0.317; //logger.debug("XLOGP: 18 -0.317"); } } else { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.316; //logger.debug("XLOGP: 19 -0.316"); } else { xlogP -= 0.723; //logger.debug("XLOGP: 20 -0.723"); } } } if (hsCount == 1) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.127; //logger.debug("XLOGP: 10 0.127"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.243; //logger.debug("XLOGP: 11 -0.243"); } if (getPiSystemsCount(ac, atomi) >= 2) { xlogP -= 0.499; //logger.debug("XLOGP: 12 -0.499"); } } else { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.205; //logger.debug("XLOGP: 13 -0.205"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.305; //logger.debug("XLOGP: 14 -0.305"); } if (getPiSystemsCount(ac, atomi) >= 2) { xlogP -= 0.709; //logger.debug("XLOGP: 15 -0.709"); } } } if (hsCount == 2) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.358; //logger.debug("XLOGP: 4 0.358"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.008; //logger.debug("XLOGP: 5 -0.008"); } if (getPiSystemsCount(ac, atomi) == 2) { xlogP -= 0.185; //logger.debug("XLOGP: 6 -0.185"); } } else { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.137; //logger.debug("XLOGP: 7 -0.137"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.303; //logger.debug("XLOGP: 8 -0.303"); } if (getPiSystemsCount(ac, atomi) == 2) { xlogP -= 0.815; //logger.debug("XLOGP: 9 -0.815"); } } } if (hsCount > 2) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.528; //logger.debug("XLOGP: 1 0.528"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP += 0.267; //logger.debug("XLOGP: 2 0.267"); } }else{ //if (getNitrogenOrOxygenCount(ac, atomi) == 1) { xlogP -= 0.032; //logger.debug("XLOGP: 3 -0.032"); } } if (getIfCarbonIsHydrophobic(ac, atomi)) { xlogP += 0.211; //logger.debug("XLOGP: Hydrophobic Carbon 0.211"); } }//csp3 }//C if (symbol.equals("N")) { //NO2 if (ac.getBondOrderSum(atomi) >= 3.0 && getOxygenCount(ac, atomi) >= 2 && maxBondOrder==IBond.Order.DOUBLE) { xlogP += 1.178; //logger.debug("XLOGP: 66 1.178"); } else { if (getPresenceOfCarbonil(ac, atomi)>=1) { // amidic nitrogen if (hsCount == 0) { if (getAtomTypeXCount(ac, atomi) == 0) { xlogP += 0.078; //logger.debug("XLOGP: 57 0.078"); } if (getAtomTypeXCount(ac, atomi) == 1) { xlogP -= 0.118; //logger.debug("XLOGP: 58 -0.118"); } } if (hsCount == 1) { if (getAtomTypeXCount(ac, atomi) == 0) { xlogP -= 0.096; hBondDonors.add(i); //logger.debug("XLOGP: 55 -0.096"); } else { xlogP -= 0.044; hBondDonors.add(i); //logger.debug("XLOGP: 56 -0.044"); } } if (hsCount == 2) { xlogP -= 0.646; hBondDonors.add(i); //logger.debug("XLOGP: 54 -0.646"); } } else {//NO amidic nitrogen if (bondCount == 1) { // -C#N if (getCarbonsCount(ac, atomi) == 1) { xlogP -= 0.566; //logger.debug("XLOGP: 68 -0.566"); } }else if (bondCount == 2) { // N sp2 if ((Boolean) atomi.getProperty("IS_IN_AROMATIC_RING")) { xlogP -= 0.493; //logger.debug("XLOGP: 67 -0.493"); if (checkAminoAcid!=0){ checkAminoAcid+=1;} } else { if (getDoubleBondedCarbonsCount(ac, atomi) == 0) { if (getDoubleBondedNitrogenCount(ac, atomi) == 0) { if (getDoubleBondedOxygenCount(ac, atomi) == 1) { xlogP += 0.427; //logger.debug("XLOGP: 65 0.427"); } } if (getDoubleBondedNitrogenCount(ac, atomi) == 1) { if (getAtomTypeXCount(ac, atomi) == 0) { xlogP += 0.536; //logger.debug("XLOGP: 63 0.536"); } if (getAtomTypeXCount(ac, atomi) == 1) { xlogP -= 0.597; //logger.debug("XLOGP: 64 -0.597"); } } }else if (getDoubleBondedCarbonsCount(ac, atomi) == 1) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.007; //logger.debug("XLOGP: 59 0.007"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.275; //logger.debug("XLOGP: 60 -0.275"); } }else if (getAtomTypeXCount(ac, atomi) == 1) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.366; //logger.debug("XLOGP: 61 0.366"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP += 0.251; //logger.debug("XLOGP: 62 0.251"); } } } } }else if (bondCount == 3) { // N sp3 if (hsCount == 0) { //if (rs.contains(atomi)&&ringSize>3) { if (atomi.getFlag(CDKConstants.ISAROMATIC)|| (rs.contains(atomi)&& (Integer) atomi.getProperty(CDKConstants.PART_OF_RING_OF_SIZE) >3 && getPiSystemsCount(ac,atomi)>=1)){ if (getAtomTypeXCount(ac, atomi) == 0) { xlogP += 0.881; //logger.debug("XLOGP: 51 0.881"); } else { xlogP -= 0.01; //logger.debug("XLOGP: 53 -0.01"); } } else { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.159; //logger.debug("XLOGP: 49 0.159"); } if (getPiSystemsCount(ac, atomi) > 0) { xlogP += 0.761; //logger.debug("XLOGP: 50 0.761"); } } else { xlogP -= 0.239; //logger.debug("XLOGP: 52 -0.239"); } } }else if (hsCount == 1) { if (getAtomTypeXCount(ac, atomi) == 0) { // like pyrrole if (atomi.getFlag(CDKConstants.ISAROMATIC)|| (rs.contains(atomi)&& (Integer) atomi.getProperty(CDKConstants.PART_OF_RING_OF_SIZE) >3 && getPiSystemsCount(ac,atomi)>=2)) { xlogP += 0.545; hBondDonors.add(i); //logger.debug("XLOGP: 46 0.545"); } else { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.112; hBondDonors.add(i); //logger.debug("XLOGP: 44 -0.112"); } if (getPiSystemsCount(ac, atomi) > 0) { xlogP += 0.166; hBondDonors.add(i); //logger.debug("XLOGP: 45 0.166"); } } } else { if (rs.contains(atomi)) { xlogP += 0.153; hBondDonors.add(i); //logger.debug("XLOGP: 48 0.153"); } else { xlogP += 0.324; hBondDonors.add(i); //logger.debug("XLOGP: 47 0.324"); } } }else if (hsCount == 2) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.534; hBondDonors.add(i); //logger.debug("XLOGP: 41 -0.534"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP -= 0.329; hBondDonors.add(i); //logger.debug("XLOGP: 42 -0.329"); } if (checkAminoAcid!=0){ checkAminoAcid+=1;} } else { xlogP -= 1.082; hBondDonors.add(i); //logger.debug("XLOGP: 43 -1.082"); } } } } } } if (symbol.equals("O")) { if (bondCount == 1 && maxBondOrder==IBond.Order.DOUBLE) { xlogP -= 0.399; if (!getPresenceOfHydroxy(ac,atomi)){ hBondAcceptors.add(i); } //logger.debug("XLOGP: 75 A=O -0.399"); }else if(bondCount == 1 && hsCount==0 && (getPresenceOfNitro(ac,atomi) || getPresenceOfCarbonil(ac,atomi)==1) || getPresenceOfSulfat(ac,atomi)){ xlogP -= 0.399; if (!getPresenceOfHydroxy(ac,atomi)){ hBondAcceptors.add(i); } //logger.debug("XLOGP: 75 A=O -0.399"); }else if (bondCount >= 1) { if (hsCount == 0 && bondCount==2) { if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.084; //logger.debug("XLOGP: 72 R-O-R 0.084"); } if (getPiSystemsCount(ac, atomi) > 0) { xlogP += 0.435; //logger.debug("XLOGP: 73 R-O-R.1 0.435"); } }else if (getAtomTypeXCount(ac, atomi) == 1) { xlogP += 0.105; //logger.debug("XLOGP: 74 R-O-X 0.105"); } }else{ if (getAtomTypeXCount(ac, atomi) == 0) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP -= 0.467; hBondDonors.add(i); hBondAcceptors.add(i); //logger.debug("XLOGP: 69 R-OH -0.467"); } if (getPiSystemsCount(ac, atomi) == 1) { xlogP += 0.082; hBondDonors.add(i); hBondAcceptors.add(i); //logger.debug("XLOGP: 70 R-OH.1 0.082"); } }else if (getAtomTypeXCount(ac, atomi) == 1) { xlogP -= 0.522; hBondDonors.add(i); hBondAcceptors.add(i); //logger.debug("XLOGP: 71 X-OH -0.522"); } } } } if (symbol.equals("S")) { if ((bondCount == 1 && maxBondOrder==IBond.Order.DOUBLE) || (bondCount == 1 && atomi.getFormalCharge()==-1)) { xlogP -= 0.148; //logger.debug("XLOGP: 78 A=S -0.148"); }else if (bondCount == 2) { if (hsCount == 0) { xlogP += 0.255; //logger.debug("XLOGP: 77 A-S-A 0.255"); } else { xlogP += 0.419; //logger.debug("XLOGP: 76 A-SH 0.419"); } }else if (bondCount == 3) { if (getOxygenCount(ac, atomi) >= 1) { xlogP -= 1.375; //logger.debug("XLOGP: 79 A-SO-A -1.375"); } }else if (bondCount == 4) { if (getDoubleBondedOxygenCount(ac, atomi) >= 2) { xlogP -= 0.168; //logger.debug("XLOGP: 80 A-SO2-A -0.168"); } } } if (symbol.equals("P")) { if (getDoubleBondedSulfurCount(ac, atomi) >= 1 && bondCount>=4) { xlogP += 1.253; //logger.debug("XLOGP: 82 S=PA3 1.253"); }else if (getOxygenCount(ac,atomi)>=1 || getDoubleBondedOxygenCount(ac, atomi) == 1 && bondCount>=4) { xlogP -= 0.447; //logger.debug("XLOGP: 81 O=PA3 -0.447"); } } if (symbol.equals("F")) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.375; //logger.debug("XLOGP: 83 F.0 0.512"); }else if (getPiSystemsCount(ac, atomi) == 1) { xlogP += 0.202; //logger.debug("XLOGP: 84 F.1 0.202"); } } if (symbol.equals("Cl")) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.512; //logger.debug("XLOGP: 85 Cl.0 0.512"); }else if (getPiSystemsCount(ac, atomi) >= 1) { xlogP += 0.663; //logger.debug("XLOGP: 86 Cl.1 0.663"); } } if (symbol.equals("Br")) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 0.85; //logger.debug("XLOGP: 87 Br.0 0.85"); }else if (getPiSystemsCount(ac, atomi) == 1) { xlogP += 0.839; //logger.debug("XLOGP: 88 Br.1 0.839"); } } if (symbol.equals("I")) { if (getPiSystemsCount(ac, atomi) == 0) { xlogP += 1.05; //logger.debug("XLOGP: 89 I.0 1.05"); }else if (getPiSystemsCount(ac, atomi) == 1) { xlogP += 1.109; //logger.debug("XLOGP: 90 I.1 1.109"); } } // Halogen pair 1-3 int halcount=getHalogenCount(ac, atomi); if ( halcount== 2) { xlogP += 0.137; //logger.debug("XLOGP: Halogen 1-3 pair 0.137"); }else if (halcount==3){ xlogP += (3*0.137); //logger.debug("XLOGP: Halogen 1-3 pair 0.411"); }else if (halcount==4){ xlogP += (6*0.137); //logger.debug("XLOGP: Halogen 1-3 pair 1.902"); } // sp2 Oxygen 1-5 pair if (getPresenceOfCarbonil(ac, atomi) == 2) {// sp2 oxygen 1-5 pair if(!rs.contains(atomi)) { xlogP += 0.580; //logger.debug("XLOGP: sp2 Oxygen 1-5 pair 0.580"); } } } //logger.debug("XLOGP: Before Correction:"+xlogP); List path=null; SimpleGraph moleculeGraph=null; int [][] pairCheck=null; // //logger.debug("Acceptors:"+hBondAcceptors.size()+" Donors:"+hBondDonors.size()); if (hBondAcceptors.size()>0 && hBondDonors.size()>0){ moleculeGraph=MoleculeGraphs.getMoleculeGraph(ac); pairCheck=initializeHydrogenPairCheck(new int[atomCount][atomCount]); } for (int i=0; i<hBondAcceptors.size();i++){ for (int j=0; j<hBondDonors.size();j++){ if (checkRingLink(rs,ac,ac.getAtom(hBondAcceptors.get(i))) || checkRingLink(rs,ac,ac.getAtom(hBondDonors.get(j).intValue()))){ path=BFSShortestPath.findPathBetween(moleculeGraph,ac.getAtom(hBondAcceptors.get(i)), ac.getAtom((Integer) hBondDonors.get(j))); // //logger.debug(" Acc:"+checkRingLink(rs,ac,atoms[((Integer)hBondAcceptors.get(i)).intValue()]) // +" S:"+atoms[((Integer)hBondAcceptors.get(i)).intValue()].getSymbol() // +" Nr:"+((Integer)hBondAcceptors.get(i)).intValue() // +" Don:"+checkRingLink(rs,ac,atoms[((Integer)hBondDonors.get(j)).intValue()]) // +" S:"+atoms[((Integer)hBondDonors.get(j)).intValue()].getSymbol() // +" Nr:"+((Integer)hBondDonors.get(j)).intValue() // +" i:"+i+" j:"+j+" path:"+path.size()); if (checkRingLink(rs,ac,ac.getAtom(hBondAcceptors.get(i))) && checkRingLink(rs,ac,ac.getAtom(hBondDonors.get(j).intValue()))){ if (path.size()==3 && pairCheck[hBondAcceptors.get(i)][hBondDonors.get(j)]==0){ xlogP += 0.429; pairCheck[hBondAcceptors.get(i)][hBondDonors.get(j)]=1; pairCheck[hBondDonors.get(j)][hBondAcceptors.get(i)]=1; //logger.debug("XLOGP: Internal HBonds 1-4 0.429"); } }else{ if (path.size()==4 && pairCheck[hBondAcceptors.get(i)][hBondDonors.get(j)]==0){ xlogP += 0.429; pairCheck[hBondAcceptors.get(i)][hBondDonors.get(j)]=1; pairCheck[hBondDonors.get(j)][hBondAcceptors.get(i)]=1; //logger.debug("XLOGP: Internal HBonds 1-5 0.429"); } } } } } if (checkAminoAcid>1){ // alpha amino acid QueryAtomContainer aminoAcid = QueryAtomContainerCreator.createBasicQueryContainer( createAminoAcid(ac.getBuilder()) ); Iterator bonds = aminoAcid.bonds().iterator(); IAtom bondAtom0=null; IAtom bondAtom1=null; while (bonds.hasNext()) { IBond bond = (IBond) bonds.next(); bondAtom0=bond.getAtom(0); bondAtom1=bond.getAtom(1); if ((bondAtom0.getSymbol().equals("C") && bondAtom1.getSymbol().equals("N")) || (bondAtom0.getSymbol().equals("N") && bondAtom1.getSymbol().equals("C"))&& bond.getOrder() == IBond.Order.SINGLE){ aminoAcid.removeBond(bondAtom0,bondAtom1); aminoAcid.addBond(new AnyOrderQueryBond((IQueryAtom)bondAtom0,(IQueryAtom)bondAtom1,IBond.Order.SINGLE)); break; } } //AtomContainer aminoacid = sp.parseSmiles("NCC(=O)O"); try { if (UniversalIsomorphismTester.isSubgraph(ac, aminoAcid)) { List list = UniversalIsomorphismTester.getSubgraphAtomsMap(ac, aminoAcid); RMap map = null; IAtom atom1=null; for (int j = 0; j < list.size(); j++){ map = (RMap) list.get(j); atom1 = ac.getAtom(map.getId1()); if (atom1.getSymbol().equals("O")&& ac.getMaximumBondOrder(atom1)==IBond.Order.SINGLE){ if (ac.getConnectedBondsCount(atom1)==2 && getHydrogenCount(ac, atom1)==0){ }else{ xlogP -= 2.166; //logger.debug("XLOGP: alpha amino acid -2.166"); break; } } } } } catch (CDKException e) { return getDummyDescriptorValue(e); } } IAtomContainer paba = createPaba(ac.getBuilder()); // p-amino sulphonic acid try { if (UniversalIsomorphismTester.isSubgraph(ac, paba)) { xlogP -= 0.501; //logger.debug("XLOGP: p-amino sulphonic acid -0.501"); } } catch (CDKException e) { return getDummyDescriptorValue(e); } // salicylic acid if (salicylFlag){ IAtomContainer salicilic = createSalicylicAcid(ac.getBuilder()); try { if (UniversalIsomorphismTester.isSubgraph(ac, salicilic)) { xlogP += 0.554; //logger.debug("XLOGP: salicylic acid 0.554"); } } catch (CDKException e) { return getDummyDescriptorValue(e); } } // ortho oxygen pair //AtomContainer orthopair = sp.parseSmiles("OCCO"); QueryAtomContainer orthopair=new QueryAtomContainer(); AromaticAtom atom1=new AromaticAtom(); atom1.setSymbol("C"); AromaticAtom atom2=new AromaticAtom(); atom2.setSymbol("C"); SymbolQueryAtom atom3=new SymbolQueryAtom(); atom3.setSymbol("O"); SymbolQueryAtom atom4=new SymbolQueryAtom(); atom4.setSymbol("O"); orthopair.addBond(new AromaticQueryBond(atom1,atom2,IBond.Order.SINGLE)); orthopair.addBond(new OrderQueryBond(atom1,atom3,IBond.Order.SINGLE)); orthopair.addBond(new OrderQueryBond(atom2,atom4,IBond.Order.SINGLE)); try { if (UniversalIsomorphismTester.isSubgraph(ac, orthopair)) { xlogP -= 0.268; //logger.debug("XLOGP: Ortho oxygen pair -0.268"); } } catch (CDKException e) { return getDummyDescriptorValue(e); } return new DescriptorValue(getSpecification(), getParameterNames(), getParameters(), new DoubleResult(xlogP), getDescriptorNames()); } /** * Returns the specific type of the DescriptorResult object. * <p/> * The return value from this method really indicates what type of result will * be obtained from the {@link org.openscience.cdk.qsar.DescriptorValue} object. Note that the same result * can be achieved by interrogating the {@link org.openscience.cdk.qsar.DescriptorValue} object; this method * allows you to do the same thing, without actually calculating the descriptor. * * @return an object that implements the {@link org.openscience.cdk.qsar.result.IDescriptorResult} interface indicating * the actual type of values returned by the descriptor in the {@link org.openscience.cdk.qsar.DescriptorValue} object */ @TestMethod("testGetDescriptorResultType") public IDescriptorResult getDescriptorResultType() { return new DoubleResult(0.0); } /** * Method initialise the HydrogenpairCheck with a value * * @param pairCheck value * @return void */ private int[][] initializeHydrogenPairCheck(int [][] pairCheck) { for (int i = 0; i < pairCheck.length; i++) { for (int j = 0; j < pairCheck[0].length; j++) { pairCheck[i][j] = 0; } } return pairCheck; } /** * Check if atom or neighbour atom is part of a ring * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The hydrogenCount value */ private boolean checkRingLink(IRingSet ringSet, IAtomContainer ac, IAtom atom) { List<IAtom> neighbours = ac.getConnectedAtomsList(atom); if (ringSet.contains(atom)){ return true; } for (IAtom neighbour : neighbours) { if (ringSet.contains(neighbour)) { return true; } } return false; } /** * Gets the hydrogenCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The hydrogenCount value */ private int getHydrogenCount(IAtomContainer ac, IAtom atom) { List<IAtom> neighbours = ac.getConnectedAtomsList(atom); int hcounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("H")) { hcounter += 1; } } return hcounter; } /** * Gets the HalogenCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The alogenCount value */ private int getHalogenCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); int acounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("F") || neighbour.getSymbol().equals("I") || neighbour.getSymbol().equals("Cl") || neighbour.getSymbol().equals("Br")) { acounter += 1; } } return acounter; } /** * Gets the atomType X Count attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The nitrogenOrOxygenCount value */ private int getAtomTypeXCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); int nocounter = 0; IBond bond; for (IAtom neighbour : neighbours) { if ((neighbour.getSymbol().equals("N") || neighbour.getSymbol().equals("O")) && !(Boolean) neighbour.getProperty("IS_IN_AROMATIC_RING")) { //if (ac.getMaximumBondOrder(neighbours[i]) == 1.0) { bond = ac.getBond(neighbour, atom); if (bond.getOrder() != IBond.Order.DOUBLE) { nocounter += 1; } } } return nocounter; } /** * Gets the aromaticCarbonsCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The aromaticCarbonsCount value */ private int getAromaticCarbonsCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); int carocounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("C") && neighbour.getFlag(CDKConstants.ISAROMATIC)) { carocounter += 1; } } return carocounter; } /** * Gets the carbonsCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The carbonsCount value */ private int getCarbonsCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); int ccounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("C")) { if (!neighbour.getFlag(CDKConstants.ISAROMATIC)) { ccounter += 1; } } } return ccounter; } /** * Gets the oxygenCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The carbonsCount value */ private int getOxygenCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); int ocounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("O")) { if (!neighbour.getFlag(CDKConstants.ISAROMATIC)) { ocounter += 1; } } } return ocounter; } /** * Gets the doubleBondedCarbonsCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The doubleBondedCarbonsCount value */ private int getDoubleBondedCarbonsCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); IBond bond; int cdbcounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("C")) { bond = ac.getBond(neighbour, atom); if (bond.getOrder() == IBond.Order.DOUBLE) { cdbcounter += 1; } } } return cdbcounter; } /** * Gets the doubleBondedOxygenCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The doubleBondedOxygenCount value */ private int getDoubleBondedOxygenCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); IBond bond; int odbcounter = 0; boolean chargeFlag=false; if (atom.getFormalCharge()>=1){ chargeFlag=true; } for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("O")) { bond = ac.getBond(neighbour, atom); if (chargeFlag && neighbour.getFormalCharge() == -1 && bond.getOrder() == IBond.Order.SINGLE) { odbcounter += 1; } if (!neighbour.getFlag(CDKConstants.ISAROMATIC)) { if (bond.getOrder() == IBond.Order.DOUBLE) { odbcounter += 1; } } } } return odbcounter; } /** * Gets the doubleBondedSulfurCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The doubleBondedSulfurCount value */ private int getDoubleBondedSulfurCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); IBond bond; int sdbcounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("S")) { if (atom.getFormalCharge() == 1 && neighbour.getFormalCharge() == -1) { sdbcounter += 1; } bond = ac.getBond(neighbour, atom); if (!neighbour.getFlag(CDKConstants.ISAROMATIC)) { if (bond.getOrder() == IBond.Order.DOUBLE) { sdbcounter += 1; } } } } return sdbcounter; } /** * Gets the doubleBondedNitrogenCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The doubleBondedNitrogenCount value */ private int getDoubleBondedNitrogenCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); IBond bond; int ndbcounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("N")) { bond = ac.getBond(neighbour, atom); if (!neighbour.getFlag(CDKConstants.ISAROMATIC)) { if (bond.getOrder() == IBond.Order.DOUBLE) { ndbcounter += 1; } } } } return ndbcounter; } /** * Gets the aromaticNitrogensCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The aromaticNitrogensCount value */ private int getAromaticNitrogensCount(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); int narocounter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("N") && (Boolean) neighbour.getProperty("IS_IN_AROMATIC_RING")) { narocounter += 1; } } return narocounter; } // a piSystem is a double or triple or aromatic bond: /** * Gets the piSystemsCount attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The piSystemsCount value */ private int getPiSystemsCount(IAtomContainer ac, IAtom atom) { java.util.List neighbours = ac.getConnectedAtomsList(atom); int picounter = 0; java.util.List bonds=null; for (int i = 0; i < neighbours.size(); i++) { IAtom neighbour = (IAtom)neighbours.get(i); bonds = ac.getConnectedBondsList(neighbour); for (int j = 0; j < bonds.size(); j++) { IBond bond = (IBond)bonds.get(j); if (bond.getOrder()!=IBond.Order.SINGLE && bond.getConnectedAtom(neighbour)!=atom && !neighbour.getSymbol().equals("P") && !neighbour.getSymbol().equals("S")){ picounter += 1; }/*else if (bonds[j].getConnectedAtom(neighbours[i])!=atom && !neighbours[i].getSymbol().equals("P") && !neighbours[i].getSymbol().equals("S") && bonds[j].getConnectedAtom(neighbours[i]).getFlag(CDKConstants.ISAROMATIC)){ picounter += 1; }*/ } } return picounter; } /** * Gets the presenceOf Hydroxy group attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The presenceOfCarbonil value */ private boolean getPresenceOfHydroxy(IAtomContainer ac, IAtom atom) { IAtom neighbour0 = (IAtom)ac.getConnectedAtomsList(atom).get(0); java.util.List first = null; if (neighbour0.getSymbol().equals("C")) { first = ac.getConnectedAtomsList(neighbour0); for (int i = 0; i < first.size(); i++) { IAtom conAtom = (IAtom)first.get(i); if (conAtom.getSymbol().equals("O")) { if(ac.getBond(neighbour0, conAtom).getOrder() == IBond.Order.SINGLE){ if (ac.getConnectedBondsCount(conAtom)>1 && getHydrogenCount(ac,conAtom)==0){ return false; }else{ return true; } } } } } return false; } /** * Gets the presenceOfN=O attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The presenceOfNitor [boolean] */ private boolean getPresenceOfNitro(IAtomContainer ac, IAtom atom) { java.util.List neighbours = ac.getConnectedAtomsList(atom); java.util.List second = null; IBond bond = null; //int counter = 0; for (int i = 0; i < neighbours.size(); i++) { IAtom neighbour = (IAtom)neighbours.get(i); if (neighbour.getSymbol().equals("N")) { second = ac.getConnectedAtomsList(neighbour); for (int b = 0; b < second.size(); b++) { IAtom conAtom = (IAtom)second.get(b); if (conAtom.getSymbol().equals("O")) { bond = ac.getBond(neighbour, conAtom); if (bond.getOrder() == IBond.Order.DOUBLE) { return true; } } } } } return false; } /** * Gets the presenceOfSulfat A-S(O2)-A attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The presenceOfSulfat [boolean] */ private boolean getPresenceOfSulfat(IAtomContainer ac, IAtom atom) { java.util.List<IAtom> neighbours = ac.getConnectedAtomsList(atom); //org.openscience.cdk.interfaces.IAtom[] second = null; //IBond bond = null; //int counter = 0; for (IAtom neighbour : neighbours) { if (neighbour.getSymbol().equals("S") && getOxygenCount(ac, neighbour) >= 2 && ac.getConnectedBondsCount(neighbour) == 4) { return true; } } return false; } /** * Gets the presenceOfCarbonil attribute of the XLogPDescriptor object. * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The presenceOfCarbonil value */ private int getPresenceOfCarbonil(IAtomContainer ac, IAtom atom) { java.util.List neighbours = ac.getConnectedAtomsList(atom); java.util.List second = null; IBond bond = null; int counter = 0; for (int i = 0; i < neighbours.size(); i++) { IAtom neighbour = (IAtom)neighbours.get(i); if (neighbour.getSymbol().equals("C")) { second = ac.getConnectedAtomsList(neighbour); for (int b = 0; b < second.size(); b++) { IAtom conAtom = (IAtom)second.get(b); if (conAtom.getSymbol().equals("O")) { bond = ac.getBond(neighbour, conAtom); if (bond.getOrder() == IBond.Order.DOUBLE) { counter +=1; } } } } } return counter; } /** * Gets the ifCarbonIsHydrophobic attribute of the XLogPDescriptor object. * C must be sp2 or sp3 and, for all distances C-1-2-3 only C atoms are permitted * *@param ac Description of the Parameter *@param atom Description of the Parameter *@return The ifCarbonIsHydrophobic value */ private boolean getIfCarbonIsHydrophobic(IAtomContainer ac, IAtom atom) { java.util.List first = ac.getConnectedAtomsList(atom); java.util.List second = null; java.util.List third = null; //org.openscience.cdk.interfaces.IAtom[] fourth = null; if (first.size() > 0) { for (int i = 0; i < first.size(); i++) { IAtom firstAtom = (IAtom)first.get(i); if (firstAtom.getSymbol().equals("C") || firstAtom.getSymbol().equals("H")) { } else { return false; } second = ac.getConnectedAtomsList(firstAtom); if (second.size() > 0) { for (int b = 0; b < second.size(); b++) { IAtom secondAtom = (IAtom)second.get(b); if (secondAtom.getSymbol().equals("C") || secondAtom.getSymbol().equals("H")) { } else { return false; } third = ac.getConnectedAtomsList(secondAtom); if (third.size() > 0) { for (int c = 0; c < third.size(); c++) { IAtom thirdAtom = (IAtom)third.get(c); if (thirdAtom.getSymbol().equals("C") || thirdAtom.getSymbol().equals("H")) { } else { return false; } //fourth = ac.getConnectedAtoms(third[c]); //if (fourth.length > 0) { // for (int d = 0; d < fourth.length; d++) { // if (fourth[d].getSymbol().equals("C") || fourth[d].getSymbol().equals("H")) { // } else { // return false; // } // } //} else { // return false; //} } } else { return false; } } } else { return false; } } } else { return false; } return true; } /** * Gets the parameterNames attribute of the XLogPDescriptor object. * *@return The parameterNames value */ @TestMethod("testGetParameterNames") public String[] getParameterNames() { String[] params = new String[2]; params[0] = "checkAromaticity"; params[1] = "salicylFlag"; return params; } /** * Gets the parameterType attribute of the XLogPDescriptor object. * *@param name Description of the Parameter *@return The parameterType value */ @TestMethod("testGetParameterType_String") public Object getParameterType(String name) { return true; } private IAtomContainer createPaba(IChemObjectBuilder builder) { // SMILES CS(=O)(=O)c1ccc(N)cc1 IAtomContainer container = builder.newAtomContainer(); IAtom atom1 = builder.newAtom("C"); container.addAtom(atom1); IAtom atom2 = builder.newAtom("S"); container.addAtom(atom2); IAtom atom3 = builder.newAtom("O"); container.addAtom(atom3); IAtom atom4 = builder.newAtom("O"); container.addAtom(atom4); IAtom atom5 = builder.newAtom("C"); atom5.setHybridization(Hybridization.SP2); container.addAtom(atom5); IAtom atom6 = builder.newAtom("C"); atom6.setHybridization(Hybridization.SP2); container.addAtom(atom6); IAtom atom7 = builder.newAtom("C"); atom7.setHybridization(Hybridization.SP2); container.addAtom(atom7); IAtom atom8 = builder.newAtom("C"); atom8.setHybridization(Hybridization.SP2); container.addAtom(atom8); IAtom atom9 = builder.newAtom("N"); container.addAtom(atom9); IAtom atom10 = builder.newAtom("C"); atom10.setHybridization(Hybridization.SP2); container.addAtom(atom10); IAtom atom11 = builder.newAtom("C"); atom11.setHybridization(Hybridization.SP2); container.addAtom(atom11); IBond bond1 = builder.newBond(atom1, atom2, CDKConstants.BONDORDER_SINGLE); container.addBond(bond1); IBond bond2 = builder.newBond(atom2, atom3, CDKConstants.BONDORDER_DOUBLE); container.addBond(bond2); IBond bond3 = builder.newBond(atom2, atom4, CDKConstants.BONDORDER_DOUBLE); container.addBond(bond3); IBond bond4 = builder.newBond(atom2, atom5, CDKConstants.BONDORDER_SINGLE); container.addBond(bond4); IBond bond5 = builder.newBond(atom5, atom6, CDKConstants.BONDORDER_DOUBLE); bond5.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond5); IBond bond6 = builder.newBond(atom6, atom7, CDKConstants.BONDORDER_SINGLE); bond6.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond6); IBond bond7 = builder.newBond(atom7, atom8, CDKConstants.BONDORDER_DOUBLE); bond7.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond7); IBond bond8 = builder.newBond(atom8, atom9, CDKConstants.BONDORDER_SINGLE); container.addBond(bond8); IBond bond9 = builder.newBond(atom8, atom10, CDKConstants.BONDORDER_SINGLE); bond9.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond9); IBond bond10 = builder.newBond(atom10, atom11, CDKConstants.BONDORDER_DOUBLE); bond10.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond10); IBond bond11 = builder.newBond(atom5, atom11, CDKConstants.BONDORDER_SINGLE); bond11.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond11); return container; } private IAtomContainer createAminoAcid(IChemObjectBuilder builder) { // SMILES NCC(=O)O IAtomContainer container = builder.newAtomContainer(); IAtom atom1 = builder.newAtom("N"); container.addAtom(atom1); IAtom atom2 = builder.newAtom("C"); container.addAtom(atom2); IAtom atom3 = builder.newAtom("C"); // carbonyl container.addAtom(atom3); IAtom atom4 = builder.newAtom("O"); // carbonyl container.addAtom(atom4); IAtom atom5 = builder.newAtom("O"); container.addAtom(atom5); container.addBond(builder.newBond(atom1, atom2, CDKConstants.BONDORDER_SINGLE)); container.addBond(builder.newBond(atom2, atom3, CDKConstants.BONDORDER_SINGLE)); container.addBond(builder.newBond(atom3, atom4, CDKConstants.BONDORDER_DOUBLE)); container.addBond(builder.newBond(atom3, atom5, CDKConstants.BONDORDER_SINGLE)); return container; } private IAtomContainer createSalicylicAcid(IChemObjectBuilder builder) { // SMILES O=C(O)c1ccccc1O IAtomContainer container = builder.newAtomContainer(); IAtom atom1 = builder.newAtom("C"); container.addAtom(atom1); IAtom atom2 = builder.newAtom("O"); container.addAtom(atom2); IAtom atom3 = builder.newAtom("O"); container.addAtom(atom3); IAtom atom4 = builder.newAtom("C"); atom4.setHybridization(Hybridization.SP2); container.addAtom(atom4); IAtom atom5 = builder.newAtom("C"); atom5.setHybridization(Hybridization.SP2); container.addAtom(atom5); IAtom atom6 = builder.newAtom("C"); atom6.setHybridization(Hybridization.SP2); container.addAtom(atom6); IAtom atom7 = builder.newAtom("C"); atom7.setHybridization(Hybridization.SP2); container.addAtom(atom7); IAtom atom8 = builder.newAtom("C"); atom8.setHybridization(Hybridization.SP2); container.addAtom(atom8); IAtom atom9 = builder.newAtom("C"); atom9.setHybridization(Hybridization.SP2); container.addAtom(atom9); IAtom atom10 = builder.newAtom("O"); container.addAtom(atom10); IBond bond1 = builder.newBond(atom1, atom2, CDKConstants.BONDORDER_DOUBLE); container.addBond(bond1); IBond bond2 = builder.newBond(atom1, atom3, CDKConstants.BONDORDER_SINGLE); container.addBond(bond2); IBond bond3 = builder.newBond(atom1, atom4, CDKConstants.BONDORDER_SINGLE); container.addBond(bond3); IBond bond4 = builder.newBond(atom4, atom5, CDKConstants.BONDORDER_DOUBLE); bond4.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond4); IBond bond5 = builder.newBond(atom5, atom6, CDKConstants.BONDORDER_SINGLE); bond5.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond5); IBond bond6 = builder.newBond(atom6, atom7, CDKConstants.BONDORDER_DOUBLE); bond6.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond6); IBond bond7 = builder.newBond(atom7, atom8, CDKConstants.BONDORDER_SINGLE); bond7.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond7); IBond bond8 = builder.newBond(atom8, atom9, CDKConstants.BONDORDER_DOUBLE); bond8.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond8); IBond bond9 = builder.newBond(atom9, atom4, CDKConstants.BONDORDER_SINGLE); bond9.setFlag(CDKConstants.ISAROMATIC, true); container.addBond(bond9); IBond bond10 = builder.newBond(atom9, atom10, CDKConstants.BONDORDER_SINGLE); container.addBond(bond10); return container; } }