Skip to content

Commit

Permalink
Ported the first part of the Depiction chapter
Browse files Browse the repository at this point in the history
  • Loading branch information
egonw committed Jun 15, 2024
1 parent 4848864 commit d7a62ee
Show file tree
Hide file tree
Showing 35 changed files with 176 additions and 87 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

# Groovy Cheminformatics with the Chemistry Development Kit

[Edition 2.9-1](https://egonw.github.io/cdkbook/)
[Edition 2.9-2](https://egonw.github.io/cdkbook/)

**Egon L. Willighagen** PhD<br />
Long time CDK developer
Expand Down
2 changes: 1 addition & 1 deletion atomsbonds.md
Original file line number Diff line number Diff line change
Expand Up @@ -644,6 +644,6 @@ in ring sets, explained in Section ??.

## References

1. <a name="citeref1"></a>Steinbeck C, Han Y, Kuhn S, Horlacher O, Luttmann E, Luttmann E, et al. The Chemistry Development Kit (CDK): an open-source Java library for Chemo- and Bioinformatics. JCICS. 2003 Feb 11;43(2):493–500. doi:[10.1021/CI025584Y](https://doi.org/10.1021/CI025584Y) ([Scholia](https://scholia.toolforge.org/doi/10.1021/CI025584Y))
1. <a name="citeref1"></a>Steinbeck C, Han Y, Kuhn S, Horlacher O, Luttmann E, Willighagen E. The Chemistry Development Kit (CDK): an open-source Java library for Chemo- and Bioinformatics. JCICS. 2003 Feb 11;43(2):493–500. doi:[10.1021/CI025584Y](https://doi.org/10.1021/CI025584Y) ([Scholia](https://scholia.toolforge.org/doi/10.1021/CI025584Y))
2. <a name="citeref2"></a>Balaban AT. Applications of graph theory in chemistry. JCICS. 1985 Aug 1;25(3):334–43. doi:[10.1021/CI00047A033](https://doi.org/10.1021/CI00047A033) ([Scholia](https://scholia.toolforge.org/doi/10.1021/CI00047A033))

12 changes: 6 additions & 6 deletions builders.md
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ refactoring to do.

## Implementations

As indicated earlier, there are various implementations. CDK 2.8
As indicated earlier, there are various implementations. CDK 2.9
has three implementations: the default builder, a builder to create debug
output creating classes, and two builders that create data classes that do
not send around change events.
Expand Down Expand Up @@ -108,11 +108,11 @@ event is when the atom was added, while the second event is caused by the
element symbol of the atom changing:

```plain
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=AtomContainer(55...
9087077, #A:1, AtomRef{Atom(1566104673, S:C, AtomType(1566104673, FC:0, Isot...
ope(1566104673, Element(1566104673, S:C, AN:6))))})]
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=Atom(1566104673,...
S:N, AtomType(1566104673, FC:0, Isotope(1566104673, Element(1566104673, S:N...
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=AtomContainer(73...
4370487, #A:1, AtomRef{Atom(1091523506, S:C, AtomType(1091523506, FC:0, Isot...
ope(1091523506, Element(1091523506, S:C, AN:6))))})]
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=Atom(1091523506,...
S:N, AtomType(1091523506, FC:0, Isotope(1091523506, Element(1091523506, S:N...
, AN:7))))]
```

Expand Down
4 changes: 2 additions & 2 deletions cheminfo.md
Original file line number Diff line number Diff line change
Expand Up @@ -318,8 +318,8 @@ Kit supports this multidisciplenaire research.
27. <a name="citeref27"></a>de Jong S. SIMPLS: An alternative approach to partial least squares regression. Chemometr Intell Lab. 1993 Mar;18(3):251–63. doi:[10.1016/0169-7439(93)85002-X](https://doi.org/10.1016/0169-7439(93)85002-X) ([Scholia](https://scholia.toolforge.org/doi/10.1016/0169-7439(93)85002-X))
28. <a name="citeref28"></a>Todeschini R, Consonni V. Handbook of Molecular Descriptors. 2000. doi:[10.1002/9783527613106](https://doi.org/10.1002/9783527613106) ([Scholia](https://scholia.toolforge.org/doi/10.1002/9783527613106))
29. <a name="citeref29"></a>J. K. Wegner, PhD thesis, Eberhard-Karls-Universität Tübingen, Tübingen, Germany, 2006
30. <a name="citeref30"></a>Steinbeck C, Han Y, Kuhn S, Horlacher O, Luttmann E, Luttmann E, et al. The Chemistry Development Kit (CDK): an open-source Java library for Chemo- and Bioinformatics. JCICS. 2003 Feb 11;43(2):493–500. doi:[10.1021/CI025584Y](https://doi.org/10.1021/CI025584Y) ([Scholia](https://scholia.toolforge.org/doi/10.1021/CI025584Y))
31. <a name="citeref31"></a>Steinbeck C, Hoppe C, Hoppe C, Kuhn S, Floris M, Guha R, et al. Recent Developments of the Chemistry Development Kit (CDK) - An Open-Source Java Library for Chemo- and Bioinformatics. Curr Pharm Des [Internet]. 2006 Jun 1;12(17):2111–20. Available from: https://cdk.github.io/cdk-paper-2/ doi:[10.2174/138161206777585274](https://doi.org/10.2174/138161206777585274) ([Scholia](https://scholia.toolforge.org/doi/10.2174/138161206777585274))
30. <a name="citeref30"></a>Steinbeck C, Han Y, Kuhn S, Horlacher O, Luttmann E, Willighagen E. The Chemistry Development Kit (CDK): an open-source Java library for Chemo- and Bioinformatics. JCICS. 2003 Feb 11;43(2):493–500. doi:[10.1021/CI025584Y](https://doi.org/10.1021/CI025584Y) ([Scholia](https://scholia.toolforge.org/doi/10.1021/CI025584Y))
31. <a name="citeref31"></a>Steinbeck C, Hoppe C, Kuhn S, Floris M, Guha R, Willighagen E. Recent Developments of the Chemistry Development Kit (CDK) - An Open-Source Java Library for Chemo- and Bioinformatics. Curr Pharm Des [Internet]. 2006 Jun 1;12(17):2111–20. Available from: https://cdk.github.io/cdk-paper-2/ doi:[10.2174/138161206777585274](https://doi.org/10.2174/138161206777585274) ([Scholia](https://scholia.toolforge.org/doi/10.2174/138161206777585274))
32. <a name="citeref32"></a>Kowalski BR. Chemometrics. Anal Chem. 1980 Apr;52(5):112–22. doi:[10.1021/AC50055A016](https://doi.org/10.1021/AC50055A016) ([Scholia](https://scholia.toolforge.org/doi/10.1021/AC50055A016))
33. <a name="citeref33"></a>BK L. Chemometrics. Anal Chem. 2000 Jun 1;72(12):91R-97R. doi:[10.1021/A1000016X](https://doi.org/10.1021/A1000016X) ([Scholia](https://scholia.toolforge.org/doi/10.1021/A1000016X))
34. <a name="citeref34"></a>Buydens LMC, Reijmers TH, Beckers MLM, Wehrens R. Molecular data-mining: a challenge for chemometrics. Chemometr Intell Lab. 1999 Oct;49(2):121–33. doi:[10.1016/S0169-7439(99)00039-8](https://doi.org/10.1016/S0169-7439(99)00039-8) ([Scholia](https://scholia.toolforge.org/doi/10.1016/S0169-7439(99)00039-8))
Expand Down
8 changes: 4 additions & 4 deletions chemobject.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,8 @@ which outputs:

```plain
Number of containers: 2
container's hashcode 1263085541
container's hashcode 1281205497
container's hashcode 32777062
container's hashcode 1187406578
```

The other options is to use a regular for-loop:
Expand All @@ -89,8 +89,8 @@ which requires more coding, but has the advantage that it keeps track of the ind

```plain
Number of containers: 2
container 0 has hashcode 632168320
container 1 has hashcode 1761382759
container 0 has hashcode 517960153
container 1 has hashcode 551377008
```

## IReactionSet and IRingSet
Expand Down
2 changes: 1 addition & 1 deletion code/AtomContainersLoopingInSet.code.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,6 @@ for (atomContainer in set.atomContainers()) {
**Output:**
```plain
Number of containers: 2
container's hashcode 285831951
container's hashcode 32777062
container's hashcode 1187406578
```
2 changes: 1 addition & 1 deletion code/GuessSMILES.code.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# GuessSMILES.groovyl
**Source code:**
```groovy
@Grab(group='org.openscience.cdk', module='cdk-bundle', version='2.8')
@Grab(group='org.openscience.cdk', module='cdk-bundle', version='2.9')
import java.io.*;
import org.openscience.cdk.io.*;
Expand Down
10 changes: 5 additions & 5 deletions code/ObjectListening.code.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ atom1.setSymbol("N")
```
**Output:**
```plain
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=AtomContainer(19...
63448684, #A:1, AtomRef{Atom(1913714009, S:C, AtomType(1913714009, FC:0, Iso...
tope(1913714009, Element(1913714009, S:C, AN:6))))})]
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=Atom(1913714009,...
S:N, AtomType(1913714009, FC:0, Isotope(1913714009, Element(1913714009, S:N...
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=AtomContainer(73...
4370487, #A:1, AtomRef{Atom(1091523506, S:C, AtomType(1091523506, FC:0, Isot...
ope(1091523506, Element(1091523506, S:C, AN:6))))})]
Event: org.openscience.cdk.event.ChemObjectChangeEvent[source=Atom(1091523506,...
S:N, AtomType(1091523506, FC:0, Isotope(1091523506, Element(1091523506, S:N...
, AN:7))))]
```
20 changes: 20 additions & 0 deletions code/RenderMolecule.code.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# RenderMolecule.groovy
**Source code:**
```groovy
@Grab(group='org.openscience.cdk', module='cdk-bundle', version='2.9')
import org.openscience.cdk.depict.*;
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.templates.*;
IAtomContainer triazole = MoleculeFactory.make123Triazole()
new DepictionGenerator()
.withSize(600, 600)
.withMargin(0.1)
.withZoom(3.0)
.withAtomColors()
.depict(triazole)
.writeTo("RenderMolecule.png");
```
**Output:**
```plain
```
2 changes: 1 addition & 1 deletion code/SimpleFingerprintDemo.code.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# SimpleFingerprintDemo.groovyl
**Source code:**
```groovy
@Grab(group='org.openscience.cdk', module='cdk-bundle', version='2.8')
@Grab(group='org.openscience.cdk', module='cdk-bundle', version='2.9')
import org.openscience.cdk.interfaces.*;
import org.openscience.cdk.templates.*;
Expand Down
2 changes: 1 addition & 1 deletion code/TPSACalc.code.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ value = result.getValue()
```
**Output:**
```plain
Specification: org.openscience.cdk.qsar.DescriptorSpecification@369ad7da
Specification: org.openscience.cdk.qsar.DescriptorSpecification@3e98b933
Parameters names: [checkAromaticity]
Parameters values: [false]
Exception: null
Expand Down
60 changes: 60 additions & 0 deletions depiction.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
<a name="sec:ch:depiction"></a>
# Depiction

The CDK originates from the merger of Jmol and <a name="tp1">JChemPaint</a> [<a href="#citeref1">1</a>]. As such, CDK has long
contained code to depict molecules. However, after the 1.0 series, a rewrite of the code base
was initiated, causing the CDK 1.2 series to not be available with <a name="tp2">rendering</a> functionality.
During the development of the 1.4 series, the rendering code became gradually available as
a set of patches, and, separately, as a JChemPaint applet. The new rendering code has
entered the CDK.

However, if you need rendering of reaction schemes or the editing functionality found
in JChemPaint, you still need the <a name="tp3">CDK-JChemPaint</a> patch.

## Molecules

Rendering molecules to an image is done in a few steps. First, an `Image` needs
to be defined, for example, of 200 by 200 pixels. The next step is to define what is to be
generated, and how. The most basic rendering requires a few generators: one for the overall
scene, one for atoms, and one for bonds. Therefore, we add a [`BasicSceneGenerator`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/renderer/generators/BasicSceneGenerator.html),
a [`BasicAtomGenerator`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/renderer/generators/BasicAtomGenerator.html), and a [`BasicBondGenerator`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/renderer/generators/BasicBondGenerator.html).
We will see later that we can add further generators to add further visualization.
Now that we defined what we want to have depicted, we construct a renderer. Because we
are rendering a molecule here, we simply use the [`AtomContainerRenderer`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/renderer/AtomContainerRenderer.html).

<a name="fig:fig:triazole"></a>
![](images/generated/RenderMolecule.png)
<br />**Figure 16.1**: 2D diagram of triazole

We also need to define, however, what rendering platform we want to use. The Java
community has a few options, with the AWT/Swing platform to be the reference implementation
provided by Oracle, and the SWT toolkit as a popular second. In fact, the redesign
was needed to be able to support both widget toolkits. For rendering images,
we can use the AWT toolkit. Therefore, we use a [`AWTFontManager`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/renderer/font/AWTFontManager.html) to help the
renderer draw texts. We get our `Graphics2D` object to which will be drawn from the
earlier created image, and we set some basic properties.
Then we are ready to draw the molecule to the graphics object with the `paint()`
method, and here again we need a AWT-specific class: the [`AWTDrawVisitor`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/renderer/visitor/AWTDrawVisitor.html).

What then remains is to save the image to a <a name="tp4">PNG</a> image file with the
`ImageIO` helper class.

The full code example then looks like:

**Script** [code/RenderMolecule.groovy](code/RenderMolecule.code.md)
```groovy
new DepictionGenerator()
.withSize(600, 600)
.withMargin(0.1)
.withZoom(3.0)
.withAtomColors()
.depict(triazole)
.writeTo("RenderMolecule.png");
```

This results in the image of triazole given in Figure [16.1](#fig:fig:triazole).

## References

1. <a name="citeref1"></a>Krause S, Willighagen E, Steinbeck C. JChemPaint - Using the Collaborative Forces of the Internet to Develop a Free Editor for 2D Chemical Structures. Molecules. 2000 Jan 28;5(1):93–8. doi:[10.3390/50100093](https://doi.org/10.3390/50100093) ([Scholia](https://scholia.toolforge.org/doi/10.3390/50100093))

18 changes: 9 additions & 9 deletions descriptor.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ allowing one to mix descriptor calculation by various tools and to keep
track of what value came from what vendor.

For example, we can inspect these field values for the TPSA descriptor
(see Section [17.3](properties.md#sec:tpsa)):
(see Section [18.3](properties.md#sec:tpsa)):

**<a name="script:TPSASpecs">Script 17.1</a>** [code/TPSASpecs.groovy](code/TPSASpecs.code.md)
```groovy
Expand All @@ -80,7 +80,7 @@ Title: org.openscience.cdk.qsar.descriptors.molecular.TPSADescriptor
Reference: http://www.blueobelisk.org/ontologies/chemoinformatics-algorithms/#...
tpsa
Vendor: The Chemistry Development Kit
Identifier: 2.8
Identifier: 2.9
```

The identifier values originally referred to a String which held the
Expand Down Expand Up @@ -126,7 +126,7 @@ descriptor.parameterNames.each { name ->
}
```

which tells us how we can tune the descriptor calculation (see also Section [18.5](#sec:noCount)):
which tells us how we can tune the descriptor calculation (see also Section [19.5](#sec:noCount)):

```plain
elementName -> java.lang.String
Expand Down Expand Up @@ -178,11 +178,11 @@ java.lang.Boolean -> true
With this information about the descriptor now clear, it is time to look at a descriptor
value calculation. A molecular descriptor in the CDK is symbolized by the
[`IMolecularDescriptor`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/IMolecularDescriptor.html) interface, which extends the [`IDescriptor`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/IDescriptor.html) interface,
as shown in Figure [18.1](#fig:descriptorInheritance).
as shown in Figure [19.1](#fig:descriptorInheritance).

<a name="fig:descriptorInheritance"></a>
![](images/descriptor.png)
<br />**Figure 18.1**: The IDescriptor interface has a few derived interfaces, but only IMolecularDescriptor is shown here.
<br />**Figure 19.1**: The IDescriptor interface has a few derived interfaces, but only IMolecularDescriptor is shown here.

The relevant method now is the `calculate(IAtomContainer)` method, which returns
a [`DescriptorValue`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/DescriptorValue.html). This class is returned rather than a double, because descriptors
Expand All @@ -207,7 +207,7 @@ value = result.getValue()
The output shows us that quite some metadata is preserved:

```plain
Specification: org.openscience.cdk.qsar.DescriptorSpecification@241fc278
Specification: org.openscience.cdk.qsar.DescriptorSpecification@3e98b933
Parameters names: [checkAromaticity]
Parameters values: [false]
Exception: null
Expand Down Expand Up @@ -262,14 +262,14 @@ Calculated values: 7
```

The [`IDescriptorResult`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/result/IDescriptorResult.html) interface is currently implemented by various classes,
outlined in Figure [18.2](#fig:descriptorResults). Each of the classes has a slightly different
outlined in Figure [19.2](#fig:descriptorResults). Each of the classes has a slightly different
API to get the actual values. The [`IntegerResult`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/result/IntegerResult.html), [`DoubleResult`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/result/DoubleResult.html),
and [`BooleanResult`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/result/BooleanResult.html) classes have the methods `intValue()`,
`doubleValue()`, and `booleanValue()` respectively.

<a name="fig:descriptorResults"></a>
![](images/descriptorResults.png)
<br />**Figure 18.2**: The IDescriptorResults interface has several implementation, each wrapping calculated descriptor values.
<br />**Figure 19.2**: The IDescriptorResults interface has several implementation, each wrapping calculated descriptor values.

The two array variants, [`IntegerArrayResult`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/result/IntegerArrayResult.html) and [`DoubleArrayResult`](http://cdk.github.io/cdk/latest/docs/api/org/openscience/cdk/qsar/result/DoubleArrayResult.html),
work slightly different, and both provide a `get(int)` method to iterate over all
Expand Down Expand Up @@ -334,7 +334,7 @@ the case for all descriptors, but many take this approach.
## References

1. <a name="citeref1"></a>Wikberg J, Eklund M, Willighagen E, Spjuth O, Lapins M, Engkvist O, et al. Introduction to Pharmaceutical Bioinformatics. 2018.
2. <a name="citeref2"></a>Steinbeck C, Hoppe C, Hoppe C, Kuhn S, Floris M, Guha R, et al. Recent Developments of the Chemistry Development Kit (CDK) - An Open-Source Java Library for Chemo- and Bioinformatics. Curr Pharm Des [Internet]. 2006 Jun 1;12(17):2111–20. Available from: https://cdk.github.io/cdk-paper-2/ doi:[10.2174/138161206777585274](https://doi.org/10.2174/138161206777585274) ([Scholia](https://scholia.toolforge.org/doi/10.2174/138161206777585274))
2. <a name="citeref2"></a>Steinbeck C, Hoppe C, Kuhn S, Floris M, Guha R, Willighagen E. Recent Developments of the Chemistry Development Kit (CDK) - An Open-Source Java Library for Chemo- and Bioinformatics. Curr Pharm Des [Internet]. 2006 Jun 1;12(17):2111–20. Available from: https://cdk.github.io/cdk-paper-2/ doi:[10.2174/138161206777585274](https://doi.org/10.2174/138161206777585274) ([Scholia](https://scholia.toolforge.org/doi/10.2174/138161206777585274))
3. <a name="citeref3"></a>Guha R, Howard MT, Hutchison GR, Murray-Rust P, Rzepa HS, Steinbeck C, et al. The Blue Obelisk-interoperability in chemical informatics. JCIM. 2006 Feb 22;46(3):991–8. doi:[10.1021/CI050400B](https://doi.org/10.1021/CI050400B) ([Scholia](https://scholia.toolforge.org/doi/10.1021/CI050400B))
4. <a name="citeref4"></a>Spjuth O, Willighagen E, Guha R, Eklund M, Wikberg J. Towards interoperable and reproducible QSAR analyses: Exchange of datasets. J Cheminform. 2010;2(1):5. doi:[10.1186/1758-2946-2-5](https://doi.org/10.1186/1758-2946-2-5) ([Scholia](https://scholia.toolforge.org/doi/10.1186/1758-2946-2-5))
5. <a name="citeref5"></a>[https://stackoverflow.com/questions/9363550/how-to-prevent-getting-a-groovy-boolean-in-an-object-array](https://stackoverflow.com/questions/9363550/how-to-prevent-getting-a-groovy-boolean-in-an-object-array)
Expand Down
2 changes: 1 addition & 1 deletion graph.md
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ Another important aspect of the chemical graph, is that the graph uniquely
places atoms in the molecule. That is, the graphs allows us to uniquely
identify, and therefore, number atoms in the molecule. This is an important
aspect of cheminformatics, and the concept behind <a name="tp13">canonicalization</a>, such
as used to create <a name="tp14">canonical SMILES</a>. The InChI library (see Chapter [19](inchi.md#sec:inchi))
as used to create <a name="tp14">canonical SMILES</a>. The InChI library (see Chapter [20](inchi.md#sec:inchi))
implements such an algorithm, and we can use it to assign unique integers to all
atoms in a chemical graph.

Expand Down
Binary file modified images/generated/CTR2.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/FixPyrroleBondOrders.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/InChIAtomNumbers.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/InChIAtomNumbersBenzene.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/MethaneExplicit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/MethaneImplicit.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/RenderAdenine.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/RenderAdenineWithNumbers.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added images/generated/RenderMolecule.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/RenderOxazole.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/StereoisomerOne.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified images/generated/StereoisomerTwo.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 1 addition & 1 deletion inchi.md
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ one mobile hydrogen to the second atom, which is the first oxygen.
<!-- <code>RenderAdenine</code> -->
<a name="fig:adenine"></a>
![](images/generated/RenderAdenine.png)
<br />**Figure 19.1**: 2D diagram of one of the tautomers of adenine.
<br />**Figure 20.1**: 2D diagram of one of the tautomers of adenine.

### Stereoisomerism

Expand Down
Loading

0 comments on commit d7a62ee

Please sign in to comment.