package net.bioclipse.nmrshiftdb.business; import java.io.ByteArrayInputStream; import java.net.URL; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.StringTokenizer; import java.util.Vector; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import net.bioclipse.cdk.business.ICDKManager; import net.bioclipse.cdk.domain.CDKMolecule; import net.bioclipse.cml.contenttypes.CmlFileDescriber; import net.bioclipse.core.business.BioclipseException; import net.bioclipse.core.domain.IMolecule; import net.bioclipse.core.domain.ISpecmol; import net.bioclipse.core.domain.ISpectrum; import net.bioclipse.jobs.IReturner; import net.bioclipse.managers.business.IBioclipseManager; import net.bioclipse.nmrshiftdb.util.Bc_nmrshiftdbConstants; import net.bioclipse.nmrshiftdb.util.NmrshiftdbUtils; import net.bioclipse.specmol.domain.JumboSpecmol; import net.bioclipse.spectrum.editor.MetadataUtils; import net.xomtools.CMLExtractor; import nu.xom.Elements; import org.apache.axis.client.Call; import org.apache.axis.client.Service; import org.apache.axis.message.SOAPBodyElement; import org.apache.axis.utils.Options; import org.apache.axis.utils.XMLUtils; import org.eclipse.core.runtime.IProgressMonitor; import org.openscience.cdk.DefaultChemObjectBuilder; import org.openscience.cdk.interfaces.IChemFile; import org.openscience.cdk.io.CMLReader; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.Text; import org.xmlcml.cml.base.CMLBuilder; import org.xmlcml.cml.base.CMLElement; import org.xmlcml.cml.element.CMLCml; import org.xmlcml.cml.element.CMLMetadata; import org.xmlcml.cml.element.CMLMolecule; import org.xmlcml.cml.element.CMLPeak; import org.xmlcml.cml.element.CMLPeakList; import org.xmlcml.cml.element.CMLSpectrum; import spok.utils.SpectrumUtils; public class NmrshiftdbManager implements IBioclipseManager { public String getManagerName() { return "nmrshiftdb"; } public void generalSearch(String searchstring, String searchtype, String searchfield, String serverurl, IReturner returner, IProgressMonitor monitor) throws BioclipseException { monitor.beginTask( "Searching in NMRShiftDB", IProgressMonitor.UNKNOWN ); try{ Options opts = new Options(new String[0]); opts.setDefaultURL(serverurl+"/services/NMRShiftDB"); Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName("doSearch"); call.setTargetEndpointAddress( new URL(opts.getURL()) ); DocumentBuilder builder; builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); SOAPBodyElement[] input = new SOAPBodyElement[1]; Document doc = builder.newDocument(); Element cdataElem; cdataElem = doc.createElementNS("http://www.nmrshiftdb.org/ws/NMRShiftDB/", "doSearch"); Element reqElem; reqElem = doc.createElementNS("http://www.nmrshiftdb.org/ws/NMRShiftDB/", "searchstring"); Node node; node = doc.createTextNode(NmrshiftdbUtils.replaceSpaces(searchstring)); reqElem.appendChild(node); Element reqElem2; reqElem2 = doc.createElementNS("http://www.nmrshiftdb.org/ws/NMRShiftDB/", "searchtype"); Node node2; node2 = doc.createTextNode(NmrshiftdbUtils.replaceSpaces(searchtype)); reqElem2.appendChild(node2); Element reqElem3; reqElem3 = doc.createElementNS("http://www.nmrshiftdb.org/ws/NMRShiftDB/", "searchfield"); Node node3; node3 = doc.createTextNode(NmrshiftdbUtils.replaceSpaces(searchfield)); reqElem3.appendChild(node3); cdataElem.appendChild(reqElem); cdataElem.appendChild(reqElem2); cdataElem.appendChild(reqElem3); input[0] = new SOAPBodyElement(cdataElem); Vector elems = (Vector) call.invoke( input ); SOAPBodyElement elem = (SOAPBodyElement) elems.get(0); Element e = elem.getAsDOM(); CMLBuilder cmlbuilder = new CMLBuilder(); CMLElement cmlElement = (CMLElement) cmlbuilder.parseString(XMLUtils.ElementToString(e)); List<ISpecmol> result = new ArrayList<ISpecmol>(); for(int i=0;i<cmlElement.getChildCount();i++){ result.add(new JumboSpecmol((CMLCml)cmlElement.getChildCMLElements().get(i))); } returner.completeReturn(result ); monitor.done(); }catch(Exception ex){ throw new BioclipseException(ex.getMessage(), ex); } } public void searchBySpectrum(ISpectrum cmlspectrum, boolean subortotal, String serverurl, IReturner returner, IProgressMonitor monitor) throws BioclipseException { monitor.beginTask( "Searching in NMRShiftDB", IProgressMonitor.UNKNOWN ); try{ Options opts = new Options(new String[0]); opts.setDefaultURL(serverurl+"/services/NMRShiftDB"); Service service = new Service(); final Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new URL(opts.getURL()) ); call.setTimeout(1000000); final SOAPBodyElement[] input = new SOAPBodyElement[1]; DocumentBuilder builder; builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.newDocument(); Element cdataElem; cdataElem = doc.createElementNS(opts.getURL(), "doElucidate"); Element reqElem; reqElem = doc.createElementNS(opts.getURL(), "suborwhole"); Node node; node = doc.createTextNode(subortotal ? "sub" : "whole");//signifies type of search reqElem.appendChild(node); Document document = builder.parse(new ByteArrayInputStream(cmlspectrum.getCML().getBytes())); Node nodeimp=doc.importNode(document.getFirstChild(),true); cdataElem.appendChild(nodeimp); cdataElem.appendChild(reqElem); input[0] = new SOAPBodyElement(cdataElem); List<IMolecule> result = new ArrayList<IMolecule>(); Vector elems = (Vector) call.invoke( input ); SOAPBodyElement elem = (SOAPBodyElement) elems.get(0); Element e = elem.getAsDOM(); CMLBuilder cmlbuilder = new CMLBuilder(); CMLElement cmlElement = (CMLElement) cmlbuilder.parseString(XMLUtils.ElementToString(e)); CMLCml cmlelud=(CMLCml)cmlElement; for(int i=0;i<cmlelud.getCMLChildCount("molecule");i++){ nu.xom.Element mol=cmlelud.getChildElements().get(i); mol.setNamespaceURI(CmlFileDescriber.NS_CML); CMLReader reader = new CMLReader(new ByteArrayInputStream(mol.toXML().getBytes())); IChemFile file = (IChemFile)reader.read( DefaultChemObjectBuilder.getInstance() .newInstance(IChemFile.class) ); CMLMolecule cmlMol = (CMLMolecule)cmlelud.getChildElements( "molecule",CmlFileDescriber.NS_CML).get(i); List<CMLMetadata> metadataList = MetadataUtils.getAllInOneMetadataList(cmlMol) .getMetadataDescendants(); List<CMLMetadata> descendents = MetadataUtils.getMetadataDescendantsByName( metadataList,"qname:similarity"); String similarity = descendents.get(0).getContent(); ICDKManager manager = net.bioclipse.cdk.business.Activator .getDefault().getJavaCDKManager(); CDKMolecule molecule = new CDKMolecule( file.getChemSequence(0) .getChemModel(0) .getMoleculeSet() .getAtomContainer(0)); molecule.getAtomContainer().setProperty("similarity", similarity); result.add(molecule); } returner.completeReturn(result ); monitor.done(); }catch(Exception ex){ throw new BioclipseException(ex.getMessage(), ex); } } public void submitSpecmol(CMLElement cmlelement, String serverurl, String username, String password, IReturner returner, IProgressMonitor monitor) throws BioclipseException { try { monitor.beginTask( "Submitting to NMRShiftDB", IProgressMonitor.UNKNOWN ); if(!(cmlelement instanceof CMLCml)) throw new BioclipseException("cmlelement must be instanceof CMLCml"); CMLCml cmlcml = (CMLCml)cmlelement; Options opts = new Options( new String[0] ); opts.setDefaultURL( serverurl + "/services/NMRShiftDB" ); SOAPBodyElement[] input = new SOAPBodyElement[1]; DocumentBuilder builder; builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document doc = builder.newDocument(); Element cdataElem; cdataElem = doc.createElementNS( opts.getURL(), "doSubmit" ); Element reqElem; reqElem = doc.createElementNS( opts.getURL(), "username" ); Node node; node = doc.createTextNode( username ); reqElem.appendChild( node ); Element reqElem2; reqElem2 = doc.createElementNS( opts.getURL(), "password" ); Node node2; node2 = doc.createTextNode( password ); reqElem2.appendChild( node2 ); Document document = builder.parse( new ByteArrayInputStream( cmlcml.toXML() .getBytes( "UTF-8" ) ) ); Node nodeimp = doc.importNode( document.getFirstChild(), true ); cdataElem.appendChild( nodeimp ); cdataElem.appendChild( reqElem ); cdataElem.appendChild( reqElem2 ); input[0] = new SOAPBodyElement( cdataElem ); Service service = new Service(); Call call = (Call) service.createCall(); call.setTargetEndpointAddress( new URL( opts.getURL() ) ); Vector elems = (Vector) call.invoke( input ); SOAPBodyElement elem = null; elem = (SOAPBodyElement) elems.get( 0 ); Element e = elem.getAsDOM(); String ids = e.getFirstChild().getTextContent(); StringTokenizer idsst = new StringTokenizer( ids ); Elements spectra = cmlcml.getChildCMLElements( "spectrum" ); for ( int k = 0; k < spectra.size(); k++ ) { CMLSpectrum spectrum = (CMLSpectrum) spectra.get( k ); List<CMLMetadata> nmridmetadatas = MetadataUtils .getMetadataDescendantsByName( MetadataUtils .getAllInOneMetadataList( spectrum ) .getMetadataDescendants(), Bc_nmrshiftdbConstants.nmrid ); if ( nmridmetadatas.size() > 0 ) { nmridmetadatas.get( 0 ) .setContent( idsst.nextToken() ); } else { CMLMetadata metadata = new CMLMetadata(); metadata.setName( Bc_nmrshiftdbConstants.nmrid ); metadata.setContent( idsst.nextToken() ); spectrum.getMetadataListElements().get( 0 ) .addMetadata( metadata ); } } returner.completeReturn( e.getFirstChild().getTextContent() ); monitor.done(); }catch(Exception ex){ throw new BioclipseException(ex.getMessage(), ex); } } public void predictSpectrum(IMolecule molecule, String type, boolean useCalculated, boolean local, String serverurl, IReturner returner, IProgressMonitor monitor) throws BioclipseException { monitor.beginTask( "Performing Prediction", IProgressMonitor.UNKNOWN ); try{ CMLSpectrum spectrum; org.openscience.cdk.interfaces.IMolecule cdkmol = DefaultChemObjectBuilder.getInstance().newInstance( org.openscience.cdk.interfaces.IMolecule.class, net.bioclipse.cdk.business.Activator.getDefault() .getJavaCDKManager().asCDKMolecule(molecule) .getAtomContainer() ); if(local){ net.bioclipse.nmrshiftdb.util.PredictionTool predtool= new net.bioclipse.nmrshiftdb.util.PredictionTool(); spectrum=new CMLSpectrum(); spectrum.setType("NMR"); spectrum.setNamespaceURI(CMLExtractor.CML_NAMESPACE); CMLPeakList peakList=new CMLPeakList(); spectrum.addPeakList(peakList); for(int i=0;i<cdkmol.getAtomCount();i++){ //TODO not good if(type.indexOf(cdkmol.getAtom(i).getSymbol())>-1){ try{ StringBuffer sb = new StringBuffer(); double[] result=predtool.generalPredict(cdkmol, cdkmol.getAtom(i),true, true, -1, -1, sb, false, true, null, 6, false, sb, 6, true); //double[] result=predtool.predict(cdkmol, cdkmol.getAtom(i)); System.err.println(sb.toString()); CMLPeak peak=new CMLPeak(); peak.setXMin(result[0]); peak.setXValue(result[1]); peak.setXMax(result[2]); peak.setXUnits("units:ppm"); peak.setXWidth(result[3]); peak.setYMin(result[4]); peak.setYMax(result[5]); peak.setId("p"+i); String[] atomrefs=new String[]{cdkmol.getAtom(i).getID()}; peak.setAtomRefs(atomrefs); peakList.addPeak(peak); }catch(Exception ex){ CMLPeak peak=new CMLPeak(); peak.setConvention("Prediction impossible"); peak.setId("p"+i); String[] atomrefs=new String[]{cdkmol.getAtom(i).getID()}; peak.setAtomRefs(atomrefs); peakList.addPeak(peak); } } } }else{ Options opts = new Options(new String[0]); opts.setDefaultURL(serverurl+"/services/NMRShiftDB"); Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName("doSearch"); call.setTargetEndpointAddress( new URL(opts.getURL()) ); DocumentBuilder builder; builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); Document document = builder.parse(new ByteArrayInputStream(molecule.toCML().getBytes())); Document doc = builder.newDocument(); Element cdataElem = doc.createElementNS(opts.getURL(), "doPrediction"); Element reqElem = doc.createElementNS(opts.getURL(), "spectrumTypeName"); Element calculatedElem = doc.createElementNS(opts.getURL(), "useCalculated"); Text node = doc.createTextNode(type); reqElem.appendChild(node); Node calculatednode = doc.createTextNode(useCalculated ? "true" : "false"); calculatedElem.appendChild(calculatednode); Node nodeimp=doc.importNode(document.getChildNodes().item(0),true); cdataElem.appendChild(nodeimp); cdataElem.appendChild(reqElem); cdataElem.appendChild(calculatedElem); SOAPBodyElement[] input=new SOAPBodyElement[1]; input[0] = new SOAPBodyElement(cdataElem); call.setTargetEndpointAddress( new URL( opts.getURL() ) ); Vector elems = (Vector) call.invoke( input ); SOAPBodyElement elem = null; elem = (SOAPBodyElement) elems.get( 0 ); Element e = elem.getAsDOM(); CMLBuilder cmlbuilder = new CMLBuilder(); CMLElement cmlElement = (CMLElement) cmlbuilder.parseString(XMLUtils.ElementToString(e)); spectrum=(CMLSpectrum)cmlElement; } StringBuffer errors = new StringBuffer(); List<CMLElement> peaks = SpectrumUtils.getPeakElements(spectrum); Iterator<CMLElement> it = peaks.iterator(); CMLPeakList newPeaks=new CMLPeakList(); while (it.hasNext()) { CMLPeak peak = (CMLPeak) it.next(); if(peak.getConvention()!=null && peak.getConvention().toString().equals( "Prediction impossible" )){ errors.append(peak.getAtomRefs()[0]+";"); }else{ if(peak.getAttribute("yValue")==null) peak.setYValue(1); if(Double.isNaN(peak.getYValue())){ peak.setYValue(1); } newPeaks.addPeak( peak ); } } spectrum.removeChild( spectrum.getPeakListElements().get( 0 )); spectrum.addPeakList( newPeaks ); returner.completeReturn(net.bioclipse.spectrum.Activator.getDefault().getJavaSpectrumManager().fromCml(spectrum.toXML())); monitor.done(); }catch(Exception ex){ throw new BioclipseException(ex.getMessage(), ex); } } public String getSpectrumTypes(String serverurl) throws BioclipseException{ try{ Options opts = new Options(new String[0]); opts.setDefaultURL(serverurl+"/services/NMRShiftDB"); Service service = new Service(); Call call = (Call) service.createCall(); call.setOperationName("getSpectrumTypes"); call.setTargetEndpointAddress( new URL(opts.getURL()) ); DocumentBuilder builder; builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); SOAPBodyElement[] input = new SOAPBodyElement[1]; Document doc = builder.newDocument(); Element cdataElem; cdataElem = doc.createElementNS(opts.getURL(), "getSpectrumTypes"); input[0] = new SOAPBodyElement(cdataElem); Vector elems = (Vector) call.invoke( input ); SOAPBodyElement elem = null ; Element e = null ; elem = (SOAPBodyElement) elems.get(0); e = elem.getAsDOM(); return e.getFirstChild().getTextContent(); }catch(Exception ex){ throw new BioclipseException(ex.getMessage()); } } }