Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Merge pull request #267 from cdk/patch/26Nov16
Looks good.
  • Loading branch information
egonw committed Feb 13, 2017
2 parents fa43771 + 1d1f3e0 commit ec6c3f2
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 38 deletions.
50 changes: 32 additions & 18 deletions base/data/src/main/java/org/openscience/cdk/AtomContainer.java
Expand Up @@ -20,6 +20,7 @@

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
Expand Down Expand Up @@ -970,35 +971,48 @@ public Order getMinimumBondOrder(IAtom atom) {
}

/**
* Adds all atoms and electronContainers of a given atomcontainer to this
* container.
* Add a container (that) to this container, if "that" container has atoms,
* bonds, or electron containers already in "this" they are not added.
*
*@param atomContainer The atomcontainer to be added
* @param that the other atom container
*/
@Override
public void add(IAtomContainer atomContainer) {
for (int f = 0; f < atomContainer.getAtomCount(); f++) {
if (!contains(atomContainer.getAtom(f))) {
addAtom(atomContainer.getAtom(f));
public void add(IAtomContainer that) {
atoms = Arrays.copyOf(atoms, atomCount + that.getAtomCount());
bonds = Arrays.copyOf(bonds, bondCount + that.getBondCount());

for (IAtom atom : that.atoms())
atom.setFlag(CDKConstants.VISITED, false);
for (IBond bond : that.bonds())
bond.setFlag(CDKConstants.VISITED, false);
for (IAtom atom : this.atoms())
atom.setFlag(CDKConstants.VISITED, true);
for (IBond bond : this.bonds())
bond.setFlag(CDKConstants.VISITED, true);

for (IAtom atom : that.atoms()) {
if (!atom.getFlag(CDKConstants.VISITED)) {
atom.setFlag(CDKConstants.VISITED, true);
atoms[atomCount++] = atom;
}
}
for (int f = 0; f < atomContainer.getBondCount(); f++) {
if (!contains(atomContainer.getBond(f))) {
addBond(atomContainer.getBond(f));
for (IBond bond : that.bonds()) {
if (!bond.getFlag(CDKConstants.VISITED)) {
bond.setFlag(CDKConstants.VISITED, true);
bonds[bondCount++] = bond;
}
}
for (int f = 0; f < atomContainer.getLonePairCount(); f++) {
if (!contains(atomContainer.getLonePair(f))) {
addLonePair(atomContainer.getLonePair(f));
for (ILonePair lp : that.lonePairs()) {
if (!contains(lp)) {
addLonePair(lp);
}
}
for (int f = 0; f < atomContainer.getSingleElectronCount(); f++) {
if (!contains(atomContainer.getSingleElectron(f))) {
addSingleElectron(atomContainer.getSingleElectron(f));
for (ISingleElectron se : that.singleElectrons()) {
if (!contains(se)) {
addSingleElectron(se);
}
}

for (IStereoElement se : atomContainer.stereoElements())
for (IStereoElement se : that.stereoElements())
stereoElements.add(se);

notifyChanged();
Expand Down
Expand Up @@ -20,6 +20,7 @@

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
Expand All @@ -28,9 +29,11 @@
import java.util.Map;
import java.util.Set;

import org.openscience.cdk.CDKConstants;
import org.openscience.cdk.interfaces.IAtom;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IChemObject;
import org.openscience.cdk.interfaces.IChemObjectChangeEvent;
import org.openscience.cdk.interfaces.IChemObjectListener;
import org.openscience.cdk.interfaces.IElectronContainer;
Expand Down Expand Up @@ -954,34 +957,49 @@ public Order getMinimumBondOrder(IAtom atom) {
}

/**
* Adds all atoms and electronContainers of a given atomcontainer to this
* container.
* Add a container (that) to this container, if "that" container has atoms,
* bonds, or electron containers already in "this" they are not added.
*
*@param atomContainer The atomcontainer to be added
* @param that the other atom container
*/
@Override
public void add(IAtomContainer atomContainer) {
for (int f = 0; f < atomContainer.getAtomCount(); f++) {
if (!contains(atomContainer.getAtom(f))) {
addAtom(atomContainer.getAtom(f));
public void add(IAtomContainer that) {

atoms = Arrays.copyOf(atoms, atomCount + that.getAtomCount());
bonds = Arrays.copyOf(bonds, bondCount + that.getBondCount());

for (IAtom atom : that.atoms())
atom.setFlag(CDKConstants.VISITED, false);
for (IBond bond : that.bonds())
bond.setFlag(CDKConstants.VISITED, false);
for (IAtom atom : this.atoms())
atom.setFlag(CDKConstants.VISITED, true);
for (IBond bond : this.bonds())
bond.setFlag(CDKConstants.VISITED, true);

for (IAtom atom : that.atoms()) {
if (!atom.getFlag(CDKConstants.VISITED)) {
atom.setFlag(CDKConstants.VISITED, true);
atoms[atomCount++] = atom;
}
}
for (int f = 0; f < atomContainer.getBondCount(); f++) {
if (!contains(atomContainer.getBond(f))) {
addBond(atomContainer.getBond(f));
for (IBond bond : that.bonds()) {
if (!bond.getFlag(CDKConstants.VISITED)) {
bond.setFlag(CDKConstants.VISITED, true);
bonds[bondCount++] = bond;
}
}
for (int f = 0; f < atomContainer.getLonePairCount(); f++) {
if (!contains(atomContainer.getLonePair(f))) {
addLonePair(atomContainer.getLonePair(f));
for (ILonePair lp : that.lonePairs()) {
if (!contains(lp)) {
addLonePair(lp);
}
}
for (int f = 0; f < atomContainer.getSingleElectronCount(); f++) {
if (!contains(atomContainer.getSingleElectron(f))) {
addSingleElectron(atomContainer.getSingleElectron(f));
for (ISingleElectron se : that.singleElectrons()) {
if (!contains(se)) {
addSingleElectron(se);
}
}
for (IStereoElement se : atomContainer.stereoElements())
for (IStereoElement se : that.stereoElements())
stereoElements.add(se);
}

Expand Down
Expand Up @@ -1072,8 +1072,8 @@ private void generateFragmentCoordinates(IAtomContainer mol, List<IAtomContainer

// correct double-bond stereo, this changes the layout and in reality
// should be done during the initial placement
if (molecule.stereoElements().iterator().hasNext())
CorrectGeometricConfiguration.correct(molecule);
if (mol.stereoElements().iterator().hasNext())
CorrectGeometricConfiguration.correct(mol);

// finalize
assignStereochem(mol);
Expand Down
Expand Up @@ -37,6 +37,8 @@
import org.openscience.cdk.interfaces.IBond;
import org.openscience.cdk.interfaces.IChemModel;
import org.openscience.cdk.interfaces.IChemSequence;
import org.openscience.cdk.interfaces.IDoubleBondStereochemistry;
import org.openscience.cdk.interfaces.IStereoElement;
import org.openscience.cdk.io.CMLReader;
import org.openscience.cdk.io.IChemObjectReader.Mode;
import org.openscience.cdk.io.ISimpleChemObjectReader;
Expand All @@ -50,6 +52,7 @@
import org.openscience.cdk.sgroup.SgroupType;
import org.openscience.cdk.silent.SilentChemObjectBuilder;
import org.openscience.cdk.smiles.SmilesParser;
import org.openscience.cdk.stereo.StereoElementFactory;
import org.openscience.cdk.templates.TestMoleculeFactory;

import javax.vecmath.Point2d;
Expand Down Expand Up @@ -85,7 +88,7 @@
public class StructureDiagramGeneratorTest extends CDKTestCase {

private static final StructureDiagramGenerator SDG = new StructureDiagramGenerator();

static {
SDG.setUseIdentityTemplates(true);
}
Expand Down Expand Up @@ -1243,4 +1246,24 @@ public void NH4OH() throws Exception {
is(greaterThan(SDG.getBondLength())));

}

@Test public void fragmentDoubleBondConfiguration() throws Exception {
SmilesParser smipar = new SmilesParser(SilentChemObjectBuilder.getInstance());
IAtomContainer mol = smipar.parseSmiles("C(\\C)=C/C.C(\\C)=C\\C.C(\\C)=C/C.C(\\C)=C\\C");
layout(mol);
List<IStereoElement> elements = StereoElementFactory.using2DCoordinates(mol).createAll();
int numCis = 0;
int numTrans = 0;
for (IStereoElement se : elements) {
if (se instanceof IDoubleBondStereochemistry) {
IDoubleBondStereochemistry.Conformation config = ((IDoubleBondStereochemistry) se).getStereo();
if (config == IDoubleBondStereochemistry.Conformation.TOGETHER)
numCis++;
else if (config == IDoubleBondStereochemistry.Conformation.OPPOSITE)
numTrans++;
}
}
assertThat(numCis, is(2));
assertThat(numTrans, is(2));
}
}

0 comments on commit ec6c3f2

Please sign in to comment.