All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.biojava.nbio.structure.rcsb.RCSBLigandsFactory Maven / Gradle / Ivy

There is a newer version: 7.2.2
Show newest version
/**
 * BioJava development code
 *
 * This code may be freely distributed and modified under the terms of the GNU Lesser General Public Licence. This
 * should be distributed with the code. If you do not have a copy, see:
 *
 * http://www.gnu.org/copyleft/lesser.html
 *
 * Copyright for this code is held jointly by the individual authors. These should be listed in @author doc comments.
 *
 * For more information on the BioJava project and its aims, or to join the biojava-l mailing list, visit the home page
 * at:
 *
 * http://www.biojava.org/
 *
 * Created on 2013-06-13 Created by Douglas Myers-Turnbull
 *
 * @since 3.0.6
 */
package org.biojava.nbio.structure.rcsb;

import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Fetches information from RCSB's RESTful Web Service
 * Interface. A factory for {@link RCSBLigands RCSBLigands} from {@code ligandInfo} XML files. The factory methods
 * will return null if the data was not found (rather than throwing an exception); client code should test for this.
 * This is for consistency: if the factory could not read some part (corresponding to a field in a class in
 * {@code rcsb.descriptions}) of the XML file, either because it was blank or contained an error that could not be
 * safely ignored, that field will simply be null. This holds even for numerical values. On some parse errors, the error
 * will additionally be printed to standard error.
 *
 * Example usage:
 *
 * 
 * RCSBLigands ligands = RCSBLigandsFactory.getFromPdbIds("1w0p");
 * List<RCSBLigand> list = ligands.getLigands();
 * System.out.println(list.get(0).getFormula()); // prints "CA 2"
 * System.out.println(list.get(1).getFormula()); // prints "C11 H19 N O9"
 * 
