/* $RCSfile$ * $Author$ * $Date$ * $Revision$ * * Copyright (C) 2005-2007 The Chemistry Development Kit (CDK) project * * 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 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.tools; import org.openscience.cdk.CDKConstants; import org.openscience.cdk.Element; import org.openscience.cdk.annotations.TestClass; import org.openscience.cdk.annotations.TestMethod; import org.openscience.cdk.interfaces.IAtom; import org.openscience.cdk.interfaces.IBond; import org.openscience.cdk.interfaces.IMolecularFormula; import org.openscience.cdk.interfaces.IRing; import org.openscience.cdk.tools.manipulator.MolecularFormulaManipulator; import java.util.Iterator; /** * Methods that takes a ring of which all bonds are aromatic, and assigns single * and double bonds. It does this in a non-general way by looking at the ring * size and take everything as a special case. * * * @author seb * @cdk.created 13. April 2005 * @cdk.module extra * @cdk.githash * @cdk.keyword aromatic ring, bond order adjustment */ @TestClass("org.openscience.cdk.tools.DeAromatizationToolTest") public class DeAromatizationTool { /** * Methods that takes a ring of which all bonds are aromatic, and assigns single * and double bonds. It does this in a non-general way by looking at the ring * size and take everything as a special case. * * @param ring Ring to dearomatize * @return False if it could not convert the aromatic ring bond into single and double bonds */ @TestMethod("testDeAromatize_IRing,testPyridine,testBezene") public static boolean deAromatize(IRing ring) { boolean allaromatic=true; for(int i=0;i<ring.getBondCount();i++){ if(!ring.getBond(i).getFlag(CDKConstants.ISAROMATIC)) allaromatic=false; } if(!allaromatic) return false; for(int i=0;i<ring.getBondCount();i++){ if(ring.getBond(i).getFlag(CDKConstants.ISAROMATIC)) ring.getBond(i).setOrder(IBond.Order.SINGLE); } boolean result = false; IMolecularFormula formula = MolecularFormulaManipulator.getMolecularFormula(ring); // Map elementCounts = new MFAnalyser(ring).getFormulaHashtable(); if (ring.getRingSize() == 6) { if (MolecularFormulaManipulator.getElementCount(formula, new Element("C")) == 6) { result = DeAromatizationTool.deAromatizeBenzene(ring); } else if (MolecularFormulaManipulator.getElementCount(formula, new Element("C")) == 5 && MolecularFormulaManipulator.getElementCount(formula, new Element("N")) == 1) { result = DeAromatizationTool.deAromatizePyridine(ring); } } if (ring.getRingSize() == 5) { if (MolecularFormulaManipulator.getElementCount(formula, new Element("C")) == 4 && MolecularFormulaManipulator.getElementCount(formula, new Element("N")) == 1) { result= deAromatizePyrolle(ring); } } return result; } private static boolean deAromatizePyridine(IRing ring) { return deAromatizeBenzene(ring); // same task to do } private static boolean deAromatizePyrolle(IRing ring) { if (ring.getBondCount() != 5) return false; for (int i = 0; i<ring.getAtomCount(); i++) { IAtom atom=ring.getAtom(i); if(atom.getSymbol().equals("N")){ int done=0; IBond bond=null; int count=0; while(done!=2){ bond=getNextBond(atom,bond,ring); if(bond.getAtom(0)==atom) atom=bond.getAtom(1); else atom=bond.getAtom(0); count++; if(count%2==0){ bond.setOrder(IBond.Order.DOUBLE); done++; } } break; } } return true; } private static IBond getNextBond(IAtom atom, IBond bond, IRing ring){ java.util.List bonds=ring.getConnectedBondsList(atom); for(int i=0;i<bonds.size();i++) if((IBond)bonds.get(i)!=bond) return (IBond)bonds.get(i); return null; } private static boolean deAromatizeBenzene(IRing ring) { if (ring.getBondCount() != 6) return false; int counter = 0; for (IBond bond : ring.bonds()) { if (counter % 2 == 0) { bond.setOrder(CDKConstants.BONDORDER_SINGLE); } else { bond.setOrder(CDKConstants.BONDORDER_DOUBLE); } counter++; } return true; } }