<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.3.4">Jekyll</generator><link href="https://chem-bla-ics.linkedchemistry.info/feed/by_tag/java.xml" rel="self" type="application/atom+xml" /><link href="https://chem-bla-ics.linkedchemistry.info/" rel="alternate" type="text/html" /><updated>2026-04-11T11:30:50+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/feed/by_tag/java.xml</id><title type="html">chem-bla-ics</title><subtitle>Chemblaics (pronounced chem-bla-ics) is the science that uses open science and computers to solve problems in chemistry, biochemistry and related fields.</subtitle><author><name>Egon Willighagen</name></author><entry><title type="html">Groovy Cheminformatics 4th edition</title><link href="https://chem-bla-ics.linkedchemistry.info/2012/01/15/groovy-cheminformatics-4th-edition.html" rel="alternate" type="text/html" title="Groovy Cheminformatics 4th edition" /><published>2012-01-15T00:00:00+00:00</published><updated>2012-01-15T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2012/01/15/groovy-cheminformatics-4th-edition</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2012/01/15/groovy-cheminformatics-4th-edition.html"><![CDATA[<p>Six month was not quite the amount of time I anticipated between the third and fourth edition, but I finally managed
to upload edition 1.4.7-0 of my <a href="http://www.lulu.com/product/paperback/groovy-cheminformatics-with-the-chemistry-development-kit/18825420">Groovy Cheminformatics</a>
book. The first three editions sold 37 copies, including two for myself. Enough to feel supported and to continue working on it.</p>

<p>So, this new edition is again thicker, summing up to 152 pages now, which is 28 pages more than
<a href="https://chem-bla-ics.linkedchemistry.info/2011/07/31/groovy-cheminformatics-3rd-edition.html">the 3rd edition <i class="fa-solid fa-recycle fa-xs"></i></a>. Indeed, the table of contents
is more than half a page longer in itself, though, just barely, still fitting on four pages. In fact, I had to remove one (new)
subsection title, because it would take otherwise two further pages.</p>

<p>The new content is again a mix of sections and chapters. While writing new chapters, I find myself realizing I need to cover
more basics. Those get typically added as new sections. I did not get many feature requests, except for one email pointing me
the text promised how to interpret and handle failing atom type perception, which explains one of the new sections.
The full list of new content is:</p>

<ul>
  <li>Section 2.1.4: explaining the three flavors of atomic coordinates</li>
  <li>Extended Section 2.2: added detail about electron counts of bonds (partly in reply to this post by Rich)</li>
  <li>Chapter 5 “Protein and DNA”: four pages, mostly about PDB files, and the matching CDK data structure</li>
  <li>Chapter 6 “IChemObjectBuilders”: four pages explaining the four alternative builders CDK 1.4.7 has</li>
  <li>Section 7.8: a new section with recipes on how to post-process read input, discussing MDL molfiles only now. It talks about what information is present in the file format, and what steps must be untertaken to add missing information</li>
  <li>Section 8.2.4 “No atom type perceived?!”</li>
  <li>Section 11.4: describes how to depict aromatic rings</li>
  <li>Section 11.5: describes how to change the background color of depictions</li>
  <li>Section 13.4: explains how to calculate the Van der Waals volume of molecules</li>
  <li>Section 18.1.3: discussing the API improvement in the iterating readers</li>
  <li>Appendix C: a list of all descriptors provided by the CDK</li>
  <li>Appendix D: a list of file formats known by the CDK, indicating which has readers and writers</li>
</ul>

<p>On top of that, I improved other bits of the book too, such as the resolution of the depictions of molecules,
as well as those of various diagrams. Also the number of scripts has seriously gone up, from 94 to 134!</p>

<p>Appendix C is a prelude to a chapter I am already writing, but did not get finished yet: a chapter about
descriptor calculation. But since I just started a new post-doc position, it may take another six months
for that chapter to make it into print.</p>

<p>The paperbak is <a href="http://www.lulu.com/product/paperback/groovy-cheminformatics-with-the-chemistry-development-kit/18825420">available from Lulu.com</a>,
an on-demand publisher, as well as <a href="http://www.lulu.com/product/ebook/groovy-cheminformatics-with-the-chemistry-development-kit/18825437">this ebook version</a>.</p>]]></content><author><name>Egon Willighagen</name></author><category term="cdk" /><category term="cdkbook" /><category term="java" /><category term="cheminf" /><summary type="html"><![CDATA[Six month was not quite the amount of time I anticipated between the third and fourth edition, but I finally managed to upload edition 1.4.7-0 of my Groovy Cheminformatics book. The first three editions sold 37 copies, including two for myself. Enough to feel supported and to continue working on it.]]></summary></entry><entry><title type="html">Groovy Cheminformatics 3rd edition</title><link href="https://chem-bla-ics.linkedchemistry.info/2011/07/31/groovy-cheminformatics-3rd-edition.html" rel="alternate" type="text/html" title="Groovy Cheminformatics 3rd edition" /><published>2011-07-31T00:00:00+00:00</published><updated>2011-07-31T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2011/07/31/groovy-cheminformatics-3rd-edition</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2011/07/31/groovy-cheminformatics-3rd-edition.html"><![CDATA[<p><strong>Update</strong>: the <a href="https://chem-bla-ics.linkedchemistry.info/2012/01/15/groovy-cheminformatics-4th-edition.html">fourth edition <i class="fa-solid fa-recycle fa-xs"></i></a> is out.</p>

