Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #407 from cdk/patch/qsarmol_nomod
Patch/qsarmol nomod
  • Loading branch information
egonw committed Jan 14, 2018
2 parents c6b63e6 + f8d0bd1 commit 2c58ecf
Show file tree
Hide file tree
Showing 11 changed files with 75 additions and 11 deletions.
Expand Up @@ -36,7 +36,6 @@

import java.util.Collection;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Map;

/**
Expand Down Expand Up @@ -68,7 +67,7 @@ public class Polymer extends AtomContainer implements java.io.Serializable, IPol
*/
public Polymer() {
super();
monomers = new Hashtable<String, IMonomer>();
monomers = new HashMap<>();
}

/**
Expand Down Expand Up @@ -159,11 +158,11 @@ public String toString() {
public IPolymer clone() throws CloneNotSupportedException {
Polymer clone = (Polymer) super.clone();
clone.removeAllElements();
clone.monomers = new Hashtable<String, IMonomer>();
for (String monomerName : getMonomerNames()) {
Monomer monomerClone = (Monomer) getMonomer(monomerName).clone();
for (IAtom atomInMonomer : monomerClone.atoms()) {
clone.addAtom(atomInMonomer, monomerClone);
clone.monomers = new HashMap<>();
for (Map.Entry<String,IMonomer> e : this.monomers.entrySet()) {
IMonomer monomer = e.getValue().clone();
for (IAtom atomInMonomer : monomer.atoms()) {
clone.addAtom(atomInMonomer, monomer);
}
}

Expand Down Expand Up @@ -241,8 +240,7 @@ public IPolymer clone() throws CloneNotSupportedException {
}

private boolean atomIsInMonomer(IAtom atom) {
for (String monomerName : getMonomerNames()) {
IMonomer monomer = getMonomer(monomerName);
for (IMonomer monomer : monomers.values()) {
if (monomer.contains(atom)) return true;
}
return false;
Expand Down
Expand Up @@ -23,6 +23,8 @@

package org.openscience.cdk.qsar;

import org.openscience.cdk.interfaces.IAtomContainer;

/**
* A super class for molecular descriptors allowing default implementations for
* interface methods.
Expand All @@ -33,4 +35,12 @@
*/
public abstract class AbstractMolecularDescriptor extends AbstractDescriptor implements IMolecularDescriptor {

protected static IAtomContainer clone(IAtomContainer mol) {
try {
return mol.clone();
} catch (CloneNotSupportedException e) {
throw new IllegalStateException("Could not clone AtomContainer!");
}
}

}
Expand Up @@ -114,6 +114,8 @@ public DescriptorValue calculate(IAtomContainer atomContainer) {
throw new IllegalStateException("descriptor is not initalised, invoke 'initalise' first");
}

atomContainer = clone(atomContainer); // don't mod original

