From: Stefan K. <sh...@us...> - 2002-10-25 17:26:00
|
Update of /cvsroot/cdk/cdk/src/org/openscience/cdk/smiles In directory usw-pr-cvs1:/tmp/cvs-serv19293 Modified Files: SmilesGenerator.java Log Message: Corrected a bug Index: SmilesGenerator.java =================================================================== RCS file: /cvsroot/cdk/cdk/src/org/openscience/cdk/smiles/SmilesGenerator.java,v retrieving revision 1.18 retrieving revision 1.19 diff -C2 -r1.18 -r1.19 *** SmilesGenerator.java 22 Oct 2002 14:24:18 -0000 1.18 --- SmilesGenerator.java 25 Oct 2002 14:21:10 -0000 1.19 *************** *** 74,77 **** --- 74,78 ---- /** This is used for remembering wich vector marks the end of a double bond configuration **/ private Stack endOfDoubleBondConfiguration=new Stack(); + private Stack beginnOfDoubleBondConfiguration=new Stack(); /** *************** *** 144,151 **** * @param container The atomContainer the atom is in * @param parent The atom we came from - * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated is given by isDoubleBondSpecified[x]==true. * @return false=is not end of configuration, true=is */ ! private boolean isEndOfDoubleBond(AtomContainer container, Atom atom, Atom parent, boolean isDoubleBondSpecified[]){ int lengthAtom=container.getConnectedAtoms(atom).length+atom.getHydrogenCount(); int lengthParent=container.getConnectedAtoms(parent).length+parent.getHydrogenCount(); --- 145,153 ---- * @param container The atomContainer the atom is in * @param parent The atom we came from * @return false=is not end of configuration, true=is */ ! private boolean isEndOfDoubleBond(AtomContainer container, Atom atom, Atom parent, boolean[] doubleBondConfiguration){ ! if(!doubleBondConfiguration[container.getBondNumber(atom,parent)]) ! return false; int lengthAtom=container.getConnectedAtoms(atom).length+atom.getHydrogenCount(); int lengthParent=container.getConnectedAtoms(parent).length+parent.getHydrogenCount(); *************** *** 161,168 **** two=atoms[i]; } ! if(two!=null&&one.getSymbol().equals(two.getSymbol())&&isDoubleBondSpecified[container.getBondNumber(parent,atom)]==true) return(false); ! else return(true); } } --- 163,171 ---- two=atoms[i]; } ! if(two!=null&&one.getSymbol().equals(two.getSymbol())) return(false); ! else{ return(true); + } } } *************** *** 176,183 **** * @param container The atomContainer the atom is in * @param parent The atom we came from - * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated is given by isDoubleBondSpecified[x]==true. * @return false=is not start of configuration, true=is */ ! private boolean isBeginnOfDoubleBond(AtomContainer container, Atom a, Atom parent, boolean isDoubleBondSpecified[]){ int lengthAtom=container.getConnectedAtoms(a).length+a.getHydrogenCount(); if(lengthAtom!=3) --- 179,185 ---- * @param container The atomContainer the atom is in * @param parent The atom we came from * @return false=is not start of configuration, true=is */ ! private boolean isBeginnOfDoubleBond(AtomContainer container, Atom a, Atom parent,boolean[] doubleBondConfiguration){ int lengthAtom=container.getConnectedAtoms(a).length+a.getHydrogenCount(); if(lengthAtom!=3) *************** *** 189,195 **** Atom nextAtom=null; for(int i=0;i< atoms.length;i++){ ! if(atoms[i]!=parent&& container.getBond(atoms[i],a).getOrder()==CDKConstants.BONDORDER_DOUBLE&&isEndOfDoubleBond(container,atoms[i],a,isDoubleBondSpecified)){ ! nextAtom=atoms[i]; doubleBond=true; } if(atoms[i]!=parent&&one==null) --- 191,197 ---- Atom nextAtom=null; for(int i=0;i< atoms.length;i++){ ! if(atoms[i]!=parent&& container.getBond(atoms[i],a).getOrder()==CDKConstants.BONDORDER_DOUBLE&&isEndOfDoubleBond(container,atoms[i],a,doubleBondConfiguration)){ doubleBond=true; + nextAtom=atoms[i]; } if(atoms[i]!=parent&&one==null) *************** *** 198,202 **** two=atoms[i]; } ! if(one!=two && doubleBond && isDoubleBondSpecified[container.getBondNumber(a,nextAtom)]==true) return(true); else --- 200,204 ---- two=atoms[i]; } ! if(one!=two && doubleBond && doubleBondConfiguration[container.getBondNumber(a,nextAtom)]) return(true); else *************** *** 420,424 **** public synchronized String createSMILES(Molecule molecule) { try{ ! return (createSMILES(molecule, false, new boolean[molecule.getAtomCount()])); } catch(Coordinates2DMissingException ex){return("");}//This exception can only happen if a chiral smiles is requested --- 422,426 ---- public synchronized String createSMILES(Molecule molecule) { try{ ! return (createSMILES(molecule, false, new boolean[molecule.getBondCount()])); } catch(Coordinates2DMissingException ex){return("");}//This exception can only happen if a chiral smiles is requested *************** *** 435,446 **** * valid stereo configuration the smiles will be the same as the non-chiral one. * ! * @exception Coordinates2DMissingException At least one atom has no Point2D; coordinates are needed for crating the chiral smiles. * @param molecule The molecule to evaluate ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated is given by isDoubleBondSpecified[x]==true. * @see org.openscience.cdk.graph.invariant.CanonicalLabeler#canonLabel. * */ ! public synchronized String createChiralSMILES(Molecule molecule, boolean isDoubleBondSpecified[]) throws Coordinates2DMissingException { ! return(createSMILES(molecule, true, isDoubleBondSpecified)); } --- 437,448 ---- * valid stereo configuration the smiles will be the same as the non-chiral one. * ! * @exception Coordinates2DMissingException At least one atom has no Point2D; coordinates are needed for crating the chiral smiles. * @param molecule The molecule to evaluate ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated isDoubleBondSpecified[x] should be true, if not false. * @see org.openscience.cdk.graph.invariant.CanonicalLabeler#canonLabel. * */ ! public synchronized String createChiralSMILES(Molecule molecule, boolean[] doubleBondConfiguration) throws Coordinates2DMissingException { ! return(createSMILES(molecule, true, doubleBondConfiguration)); } *************** *** 453,461 **** * @param molecule The molecule to evaluate * @param chiral true=SMILES will be chiral, false=SMILES will not be chiral. ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated is given b isDoubleBondSpecified[x]==true. ! * @exception Coordinates2DMissingException At least one atom has no Point2D; coordinates are needed for crating the chiral smiles. This excpetion can only be thrown if chiral smiles is created, ignore it if you want a non-chiral smiles (createSMILES(AtomContainer) does not throw an exception). * */ ! public synchronized String createSMILES(Molecule molecule, boolean chiral, boolean isDoubleBondSpecified[]) throws Coordinates2DMissingException{ if (molecule.getAtomCount() == 0) return ""; --- 455,463 ---- * @param molecule The molecule to evaluate * @param chiral true=SMILES will be chiral, false=SMILES will not be chiral. ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated isDoubleBondSpecified[x] should be true, if not false. ! * @exception Coordinates2DMissingException At least one atom has no Point2D; coordinates are needed for crating the chiral smiles. This excpetion can only be thrown if chiral smiles is created, ignore it if you want a non-chiral smiles (createSMILES(AtomContainer) does not throw an exception). * */ ! public synchronized String createSMILES(Molecule molecule, boolean chiral, boolean doubleBondConfiguration[]) throws Coordinates2DMissingException{ if (molecule.getAtomCount() == 0) return ""; *************** *** 489,493 **** StringBuffer l = new StringBuffer(); ! createSMILES(start, l, molecule, chiral, isDoubleBondSpecified); return l.toString(); } --- 491,495 ---- StringBuffer l = new StringBuffer(); ! createSMILES(start, l, molecule, chiral, doubleBondConfiguration); return l.toString(); } *************** *** 500,510 **** * @param line the StringBuffer that the SMILES is to be appended to. * @param chiral true=SMILES will be chiral, false=SMILES will not be chiral. ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated is given by isDoubleBondSpecified[x]==true. * @param atomContainer the AtomContainer that the SMILES string is generated for. */ ! private void createSMILES(Atom a, StringBuffer line, AtomContainer atomContainer, boolean chiral, boolean isDoubleBondSpecified[]) { Vector tree = new Vector(); createDFSTree(a, tree, null, atomContainer); ! parseChain(tree, line, atomContainer, null, chiral, isDoubleBondSpecified,null); } --- 502,512 ---- * @param line the StringBuffer that the SMILES is to be appended to. * @param chiral true=SMILES will be chiral, false=SMILES will not be chiral. ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated isDoubleBondSpecified[x] should be true, if not false. * @param atomContainer the AtomContainer that the SMILES string is generated for. */ ! private void createSMILES(Atom a, StringBuffer line, AtomContainer atomContainer, boolean chiral, boolean[] doubleBondConfiguration) { Vector tree = new Vector(); createDFSTree(a, tree, null, atomContainer); ! parseChain(tree, line, atomContainer, null, chiral, doubleBondConfiguration,null); } *************** *** 561,567 **** * Parse a branch */ ! private void parseChain(Vector v, StringBuffer buffer, AtomContainer container, Atom parent, boolean chiral, boolean isDoubleBondSpecified[], Vector vectorBefore){ int positionInVector=0; ! Atom atom=null; for(int h=0;h<v.size();h++){ Object o=v.get(h); --- 563,569 ---- * Parse a branch */ ! private void parseChain(Vector v, StringBuffer buffer, AtomContainer container, Atom parent, boolean chiral, boolean[] doubleBondConfiguration, Vector vectorBefore){ int positionInVector=0; ! Atom atom; for(int h=0;h<v.size();h++){ Object o=v.get(h); *************** *** 576,580 **** parent=(Atom)((Vector)v.get(1)).get(0); } ! parseAtom(atom, buffer, container, chiral, isDoubleBondSpecified,parent); if(chiral && isStereo(container,atom)){ Atom[] sorted=null; --- 578,582 ---- parent=(Atom)((Vector)v.get(1)).get(0); } ! parseAtom(atom, buffer, container, chiral,doubleBondConfiguration,parent); if(chiral && isStereo(container,atom)){ Atom[] sorted=null; *************** *** 892,896 **** } } ! if(atom!=null&&parent!=null&&isEndOfDoubleBond(container,atom,parent,isDoubleBondSpecified)){ int position=-1; if(v.get(positionInVector+1) instanceof Vector){ --- 894,898 ---- } } ! if(atom!=null&&parent!=null && isEndOfDoubleBond(container,atom,parent,doubleBondConfiguration)){ int position=-1; if(v.get(positionInVector+1) instanceof Vector){ *************** *** 934,968 **** if(brackets) buffer.append('('); ! parseChain((Vector)o, buffer, container, parent, chiral, isDoubleBondSpecified,v); if(brackets) buffer.append(')'); ! if(!endOfDoubleBondConfiguration.empty()){ ! Integer integer=(Integer)endOfDoubleBondConfiguration.pop(); ! Atom viewFrom=(Atom)endOfDoubleBondConfiguration.pop(); ! System.err.println("jkljlkjlk "+container.getBondNumber(viewFrom,parent)+" "+parent+" "+atom); ! if(v.indexOf(o)==integer.intValue()) ! { ! Atom[] atomsOfParent=container.getConnectedAtoms(parent); ! Atom[] atomsOfViewFrom=container.getConnectedAtoms(viewFrom); ! Atom between=null; ! for(int i=0;i<atomsOfParent.length;i++){ ! for(int k=0;k<atomsOfViewFrom.length;k++){ ! if(atomsOfParent[i]==atomsOfViewFrom[k]) ! between=atomsOfParent[i]; } - } - if(isDoubleBondSpecified[container.getBondNumber(between,atom)]){ - boolean oldAtom=isLeft(viewFrom,parent,between); - boolean newAtom=isLeft((Atom)v.get(positionInVector+1),between,parent); - if(oldAtom==newAtom) - buffer.append('/'); else ! buffer.append('\\'); } } else { ! endOfDoubleBondConfiguration.push(viewFrom); ! endOfDoubleBondConfiguration.push(integer); } } --- 936,976 ---- if(brackets) buffer.append('('); ! parseChain((Vector)o, buffer, container, parent, chiral, doubleBondConfiguration,v); if(brackets) buffer.append(')'); ! if(!beginnOfDoubleBondConfiguration.empty()){ ! Atom beginn=(Atom)beginnOfDoubleBondConfiguration.pop(); ! if(container.getBondNumber(beginn,parent)!=-1 && doubleBondConfiguration[container.getBondNumber(beginn,parent)]){ ! if(!endOfDoubleBondConfiguration.empty()){ ! Integer integer=(Integer)endOfDoubleBondConfiguration.pop(); ! Atom viewFrom=(Atom)endOfDoubleBondConfiguration.pop(); ! if(v.indexOf(o)==integer.intValue()) ! { ! Atom[] atomsOfParent=container.getConnectedAtoms(parent); ! Atom[] atomsOfViewFrom=container.getConnectedAtoms(viewFrom); ! Atom between=null; ! for(int i=0;i<atomsOfParent.length;i++){ ! for(int k=0;k<atomsOfViewFrom.length;k++){ ! if(atomsOfParent[i]==atomsOfViewFrom[k]) ! between=atomsOfParent[i]; ! } ! } ! boolean oldAtom=isLeft(viewFrom,parent,between); ! boolean newAtom=isLeft((Atom)v.get(positionInVector+1),between,parent); ! if(oldAtom==newAtom) ! buffer.append('/'); ! else ! buffer.append('\\'); } else ! { ! endOfDoubleBondConfiguration.push(viewFrom); ! endOfDoubleBondConfiguration.push(integer); ! } } } else { ! beginnOfDoubleBondConfiguration.push(beginn); } } *************** *** 1079,1088 **** * @param atom the atom to generate the SMILES for * @param buffer the string buffer that the atom is to be apended to. ! * @param container the atomCointainer we parse ! * @param chiral is the SMILES supposed to be chiral ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated is given by isDoubleBondSpecified[x]==true. ! * @param parent The atom which was parsed before */ ! private void parseAtom(Atom a, StringBuffer buffer, AtomContainer container, boolean chiral, boolean isDoubleBondSpecified[], Atom parent) { String symbol = a.getSymbol(); boolean stereo=isStereo(container,a); --- 1087,1093 ---- * @param atom the atom to generate the SMILES for * @param buffer the string buffer that the atom is to be apended to. ! * @param isDoubleBondSpecified[] Should double bond configurations be evaluated. If bond X (numbering as in the bonds array) should be evaluated isDoubleBondSpecified[x] should be true, if not false. */ ! private void parseAtom(Atom a, StringBuffer buffer, AtomContainer container, boolean chiral, boolean[] doubleBondConfiguration, Atom parent) { String symbol = a.getSymbol(); boolean stereo=isStereo(container,a); *************** *** 1098,1103 **** if(chiral && stereo) brackets=true; ! if(isBeginnOfDoubleBond(container,a,parent,isDoubleBondSpecified)){ buffer.append('/'); } if(brackets) --- 1103,1109 ---- if(chiral && stereo) brackets=true; ! if(isBeginnOfDoubleBond(container,a,parent,doubleBondConfiguration)){ buffer.append('/'); + beginnOfDoubleBondConfiguration.push(a); } if(brackets) *************** *** 1263,1266 **** --- 1269,1273 ---- } } + |