<p>I am starting to get the hang of this publishing soon, publishing often thing, and
<a href="http://www.lulu.com/product/paperback/groovy-cheminformatics-with-the-chemistry-development-kit/16378378">just uploaded</a>
edition 1.4.1-0 of the <a href="https://chem-bla-ics.linkedchemistry.info/2011/02/06/groovy-cheminformatics.html">Groovy Cheminformatics <i class="fa-solid fa-recycle fa-xs"></i></a> book.
The cover is the same (with one typo fix), and the content is 20 pages thicker. True, six of those pages are isotope
masses of all natural isotopes. That leaves 14 pages with this new content:</p>

<ul>
  <li>Section 2.7 on line notations with 2.7.1 about reading and writing SMILES</li>
  <li>Section 6.3 about Sybyl (mol2) atom types</li>
  <li>Section 7.4 on atom numbering with 7.4.1 on Morgan atom numbers, and 7.4.2 on InChI atom numbers</li>
  <li>Chapter 9 on molecule depiction with the new rendering code, with
    <ul>
      <li>Section 9.1 on drawing molecules,</li>
      <li>Section 9.2 on rendering parameters, and</li>
      <li>Section 9.3 on the generator API and how to add custom content</li>
    </ul>
  </li>
  <li>Section 11.4 on calculating aromaticity</li>
  <li>Appendix A.2 listing all Sybyl atom types</li>
  <li>Appendix B listing all naturally occurring isotopes</li>
</ul>

<p>Features requests most welcome.</p>]]></content><author><name>Egon Willighagen</name></author><category term="cdk" /><category term="cdkbook" /><category term="java" /><category term="cheminf" /><summary type="html"><![CDATA[Update: the fourth edition is out.]]></summary></entry><entry><title type="html">Groovy Cheminformatics…</title><link href="https://chem-bla-ics.linkedchemistry.info/2011/02/06/groovy-cheminformatics.html" rel="alternate" type="text/html" title="Groovy Cheminformatics…" /><published>2011-02-06T00:00:00+00:00</published><updated>2011-02-06T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2011/02/06/groovy-cheminformatics</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2011/02/06/groovy-cheminformatics.html"><![CDATA[<p><strong>Update</strong>: the <a href="https://chem-bla-ics.linkedchemistry.info/2012/01/15/groovy-cheminformatics-4th-edition.html">fourth edition <i class="fa-solid fa-recycle fa-xs"></i></a> is out.</p>

<p>Some project are never finished. Neither is this one, but it is never too late to change how things work, so, taking advantage of
publishing-on-demand, here I introduce the release-soon, release-often equivalent of cheminformatics books, my
<a href="http://www.lulu.com/product/paperback/groovy-cheminformatics-with-the-chemistry-development-kit/14745007">Groovy Cheminformatics with the Chemistry Development Kit</a>
book:</p>

<p><img src="/assets/images/cdkBook.png" alt="" /></p>

<p>With a serious discount for just being the first edition (1.3.8-0), but still counting at 72 pages with 75 code examples, this edition
marks a personal milestone (and probably not much more than that). There remains much to do, but I promised a release by tomorrow, so
here it is. Next releases will contain more code examples, more functionality descriptions, and more literature reviewing where such
code is used in science. The plan is to make new editions with each new <a href="http://cdk.sf.net/">CDK</a> release, as well as new editions
when I added a new chapter, section, or just paragraph. But, there will not be a Nightly build service anytime soon.</p>

<p>The current table of content is as follows:</p>

<p><img src="/assets/images/cdkBookToc1.png" alt="" /></p>

