/* $RCSfile: $
* $Author$
* $Date$
* $Revision$
*
* Copyright (C) 2006-2007 Todd Martin (Environmental Protection Agency) <Martin.Todd@epamail.epa.gov>
*
* 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.atomtype;
import java.util.List;
import org.openscience.cdk.CDKConstants;
import org.openscience.cdk.annotations.TestClass;
import org.openscience.cdk.annotations.TestMethod;
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.IRing;
import org.openscience.cdk.interfaces.IRingSet;
/**
* Determines the EState atom types.
*
* @author Todd Martin
* @author nick
* @cdk.module standard
* @cdk.githash
* @cdk.keyword atom type, E-state
*/
@TestClass("org.openscience.cdk.atomtype.EStateAtomTypeMatcherTest")
public class EStateAtomTypeMatcher implements IAtomTypeMatcher {
IRingSet ringSet = null;
public void setRingSet(IRingSet rs)
{
ringSet = rs;
}
@TestMethod("testFindMatchingAtomType_IAtomContainer")
public IAtomType[] findMatchingAtomType(IAtomContainer atomContainer) throws CDKException {
IAtomType[] types = new IAtomType[atomContainer.getAtomCount()];
int typeCounter = 0;
for (IAtom atom : atomContainer.atoms()) {
types[typeCounter] = findMatchingAtomType(atomContainer, atom);
typeCounter++;
}
return types;
}
@TestMethod("testSP3Atoms,testNaCl,testNaphthalene,testSP2Atoms,testSPAtoms,testBenzeneFromSmiles")
public IAtomType findMatchingAtomType(IAtomContainer atomContainer, IAtom atom)
{
IAtomType atomType = null;
try {
String fragment = "";
int NumHAtoms = 0;
int NumSingleBonds2 = 0;
int NumDoubleBonds2 = 0;
int NumTripleBonds2 = 0;
int NumAromaticBonds2 = 0;
int NumAromaticBondsTotal2 = 0;
String element = atom.getSymbol();
List<IAtom> attachedAtoms = atomContainer.getConnectedAtomsList(atom);
for (int j = 0; j <= attachedAtoms.size() - 1; j++) {
IAtom attached = (IAtom)attachedAtoms.get(j);
IBond b = atomContainer.getBond(atom, attached);
if(attached.getSymbol().equals("H"))
NumHAtoms++;
if (atom.getFlag(CDKConstants.ISAROMATIC)
&& attached.getFlag(CDKConstants.ISAROMATIC)) {
boolean SameRing = inSameAromaticRing(atomContainer, atom,
attached, ringSet);
if (SameRing) {
NumAromaticBonds2++;
if (element.equals("N")) {
if (b.getOrder() == IBond.Order.SINGLE)
NumAromaticBondsTotal2++;
if (b.getOrder() == IBond.Order.DOUBLE)
NumAromaticBondsTotal2 = NumAromaticBondsTotal2 + 2;
}
} else {
if (b.getOrder() == IBond.Order.SINGLE)
NumSingleBonds2++;
if (b.getOrder() == IBond.Order.DOUBLE)
NumDoubleBonds2++;
if (b.getOrder() == IBond.Order.TRIPLE)
NumTripleBonds2++;
}
} else {
if (b.getOrder() == IBond.Order.SINGLE)
NumSingleBonds2++;
if (b.getOrder() == IBond.Order.DOUBLE)
NumDoubleBonds2++;
if (b.getOrder() == IBond.Order.TRIPLE)
NumTripleBonds2++;
}
}
NumSingleBonds2 = NumSingleBonds2 - NumHAtoms;
// assign frag here
fragment = "S";
for (int j = 0; j <= NumTripleBonds2 - 1; j++) {
fragment += "t";
}
for (int j = 0; j <= NumDoubleBonds2 - 1; j++) {
fragment += "d";
}
for (int j = 0; j <= NumSingleBonds2 - 1; j++) {
fragment += "s";
}
for (int j = 0; j <= NumAromaticBonds2 - 1; j++) {
fragment += "a";
}
fragment += element;
if (atom.getFormalCharge() == 1) {
fragment += "p";
} else if (atom.getFormalCharge() == -1) {
fragment += "m";
}
if (NumHAtoms == 1)
fragment += "H";
else
if (NumHAtoms > 1)
fragment += ("H" + NumHAtoms);
atomType = atom.getBuilder().newAtomType(fragment, atom.getSymbol());
atomType.setFormalCharge(atom.getFormalCharge());
if (atom.getFlag(CDKConstants.ISAROMATIC))
atomType.setFlag(CDKConstants.ISAROMATIC, true);
} catch (Exception e) {
e.printStackTrace();
}
return atomType;
}
@TestMethod("testAromaticAtoms")
public static boolean inSameAromaticRing(IAtomContainer m, IAtom atom1,
IAtom atom2, IRingSet rs)
{
if (rs == null)
return false;
for (int i = 0; i <= rs.getAtomContainerCount() - 1; i++)
{
IRing r = (IRing) rs.getAtomContainer(i);
if (r.contains(atom1) && r.contains(atom2))
{
if (isAromaticRing(r))
return(true);
}
}
return false;
}
@TestMethod("testAromaticAtoms")
static boolean isAromaticRing(IRing ring)
{
for (int i = 0; i < ring.getAtomCount(); i++)
if(!ring.getAtom(i).getFlag(CDKConstants.ISAROMATIC))
return(false);
return(true);
}
}