{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "chem-bla-ics",
  "description": "Chemblaics (pronounced chem-bla-ics) is the science that uses open science and computers to solve problems in chemistry, biochemistry and related fields.",
  "home_page_url": "https://chem-bla-ics.linkedchemistry.info/",
  "feed_url": "https://chem-bla-ics.linkedchemistry.info/2010/11/29/adding-new-dictionary-to-oscar.json",
  "icon": "https://chem-bla-ics.linkedchemistry.info/assets/images/chem-bla-ics_logo.png",
  "language": "en",
  "authors": [
    {
      "name": "Egon Willighagen",
      "url": "https://orcid.org/0000-0001-7542-0286",
      "_orcid": "0000-0001-7542-0286"
    }
  ],
  "items": [

    {
      "id": "https://doi.org/10.59350/v90k2-5a907",
      "url": "https://chem-bla-ics.linkedchemistry.info/2010/11/29/adding-new-dictionary-to-oscar.html",
      "title": "Adding a new dictionary to Oscar",
      "content_html": "<p>Say, you have your own dictionary of chemical compounds. For example, like your company’s list of yet-unpublished\n<a href=\"http://chembl.blogspot.com/2010/08/research-code-to-company-name-mapping.html\">internal research codes</a>. Still,\nyou want to index your local <a href=\"http://en.wikipedia.org/wiki/LISTSERV\">listserv</a> to make it easier for your\nemployees to search for particular chemistry you are working on and perhaps related to something done at\nother company sites. This is what Oscar is for.</p>\n\n<p>But, it will need to understand things like <a href=\"http://chembl.blogspot.com/p/research-code-stems.html\">UK-92,480</a>.\nThis is made possible with the Oscar4 refactorings we are currently working on. You only need to\n<a href=\"https://chem-bla-ics.linkedchemistry.info/2010/10/28/oscar4-java-api-chemical-name.html\">register a dedicated dictionary <i class=\"fa-solid fa-recycle fa-xs\"></i></a>.\nOscar4 has a default dictionary which corresponds to the dictionary used by Oscar3, and a dictionary based on\n<a href=\"http://www.ebi.ac.uk/chebi/\">ChEBI</a> (an old version) (see <a href=\"http://bitbucket.org/wwmm/oscar4/src/247b8deef001/oscar4-chemnamedict/src/main/java/uk/ac/cam/ch/wwmm/oscar/chemnamedict/core/\">this folder</a>\nin the source code repository).</p>\n\n<p>Adding a new dictionary is very straightforward: you just implement the <a href=\"http://bitbucket.org/wwmm/oscar4/src/247b8deef001/oscar4-chemnamedict/src/main/java/uk/ac/cam/ch/wwmm/oscar/chemnamedict/IChemNameDict.java\">IChemNameDict</a>\ninterface. This is, for example, what the OPSIN dictionary looks like:</p>\n\n<div class=\"language-java highlighter-rouge\"><div class=\"highlight\"><pre class=\"highlight\"><code><span class=\"kd\">public</span> <span class=\"kd\">class</span> <span class=\"nc\">OpsinDictionary</span>\n<span class=\"kd\">implements</span> <span class=\"nc\">IChemNameDict</span><span class=\"o\">,</span> <span class=\"nc\">IInChIProvider</span> <span class=\"o\">{</span>\n\n  <span class=\"kd\">private</span> <span class=\"no\">URI</span> <span class=\"n\">uri</span><span class=\"o\">;</span>\n\n  <span class=\"kd\">public</span> <span class=\"nf\">OpsinDictionary</span><span class=\"o\">()</span> <span class=\"kd\">throws</span> <span class=\"nc\">URISyntaxException</span> <span class=\"o\">{</span>\n    <span class=\"k\">this</span><span class=\"o\">.</span><span class=\"na\">uri</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"no\">URI</span><span class=\"o\">(</span>\n      <span class=\"s\">\"http://wwmm.cam.ac.uk/oscar/dictionariy/opsin/\"</span>\n    <span class=\"o\">);</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"c1\">// the URI is somewhat like a namespace</span>\n  <span class=\"kd\">public</span> <span class=\"no\">URI</span> <span class=\"nf\">getURI</span><span class=\"o\">()</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"n\">uri</span><span class=\"o\">;</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"c1\">// there are no stop words defined in this</span>\n  <span class=\"c1\">// dictionary</span>\n  <span class=\"kd\">public</span> <span class=\"kt\">boolean</span> <span class=\"nf\">hasStopWord</span><span class=\"o\">(</span><span class=\"nc\">String</span> <span class=\"n\">queryWord</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"o\">;</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"c1\">// see hasStopWord()</span>\n  <span class=\"kd\">public</span> <span class=\"nc\">Set</span> <span class=\"nf\">getStopWords</span><span class=\"o\">()</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"nc\">Collections</span><span class=\"o\">.</span><span class=\"na\">emptySet</span><span class=\"o\">();</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"c1\">// it has the name in the dictionary if the name</span>\n  <span class=\"c1\">// can be converted into an InChI</span>\n  <span class=\"kd\">public</span> <span class=\"kt\">boolean</span> <span class=\"nf\">hasName</span><span class=\"o\">(</span><span class=\"nc\">String</span> <span class=\"n\">queryName</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"nf\">getInChI</span><span class=\"o\">(</span><span class=\"n\">queryName</span><span class=\"o\">).</span><span class=\"na\">size</span><span class=\"o\">()</span> <span class=\"o\">!=</span> <span class=\"mi\">0</span><span class=\"o\">;</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"c1\">// this dictionary can return InChIs for names</span>\n  <span class=\"c1\">// so, it implements the IInChIProvider interface</span>\n  <span class=\"kd\">public</span> <span class=\"nc\">Set</span> <span class=\"nf\">getInChI</span><span class=\"o\">(</span><span class=\"nc\">String</span> <span class=\"n\">queryName</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n    <span class=\"k\">try</span> <span class=\"o\">{</span>\n      <span class=\"nc\">NameToStructure</span> <span class=\"n\">nameToStructure</span> <span class=\"o\">=</span>\n        <span class=\"nc\">NameToStructure</span><span class=\"o\">.</span><span class=\"na\">getInstance</span><span class=\"o\">();</span>\n      <span class=\"nc\">OpsinResult</span> <span class=\"n\">result</span> <span class=\"o\">=</span> <span class=\"n\">nameToStructure</span>\n        <span class=\"o\">.</span><span class=\"na\">parseChemicalName</span><span class=\"o\">(</span>\n          <span class=\"n\">queryName</span><span class=\"o\">,</span> <span class=\"kc\">false</span>\n        <span class=\"o\">);</span>\n      <span class=\"k\">if</span> <span class=\"o\">(</span><span class=\"n\">result</span><span class=\"o\">.</span><span class=\"na\">getStatus</span><span class=\"o\">()</span>\n          <span class=\"o\">==</span> <span class=\"no\">OPSIN_RESULT_STATUS</span><span class=\"o\">.</span><span class=\"na\">SUCCESS</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n        <span class=\"nc\">Set</span> <span class=\"n\">inchis</span> <span class=\"o\">=</span> <span class=\"k\">new</span> <span class=\"nc\">HashSet</span><span class=\"o\">();</span>\n        <span class=\"nc\">String</span> <span class=\"n\">inchi</span> <span class=\"o\">=</span> <span class=\"nc\">NameToInchi</span>\n          <span class=\"o\">.</span><span class=\"na\">convertResultToInChI</span><span class=\"o\">(</span>\n            <span class=\"n\">result</span><span class=\"o\">,</span> <span class=\"kc\">false</span>\n          <span class=\"o\">);</span>\n        <span class=\"n\">inchis</span><span class=\"o\">.</span><span class=\"na\">add</span><span class=\"o\">(</span><span class=\"n\">inchi</span><span class=\"o\">);</span>\n        <span class=\"k\">return</span> <span class=\"n\">inchis</span><span class=\"o\">;</span>\n      <span class=\"o\">}</span>\n    <span class=\"o\">}</span> <span class=\"k\">catch</span> <span class=\"o\">(</span><span class=\"nc\">NameToStructureException</span> <span class=\"n\">e</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n      <span class=\"n\">e</span><span class=\"o\">.</span><span class=\"na\">printStackTrace</span><span class=\"o\">();</span>   \n    <span class=\"o\">}</span>\n    <span class=\"k\">return</span> <span class=\"nc\">Collections</span><span class=\"o\">.</span><span class=\"na\">emptySet</span><span class=\"o\">();</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"kd\">public</span> <span class=\"nc\">String</span> <span class=\"nf\">getInChIforShortestSMILES</span><span class=\"o\">(</span>\n    <span class=\"nc\">String</span> <span class=\"n\">queryName</span><span class=\"o\">)</span>\n  <span class=\"o\">{</span>\n    <span class=\"nc\">Set</span> <span class=\"n\">inchis</span> <span class=\"o\">=</span> <span class=\"n\">getInChI</span><span class=\"o\">(</span><span class=\"n\">queryName</span><span class=\"o\">);</span>\n    <span class=\"k\">if</span> <span class=\"o\">(</span><span class=\"n\">inchis</span><span class=\"o\">.</span><span class=\"na\">size</span><span class=\"o\">()</span> <span class=\"o\">==</span> <span class=\"mi\">0</span><span class=\"o\">)</span> <span class=\"k\">return</span> <span class=\"kc\">null</span><span class=\"o\">;</span>\n    <span class=\"k\">return</span> <span class=\"n\">inchis</span><span class=\"o\">.</span><span class=\"na\">iterator</span><span class=\"o\">().</span><span class=\"na\">next</span><span class=\"o\">();</span>\n  <span class=\"o\">}</span>\n\n  <span class=\"c1\">// since names are converted on the fly, we do</span>\n  <span class=\"c1\">// not enumerate them</span>\n  <span class=\"kd\">public</span> <span class=\"nc\">Set</span> <span class=\"nf\">getNames</span><span class=\"o\">(</span><span class=\"nc\">String</span> <span class=\"n\">inchi</span><span class=\"o\">)</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"nc\">Collections</span><span class=\"o\">.</span><span class=\"na\">emptySet</span><span class=\"o\">();</span>\n  <span class=\"o\">}</span>\n  <span class=\"kd\">public</span> <span class=\"nc\">Set</span> <span class=\"nf\">getNames</span><span class=\"o\">()</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"nc\">Collections</span><span class=\"o\">.</span><span class=\"na\">emptySet</span><span class=\"o\">();</span>\n  <span class=\"o\">}</span>\n  <span class=\"kd\">public</span> <span class=\"nc\">Set</span> <span class=\"nf\">getOrphanNames</span><span class=\"o\">()</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"nc\">Collections</span><span class=\"o\">.</span><span class=\"na\">emptySet</span><span class=\"o\">();</span>\n  <span class=\"o\">}</span>\n  <span class=\"kd\">public</span> <span class=\"nc\">Set</span> <span class=\"nf\">getChemRecords</span><span class=\"o\">()</span> <span class=\"o\">{</span>\n    <span class=\"k\">return</span> <span class=\"nc\">Collections</span><span class=\"o\">.</span><span class=\"na\">emptySet</span><span class=\"o\">();</span>\n  <span class=\"o\">}</span>\n  <span class=\"kd\">public</span> <span class=\"kt\">boolean</span> <span class=\"nf\">hasOntologyIdentifier</span><span class=\"o\">(</span>\n    <span class=\"nc\">String</span> <span class=\"n\">identifier</span><span class=\"o\">)</span>\n  <span class=\"o\">{</span>\n    <span class=\"c1\">// this ontology does not use ontology</span>\n    <span class=\"c1\">// identifiers</span>\n    <span class=\"k\">return</span> <span class=\"kc\">false</span><span class=\"o\">;</span>\n  <span class=\"o\">}</span>\n<span class=\"o\">}</span>\n</code></pre></div></div>\n\n<p>Now, you can implement the interface in various ways. You can even have the implementation hook into a SQL database\nwith JDBC, or use something else fancy. The dictionary will be used at various steps of the Oscar4 text analysis\nworkflow.</p>\n\n<p>Mind you, the refactoring is not over yet, and the details may change here and there.</p>\n\n<p>Your comments are most welcome!</p>",
      "summary": "Say, you have your own dictionary of chemical compounds. For example, like your company’s list of yet-unpublished internal research codes. Still, you want to index your local listserv to make it easier for your employees to search for particular chemistry you are working on and perhaps related to something done at other company sites. This is what Oscar is for.",
      
      "date_published": "2010-11-29T00:00:00+00:00",
      "date_modified": "2025-03-05T00:00:00+00:00",
      "tags": ["oscar","java"],
      
      
      
      
      
      
        "authors": [ { "name": "Egon Willighagen", "url": "https://orcid.org/0000-0001-7542-0286" } ]
      
    }

  ]
}