<p>Now, the book content is <strong><em>not</em></strong> open content. However, it contains nothing that is not available in other means. It’s just the
compilation that makes this book interesting, as well as that I put effort in ensuring the code examples remain working.
For that, I ask a minor financial contribution.</p>]]></content><author><name>Egon Willighagen</name></author><category term="cdk" /><category term="java" /><category term="cheminf" /><category term="cdkbook" /><summary type="html"><![CDATA[Update: the fourth edition is out.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chem-bla-ics.linkedchemistry.info/assets/images/cdkBook.png" /><media:content medium="image" url="https://chem-bla-ics.linkedchemistry.info/assets/images/cdkBook.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Adding a new dictionary to Oscar</title><link href="https://chem-bla-ics.linkedchemistry.info/2010/11/29/adding-new-dictionary-to-oscar.html" rel="alternate" type="text/html" title="Adding a new dictionary to Oscar" /><published>2010-11-29T00:00:00+00:00</published><updated>2010-11-29T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2010/11/29/adding-new-dictionary-to-oscar</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2010/11/29/adding-new-dictionary-to-oscar.html"><![CDATA[<p>Say, you have your own dictionary of chemical compounds. For example, like your company’s list of yet-unpublished
<a href="http://chembl.blogspot.com/2010/08/research-code-to-company-name-mapping.html">internal research codes</a>. Still,
you want to index your local <a href="http://en.wikipedia.org/wiki/LISTSERV">listserv</a> 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.</p>

<p>But, it will need to understand things like <a href="http://chembl.blogspot.com/p/research-code-stems.html">UK-92,480</a>.
This is made possible with the Oscar4 refactorings we are currently working on. You only need to
<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>.
Oscar4 has a default dictionary which corresponds to the dictionary used by Oscar3, and a dictionary based on
<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>
in the source code repository).</p>

<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>
interface. This is, for example, what the OPSIN dictionary looks like:</p>

<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>
<span class="kd">implements</span> <span class="nc">IChemNameDict</span><span class="o">,</span> <span class="nc">IInChIProvider</span> <span class="o">{</span>

  <span class="kd">private</span> <span class="no">URI</span> <span class="n">uri</span><span class="o">;</span>

  <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>
    <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>
      <span class="s">"http://wwmm.cam.ac.uk/oscar/dictionariy/opsin/"</span>
    <span class="o">);</span>
  <span class="o">}</span>

  <span class="c1">// the URI is somewhat like a namespace</span>
  <span class="kd">public</span> <span class="no">URI</span> <span class="nf">getURI</span><span class="o">()</span> <span class="o">{</span>
    <span class="k">return</span> <span class="n">uri</span><span class="o">;</span>
  <span class="o">}</span>

  <span class="c1">// there are no stop words defined in this</span>
  <span class="c1">// dictionary</span>
  <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>
    <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
  <span class="o">}</span>

  <span class="c1">// see hasStopWord()</span>
  <span class="kd">public</span> <span class="nc">Set</span> <span class="nf">getStopWords</span><span class="o">()</span> <span class="o">{</span>
    <span class="k">return</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">emptySet</span><span class="o">();</span>
  <span class="o">}</span>

  <span class="c1">// it has the name in the dictionary if the name</span>
  <span class="c1">// can be converted into an InChI</span>
  <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>
    <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>
  <span class="o">}</span>

  <span class="c1">// this dictionary can return InChIs for names</span>
  <span class="c1">// so, it implements the IInChIProvider interface</span>
  <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>
    <span class="k">try</span> <span class="o">{</span>
      <span class="nc">NameToStructure</span> <span class="n">nameToStructure</span> <span class="o">=</span>
        <span class="nc">NameToStructure</span><span class="o">.</span><span class="na">getInstance</span><span class="o">();</span>
      <span class="nc">OpsinResult</span> <span class="n">result</span> <span class="o">=</span> <span class="n">nameToStructure</span>
        <span class="o">.</span><span class="na">parseChemicalName</span><span class="o">(</span>
          <span class="n">queryName</span><span class="o">,</span> <span class="kc">false</span>
        <span class="o">);</span>
      <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>
          <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>
        <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>
        <span class="nc">String</span> <span class="n">inchi</span> <span class="o">=</span> <span class="nc">NameToInchi</span>
          <span class="o">.</span><span class="na">convertResultToInChI</span><span class="o">(</span>
            <span class="n">result</span><span class="o">,</span> <span class="kc">false</span>
          <span class="o">);</span>
        <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>
        <span class="k">return</span> <span class="n">inchis</span><span class="o">;</span>
      <span class="o">}</span>
    <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>
      <span class="n">e</span><span class="o">.</span><span class="na">printStackTrace</span><span class="o">();</span>   
    <span class="o">}</span>
    <span class="k">return</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">emptySet</span><span class="o">();</span>
  <span class="o">}</span>

  <span class="kd">public</span> <span class="nc">String</span> <span class="nf">getInChIforShortestSMILES</span><span class="o">(</span>
    <span class="nc">String</span> <span class="n">queryName</span><span class="o">)</span>
  <span class="o">{</span>
    <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>
    <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>
    <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>
  <span class="o">}</span>

  <span class="c1">// since names are converted on the fly, we do</span>
  <span class="c1">// not enumerate them</span>
  <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>
    <span class="k">return</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">emptySet</span><span class="o">();</span>
  <span class="o">}</span>
  <span class="kd">public</span> <span class="nc">Set</span> <span class="nf">getNames</span><span class="o">()</span> <span class="o">{</span>
    <span class="k">return</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">emptySet</span><span class="o">();</span>
  <span class="o">}</span>
  <span class="kd">public</span> <span class="nc">Set</span> <span class="nf">getOrphanNames</span><span class="o">()</span> <span class="o">{</span>
    <span class="k">return</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">emptySet</span><span class="o">();</span>
  <span class="o">}</span>
  <span class="kd">public</span> <span class="nc">Set</span> <span class="nf">getChemRecords</span><span class="o">()</span> <span class="o">{</span>
    <span class="k">return</span> <span class="nc">Collections</span><span class="o">.</span><span class="na">emptySet</span><span class="o">();</span>
  <span class="o">}</span>
  <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">hasOntologyIdentifier</span><span class="o">(</span>
    <span class="nc">String</span> <span class="n">identifier</span><span class="o">)</span>
  <span class="o">{</span>
    <span class="c1">// this ontology does not use ontology</span>
    <span class="c1">// identifiers</span>
    <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
  <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Now, you can implement the interface in various ways. You can even have the implementation hook into a SQL database
with JDBC, or use something else fancy. The dictionary will be used at various steps of the Oscar4 text analysis
workflow.</p>

<p>Mind you, the refactoring is not over yet, and the details may change here and there.</p>

<p>Your comments are most welcome!</p>]]></content><author><name>Egon Willighagen</name></author><category term="oscar" /><category term="java" /><summary type="html"><![CDATA[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.]]></summary></entry><entry><title type="html">Oscar4 Java API: chemical name dictionaries</title><link href="https://chem-bla-ics.linkedchemistry.info/2010/10/28/oscar4-java-api-chemical-name.html" rel="alternate" type="text/html" title="Oscar4 Java API: chemical name dictionaries" /><published>2010-10-28T00:00:00+00:00</published><updated>2010-10-28T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2010/10/28/oscar4-java-api-chemical-name</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2010/10/28/oscar4-java-api-chemical-name.html"><![CDATA[<p>Besides getting Oscar used by <a href="http://www.ebi.ac.uk/chebi/">ChEBI</a> (hopefully <a href="https://chem-bla-ics.linkedchemistry.info/2010/10/21/oscar-text-mining-in-taverna.html">via Taverna <i class="fa-solid fa-recycle fa-xs"></i></a>),
my main task in <a href="https://chem-bla-ics.linkedchemistry.info/2010/10/15/working-on-oscar-for-three-months.html">my three month Oscar project <i class="fa-solid fa-recycle fa-xs"></i></a>
is to refactor things to make it more modular, and remove some features no longer needed (e.g. an automatically created workspace environment).
Clearly, I need to define a lot of <a href="http://chem-bla-ics.blogspot.com/2010/10/multiple-unit-test-inheritance-with.html">new unit tests</a>
to ensure my assumptions on how to code works are valid.</p>