// do aromaticity detection
if (this.checkAromaticity) {
try {
Expand Down
Expand Up @@ -97,6 +97,8 @@ public DescriptorValue calculate(IAtomContainer atomContainer) {
throw new IllegalStateException("descriptor is not initalised, invoke 'initalise' first");
}

atomContainer = clone(atomContainer);

try {
int count = 0;
for (SMARTSQueryTool tool : tools) {
Expand Down
Expand Up @@ -65,6 +65,9 @@ public FMFDescriptor() {}
*/
@Override
public DescriptorValue calculate(IAtomContainer container) {

container = clone(container); // don't mod original

MurckoFragmenter fragmenter = new MurckoFragmenter(true, 3);
DoubleResult result;
try {
Expand Down
Expand Up @@ -140,6 +140,7 @@ public String[] getDescriptorNames() {
*/
@Override
public DescriptorValue calculate(IAtomContainer ac) {
ac = clone(ac); // don't mod original
int rotatableBondsCount = 0;
int degree0;
int degree1;
Expand Down
Expand Up @@ -142,7 +142,7 @@ public String[] getDescriptorNames() {
*/
@Override
public DescriptorValue calculate(IAtomContainer mol) {

mol = clone(mol); // don't mod original
int lipinskifailures = 0;

IMolecularDescriptor xlogP = new XLogPDescriptor();
Expand Down
Expand Up @@ -85,7 +85,8 @@ private DescriptorValue getDummyDescriptorValue(Exception e) {
public DescriptorValue calculate(IAtomContainer atomContainer) {
double volume;
try {
volume = VABCVolume.calculate(atomContainer);
// clone: don't mod original
volume = VABCVolume.calculate(clone(atomContainer));
} catch (CDKException exception) {
return getDummyDescriptorValue(exception);
}
Expand Down
Expand Up @@ -20,6 +20,7 @@

import javax.vecmath.Point3d;

import org.hamcrest.CoreMatchers;
import org.junit.Assert;
import org.junit.Ignore;
import org.junit.Test;
Expand All @@ -29,6 +30,8 @@
import org.openscience.cdk.dict.Dictionary;
import org.openscience.cdk.dict.DictionaryDatabase;
import org.openscience.cdk.dict.Entry;
import org.openscience.cdk.exception.CDKException;
import org.openscience.cdk.exception.InvalidSmilesException;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IAtomType;
Expand All @@ -45,9 +48,13 @@
import org.openscience.cdk.qsar.result.IDescriptorResult;
import org.openscience.cdk.qsar.result.IntegerArrayResult;
import org.openscience.cdk.qsar.result.IntegerResult;
import org.openscience.cdk.smiles.SmilesParser;
import org.openscience.cdk.templates.TestMoleculeFactory;
import org.openscience.cdk.tools.diff.AtomContainerDiff;
import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;

import java.util.Iterator;

/**
* Tests for molecular descriptors.
*
Expand All @@ -60,6 +67,38 @@ public abstract class MolecularDescriptorTest extends DescriptorTest<IMolecularD

public MolecularDescriptorTest() {}

private Number[] getAtomFlags(IAtomContainer mol) {
Number[] flags = new Number[mol.getAtomCount()];
for (int i = 0; i < mol.getAtomCount(); i++) {
flags[i] = mol.getAtom(i).getFlagValue();
}
return flags;
}

private Number[] getBondFlags(IAtomContainer mol) {
Number[] flags = new Number[mol.getBondCount()];
for (int i = 0; i < mol.getBondCount(); i++) {
flags[i] = mol.getBond(i).getFlagValue();
}
return flags;
}

@Test
public void descriptorDoesNotChangeFlags() throws CDKException {
IAtomContainer mol = TestMoleculeFactory.makeBenzene();
AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
Number mflags = mol.getFlagValue();
Number[] aflags = getAtomFlags(mol);
Number[] bflags = getBondFlags(mol);
descriptor.calculate(mol);
Assert.assertThat("Molecule flags were modified by descriptor!",
mol.getFlagValue(), CoreMatchers.is(mflags));
Assert.assertThat("Molecule's Atom flags were modified by descriptor!",
getAtomFlags(mol), CoreMatchers.is(aflags));
Assert.assertThat("Molecule's Bond flags were modified by descriptor!",
getBondFlags(mol), CoreMatchers.is(bflags));
}

@Test
public void testDescriptorIdentifierExistsInOntology() {
Entry ontologyEntry = dict.getEntry(descriptor.getSpecification().getSpecificationReference()
Expand Down
7 changes: 7 additions & 0 deletions descriptor/qsarprotein/pom.xml
Expand Up @@ -53,6 +53,13 @@
<artifactId>cdk-data</artifactId>
<version>${project.parent.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>cdk-data</artifactId>
<version>${project.parent.version}</version>
<scope>test</scope>
<type>test-jar</type>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>cdk-core</artifactId>
Expand Down
Expand Up @@ -140,6 +140,7 @@ public String[] getDescriptorNames() {
*/
@Override
public DescriptorValue calculate(IAtomContainer ac) {
ac = clone(ac); // don't modify input
int resultLength = substructureSet.getAtomContainerCount();
IntegerArrayResult results = new IntegerArrayResult(resultLength);

Expand Down

0 comments on commit 2c58ecf

Please sign in to comment.