/* Copyright (C) 2009 Egon Willighagen <egonw@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.,
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
package org.openscience.cdk.qsar.descriptors.molecular;
import org.openscience.cdk.annotations.TestClass;
import org.openscience.cdk.annotations.TestMethod;
import org.openscience.cdk.config.Elements;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.qsar.DescriptorSpecification;
import org.openscience.cdk.qsar.DescriptorValue;
import org.openscience.cdk.qsar.IDescriptor;
import org.openscience.cdk.qsar.IMolecularDescriptor;
import org.openscience.cdk.qsar.result.DoubleResult;
import org.openscience.cdk.qsar.result.DoubleResultType;
import org.openscience.cdk.qsar.result.IDescriptorResult;
/**
* <p>Prediction of logP based on the number of carbon and hetero atoms. The
* implemented equation was proposed in {@cdk.cite Mannhold2009}.
*
* @cdk.module qsarmolecular
* @cdk.githash
* @cdk.set qsar-descriptors
* @cdk.dictref qsar-descriptors:mannholdLogP
*
* @cdk.keyword LogP
* @cdk.keyword descriptor
*/
@TestClass(
"org.openscience.cdk.qsar.descriptors.molecular.MannholdLogPDescriptorTest"
)
public class MannholdLogPDescriptor implements IMolecularDescriptor {
private static final String[] names = {"MLogP"};
/**
* Gets the specification attribute of the MannholdLogPDescriptor object.
*
* @return The specification value
*/
@TestMethod("testGetSpecification")
public DescriptorSpecification getSpecification() {
return new DescriptorSpecification(
"http://www.blueobelisk.org/ontologies/" +
"chemoinformatics-algorithms/#mannholdLogP",
this.getClass().getName(),
"$Id$",
"The Chemistry Development Kit"
);
}
/**
* This {@link IDescriptor} does not have any parameters. If it had, this
* would have been the method to set them.
*
* @param params The new parameter value
* @exception CDKException Exception throw when invalid parameter values
* are passed
* @see #getParameters
*/
@TestMethod("testSetParameters_arrayObject")
public void setParameters(Object[] params) throws CDKException {
if (params != null && params.length > 0) {
throw new CDKException("MannholdLogPDescriptor has no parameters.");
}
}
/**
* Gets the parameters attribute of the MannholdLogPDescriptor object.
*
* @return A zero-length Object array.
* @see #setParameters
*/
@TestMethod("testGetParameters")
public Object[] getParameters() {
return new Object[0];
}
@TestMethod("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 Mannhold LogP for an atom container.
*
* @param atomContainer {@link IAtomContainer} to calculate the
* descriptor value for.
* @return A descriptor value wrapping a {@link DoubleResult}.
*/
@TestMethod("testCalculate_IAtomContainer")
public DescriptorValue calculate(IAtomContainer atomContainer) {
IAtomContainer ac = null;
try {
ac = (IAtomContainer)atomContainer.clone();
} catch (CloneNotSupportedException e) {
return getDummyDescriptorValue(e);
}
int carbonCount = 0;
int heteroCount = 0;
for (IAtom atom : ac.atoms()) {
if (!Elements.HYDROGEN.getSymbol().equals(atom.getSymbol())) {
if (Elements.CARBON.getSymbol().equals(atom.getSymbol())) {
carbonCount++;
} else {
heteroCount++;
}
}
}
double mLogP = 1.46 + 0.11*carbonCount - 0.11*heteroCount;
return new DescriptorValue(
getSpecification(), getParameterNames(), getParameters(),
new DoubleResult(mLogP), getDescriptorNames()
);
}
/**
* Returns a type of return value calculated by this descriptor.
*
* @return returns a {@link DoubleResult}.
*/
@TestMethod("testGetDescriptorResultType")
public IDescriptorResult getDescriptorResultType() {
return new DoubleResultType();
}
/**
* Gets the parameterNames attribute for this descriptor.
*
* @return A zero-length String array.
*/
@TestMethod("testGetParameterNames")
public String[] getParameterNames() {
return new String[0];
}
/**
* Gets the parameterType attribute for a given parameter name. It
* always returns null, as this descriptor does not have any parameters.
*
* @param name Name of the parameter for which the type is requested.
* @return The parameterType of the given parameter.
*/
@TestMethod("testGetParameterType_String")
public Object getParameterType(String name) {
return null;
}
}