org.integratedmodelling.engine.authorities.IUPACAuthority Maven / Gradle / Ivy
The newest version!
package org.integratedmodelling.engine.authorities;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.integratedmodelling.api.knowledge.IConcept;
import org.integratedmodelling.api.knowledge.IKnowledge;
import org.integratedmodelling.api.metadata.IMetadata;
import org.integratedmodelling.common.beans.authority.Authority;
import org.integratedmodelling.common.beans.authority.AuthorityConcept;
import org.integratedmodelling.common.beans.authority.AuthorityQueryResponse;
import org.integratedmodelling.common.metadata.Metadata;
import org.integratedmodelling.common.utils.image.ImageUtil;
import org.integratedmodelling.common.vocabulary.authority.BaseAuthority;
import org.integratedmodelling.exceptions.KlabException;
import org.integratedmodelling.exceptions.KlabValidationException;
import org.openscience.cdk.DefaultChemObjectBuilder;
import org.openscience.cdk.inchi.InChIGeneratorFactory;
import org.openscience.cdk.inchi.InChIToStructure;
import org.openscience.cdk.interfaces.IAtomContainer;
import org.openscience.cdk.layout.StructureDiagramGenerator;
import org.openscience.cdk.renderer.AtomContainerRenderer;
import org.openscience.cdk.renderer.RendererModel;
import org.openscience.cdk.renderer.font.AWTFontManager;
import org.openscience.cdk.renderer.generators.BasicAtomGenerator;
import org.openscience.cdk.renderer.generators.BasicSceneGenerator;
import org.openscience.cdk.renderer.generators.ExtendedAtomGenerator;
import org.openscience.cdk.renderer.generators.HighlightGenerator;
import org.openscience.cdk.renderer.generators.IGenerator;
import org.openscience.cdk.renderer.generators.RingGenerator;
import org.openscience.cdk.renderer.visitor.AWTDrawVisitor;
import net.sf.jniinchi.INCHI_KEY;
import net.sf.jniinchi.INCHI_KEY_STATUS;
import net.sf.jniinchi.INCHI_RET;
import net.sf.jniinchi.JniInchiException;
import net.sf.jniinchi.JniInchiOutputKey;
import net.sf.jniinchi.JniInchiWrapper;
import uk.ac.cam.ch.wwmm.opsin.NameToInchi;
import uk.ac.cam.ch.wwmm.opsin.NameToStructure;
import uk.ac.cam.ch.wwmm.opsin.NameToStructureConfig;
import uk.ac.cam.ch.wwmm.opsin.OpsinResult;
import uk.ac.cam.ch.wwmm.opsin.OpsinResult.OPSIN_RESULT_STATUS;
public class IUPACAuthority extends BaseAuthority {
public IUPACAuthority(Authority definition) {
super(definition);
}
@Override
public IConcept getBaseIdentityFor(String id, String authorityId) {
// TODO Auto-generated method stub
return null;
}
@Override
public List search(String query, String authorityId) {
// TODO Auto-generated method stub
return null;
}
@Override
public String validateCoreConcept(IKnowledge knowledge, String id) {
// TODO Auto-generated method stub
return null;
}
public static IUPACAuthority get() {
Authority ret = new Authority();
ret.setName("IUPAC");
ret.setOverallDescription(
"IUPAC endorses the use of the InChI identifiers for all organic and inorganic compounds.\n\n. Please search for the InChI "
+ "identifier for the compound you want to annotate (if the internal search is unsuccessful, Wikipedia lists them for each compound that has a page)"
+ " and use a form like\n\n im.core:Mass identified as \"1S/H3N/h1H3\" by IUPAC\n\n"
+ "in your annotations.");
ret.getAuthorities().add("IUPAC");
ret.getAuthorityDescriptions().add("");
ret.setOntologyId("iupac");
ret.setSearchable(true);
ret.setWorldview("im");
ret.setVersion("1.0");
ret.getInitialConcepts().add("chemistry:Compound,Compound");
return new IUPACAuthority(ret);
}
/*
* OPSIN-specific methods.
*/
public static List searchOPSIN(String query) throws KlabException {
List ret = new ArrayList<>();
NameToStructure nts = NameToStructure.getInstance();
NameToStructureConfig ntsconfig = new NameToStructureConfig();
ntsconfig.setAllowRadicals(true);
OpsinResult result = nts.parseChemicalName(query, ntsconfig);
if (result.getStatus() == OPSIN_RESULT_STATUS.SUCCESS) {
String stdinchi = NameToInchi.convertResultToStdInChI(result);
String stdinchikey = NameToInchi.convertResultToStdInChIKey(result);
Metadata md = new Metadata();
md.put(IMetadata.DC_IDENTIFIER, stdinchikey);
md.put(IMetadata.DC_NAME, stdinchi);
md.put(IMetadata.DC_LABEL, result.getChemicalName());
ret.add(md);
}
return ret;
}
/**
* Get the IUPAC hash for the passed InChI string, or null if the string was not
* recognized.
*
* @param inchi
* @return
*/
public static String getId(String inchi) {
String ret = inchi;
INCHI_KEY_STATUS status = INCHI_KEY_STATUS.INVALID_LAYOUT;
try {
status = JniInchiWrapper.checkInchiKey(inchi);
} catch (JniInchiException e) {
// fall through with invalid status
}
if (status != INCHI_KEY_STATUS.VALID_STANDARD) {
/*
* try as a InChI - this should be the default situation
*/
ret = null;
try {
JniInchiOutputKey output = JniInchiWrapper.getInchiKey("InChI=" + inchi);
if (output.getReturnStatus() == INCHI_KEY.OK) {
ret = output.getKey();
}
} catch (JniInchiException e) {
// fall through with ret = null
}
}
return ret;
}
public static void makeImage(String inchi, File output) throws KlabException {
BufferedImage image = null;
try {
InChIGeneratorFactory factory = InChIGeneratorFactory.getInstance();
// Get InChIToStructure
InChIToStructure intostruct = factory
.getInChIToStructure(inchi, DefaultChemObjectBuilder.getInstance());
INCHI_RET ret = intostruct.getReturnStatus();
if (ret != INCHI_RET.OKAY) {
// Structure generation failed
throw new KlabValidationException("Structure generation failed failed: " + ret.toString()
+ " [" + intostruct.getMessage() + "]");
}
IAtomContainer mol = intostruct.getAtomContainer();
StructureDiagramGenerator dptgen = new StructureDiagramGenerator();
dptgen.setMolecule(mol);
dptgen.generateCoordinates();
// make generators
List> generators = new ArrayList<>();
generators.add(new BasicSceneGenerator());
// generators.add(new BasicBondGenerator());
generators.add(new BasicSceneGenerator());
generators.add(new RingGenerator());
// generators.add(new AtomNumberGenerator());
generators.add(new ExtendedAtomGenerator());
generators.add(new HighlightGenerator());
// setup the renderer
AtomContainerRenderer renderer = new AtomContainerRenderer(generators, new AWTFontManager());
RendererModel model = renderer.getRenderer2DModel();
model.set(ExtendedAtomGenerator.CompactAtom.class, true);
model.set(ExtendedAtomGenerator.AtomRadius.class, 5.0);
model.set(ExtendedAtomGenerator.CompactShape.class, BasicAtomGenerator.Shape.OVAL);
model.set(ExtendedAtomGenerator.KekuleStructure.class, true);
model.set(ExtendedAtomGenerator.ShowAtomTypeNames.class, true);
model.set(RingGenerator.BondWidth.class, 1.0);
// get the image
image = new BufferedImage(400, 400, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = (Graphics2D) image.getGraphics();
g.setColor(Color.WHITE);
g.fill(new Rectangle2D.Double(0, 0, 400, 400));
// paint
// renderer.paint(molecule, new AWTDrawVisitor(g));
renderer.paint(dptgen
.getMolecule(), new AWTDrawVisitor(g), new Rectangle2D.Double(0, 0, 400, 400), true);
g.dispose();
} catch (Exception e) {
throw new KlabValidationException(e);
}
ImageUtil.saveImage(image, output.toString());
}
public static void main(String[] args) throws Exception {
for (IMetadata result : searchOPSIN("(8R,9S,13S,14S,17S)-13-Methyl-6,7,8,9,11,12,14,15,16,17-decahydrocyclopenta[a]phenanthrene-3,17-diol")) {
System.out.println(result.getString(IMetadata.DC_NAME));
System.out.println(result.getString(IMetadata.DC_IDENTIFIER));
makeImage(result.getString(IMetadata.DC_NAME), new File("diopro.png"));
}
}
@Override
public AuthorityConcept getConcept(String authority, String id) {
// TODO Auto-generated method stub
return null;
}
@Override
public AuthorityQueryResponse queryAuthority(String authority, String query) {
// TODO Auto-generated method stub
return null;
}
}