<p>So, what are the API requirements set out? These include (but are not limited to):</p>

<ul>
  <li>have reasonable defaults</li>
  <li>being able to add custom dictionaries</li>
  <li>easily change the chemical entity recogniser</li>
  <li>plugin text normalization (see <a href="https://blogs.ch.cam.ac.uk/pmr/2010/10/24/the-absolute-minimum-every-scientist-with-data-absolutely-positively-must-know-about-unicode-and-character-sets-no-excuses/">Peter’s post on UNICODE <i class="fa-solid fa-recycle fa-xs"></i></a>)</li>
</ul>

<p>This week I worked on the dictionary refactoring, and talked with Lezan about the <a href="http://www-ucc.ch.cam.ac.uk/products/software/chemicaltagger">ChemicalTagger</a>
and trying to get this based on the newer Oscar code (I think we’ll be able to finish that today). So, I cleaned up
some code I did in the first week, and introduced <a href="https://bitbucket.org/wwmm/oscar4/src/bf79fd11045c/oscar4-api/src/main/java/uk/ac/cam/ch/wwmm/oscar/Oscar.java">a Oscar class</a>
providing a Java API to the Oscar functionality.</p>

<p>So, to get started with Oscar in your application, you only need to do:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Oscar</span> <span class="n">oscar</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Oscar</span><span class="o">(</span>
  <span class="k">this</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getClassLoader</span><span class="o">()</span>
<span class="o">);</span>
<span class="n">oscar</span><span class="o">.</span><span class="na">loadDefaultDictionaries</span><span class="o">();</span>
<span class="nc">Map</span><span class="o">&lt;</span><span class="nc">NamedEntity</span><span class="o">,</span><span class="nc">String</span><span class="o">&gt;</span> <span class="n">structures</span> <span class="o">=</span>
  <span class="n">oscar</span><span class="o">.</span><span class="na">getNamedEntities</span><span class="o">(</span>
    <span class="s">"Ingredients: acetic acid, water."</span>
  <span class="o">);</span>
</code></pre></div></div>

<p>The ClassLoader is needed because the Oscar class will not generally know how to load custom classes.</p>

<p>You can add additional dictionaries, by implementing the <a href="https://bitbucket.org/wwmm/oscar4/src/tip/oscar4-chemnamedict/src/main/java/uk/ac/cam/ch/wwmm/oscar/chemnamedict/IChemNameDict.java">IChemNameDict</a>
interface and one or more of <a href="https://bitbucket.org/wwmm/oscar4/src/tip/oscar4-chemnamedict/src/main/java/uk/ac/cam/ch/wwmm/oscar/chemnamedict/IInChIProvider.java">IInChIProvider</a>,
<a href="https://bitbucket.org/wwmm/oscar4/src/tip/oscar4-chemnamedict/src/main/java/uk/ac/cam/ch/wwmm/oscar/chemnamedict/ISMILESProvider.java">ISMILESProvider</a>,
and <a href="https://bitbucket.org/wwmm/oscar4/src/tip/oscar4-chemnamedict/src/main/java/uk/ac/cam/ch/wwmm/oscar/chemnamedict/ICMLProvider.java">ICMLProvider</a>.
For example, adding the OPSIN dictionary would extend the above code to:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">Oscar</span> <span class="n">oscar</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Oscar</span><span class="o">(</span>
  <span class="k">this</span><span class="o">.</span><span class="na">getClass</span><span class="o">().</span><span class="na">getClassLoader</span><span class="o">()</span>
<span class="o">);</span>
<span class="n">oscar</span><span class="o">.</span><span class="na">loadDefaultDictionaries</span><span class="o">();</span>
<span class="n">oscar</span><span class="o">.</span><span class="na">getChemNameDict</span><span class="o">().</span><span class="na">register</span><span class="o">(</span>
  <span class="k">new</span> <span class="nf">OpsinDictionary</span><span class="o">()</span>
<span class="o">);</span>
<span class="nc">Map</span><span class="o">&lt;</span><span class="nc">NamedEntity</span><span class="o">,</span><span class="nc">String</span><span class="o">&gt;</span> <span class="n">structures</span> <span class="o">=</span>
  <span class="n">oscar</span><span class="o">.</span><span class="na">getNamedEntities</span><span class="o">(</span>
    <span class="s">"Ingredients: acetic acid, water."</span>
  <span class="o">);</span>
</code></pre></div></div>

<p>And, I think the <code class="language-plaintext highlighter-rouge">oscar.getChemNameDict()</code> method will be renamed to something like <code class="language-plaintext highlighter-rouge">oscar.getDictionaryRegistry()</code> really soon.</p>]]></content><author><name>Egon Willighagen</name></author><category term="oscar" /><category term="java" /><category term="chebi" /><category term="inchikey:XLYOFNOQVPJJNP-UHFFFAOYSA-N" /><category term="inchikey:QTBSBXVTEAMEQO-UHFFFAOYSA-N" /><summary type="html"><![CDATA[Besides getting Oscar used by ChEBI (hopefully via Taverna ), my main task in my three month Oscar project is to refactor things to make it more modular, and remove some features no longer needed (e.g. an automatically created workspace environment). Clearly, I need to define a lot of new unit tests to ensure my assumptions on how to code works are valid.]]></summary></entry><entry><title type="html">Semantic Web features in Bioclipse 2.2</title><link href="https://chem-bla-ics.linkedchemistry.info/2010/01/28/semantic-web-features-in-bioclipse-22.html" rel="alternate" type="text/html" title="Semantic Web features in Bioclipse 2.2" /><published>2010-01-28T00:00:00+00:00</published><updated>2010-01-28T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2010/01/28/semantic-web-features-in-bioclipse-22</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2010/01/28/semantic-web-features-in-bioclipse-22.html"><![CDATA[<p><a href="http://www.blogger.com/profile/10379047094508592338">Ola</a> is releasing <a href="http://web.archive.org/web/20100111032721/https://bioclipse.net/">Bioclipse <i class="fa-solid fa-box-archive fa-xs"></i></a>
<a href="http://sourceforge.net/projects/bioclipse/files/bioclipse2/bioclipse2.2.0/">2.2.0</a>
today, and asked me to show case the semantic web functionality in Bioclipse. I realized that I do not have a nice page showing the semantic web overview. But I did blog a lot about RDF functionality, so here’s a list of pointers:</p>

<ul>
  <li><a href="http://chem-bla-ics.blogspot.com/2009/11/bioclipse-manager-for-myexperimentorg.html">Bioclipse Manager for MyExperiment.org</a></li>
  <li><a href="http://chem-bla-ics.blogspot.com/2009/09/bioclipse-rdf-and-defeasible-reasoning.html">Bioclipse, RDF and defeasible reasoning</a> (see also <a href="http://saml.rilspace.com/">Samuel’s blog</a>)</li>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2009/08/21/bioclipse-and-sparql-end-points-2.html">Bioclipse and SPARQL end points #2: MyExperiment <i class="fa-solid fa-recycle fa-xs"></i></a></li>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2009/08/16/bioclipse-and-sparql-end-points.html">Bioclipse and SPARQL end points <i class="fa-solid fa-recycle fa-xs"></i></a></li>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2009/02/22/solubility-data-in-bioclipse-2-handling.html">Solubility Data in Bioclipse #2: handling RDF <i class="fa-solid fa-recycle fa-xs"></i></a></li>
  <li><a href="https://chem-bla-ics.linkedchemistry.info/2009/02/27/solubility-data-in-bioclipse-3-finding.html">Solubility Data in Bioclipse #3: Finding ChEBI IDs <i class="fa-solid fa-recycle fa-xs"></i></a></li>
  <li><a href="http://chem-bla-ics.blogspot.com/2009/03/solubility-data-in-bioclipse-4-finding.html">Solubility Data in Bioclipse #4: Finding ChEBI IDs (Again, but better)</a></li>
  <li><a href="http://chem-bla-ics.blogspot.com/2009/05/me-is-having-bioclipsexmpprdf-fun.html">/me is having Bioclipse/XMPP/RDF fun</a></li>
</ul>

<p>Or check this screenshot from <a href="http://web.archive.org/web/20130310013833/http://egonw.posterous.com/molecules-in-dbpedia-visualized-with-bioclips">a Posterous post about a MyExperiment workflow
<i class="fa-solid fa-box-archive fa-xs"></i></a>:</p>

<p><img src="/assets/images/dbPediaMolTable.png" alt="" /></p>

<p>One thing I have not blogged about yet (I think), is that the Bioclipse RDF manager also understands RDFa now. Well, sort of… it relies on a webservice, but this is what the script looks like:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">model</span> <span class="o">=</span> <span class="nx">rdf</span><span class="p">.</span><span class="nf">createStore</span><span class="p">()</span>
<span class="nx">rdf</span><span class="p">.</span><span class="nf">importRDFa</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="dl">"</span><span class="s2">http://egonw.github.com/</span><span class="dl">"</span><span class="p">)</span>
<span class="nx">rdf</span><span class="p">.</span><span class="nf">saveRDFN3</span><span class="p">(</span><span class="nx">model</span><span class="p">,</span> <span class="dl">"</span><span class="s2">/Virtual/egonw.n3</span><span class="dl">"</span><span class="p">)</span>
</code></pre></div></div>

<p>With support of SPARQL end points, and reading RDF from web resources directly (RDF/XML, N3, RDFa), Bioclipse is ready for the chemical semantic web.</p>]]></content><author><name>Egon Willighagen</name></author><category term="java" /><category term="bioclipse" /><category term="rdf" /><category term="sparql" /><summary type="html"><![CDATA[Ola is releasing Bioclipse 2.2.0 today, and asked me to show case the semantic web functionality in Bioclipse. I realized that I do not have a nice page showing the semantic web overview. But I did blog a lot about RDF functionality, so here’s a list of pointers:]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chem-bla-ics.linkedchemistry.info/assets/images/dbPediaMolTable.png" /><media:content medium="image" url="https://chem-bla-ics.linkedchemistry.info/assets/images/dbPediaMolTable.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Extracting RDF from Chem4Word documents</title><link href="https://chem-bla-ics.linkedchemistry.info/2010/01/21/extracting-rdf-from-chem4word-documents.html" rel="alternate" type="text/html" title="Extracting RDF from Chem4Word documents" /><published>2010-01-21T00:00:00+00:00</published><updated>2010-01-21T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2010/01/21/extracting-rdf-from-chem4word-documents</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2010/01/21/extracting-rdf-from-chem4word-documents.html"><![CDATA[<p><a href="http://jat45.wordpress.com/">Joe</a> has released the first <a href="http://research.microsoft.com/en-us/projects/chem4word/">Chem4Word</a>
<a href="http://jat45.files.wordpress.com/2010/01/example.docx">demo file</a>, and has written about how to
<a href="http://jat45.wordpress.com/2010/01/20/extracting-cml-from-a-chem4word-authored-document-java/">extract the CML with Java</a>
and <a href="http://jat45.wordpress.com/2010/01/21/extracting-cml-from-a-chem4word-authored-document-c/">with C#</a>.</p>

<p>I haven’t actually gotten around to fiddling with Java, but ran <a href="http://strigi.sf.net/">Strigi</a> against it to extract RDF,
while having the <a href="http://neksa.blogspot.com/2007/05/introduction.html">Strigi-Chemistry</a> plugins installed. This is part of the
<a href="http://en.wikipedia.org/wiki/Resource_Description_Framework">RDF</a> that came out:</p>

<div class="language-turtle highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">&lt;example-doc.docx&gt;</span><span class="w">
  </span><span class="nl">&lt;http://freedesktop.org/standards/xesam/1.0/core#title&gt;</span><span class="w">
    </span><span class="s">"acetic acid"</span><span class="p">,</span><span class="w">
    </span><span class="s">"(8R,9S,10R,13S,14S,17S)- 17-hydroxy-10,13-dimethyl- 1,2,6,7,8,9,11,12,14,15,16,17-dodecahydrocyclopenta[a] phenanthren-3-one"</span><span class="p">,</span><span class="w">
    </span><span class="s">"testosterone"</span><span class="p">;</span><span class="w">
  </span><span class="nl">&lt;http://freedesktop.org/standards/xesam/1.0/core#version&gt;</span><span class="w">
    </span><span class="s">"2"</span><span class="p">,</span><span class="w">
    </span><span class="s">"2"</span><span class="p">;</span><span class="w">
  </span><span class="nl">&lt;http://rdf.openmolecules.net/0.9#atomCount&gt;</span><span class="w">
    </span><span class="s">"8"</span><span class="p">,</span><span class="w">
    </span><span class="s">"49"</span><span class="p">;</span><span class="w">
  </span><span class="nl">&lt;http://rdf.openmolecules.net/0.9#bondCount&gt;</span><span class="w">
    </span><span class="s">"7"</span><span class="p">,</span><span class="w">
    </span><span class="s">"52"</span><span class="p">;</span><span class="w">
  </span><span class="nl">&lt;http://rdf.openmolecules.net/0.9#molecularFormula&gt;</span><span class="w">
    </span><span class="s">"C2H4O2"</span><span class="p">,</span><span class="w">
    </span><span class="s">"C19H28O2"</span><span class="p">;</span><span class="w">
</span></code></pre></div></div>

<p>I believe there is quite some room for improvement, but it’s a start :) Thanx to Joe for posting the public domain test file, so
that other projects can start play with the exiting new technology. I should note, however, that I am not running a Microsoft OS
nor MS-Word, and the saved documents source are the only way I have access to the
<a href="http://en.wikipedia.org/wiki/Chemical_Markup_Language">CML</a> right now.</p>]]></content><author><name>Egon Willighagen</name></author><category term="cml" /><category term="java" /><category term="rdf" /><category term="chem4word" /><category term="strigi" /><summary type="html"><![CDATA[Joe has released the first Chem4Word demo file, and has written about how to extract the CML with Java and with C#.]]></summary></entry><entry><title type="html">Work in Progress: an Open DocCheck replacement</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/10/17/work-in-progress-open-doccheck.html" rel="alternate" type="text/html" title="Work in Progress: an Open DocCheck replacement" /><published>2009-10-17T00:00:00+00:00</published><updated>2009-10-17T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/10/17/work-in-progress-open-doccheck</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/10/17/work-in-progress-open-doccheck.html"><![CDATA[<p>While it is still very much in progress, I have already made more progress than I had hoped for. The <a href="http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec/index.html">JavaDoc Doclet API</a>
is actually not too difficult to use, though my use will very likely improve more later. The <a href="http://cdk.sf.net/">CDK</a> has been using
<a href="http://java.sun.com/j2se/javadoc/doccheck/">Sun’s DocCheck</a> utility for testing the library’s JavaDoc quality, but the reports never
really satisfied me. Moreover, the most recent version is ancient and because it is <em>closed source</em>, no one can continue on those efforts.
DocCheck is <a href="http://en.wikipedia.org/wiki/Missing_In_Action">MIA</a>.</p>

<p>Instead, <a href="http://pmd.sf.net/">PMD</a> is given nice overviews of what it believes to be wrong with the CDK, and also provides a decent XML
format which allows extraction of information, which is used by, for example, <a href="http://pele.farmbio.uu.se/supernightly/">SuperNightly</a> as
showed yesterday in <a href="http://chem-bla-ics.blogspot.com/2009/10/pmd-245-installed-in-cdk-12x-branch.html">PMD 2.4.5 installed in the CDK 1.2.x branch</a>.</p>

<p>I have been pondering about it for a long time now, but writing a JavaDoc checking library is hardly core cheminformatics research;
at least, you would not get funding for it, despite everyone always complaining about good documentation. <em>Alas</em>.</p>

<p>Last week, I was reviewing some more code, and again saw the very common error of the missing period at the end of the first sentence
in JavaDoc. This one is sort of important for proper JavaDoc documentation generation, but the complexity of the current DocCheck
reporting, people are not familiar enough with it. Being tired of having to repeat myself, I decided to address the problen, but
creating better <a href="http://pele.farmbio.uu.se/nightly/javadoc/data/">Nightly error reporting for the CDK JavaDoc</a>.</p>

<p>So, I started <a href="http://github.com/egonw/ojdcheck">OpenJavaDocCheck</a>, or <em>ojdcheck</em>. As mentioned, I have made quite promising progress,
and the current version provides the ability to write custom tests (which I plan to use for validating content of
<a href="http://cdk.sourceforge.net/guides/devel/ch01.html">CDK taglet</a> content), and create XML as well as XHTML which can be saved to any file.
To give you a glimps of where things are going, here’s a screenshot of the current XHTML output:</p>

<p><img src="/assets/images/ojdcheckXHTML.png" alt="" /></p>

<p>The current list of tests is really small, and consists of a single test:</p>

<ul>
  <li>test if each class and method has JavaDoc</li>
</ul>]]></content><author><name>Egon Willighagen</name></author><category term="cdk" /><category term="javadoc" /><category term="java" /><category term="xml" /><summary type="html"><![CDATA[While it is still very much in progress, I have already made more progress than I had hoped for. The JavaDoc Doclet API is actually not too difficult to use, though my use will very likely improve more later. The CDK has been using Sun’s DocCheck utility for testing the library’s JavaDoc quality, but the reports never really satisfied me. Moreover, the most recent version is ancient and because it is closed source, no one can continue on those efforts. DocCheck is MIA.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://chem-bla-ics.linkedchemistry.info/assets/images/ojdcheckXHTML.png" /><media:content medium="image" url="https://chem-bla-ics.linkedchemistry.info/assets/images/ojdcheckXHTML.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">VRMS meme: how much non-free software are you running?</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/09/13/vrms-meme-how-much-non-free-software.html" rel="alternate" type="text/html" title="VRMS meme: how much non-free software are you running?" /><published>2009-09-13T00:00:00+00:00</published><updated>2009-09-13T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/09/13/vrms-meme-how-much-non-free-software</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/09/13/vrms-meme-how-much-non-free-software.html"><![CDATA[<p>Over at <a href="http://planet.ubuntu.com/">Planet Ubuntu</a> there is a meme running around VRMS
(<a href="http://en.wikipedia.org/wiki/Vrms">Virtual Richard M. Stallman</a>, brilliant name!) which finds non-free software on
your desktop. I uninstalled Sun’s Java6, for which there is the
<a href="http://www.outflux.net/blog/archives/2009/09/12/uninstall-sun-java6/">OpenJDK6 alternative</a>.</p>

<p>These are my current results:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Non-free packages installed on egonw-laptop

fglrx-modaliases          Identifiers supported by the ATI graphics driver
linux-generic             Complete Generic Linux kernel
linux-restricted-modules- Non-free Linux 2.6.28 modules helper script
linux-restricted-modules- Restricted Linux modules for generic kernels
skype                     Skype - Take a deep breath
sun-java5-bin             Sun Java(TM) Runtime Environment (JRE) 5.0 (architectu
sun-java5-demo            Sun Java(TM) Development Kit (JDK) 5.0 demos and examp
sun-java5-jdk             Sun Java(TM) Development Kit (JDK) 5.0
sun-java5-jre             Sun Java(TM) Runtime Environment (JRE) 5.0 (architectu

            Contrib packages installed on egonw-laptop

flashplugin-installer     Adobe Flash Player plugin installer
flashplugin-nonfree       Adobe Flash Player plugin installer (transitional pack
msttcorefonts             transitional dummy package
ttf-mscorefonts-installer Installer for Microsoft TrueType core fonts

  9 non-free packages, 0.4% of 2050 installed packages.
  4 contrib packages, 0.2% of 2050 installed packages.
</code></pre></div></div>]]></content><author><name>Egon Willighagen</name></author><category term="java" /><category term="ubuntu" /><category term="openscience" /><summary type="html"><![CDATA[Over at Planet Ubuntu there is a meme running around VRMS (Virtual Richard M. Stallman, brilliant name!) which finds non-free software on your desktop. I uninstalled Sun’s Java6, for which there is the OpenJDK6 alternative.]]></summary></entry><entry><title type="html">The Art of Programming: do not leak implementation details</title><link href="https://chem-bla-ics.linkedchemistry.info/2009/09/09/art-of-programming-do-not-leak.html" rel="alternate" type="text/html" title="The Art of Programming: do not leak implementation details" /><published>2009-09-09T00:00:00+00:00</published><updated>2009-09-09T00:00:00+00:00</updated><id>https://chem-bla-ics.linkedchemistry.info/2009/09/09/art-of-programming-do-not-leak</id><content type="html" xml:base="https://chem-bla-ics.linkedchemistry.info/2009/09/09/art-of-programming-do-not-leak.html"><![CDATA[<p>At the <a href="http://sourceforge.net/apps/mediawiki/cdk/index.php?title=JChemPaintWorkshop2009#Work">JChemPaint workshop</a> here in Uppsala, where we have
Mark from <a href="http://www.steinbeck-molecular.de/steinblog/">Chris</a>’ group as our guest, we encountered an inconsistency in <a href="http://cdk.sf.net/">CDK</a> 1.2,
where the bond stereochemistry did not yet follow the pattern recently adopted of having Class fields, to allow using <em>null</em> to have the semantics
of undefined. Previously, the defaults for native values were confounded with set values. For example, the formal charge <em>unset</em> and 0 would be have
a field value <em>int = 0</em>.</p>

<p>So, I am now writing a patch which replaces the use of <em>int</em> in <code class="language-plaintext highlighter-rouge">IBond.getStereo()</code>. But instead of going for <code class="language-plaintext highlighter-rouge">Integer</code>, the patch is actually
going to use a enumeration.</p>

<p>Now, getting the the Art of Programming… while writing patches in the CDK, you run into those lovely bits of code, where intention is mixed with
implementation details. They should not, and often do not need to, but they typically do. This is actually one reason why we now have a more strict
peer-review installed. Below are two nice examples where intention is mixed with implementation detail.</p>

<h3 id="example-1">Example 1</h3>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="n">stereo</span> <span class="o">=</span> <span class="n">container</span><span class="o">.</span><span class="na">getBond</span><span class="o">(</span><span class="n">chiralNeighbours</span><span class="o">.</span><span class="na">get</span><span class="o">(</span><span class="n">i</span><span class="o">),</span> <span class="n">atom</span><span class="o">).</span><span class="na">getStereo</span><span class="o">();</span>
<span class="k">if</span> <span class="o">(</span><span class="n">stereo</span> <span class="o">==</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
  <span class="c1">// do something</span>
<span class="o">}</span>
</code></pre></div></div>

<p>This code is bad because we have no clue of what this code is supposed to do. When should the if-clause kick in? Be reminded that the <em>int = 0</em> has
the confounded meanings of <em>no stereochemistry</em> and perhaps <em>has stereochemistry, but no one ever bothered telling me</em>. So, which of the two situations
does the if clause apply to. So, my patch can only assume that both were applicable (following the actual implementation), though I don’t think that
makes sense on an algorithmic level. Had the author used <code class="language-plaintext highlighter-rouge">CDKConstants.STEREO_BOND_NONE</code> (which is the implementation for <em>int = 0</em> for <em>no stereochemistry</em>,
then I had known what the implementation was doing. Instead, the author chose to reuse implementation details: a hardcoded 0.</p>

<h3 id="example-2">Example 2</h3>

<p>There is another instance of this problem. Look at this lovely piece of code:</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">IBond</span> <span class="n">bond</span> <span class="o">=</span> <span class="n">molecule</span><span class="o">.</span><span class="na">getBond</span><span class="o">(</span><span class="n">atomA</span><span class="o">,</span> <span class="n">unplacedAtom</span><span class="o">);</span>
<span class="k">if</span> <span class="o">(</span><span class="nc">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">bond</span><span class="o">.</span><span class="na">getStereo</span><span class="o">())</span> <span class="o">&lt;</span> <span class="mi">2</span>
    <span class="o">&amp;&amp;</span> <span class="nc">Math</span><span class="o">.</span><span class="na">abs</span><span class="o">(</span><span class="n">bond</span><span class="o">.</span><span class="na">getStereo</span><span class="o">())</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
<span class="o">}</span>
</code></pre></div></div>

<p>This example also uses hardcoded value, instead of the matching constants. Remember that <em>int = 0</em> had the meaning of no stereochemistry, so I assume
this code is determining is stereochemistry is defined for the bond, making nice use that those situations at some point were coded as non-zero values.
Moreover, it is only interested in a few stereochemistry definitions, and from the implementation I learn (and that actually makes sense at this
location) that it is only interested in those stereochemistry for which the first bond atom is the stereochemical center. This again is leaking
implementation details, instead of using semantically meaningful constants.</p>]]></content><author><name>Egon Willighagen</name></author><category term="java" /><category term="cdk" /><category term="jchempaint" /><summary type="html"><![CDATA[At the JChemPaint workshop here in Uppsala, where we have Mark from Chris’ group as our guest, we encountered an inconsistency in CDK 1.2, where the bond stereochemistry did not yet follow the pattern recently adopted of having Class fields, to allow using null to have the semantics of undefined. Previously, the defaults for native values were confounded with set values. For example, the formal charge unset and 0 would be have a field value int = 0.]]></summary></entry></feed>