/* * Updated 01/03/06 to use the latest CDK QSAR package * */ import org.openscience.cdk.interfaces.IMolecule; import org.openscience.cdk.interfaces.IChemObject; import org.openscience.cdk.interfaces.IChemFile; import org.openscience.cdk.ChemFile; import org.openscience.cdk.interfaces.IChemSequence; import org.openscience.cdk.interfaces.IChemModel; import org.openscience.cdk.qsar.DescriptorValue; import org.openscience.cdk.qsar.IDescriptor; import org.openscience.cdk.qsar.DescriptorSpecification; import org.openscience.cdk.exception.CDKException; import org.openscience.cdk.fingerprint.Fingerprinter; import org.openscience.cdk.smiles.SmilesParser; import org.openscience.cdk.qsar.*; import org.openscience.cdk.io.MDLReader; import org.openscience.cdk.io.CMLReader; import org.openscience.cdk.io.CMLWriter; import org.openscience.cdk.io.MDLWriter; import org.openscience.cdk.io.listener.PropertiesListener; import org.openscience.cdk.qsar.result.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServlet; import javax.servlet.ServletContext; import org.apache.axis.MessageContext; import org.apache.axis.transport.http.HTTPConstants; import java.util.*; import java.io.*; public class CDKdesc { PropertiesListener propsListener; public CDKdesc() {}; public String getDescriptors(String moleculeString, String classes) throws CDKException { DescriptorEngine de = null; // Convert the String representation to a Molecule StringReader reader = new StringReader(moleculeString); MDLReader mdlr = new MDLReader(reader); IChemFile chemFile = (IChemFile) mdlr.read((IChemObject)new ChemFile()); IChemSequence chemSequence = chemFile.getChemSequence(0); IChemModel chemModel = chemSequence.getChemModel(0); IMolecule molecule = chemModel.getSetOfMolecules().getMolecule(0); // we need to get the real path corresponding to "/", for this service // given that we can then get a list of the CDK jars so that we can // examine them for Descriptor classes in the constructor of DescriptorEngine MessageContext mcon = MessageContext.getCurrentContext(); ServletContext scon = ((HttpServlet)mcon.getProperty(HTTPConstants.MC_HTTP_SERVLET)).getServletContext(); String baseDir = scon.getRealPath("/") + "WEB-INF/lib"; File file = new File(baseDir); String[] jars = file.list(); if (jars == null || jars.length == 0) { System.out.println("No jars found for this web app"); } else { for (int i = 0; i < jars.length; i++) { jars[i] = baseDir+"/"+jars[i]; // make the paths fully qualified } } de = new DescriptorEngine(DescriptorEngine.MOLECULAR, jars); HashMap map = new HashMap(); if (classes.equalsIgnoreCase("all")) { classes = "topological,geometrical,constitutional,electronic,hybrid"; } // split the comma seperated list String[] classlist = classes.split(","); List deInstances = de.getDescriptorInstances(); for (Object o : deInstances) { IDescriptor desc = (IDescriptor)o; DescriptorSpecification spec = desc.getSpecification(); String[] comps = spec.getSpecificationReference().split("#"); String descName = comps[1]; String[] descClasses = de.getDictionaryClass(spec); if (descClasses == null) { continue; } // see if the class matches any of our specified classes boolean matches = false; for (String s1 : descClasses) { for (String s2 : classlist) { if (s1.equals(s2+"Descriptor")) { matches = true; break; } } if (matches) break; } if (!matches) continue; try { DescriptorValue value = desc.calculate(molecule); IDescriptorResult result = value.getValue(); if (result instanceof DoubleResult) { molecule.setProperty(descName, ((DoubleResult) result).doubleValue()); map.put(descName, ((DoubleResult) result).doubleValue()); } else if (result instanceof IntegerResult) { molecule.setProperty(descName, ((IntegerResult) result).intValue()); map.put(descName, ((IntegerResult) result).intValue()); } else if (result instanceof DoubleArrayResult) { for (int i = 0; i < ((DoubleArrayResult) result).size(); i++) { molecule.setProperty(descName + "." + i, ((DoubleArrayResult) result).get(i)); map.put(descName + "." + i, ((DoubleArrayResult) result).get(i)); } } else if (result instanceof IntegerArrayResult) { for (int i = 0; i < ((IntegerArrayResult) result).size(); i++){ molecule.setProperty(descName + "." + i, ((IntegerArrayResult) result).get(i)); map.put(descName + "." + i, ((IntegerArrayResult) result).get(i)); } } } catch (CDKException e) { throw new CDKException(e.toString()); } } StringWriter writer = new StringWriter(); try { MDLWriter mdlwriter = new MDLWriter(writer); mdlwriter.setSdFields(map); mdlwriter.write(molecule); mdlwriter.close(); } catch (Exception e) { throw new CDKException(e.toString()); } return(writer.toString()); } private static String readFile(String inFileName) throws IOException { FileReader r = null; try { r = new FileReader(new File(inFileName)); StringBuffer sb = new StringBuffer(); char[] b = new char[8192]; int n; while ((n = r.read(b)) > 0) { sb.append(b, 0, n); } return sb.toString(); } finally { try { r.close(); } catch (IOException e1) { e1.printStackTrace(); } } } }