* * @see RCSB RESTful * * @author dmyerstu * @since 3.0.6 */ public class RCSBLigandsFactory { private static final String HET_URL_STUB = "http://www.pdb.org/pdb/rest/describeHet?chemicalID="; private static final Logger logger = Logger.getLogger(RCSBLigandsFactory.class.getPackage().getName()); private static final String PDB_URL_STUB = "http://www.pdb.org/pdb/rest/ligandInfo?structureId="; /** * @return A list of {@link RCSBLigand RCSBLigands} from the XML file loaded as {@code stream}. Prefer calling * {@link #getFromHeteroAtomId(String)} if you want data directly from RCSB's RESTful service. * @see RCSBDescriptionFactory#get(String) */ public static RCSBLigand getFromHeteroAtomId(InputStream stream) { return getFromHeteroAtomIds(stream).get(0); } /** * @return An {@link RCSBLigands} from the XML file at * {@code "http://www.pdb.org/pdb/rest/describeHet?chemicalID=hetid"}. This is the preferred factory method, * unless a different URL or input source is required. * @see RCSBDescriptionFactory#get(InputStream) */ public static RCSBLigand getFromHeteroAtomId(String heteroAtomId) { return getFromHeteroAtomIds(heteroAtomId).get(0); } /** * @return A list of {@link RCSBLigand RCSBLigands} from the XML file loaded as {@code stream}. Prefer calling * {@link #getFromHeteroAtomId(String)} if you want data directly from RCSB's RESTful service. * @see RCSBDescriptionFactory#get(String) */ public static List getFromHeteroAtomIds(InputStream stream) { NodeList data; try { data = ReadUtils.getNodes(stream); } catch (IOException e) { logger.log(Level.WARNING,"Couldn't parse XML", e); return null; } List ligands = new ArrayList(); // first get the ligandInfo Element structureIdE = null; for (int i = 0; i < data.getLength(); i++) { if (data.item(i).getNodeType() != 1) continue; structureIdE = (Element) data.item(i); if (structureIdE.getNodeName().equals("ligandInfo")) { break; } } // now get individual ligands data = structureIdE.getChildNodes(); Element ligandE = null; for (int i = 0; i < data.getLength(); i++) { if (data.item(i).getNodeType() != 1) continue; ligandE = (Element) data.item(i); if (ligandE.getNodeName().equals("ligand")) { RCSBLigand ligand = makeLigand(ligandE); ligands.add(ligand); } } return ligands; } /** * @return An {@link RCSBLigands} from the XML file at * {@code "http://www.pdb.org/pdb/rest/describeHet?chemicalID=hetid"}. This is the preferred factory method, * unless a different URL or input source is required. * @see RCSBDescriptionFactory#get(InputStream) */ public static List getFromHeteroAtomIds(List heteroAtomIds) { String[] x = new String[heteroAtomIds.size()]; heteroAtomIds.toArray(x); return getFromHeteroAtomIds(x); // somewhat cheating here } /** * @return An {@link RCSBLigands} from the XML file at * {@code "http://www.pdb.org/pdb/rest/describeHet?chemicalID=hetid"}. This is the preferred factory method, * unless a different URL or input source is required. * @see RCSBDescriptionFactory#get(InputStream) */ public static List getFromHeteroAtomIds(String... heteroAtomIds) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < heteroAtomIds.length; i++) { if (i > 0) sb.append(","); sb.append(heteroAtomIds[i]); } InputStream is; try { URL url = new URL(HET_URL_STUB + sb.toString()); is = url.openConnection().getInputStream(); } catch (IOException e) { logger.log(Level.WARNING,"Couldn't open connection", e); return null; } return getFromHeteroAtomIds(is); } /** * @return An {@link RCSBLigands} from the XML file loaded as {@code stream}. Prefer calling * {@link #getFromPdbId(String)} if you want data directly from RCSB's RESTful service. * @see RCSBDescriptionFactory#get(String) */ public static RCSBLigands getFromPdbId(InputStream stream) { NodeList data; try { data = ReadUtils.getNodes(stream); } catch (IOException e) { logger.log(Level.WARNING,"Couldn't parse XML", e); return null; } // first get the ligandInfo RCSBLigands ligands = new RCSBLigands(); Element structureIdE = null; for (int i = 0; i < data.getLength(); i++) { if (data.item(i).getNodeType() != 1) continue; structureIdE = (Element) data.item(i); if (structureIdE.getNodeName().equals("ligandInfo")) { break; } } // now get individual ligands data = structureIdE.getChildNodes(); Element ligandE = null; for (int i = 0; i < data.getLength(); i++) { if (data.item(i).getNodeType() != 1) continue; ligandE = (Element) data.item(i); if (ligandE.getNodeName().equals("ligand")) { if (ligands.getPdbId() == null) { ligands.setPdbId(ligandE.getAttribute("structureId")); } RCSBLigand ligand = makeLigand(ligandE); ligands.addLigand(ligand); } } return ligands; } /** * @return An {@link RCSBLigands} from the XML file at * {@code "http://www.pdb.org/pdb/rest/describeMol?structureId=pdbId"}. This is the preferred factory * method, unless a different URL or input source is required. * @see RCSBDescriptionFactory#get(InputStream) */ public static RCSBLigands getFromPdbId(String pdbId) { InputStream is; try { URL url = new URL(PDB_URL_STUB + pdbId); is = url.openConnection().getInputStream(); } catch (IOException e) { logger.log(Level.WARNING,"Couldn't open connection", e); return null; } return getFromPdbId(is); } /** * @return An {@link RCSBLigands} from the XML file loaded as {@code stream}. Prefer calling * {@link #getFromPdbId(String)} if you want data directly from RCSB's RESTful service. * @see RCSBDescriptionFactory#get(String) */ public static List getFromPdbIds(InputStream stream) { NodeList dataaa; try { dataaa = ReadUtils.getNodes(stream); } catch (IOException e) { logger.log(Level.WARNING,"Couldn't parse XML", e); return null; } // first we have to handle the element "ligandsInEntry", which is not present if we have only 1 structure List ligandsList = new ArrayList(); Element structureIdE = null; for (int k = 0; k < dataaa.getLength(); k++) { if (dataaa.item(k).getNodeType() != 1) continue; structureIdE = (Element) dataaa.item(k); if (structureIdE.getNodeName().equals("structureId")) { // now get the ligandInfo NodeList data = structureIdE.getChildNodes(); RCSBLigands ligands = new RCSBLigands(); Element ligandIdE = null; for (int i = 0; i < data.getLength(); i++) { if (data.item(i).getNodeType() != 1) continue; ligandIdE = (Element) data.item(i); if (ligandIdE.getNodeName().equals("ligandInfo")) { break; } } // now get individual ligands data = ligandIdE.getChildNodes(); Element ligandE = null; for (int i = 0; i < data.getLength(); i++) { if (data.item(i).getNodeType() != 1) continue; ligandE = (Element) data.item(i); if (ligandE.getNodeName().equals("ligand")) { if (ligands.getPdbId() == null) { ligands.setPdbId(ligandE.getAttribute("structureId")); } RCSBLigand ligand = makeLigand(ligandE); ligands.addLigand(ligand); } } ligandsList.add(ligands); } } return ligandsList; } /** * @return An {@link RCSBLigands} from the XML file at * {@code "http://www.pdb.org/pdb/rest/describeMol?structureId=pdbId"}. This is the preferred factory * method, unless a different URL or input source is required. * @see RCSBDescriptionFactory#get(InputStream) */ public static List getFromPdbIds(List pdbIds) { String[] x = new String[pdbIds.size()]; pdbIds.toArray(x); return getFromPdbIds(x); } /** * @return An {@link RCSBLigands} from the XML file at * {@code "http://www.pdb.org/pdb/rest/describeMol?structureId=pdbId"}. This is the preferred factory * method, unless a different URL or input source is required. * @see RCSBDescriptionFactory#get(InputStream) */ public static RCSBLigands getFromPdbIds(String pdbId) { InputStream is; try { URL url = new URL(PDB_URL_STUB + pdbId); is = url.openConnection().getInputStream(); } catch (IOException e) { logger.log(Level.WARNING,"Couldn't open connection", e); return null; } return getFromPdbId(is); } /** * @return An {@link RCSBLigands} from the XML file at * {@code "http://www.pdb.org/pdb/rest/describeMol?structureId=pdbId"}. This is the preferred factory * method, unless a different URL or input source is required. * @see RCSBDescriptionFactory#get(InputStream) */ public static List getFromPdbIds(String... pdbIds) { InputStream is; StringBuilder sb = new StringBuilder(); for (int i = 0; i < pdbIds.length; i++) { if (i > 0) sb.append(","); sb.append(pdbIds[i]); } try { URL url = new URL(PDB_URL_STUB + sb.toString()); is = url.openConnection().getInputStream(); } catch (IOException e) { logger.log(Level.WARNING,"Couldn't open connection", e); return null; } return getFromPdbIds(is); } private static RCSBLigand makeLigand(Element ligandE) { RCSBLigand ligand = new RCSBLigand(); ligand.setId(ligandE.getAttribute("chemicalID")); ligand.setType(ligandE.getAttribute("type")); ligand.setWeight(ReadUtils.toDouble(ligandE.getAttribute("molecularWeight"))); Element element = null; NodeList data = ligandE.getChildNodes(); for (int i = 0; i < data.getLength(); i++) { if (data.item(i).getNodeType() != 1) continue; element = (Element) data.item(i); if (element.getNodeName().equals("chemicalName")) { ligand.setName(element.getTextContent()); } else if (element.getNodeName().equals("formula")) { ligand.setFormula(element.getTextContent()); } else if (element.getNodeName().equals("InChIKey")) { ligand.setInChIKey(element.getTextContent()); } else if (element.getNodeName().equals("InChI")) { ligand.setInChI(element.getTextContent()); } else if (element.getNodeName().equals("smiles")) { ligand.setSmiles(element.getTextContent()); } } return ligand; } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy