diff --git a/src/main/org/openscience/cdk/smsd/tools/ExtAtomContainerManipulator.java b/src/main/org/openscience/cdk/smsd/tools/ExtAtomContainerManipulator.java
deleted file mode 100644
index 34dd8f4d90b..00000000000
--- a/src/main/org/openscience/cdk/smsd/tools/ExtAtomContainerManipulator.java
+++ /dev/null
@@ -1,551 +0,0 @@
-/**
- *
- * Copyright (C) 2006-2010 Syed Asad Rahman {asad@ebi.atomContainer.uk}
- *
- * 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.
- * All we ask is that proper credit is given for our work, which includes
- * - but is not limited to - adding the above copyright notice to the beginning
- * of your source code files, and to any copyright notice that you may distribute
- * with programs based on this work.
- *
- * 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 atom 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.smsd.tools;
-
-import org.openscience.reactionblast.tools.*;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
-import java.util.Map;
-import javax.vecmath.Point2d;
-import javax.vecmath.Point3d;
-
-import org.openscience.cdk.Bond;
-import org.openscience.cdk.interfaces.IAtomParity;
-import org.openscience.cdk.interfaces.IBond.Order;
-import org.openscience.cdk.interfaces.ILonePair;
-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.atomtype.CDKAtomTypeMatcher;
-import org.openscience.cdk.exception.CDKException;
-import org.openscience.cdk.interfaces.IAtom;
-import org.openscience.cdk.interfaces.IAtomContainer;
-import org.openscience.cdk.interfaces.IAtomType;
-import org.openscience.cdk.interfaces.IBond;
-import org.openscience.cdk.interfaces.IMolecule;
-import org.openscience.cdk.interfaces.IPseudoAtom;
-import org.openscience.cdk.interfaces.IRing;
-import org.openscience.cdk.interfaces.IRingSet;
-import org.openscience.cdk.ringsearch.AllRingsFinder;
-import org.openscience.cdk.tools.manipulator.AtomContainerManipulator;
-import org.openscience.cdk.tools.manipulator.AtomTypeManipulator;
-import org.openscience.cdk.tools.manipulator.RingSetManipulator;
-
-/**
- * Class that handles some cutomised features for SMSD atomcontainers.
- *
This is an extension of CDK AtomContainer.
- * Some part of this code was taken from CDK source code and modified.
- *
- * @cdk.module smsd
- * @cdk.githash
- * @author Syed Asad Rahman
- */
-@TestClass("org.openscience.cdk.smsd.tools.ExtAtomContainerManipulatorTest")
-public class ExtAtomContainerManipulator extends AtomContainerManipulator {
-
- private static void printAtoms(IAtomContainer mol) {
- System.out.print("Atom: ");
- for (IAtom a : mol.atoms()) {
-
- System.out.print(a.getSymbol());
- System.out.print("[" + a.getFormalCharge() + "]");
- if (a.getID() != null) {
- System.out.print("[" + a.getID() + "]");
- }
-
- }
- System.out.println();
- System.out.println();
- }
-
- /**
- * Retrurns deep copy of the molecule
- * @param container
- * @return deep copy of the mol
- */
- @TestMethod("testMakeDeepCopy")
- public static IAtomContainer makeDeepCopy(IAtomContainer container) {
-
-
- IAtomContainer newAtomContainer = container.getBuilder().newInstance(IAtomContainer.class);
-// Deep copy of the Atoms
- IAtom[] atoms = copyAtoms(container, newAtomContainer);
-
-// Deep copy of the bonds
- copyBonds(atoms, container, newAtomContainer);
-
-// Deep copy of the LonePairs
- for (int index = 0; index < container.getLonePairCount(); index++) {
- if (container.getAtom(index).getSymbol().equalsIgnoreCase("R") || container.getAtom(index).getSymbol().equalsIgnoreCase("A")) {
- newAtomContainer.addLonePair(container.getBuilder().newInstance(ILonePair.class, container.getAtom(index)));
- } else {
- newAtomContainer.addLonePair(index);
- }
- }
-
- for (int index = 0; index < container.getSingleElectronCount(); index++) {
- newAtomContainer.addSingleElectron(index);
- }
- newAtomContainer.setProperties(container.getProperties());
- newAtomContainer.setFlags(container.getFlags());
- newAtomContainer.setID(container.getID());
- newAtomContainer.notifyChanged();
-
- return newAtomContainer;
- }
-
- /**
- * Retrurns deep copy of the molecule
- * @param container
- * @return deep copy of the mol
- */
- @TestMethod("testMakeDeepCopy")
- public static IMolecule makeDeepCopy(IMolecule container) {
-
- IMolecule newMolecule = container.getBuilder().newInstance(IMolecule.class);
-// Deep copy of the Atoms
- IAtom[] atoms = copyAtoms(container, newMolecule);
-
-// Deep copy of the bonds
- copyBonds(atoms, container, newMolecule);
-
-// Deep copy of the LonePairs
- for (int index = 0; index < container.getLonePairCount(); index++) {
- if (container.getAtom(index).getSymbol().equalsIgnoreCase("R") || container.getAtom(index).getSymbol().equalsIgnoreCase("A")) {
- newMolecule.addLonePair(container.getBuilder().newInstance(ILonePair.class, container.getAtom(index)));
- } else {
- newMolecule.addLonePair(index);
- }
- }
-
- for (int index = 0; index < container.getSingleElectronCount(); index++) {
- newMolecule.addSingleElectron(index);
- }
-
- newMolecule.setProperties(container.getProperties());
- newMolecule.setFlags(container.getFlags());
- newMolecule.setID(container.getID());
- newMolecule.notifyChanged();
-
- return newMolecule;
- }
-
- /**
- * This function finds rings and uses aromaticity detection code to
- * aromatize the molecule.
- * @param mol input molecule
- */
- @TestMethod("testAromatizeMolecule")
- public static void aromatizeMolecule(IAtomContainer mol) {
-
- // need to find rings and aromaticity again since added H's
-
- IRingSet ringSet = null;
- try {
- AllRingsFinder arf = new AllRingsFinder();
- ringSet = arf.findAllRings(mol);
-
- // SSSRFinder s = new SSSRFinder(atomContainer);
- // srs = s.findEssentialRings();
-
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- try {
- // figure out which atoms are in aromatic rings:
-// printAtoms(atomContainer);
- ExtAtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(mol);
-// printAtoms(atomContainer);
- CDKHueckelAromaticityDetector.detectAromaticity(mol);
-// printAtoms(atomContainer);
- // figure out which rings are aromatic:
- RingSetManipulator.markAromaticRings(ringSet);
-// printAtoms(atomContainer);
- // figure out which simple (non cycles) rings are aromatic:
- // HueckelAromaticityDetector.detectAromaticity(atomContainer, srs);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
-
- // only atoms in 6 membered rings are aromatic
- // determine largest ring that each atom is atom part of
-
- for (int i = 0; i <= mol.getAtomCount() - 1; i++) {
-
- mol.getAtom(i).setFlag(CDKConstants.ISAROMATIC, false);
-
- jloop:
- for (int j = 0; j <= ringSet.getAtomContainerCount() - 1; j++) {
- //logger.debug(i+"\t"+j);
- IRing ring = (IRing) ringSet.getAtomContainer(j);
- if (!ring.getFlag(CDKConstants.ISAROMATIC)) {
- continue jloop;
- }
-
- boolean haveatom = ring.contains(mol.getAtom(i));
-
- //logger.debug("haveatom="+haveatom);
-
- if (haveatom && ring.getAtomCount() == 6) {
- mol.getAtom(i).setFlag(CDKConstants.ISAROMATIC, true);
- }
- }
- }
- }
-
- /**
- * Returns The number of explicit hydrogens for a given IAtom.
- * @param atomContainer
- * @param atom
- * @return The number of explicit hydrogens on the given IAtom.
- */
- @TestMethod("testGetExplicitHydrogenCount")
- public static int getExplicitHydrogenCount(IAtomContainer atomContainer, IAtom atom) {
- int hCount = 0;
- for (IAtom iAtom : atomContainer.getConnectedAtomsList(atom)) {
- IAtom connectedAtom = iAtom;
- if (connectedAtom.getSymbol().equals("H")) {
- hCount++;
- }
- }
- return hCount;
- }
-
- /**
- * Returns The number of Implicit Hydrogen Count for a given IAtom.
- * @param atom
- * @return Implicit Hydrogen Count
- */
- @TestMethod("testGetImplicitHydrogenCount")
- public static int getImplicitHydrogenCount(IAtom atom) {
- return atom.getHydrogenCount() == CDKConstants.UNSET ? 0 : atom.getHydrogenCount();
- }
-
- /**
- * The summed implicit + explicit hydrogens of the given IAtom.
- * @param atomContainer
- * @param atom
- * @return The summed implicit + explicit hydrogens of the given IAtom.
- */
- @TestMethod("testGetHydrogenCount")
- public static int getHydrogenCount(IAtomContainer atomContainer, IAtom atom) {
- return getExplicitHydrogenCount(atomContainer, atom) + getImplicitHydrogenCount(atom);
- }
-
- /**
- * Returns IAtomContainer without Hydrogen. If an AtomContainer has atom single atom which
- * is atom Hydrogen then its not removed.
- * @param atomContainer
- * @return IAtomContainer without Hydrogen. If an AtomContainer has atom single atom which
- * is atom Hydrogen then its not removed.
- */
- @TestMethod("testRemoveHydrogensAndPreserveAtomID")
- public static IMolecule removeHydrogensExceptSingleAndPreserveAtomID(IAtomContainer atomContainer) {
- Map map = new HashMap(); // maps original atoms to clones.
- List remove = new ArrayList(); // lists removed Hs.
- IMolecule mol = null;
- if (atomContainer.getBondCount() > 0) {
- // Clone atoms except those to be removed.
- mol = atomContainer.getBuilder().newInstance(IMolecule.class);
- int count = atomContainer.getAtomCount();
- for (int i = 0; i < count; i++) {
- // Clone/remove this atom?
- IAtom atom = atomContainer.getAtom(i);
- if (!atom.getSymbol().equals("H")) {
- IAtom clonedAtom = null;
- try {
- clonedAtom = (IAtom) atom.clone();
- } catch (CloneNotSupportedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- //added by Asad to preserve the Atom ID for atom mapping without Hydrogen
- clonedAtom.setID(atom.getID());
- clonedAtom.setFlags(atom.getFlags());
- int countH = 0;
- if (atom.getHydrogenCount() != null) {
- countH = atom.getHydrogenCount();
- }
- clonedAtom.setHydrogenCount(countH);
- mol.addAtom(clonedAtom);
- map.put(atom, clonedAtom);
-
- } else {
- remove.add(atom); // maintain list of removed H.
- }
- }
-// Clone bonds except those involving removed atoms.
- mol = cloneAndMarkNonHBonds(mol, atomContainer, remove, map);
-// Recompute hydrogen counts of neighbours of removed Hydrogens.
- mol = reComputeHydrogens(mol, atomContainer, remove, map);
-
- } else {
- mol = atomContainer.getBuilder().newInstance(IMolecule.class, atomContainer);
- if (atomContainer.getAtom(0).getSymbol().equalsIgnoreCase("H")) {
- System.err.println("WARNING: single hydrogen atom removal not supported!");
- }
- mol.setFlags(atomContainer.getFlags());
- }
- mol.setProperties(atomContainer.getProperties());
- if (atomContainer.getID() != null) {
- mol.setID(atomContainer.getID());
- }
-
- return mol;
- }
-
- /**
- * Returns IAtomContainer without Hydrogen. If an AtomContainer has atom single atom which
- * is atom Hydrogen then its not removed.
- * @param atomContainer
- * @return IAtomContainer without Hydrogen. If an AtomContainer has atom single atom which
- * is atom Hydrogen then its not removed.
- */
- @TestMethod("testConvertExplicitToImplicitHydrogens")
- public static IAtomContainer convertExplicitToImplicitHydrogens(IAtomContainer atomContainer) {
- IAtomContainer mol = atomContainer.getBuilder().newInstance(IMolecule.class, atomContainer);
- convertImplicitToExplicitHydrogens(mol);
- if (mol.getAtomCount() > 1) {
- mol = removeHydrogens(mol);
- } else if (atomContainer.atoms().iterator().next().getSymbol().equalsIgnoreCase("H")) {
- System.err.println("WARNING: single hydrogen atom removal not supported!");
- }
- mol.setProperties(atomContainer.getProperties());
- mol.setFlags(atomContainer.getFlags());
- if (atomContainer.getID() != null) {
- mol.setID(atomContainer.getID());
- }
- return mol;
- }
-
- /**
- * Convenience method to perceive atom types for all IAtom
s in the
- * IAtomContainer
, using the CDKAtomTypeMatcher
. If the
- * matcher finds atom matching atom type, the IAtom
will be configured
- * to have the same properties as the IAtomType
. If no matching atom
- * type is found, no configuration is performed.
- * @param container
- * @throws CDKException
- */
- @TestMethod("testPercieveAtomTypesAndConfigureAtoms")
- public static void percieveAtomTypesAndConfigureAtoms(IAtomContainer container) throws CDKException {
- CDKAtomTypeMatcher matcher = CDKAtomTypeMatcher.getInstance(container.getBuilder());
- for (IAtom atom : container.atoms()) {
- if (!(atom instanceof IPseudoAtom)) {
-
- IAtomType matched = matcher.findMatchingAtomType(container, atom);
- if (matched != null) {
- AtomTypeManipulator.configure(atom, matched);
- }
-
- }
- }
- }
-
- private static IAtom[] copyAtoms(IAtomContainer container, IAtomContainer newAtomContainer) {
- int atomCount = container.getAtomCount();
- IAtom[] atoms = new IAtom[atomCount];
- for (int index = 0; index < container.getAtomCount(); index++) {
-
- if (container.getAtom(index) instanceof IPseudoAtom) {
- atoms[index] = container.getBuilder().newInstance(IPseudoAtom.class, container.getAtom(index));
- } else {
- atoms[index] = container.getBuilder().newInstance(IAtom.class, container.getAtom(index));
- }
-
- set2D(container, index, atoms);
- set3D(container, index, atoms);
- setFractionalPoint3d(container, index, atoms);
- setID(container, index, atoms);
- setHydrogenCount(container, index, atoms);
- setCharge(container, index, atoms);
- setStereoParity(container, index, atoms);
- newAtomContainer.addAtom(atoms[index]);
- setAtomParity(container, index, newAtomContainer);
- }
-
- return atoms;
- }
-
- private static void copyBonds(IAtom[] atoms, IAtomContainer container, IAtomContainer newAtomContainer) {
- int bondCount = container.getBondCount();
- IBond[] bonds = new IBond[bondCount];
- for (int index = 0; index < container.getBondCount(); index++) {
- bonds[index] = new Bond();
- int IndexI = 999;
- for (int i = 0; i < container.getAtomCount(); i++) {
- if (container.getBond(index).getAtom(0) == container.getAtom(i)) {
- IndexI = i;
- break;
- }
- }
- int IndexJ = 999;
- for (int j = 0; j < container.getAtomCount(); j++) {
- if (container.getBond(index).getAtom(1) == container.getAtom(j)) {
- IndexJ = j;
- break;
- }
- }
-
- IAtom atom1 = atoms[IndexI];
- IAtom atom2 = atoms[IndexJ];
-
- Order order = container.getBond(index).getOrder();
- IBond.Stereo stereo = container.getBond(index).getStereo();
- bonds[index] = new Bond(atom1, atom2, order, stereo);
- if (container.getBond(index).getID() != null) {
- bonds[index].setID(new String(container.getBond(index).getID()));
- }
- newAtomContainer.addBond(bonds[index]);
-
- }
- }
-
- private static IMolecule reComputeHydrogens(
- IMolecule mol,
- IAtomContainer atomContainer,
- List remove,
- Map map) {
-
- // Recompute hydrogen counts of neighbours of removed Hydrogens.
- for (IAtom aRemove : remove) {
- // Process neighbours.
- for (IAtom iAtom : atomContainer.getConnectedAtomsList(aRemove)) {
- final IAtom neighb = map.get(iAtom);
- if (neighb == null) {
- continue; // since for the case of H2, neight H has atom heavy atom neighbor
- }
- //Added by Asad
- if (!(neighb instanceof IPseudoAtom)) {
- neighb.setHydrogenCount(
- (neighb.getHydrogenCount() == null ? 0 : neighb.getHydrogenCount()) + 1);
- } else {
- neighb.setHydrogenCount(0);
- }
- }
- }
- mol.setProperties(atomContainer.getProperties());
- mol.setFlags(atomContainer.getFlags());
- if (atomContainer.getID() != null) {
- mol.setID(atomContainer.getID());
- }
- return mol;
- }
-
- private static IMolecule cloneAndMarkNonHBonds(
- IMolecule mol,
- IAtomContainer atomContainer,
- List remove,
- Map map) {
- // Clone bonds except those involving removed atoms.
- int count = atomContainer.getBondCount();
- for (int i = 0; i < count; i++) {
- // Check bond.
- final IBond bond = atomContainer.getBond(i);
- boolean removedBond = false;
- final int length = bond.getAtomCount();
- for (int k = 0; k < length; k++) {
- if (remove.contains(bond.getAtom(k))) {
- removedBond = true;
- break;
- }
- }
-
- // Clone/remove this bond?
- if (!removedBond) // if (!remove.contains(atoms[0]) && !remove.contains(atoms[1]))
- {
- IBond clone = null;
- try {
- clone = (IBond) atomContainer.getBond(i).clone();
- } catch (CloneNotSupportedException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- assert clone != null;
- clone.setAtoms(new IAtom[]{map.get(bond.getAtom(0)), map.get(bond.getAtom(1))});
- clone.setOrder(atomContainer.getBond(i).getOrder());
- clone.setStereo(atomContainer.getBond(i).getStereo());
- mol.addBond(clone);
- }
- }
-
- return mol;
- }
-
- private static void set2D(IAtomContainer container, int index, IAtom[] atoms) {
- if ((container.getAtom(index)).getPoint2d() != null) {
- atoms[index].setPoint2d(new Point2d(container.getAtom(index).getPoint2d()));
- }
- }
-
- private static void set3D(IAtomContainer container, int index, IAtom[] atoms) {
- if ((container.getAtom(index)).getPoint3d() != null) {
- atoms[index].setPoint3d(new Point3d(container.getAtom(index).getPoint3d()));
- }
- }
-
- private static void setFractionalPoint3d(IAtomContainer container, int index, IAtom[] atoms) {
- if ((container.getAtom(index)).getFractionalPoint3d() != null) {
- atoms[index].setFractionalPoint3d(new Point3d(container.getAtom(index).getFractionalPoint3d()));
- }
- }
-
- private static void setID(IAtomContainer container, int index, IAtom[] atoms) {
-
- if (container.getAtom(index).getID() != null) {
- atoms[index].setID(container.getAtom(index).getID());
- }
- }
-
- private static void setHydrogenCount(IAtomContainer container, int index, IAtom[] atoms) {
- if (container.getAtom(index).getHydrogenCount() != null) {
- atoms[index].setHydrogenCount(Integer.valueOf(container.getAtom(index).getHydrogenCount()));
- }
- }
-
- private static void setCharge(IAtomContainer container, int index, IAtom[] atoms) {
- if (container.getAtom(index).getCharge() != null) {
- atoms[index].setCharge(new Double(container.getAtom(index).getCharge()));
- }
- }
-
- private static void setStereoParity(IAtomContainer container, int index, IAtom[] atoms) {
- if (container.getAtom(index).getStereoParity() != null) {
- atoms[index].setStereoParity(Integer.valueOf(container.getAtom(index).getStereoParity()));
- }
- }
-
- private static void setAtomParity(IAtomContainer container, int index, IAtomContainer newAtomContainer) {
- IAtomParity parity = AtomContainerManipulator.getAtomParity(container, container.getAtom(index));
- if (parity != null) {
- newAtomContainer.addStereoElement(parity);
- }
- }
-}