/* $Revision$ $Author$ $Date$ * * Copyright (C) 2004-2007 Christian Hoppe <chhoppe@users.sf.net> * * 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.modeling.builder3d; import java.io.InputStream; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.openscience.cdk.CDKConstants; import org.openscience.cdk.aromaticity.CDKHueckelAromaticityDetector; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.exception.NoSuchAtomTypeException; 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.SSSRFinder; import org.openscience.cdk.tools.HOSECodeGenerator; import org.openscience.cdk.tools.manipulator.AtomContainerManipulator; import org.openscience.cdk.tools.manipulator.RingSetManipulator; /** * Reads in a force field configuration file, set the atom types into a vector, and the data into a hashtable * Therefore, it uses the class {@link MM2BasedParameterSetReader}. * private Hashtable parameterSet; * key=nameofdatafield+atomid1+;atomid2;atomxid * * <p>MM2 and MMFF94 force field are implemented * With force field data it configures the cdk atom (assign atomtype, van der Waals radius, charge...) * * @author chhoppe * @cdk.created 2004-09-07 * @cdk.module forcefield * @cdk.githash */ public class ForceFieldConfigurator { private String ffName = "mmff94"; private List<IAtomType> atomTypes; private Map<String, Object> parameterSet=null; private MM2BasedParameterSetReader mm2 = null; private MMFF94BasedParameterSetReader mmff94= null; private InputStream ins = null; private String[] fftypes = {"mm2","mmff94"}; /** *Constructor for the ForceFieldConfigurator object */ public ForceFieldConfigurator() { } /** * Sets the inputStream attribute of the ForceFieldConfigurator object * * @param ins The new inputStream value */ public void setInputStream(InputStream ins) { this.ins = ins; } /** * gives a list of possible force field types * *@return the list */ public String[] getFfTypes(){ return fftypes; } /** * Sets the forceFieldType attribute of the ForceFieldConfigurator object * * @param ffname The new forceFieldType name */ public boolean checkForceFieldType(String ffname) { boolean check=false; for (int i = 0; i <= fftypes.length; i++) { if (fftypes[i].equals(ffname)) { check=true; break; } } if (!check) { // logger.debug("FFError:checkForceFieldType> Unknown forcefield:" + ffname + "Take default:"+ffName); return false; } return true; } /** *Constructor for the ForceFieldConfigurator object * * @param ffname name of the force field data file */ public void setForceFieldConfigurator(String ffname) throws CDKException { ffname=ffname.toLowerCase(); boolean check=false; if (ffname==ffName && parameterSet!=null){ }else{ check=this.checkForceFieldType(ffname); ffName=ffname; if (ffName.equals("mm2")) { //logger.debug("ForceFieldConfigurator: open Force Field mm2"); //f = new File(mm2File); //readFile(f); ins = this.getClass().getClassLoader().getResourceAsStream("org/openscience/cdk/modeling/forcefield/data/mm2.prm"); //logger.debug("ForceFieldConfigurator: open Force Field mm2 ... READY"); mm2 = new MM2BasedParameterSetReader(); mm2.setInputStream(ins); //logger.debug("ForceFieldConfigurator: mm2 set input stream ... READY"); try{ this.setMM2Parameters(); }catch (Exception ex1){ throw new CDKException("Problems with set MM2Parameters due to "+ex1.toString(), ex1); } }else if (ffName.equals("mmff94") || !check) { //logger.debug("ForceFieldConfigurator: open Force Field mmff94"); //f = new File(mmff94File); //readFile(f); ins = this.getClass().getClassLoader().getResourceAsStream("org/openscience/cdk/modeling/forcefield/data/mmff94.prm"); mmff94= new MMFF94BasedParameterSetReader(); mmff94.setInputStream(ins); try{ this.setMMFF94Parameters(); }catch (Exception ex2){ throw new CDKException("Problems with set MM2Parameters due to"+ex2.toString(), ex2); } } } //throw new CDKException("Data file for "+ffName+" force field could not be found"); } /** * Sets the atomTypes attribute of the ForceFieldConfigurator object * * @param atomtypes The new atomTypes */ public void setAtomTypes(List<IAtomType> atomtypes) { atomTypes = atomtypes; } /** * Sets the parameters attribute of the ForceFieldConfigurator object * * @param parameterset The new parameter values */ public void setParameters(Map<String, Object> parameterset) { parameterSet = parameterset; } /** * Sets the parameters attribute of the ForceFieldConfigurator object, default is mm2 force field */ public void setMM2Parameters() throws CDKException{ try{ mm2.readParameterSets(); }catch(Exception ex1){ throw new CDKException("Problem within readParameterSets due to:"+ex1.toString(), ex1); } parameterSet = mm2.getParamterSet(); atomTypes = mm2.getAtomTypes(); } public void setMMFF94Parameters() throws Exception{ mmff94.readParameterSets(); parameterSet = mmff94.getParamterSet(); atomTypes = mmff94.getAtomTypes(); } /** * Gets the atomTypes attribute of the ForceFieldConfigurator object * * @return The atomTypes vector */ public List<IAtomType> getAtomTypes() { return atomTypes; } /** * Gets the parameterSet attribute of the ForceFieldConfigurator object * * @return The parameterSet hashtable */ public Map<String,Object> getParameterSet() { return this.parameterSet; } /** * Find the atomType for a id * * @param ID Atomtype id of the forcefield * @return The atomType * @exception NoSuchAtomTypeException atomType is not known. */ private IAtomType getAtomType(String ID) throws NoSuchAtomTypeException { IAtomType at = null; for (int i = 0; i < atomTypes.size(); i++) { at = (IAtomType) atomTypes.get(i); if (at.getAtomTypeName().equals(ID)) { return at; } } throw new NoSuchAtomTypeException("AtomType " + ID + " could not be found"); } /** * Method assigns atom types to atoms (calculates sssr and aromaticity) * *@return sssrf set *@exception CDKException Problems detecting aromaticity or making hose codes. */ public IRingSet assignAtomTyps(IMolecule molecule) throws CDKException { IAtom atom = null; String hoseCode = ""; HOSECodeGenerator hcg = new HOSECodeGenerator(); int NumberOfRingAtoms = 0; IRingSet ringSetA = null; IRingSet ringSetMolecule = new SSSRFinder(molecule).findSSSR(); boolean isInHeteroRing = false; try { AtomContainerManipulator.percieveAtomTypesAndConfigureAtoms(molecule); CDKHueckelAromaticityDetector.detectAromaticity(molecule); } catch (Exception cdk1) { throw new CDKException( "AROMATICITYError: Cannot determine aromaticity due to: " + cdk1.getMessage(), cdk1 ); } for (int i = 0; i < molecule.getAtomCount(); i++) { atom = molecule.getAtom(i); if (ringSetMolecule.contains(atom)) { NumberOfRingAtoms = NumberOfRingAtoms + 1; atom.setFlag(CDKConstants.ISINRING, true); atom.setFlag(CDKConstants.ISALIPHATIC, false); ringSetA = ringSetMolecule.getRings(atom); RingSetManipulator.sort(ringSetA); IRing sring = (IRing) ringSetA.getAtomContainer(ringSetA.getAtomContainerCount()-1); atom.setProperty("RING_SIZE", Integer.valueOf(sring.getRingSize())); isInHeteroRing = false; Iterator<IAtomContainer> containers = RingSetManipulator.getAllAtomContainers(ringSetA).iterator(); while (!isInHeteroRing && containers.hasNext()) { isInHeteroRing = isHeteroRingSystem(containers.next()); } } else { atom.setFlag(CDKConstants.ISALIPHATIC, true); atom.setFlag(CDKConstants.ISINRING, false); isInHeteroRing = false; } atom.setProperty("MAX_BOND_ORDER", new Double(molecule.getMaximumBondOrder(atom).ordinal()+1)); try { hoseCode = hcg.getHOSECode(molecule, atom, 3); //logger.debug("HOSECODE GENERATION: ATOM "+i+" HoseCode: "+hoseCode+" "); } catch (CDKException ex1) { System.out.println("Could not build HOSECode from atom " + i + " due to " + ex1.toString()); throw new CDKException("Could not build HOSECode from atom "+ i + " due to " + ex1.toString(), ex1); } try { configureAtom(atom, hoseCode, isInHeteroRing); } catch (CDKException ex2) { System.out.println("Could not final configure atom " + i + " due to " + ex2.toString()); throw new CDKException("Could not final configure atom due to problems with force field", ex2); } } // IBond[] bond = molecule.getBonds(); String bondType; for (IBond bond : molecule.bonds()) { //logger.debug("bond[" + i + "] properties : " + molecule.getBond(i).getProperties()); bondType = "0"; if (bond.getOrder() == IBond.Order.SINGLE) { if ((bond.getAtom(0).getAtomTypeName().equals("Csp2")) & ((bond.getAtom(1).getAtomTypeName().equals("Csp2")) | (bond.getAtom(1).getAtomTypeName().equals("C=")))) { bondType = "1"; } if ((bond.getAtom(0).getAtomTypeName().equals("C=")) & ((bond.getAtom(1).getAtomTypeName().equals("Csp2")) | (bond.getAtom(1).getAtomTypeName().equals("C=")))) { bondType = "1";} if ((bond.getAtom(0).getAtomTypeName().equals("Csp")) & (bond.getAtom(1).getAtomTypeName().equals("Csp"))) { bondType = "1";} } // molecule.getBond(i).setProperty("MMFF94 bond type", bondType); bond.setProperty("MMFF94 bond type", bondType); //logger.debug("bond[" + i + "] properties : " + molecule.getBond(i).getProperties()); } return ringSetMolecule; } /** * Returns true if atom is in hetero ring system * *@param ac AtomContainer *@return true/false */ private boolean isHeteroRingSystem(IAtomContainer ac) { if (ac != null) { for (int i = 0; i < ac.getAtomCount(); i++) { if (!(ac.getAtom(i).getSymbol()).equals("H") && !(ac.getAtom(i).getSymbol()).equals("C")) { return true; } } } return false; } /** * Assigns an atom type to an atom * * @param atom The atom to be aasigned * @param ID the atom type id * @exception NoSuchAtomTypeException atomType is not known * @return the assigned atom */ private IAtom setAtom(IAtom atom, String ID) throws NoSuchAtomTypeException { IAtomType at = null; String key = ""; List<?> data = null; Double value = null; at = getAtomType(ID); if (atom.getSymbol()==null){ atom.setSymbol(at.getSymbol()); } atom.setAtomTypeName(at.getAtomTypeName()); atom.setFormalNeighbourCount(at.getFormalNeighbourCount()); key = "vdw" + ID; data = (List) parameterSet.get(key); value = (Double) data.get(0); key = "charge" + ID; if (parameterSet.containsKey(key)) { data = (List) parameterSet.get(key); value = (Double) data.get(0); atom.setCharge(value.doubleValue()); } Object color = at.getProperty("org.openscience.cdk.renderer.color"); if (color != null) { atom.setProperty("org.openscience.cdk.renderer.color", color); } if (at.getAtomicNumber() != 0) { atom.setAtomicNumber(at.getAtomicNumber()); } if (at.getExactMass() > 0.0) { atom.setExactMass(at.getExactMass()); } return atom; } public IAtom configureAtom(IAtom atom, String hoseCode, boolean _boolean) throws CDKException { if (ffName.equals("mm2")){ return configureMM2BasedAtom(atom, hoseCode,_boolean); }else if (ffName.equals("mmff94")){ return configureMMFF94BasedAtom(atom, hoseCode,_boolean); } return atom; } /** * Configures an atom to a mm2 based atom type * * @param atom atom to be configured * @param hoseCode the 4 sphere hose code of the atom * @return atom * @exception NoSuchAtomTypeException atomType is not known */ public IAtom configureMM2BasedAtom(IAtom atom, String hoseCode,boolean hetRing) throws NoSuchAtomTypeException { //logger.debug("CONFIGURE MM2 ATOM"); List<Pattern> atomTypePattern = null; MM2BasedAtomTypePattern atp = new MM2BasedAtomTypePattern(); atomTypePattern = atp.getAtomTypePatterns(); Double d_tmp = null; Pattern p = null; String ID = ""; boolean atomTypeFlag = false; if (atom instanceof IPseudoAtom) { return atom; } hoseCode=removeAromaticityFlagsFromHoseCode(hoseCode); String [] ids={"C","Csp2","C=","Csp","HC","O","O=","N","Nsp2","Nsp", "F","CL","BR","I","S","S+",">SN","SO2","SI","LP","HO", "CR3R","HN","HOCO","P","B","BTET","HN2","C.","C+","GE", "SN","PB","SE","TE","D","NPYD","CE3R","N+","NPYL","Oar", "Sthi","N2OX","HS","=N=","NO3","OM","HN+","OR","Car","HE", "NE","AR","KR","XE","","","","MG","PTET","FE","FE","NI","NI","CO","CO", "","","OX","OK","C++","N=C","NPD+","N+=","N2OX" }; for (int j = 0; j < atomTypePattern.size(); j++) { p = (Pattern) atomTypePattern.get(j); Matcher mat = p.matcher(hoseCode); if (mat.matches()) { ID = ids[j]; //CHECK Rings 1,2,8,9? Thiole 44? AZO 9? Radical - ? Amid 23/enol 21? if (j == 0) { //csp3 if (atom.getFlag(CDKConstants.ISINRING)) { if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(3))) { ID=ids[21]; }else if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(6)) & atom.getFlag(CDKConstants.ISAROMATIC)) { ID=ids[1]; }else if (atom.getFlag(CDKConstants.ISAROMATIC)){ ID=ids[1]; } } } else if (j == 1) { //csp2 if (atom.getFlag(CDKConstants.ISINRING)) { if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(6)) & atom.getFlag(CDKConstants.ISAROMATIC)) { }else if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(3))) { ID=ids[37]; }else{ ID=ids[1]; } } p = (Pattern) atomTypePattern.get(2); //COOH mat = p.matcher(hoseCode); if (mat.matches() & !atom.getFlag(CDKConstants.ISINRING)) { ID=ids[2]; } } else if (j == 5) { //OH/Ether if (atom.getFlag(CDKConstants.ISINRING)) { if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(3))) { ID=ids[48]; //EPOXY }else if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(5)) & atom.getFlag(CDKConstants.ISAROMATIC)){ ID=ids[40]; }else{ ID=ids[5]; } } } else if (j == 7) { //n sp3 if (atom.getFlag(CDKConstants.ISINRING) & atom.getFlag(CDKConstants.ISAROMATIC)) { if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))) { ID=ids[39]; } } //Amid p = (Pattern) atomTypePattern.get(77); mat = p.matcher(hoseCode); if (mat.matches() & !atom.getFlag(CDKConstants.ISINRING)) { ID=ids[8]; } } else if (j == 8) { //nsp2 if (atom.getFlag(CDKConstants.ISINRING)) { if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(6))) { ID=ids[36]; } } p = (Pattern) atomTypePattern.get(36); //AZO mat = p.matcher(hoseCode); if (mat.matches() & !atom.getFlag(CDKConstants.ISINRING)) { ID=ids[36]; } } else if (j == 43) { //h thiol d_tmp = (Double) atom.getProperty("MAX_BOND_ORDER"); if (d_tmp.doubleValue() > 1) { ID=ids[4]; } } else if (j == 20) { //h alcohol,ether p = (Pattern) atomTypePattern.get(76); //Enol mat = p.matcher(hoseCode); if (mat.matches() & !atom.getFlag(CDKConstants.ISINRING)) { ID=ids[27]; } p = (Pattern) atomTypePattern.get(23); //COOH mat = p.matcher(hoseCode); if (mat.matches() & !atom.getFlag(CDKConstants.ISINRING)) { ID=ids[23]; } } else if (j == 22) { p = (Pattern) atomTypePattern.get(75); //Amid mat = p.matcher(hoseCode); if (mat.matches()) { ID=ids[27]; } } atomTypeFlag = true; //logger.debug("Atom Symbol:" + atom.getSymbol() + " MATCH AtomType> " + ID + " HoseCode>" + hoseCode + " "); break; }//IF }//for end if (atomTypeFlag) { atomTypeFlag = false; return setAtom(atom, ID); } else { throw new NoSuchAtomTypeException("Atom is unkown: Symbol:" + atom.getSymbol() + " does not MATCH AtomType. HoseCode:" + hoseCode); } } public String removeAromaticityFlagsFromHoseCode(String hoseCode){ String hosecode=""; for (int i=0;i<hoseCode.length();i++){ if (hoseCode.charAt(i)!= '*'){ hosecode=hosecode+hoseCode.charAt(i); } } return hosecode; } /** * Configures an atom to a mmff94 based atom type * * @param atom atom to be configured * @param hoseCode the 4 sphere hose code of the atom * @return atom * @exception NoSuchAtomTypeException atomType is not known */ public IAtom configureMMFF94BasedAtom(IAtom atom, String hoseCode, boolean isInHetRing) throws NoSuchAtomTypeException { //logger.debug("****** Configure MMFF94 AtomType ******"); List<Pattern> atomTypePattern = null; MMFF94BasedAtomTypePattern atp = new MMFF94BasedAtomTypePattern(); atomTypePattern = atp.getAtomTypePatterns(); Pattern p = null; Pattern p2 = null; String ID = ""; boolean atomTypeFlag = false; Matcher mat=null; Matcher mat2=null; hoseCode=removeAromaticityFlagsFromHoseCode(hoseCode); String [] ids={"C","Csp2","C=","Csp","CO2M","CNN+","C%","CIM+","CR4R", "CR3R","CE4R","Car","C5A","C5B","C5","HC","HO","HN","HOCO", "HN=C","HN2","HOCC","HOH","HOS","HN+","HO+","HO=+","HP","O","O=", "OX","OM","O+","O=+","OH2","Oar","N","N=C","NC=C","NSP","=N=","NAZT", "N+","N2OX","N3OX","NC#N","NO3","N=O","NC=O","NSO","N+=","NCN+","NGD+","NR%", "NM","N5M","NPYD","NPYL","NPD+","N5A","N5B","NPOX","N5OX","N5+","N5","S", "S=C",">SN","SO2","SX","SO2M","=SO","Sthi","PTET","P","-P=C","F","CL","BR", "I","SI","CL04","FE+2","FE+3","F-","CL-","BR-","LI+","NA+","K+","ZN+2","CA+2","CU+1", "CU+2","MG+2","Du" }; if (atom instanceof IPseudoAtom) { return atom; } for (int j = 0; j < atomTypePattern.size(); j++) { p = (Pattern) atomTypePattern.get(j); mat = p.matcher(hoseCode); if (mat.matches()) { ID = ids[j]; if (j == 0) {//csp3 if (atom.getFlag(CDKConstants.ISINRING)) { p = (Pattern) atomTypePattern.get(13);//c beta heteroaromatic ring mat = p.matcher(hoseCode); p2 = (Pattern) atomTypePattern.get(12);//c alpha heteroaromatic ring mat2 = p2.matcher(hoseCode); if (mat.matches() && isInHetRing && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[13]; }else if (mat2.matches() && isInHetRing && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[12]; }else if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(3))& !atom.getFlag(CDKConstants.ISAROMATIC)) { ID = ids[9];//sp3 3mem rings }else if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(4)) & !atom.getFlag(CDKConstants.ISAROMATIC)) { ID = ids[8];//sp3 4mem rings }else if (atom.getFlag(CDKConstants.ISAROMATIC) && isInHetRing && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))) { ID = ids[14];//C in het 5 ring }else if (atom.getFlag(CDKConstants.ISAROMATIC)) { ID = ids[11];//C in benzene, pyroll } }else{ p = (Pattern) atomTypePattern.get(66);//S=C mat = p.matcher(hoseCode); if (mat.matches()){ ID = ids[66]; } } } else if (j == 1) {//csp2 if (atom.getFlag(CDKConstants.ISINRING)) { if (atom.getProperty("RING_SIZE").equals(Integer.valueOf(4)) & !atom.getFlag(CDKConstants.ISAROMATIC) && !isInHetRing) { ID = ids[29];//C= in 4 ring } } } else if (j == 2) {//csp2 C=Hetatom if (atom.getFlag(CDKConstants.ISINRING) && isInHetRing && atom.getFlag(CDKConstants.ISAROMATIC)) { ID = ids[12]; } } else if (j == 36) {//n sp3 //Amid p = (Pattern) atomTypePattern.get(48); mat = p.matcher(hoseCode); if (mat.matches() & !atom.getFlag(CDKConstants.ISINRING)) { ID = ids[48]; } p = (Pattern) atomTypePattern.get(44);//sp3 n-oxide mat = p.matcher(hoseCode); if (mat.matches()){ ID = ids[44]; } p = (Pattern) atomTypePattern.get(56);//npyd mat = p.matcher(hoseCode); if (atom.getFlag(CDKConstants.ISAROMATIC)){//id in pyridin, pyrol etc... if (mat.matches() && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ if(atom.getProperty("RING_SIZE").equals(Integer.valueOf(6)) && mat.matches()){ ID = ids[56]; }else if(atom.getProperty("RING_SIZE").equals(Integer.valueOf(5)) && mat.matches()){ ID = ids[57]; }else{ ID=ids[64]; } } p = (Pattern) atomTypePattern.get(61);//npyd mat = p.matcher(hoseCode); if (atom.getFlag(CDKConstants.ISAROMATIC)){//id in pyridin, pyrol etc... if (mat.matches() && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ if(atom.getProperty("RING_SIZE").equals(Integer.valueOf(6)) && mat.matches()){ ID = ids[61]; }else if(atom.getProperty("RING_SIZE").equals(Integer.valueOf(5)) && mat.matches()){ ID = ids[62]; }else{ ID=ids[43]; } } p = (Pattern) atomTypePattern.get(45);//NC#N mat = p.matcher(hoseCode); if (mat.matches()){ ID = ids[45]; } }else if (j == 37) {//N=C n in imine p = (Pattern) atomTypePattern.get(59);//n beta heteroaromatic ring mat = p.matcher(hoseCode); if (atom.getFlag(CDKConstants.ISINRING)) { if (mat.matches() && isInHetRing && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[59]; }else if( atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(6))){ ID = ids[56]; }else if( atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[57]; } } p = (Pattern) atomTypePattern.get(43);//N2OX mat = p.matcher(hoseCode); if (mat.matches()){ if (atom.getFlag(CDKConstants.ISAROMATIC)&& atom.getProperty("RING_SIZE").equals(Integer.valueOf(6))){ ID = ids[61];//npox }else if (mat.matches() && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[62];//n5ox }else{ ID = ids[43]; } } }else if (j==43){//sp2 n oxide if (atom.getFlag(CDKConstants.ISINRING) && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[62]; }else if (atom.getFlag(CDKConstants.ISINRING) && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(6))){ ID = ids[61]; } }else if (j==40 || j==41){//n in c=n=n or terminal n in azido if (atom.getFlag(CDKConstants.ISINRING) && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[59];//aromatic N 5R alpha } }else if (j==50){//n+= if (atom.getFlag(CDKConstants.ISINRING) && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[63];//n5+ }else if (atom.getFlag(CDKConstants.ISINRING) && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(6))){ ID = ids[58];//npd+ } }else if (j==28){//O ->furan if (atom.getFlag(CDKConstants.ISINRING) && atom.getFlag(CDKConstants.ISAROMATIC) && atom.getProperty("RING_SIZE").equals(Integer.valueOf(5))){ ID = ids[35]; } }else if (j==16){//H-Object-> enol p = (Pattern) atomTypePattern.get(21);//enol mat = p.matcher(hoseCode); if (mat.matches()){ ID = ids[21]; } p = (Pattern) atomTypePattern.get(18);//enol mat = p.matcher(hoseCode); if (mat.matches()){ ID = ids[18]; } }else if (j==74){//P p = (Pattern) atomTypePattern.get(75);//-P=C mat = p.matcher(hoseCode); if (mat.matches()){ ID = ids[75]; } } atomTypeFlag = true; //logger.debug("Atom Symbol:" + atom.getSymbol() + " MATCH AtomType> " + ID + " HoseCode>" + hoseCode + " "); break; }//IF }//for end if (atomTypeFlag) { atomTypeFlag = false; return setAtom(atom, ID); } else { throw new NoSuchAtomTypeException("Atom is unkown: Symbol:" + atom.getSymbol() + " does not MATCH AtomType. HoseCode:" + hoseCode); } } }