Skip to content

Commit 3a14e54

Browse files
authored
Add RDKit renderers for SMILES/SMARTS/MOL/SDF (#85)
* version bump * initial pass at adding an RDKit renderer for mol, SDF, SMILES, and SMARTS
1 parent f1a8105 commit 3a14e54

File tree

16 files changed

+147
-54
lines changed

16 files changed

+147
-54
lines changed

org.rdkit.knime.bin.linux.x86_64/META-INF/MANIFEST.MF

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
22
Bundle-ManifestVersion: 2
33
Bundle-Name: RDKit binaries for 64bit Linux
44
Bundle-SymbolicName: org.rdkit.knime.bin.linux.x86_64;singleton:=true
5-
Bundle-Version: 4.1.0.qualifier
6-
Fragment-Host: org.rdkit.knime.types;bundle-version="4.1.0"
5+
Bundle-Version: 4.2.0.qualifier
6+
Fragment-Host: org.rdkit.knime.types;bundle-version="4.2.0"
77
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
88
Eclipse-PlatformFilter: (&(osgi.os=linux)(osgi.arch=x86_64))
99
Bundle-Vendor: NIBR

org.rdkit.knime.bin.macosx.x86_64/META-INF/MANIFEST.MF

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
22
Bundle-ManifestVersion: 2
33
Bundle-Name: RDKit binaries for 64bit MacOSX
44
Bundle-SymbolicName: org.rdkit.knime.bin.macosx.x86_64;singleton:=true
5-
Bundle-Version: 4.1.0.qualifier
6-
Fragment-Host: org.rdkit.knime.types;bundle-version="4.1.0"
5+
Bundle-Version: 4.2.0.qualifier
6+
Fragment-Host: org.rdkit.knime.types;bundle-version="4.2.0"
77
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
88
Eclipse-PlatformFilter: (&(osgi.os=macosx)(osgi.arch=x86_64))
99
Bundle-Vendor: NIBR

org.rdkit.knime.bin.win32.x86_64/META-INF/MANIFEST.MF

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ Manifest-Version: 1.0
22
Bundle-ManifestVersion: 2
33
Bundle-Name: RDKit binaries for 64bit Windows
44
Bundle-SymbolicName: org.rdkit.knime.bin.win32.x86_64;singleton:=true
5-
Bundle-Version: 4.1.0.qualifier
6-
Fragment-Host: org.rdkit.knime.types;bundle-version="4.1.0"
5+
Bundle-Version: 4.2.0.qualifier
6+
Fragment-Host: org.rdkit.knime.types;bundle-version="4.2.0"
77
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
88
Eclipse-PlatformFilter: (&(osgi.os=win32)(osgi.arch=x86_64))
99
Bundle-Vendor: NIBR

org.rdkit.knime.binaries.feature/feature.xml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<feature
33
id="org.rdkit.knime.binaries.feature"
44
label="RDKit Binaries for Java"
5-
version="4.1.0.qualifier"
5+
version="4.2.0.qualifier"
66
provider-name="NIBR">
77

88
<description>
@@ -14,7 +14,7 @@
1414
</copyright>
1515

1616
<license url="http://www.gnu.org/licenses/gpl-3.0.html">
17-
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
17+
GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007
1818

1919
Copyright (C) 2007 Free Software Foundation, Inc. &lt;https://fsf.org/&gt;
2020
Everyone is permitted to copy and distribute verbatim copies

org.rdkit.knime.feature/feature.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<feature
33
id="org.rdkit.knime.feature"
44
label="RDKit KNIME integration"
5-
version="4.1.0.qualifier"
5+
version="4.2.0.qualifier"
66
provider-name="NIBR"
77
plugin="org.rdkit.knime.nodes">
88

org.rdkit.knime.nodes/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
33
Bundle-Name: RDKit Nodes for Knime
44
Bundle-SymbolicName: org.rdkit.knime.nodes;singleton:=true
55
Automatic-Module-Name: org.rdkit.knime.nodes
6-
Bundle-Version: 4.1.0.qualifier
6+
Bundle-Version: 4.2.0.qualifier
77
Bundle-Vendor: NIBR
88
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
99
Require-Bundle: org.eclipse.ui;bundle-version="[3.109.0,4.0.0)",

org.rdkit.knime.testing.feature/feature.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<feature
33
id="org.rdkit.knime.testing.feature"
44
label="RDKit KNIME JUnit Test"
5-
version="4.1.0.qualifier"
5+
version="4.2.0.qualifier"
66
provider-name="NIBR">
77

88
<description>

org.rdkit.knime.testing/META-INF/MANIFEST.MF

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ Bundle-ManifestVersion: 2
33
Bundle-Name: Testing
44
Bundle-SymbolicName: org.rdkit.knime.testing;singleton:=true
55
Automatic-Module-Name: org.rdkit.knime.testing
6-
Bundle-Version: 4.1.0.qualifier
7-
Fragment-Host: org.rdkit.knime.nodes;bundle-version="4.1.0"
6+
Bundle-Version: 4.2.0.qualifier
7+
Fragment-Host: org.rdkit.knime.nodes;bundle-version="4.2.0"
88
Bundle-RequiredExecutionEnvironment: JavaSE-1.8
99
Require-Bundle: org.knime.testing;bundle-version="[3.7.0,5.0.0)",
1010
org.knime.chem.base;bundle-version="[3.6.0,5.0.0)"
Binary file not shown.

org.rdkit.knime.types/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ Bundle-ActivationPolicy: lazy
2121
Bundle-ClassPath: rdkit-chem.jar,
2222
lib/org.RDKit.jar,
2323
lib/org.RDKitDoc.jar
24-
Bundle-Version: 4.1.0.qualifier
24+
Bundle-Version: 4.2.0.qualifier
2525
Bundle-Name: RDKit Chemistry Type Definition Plugin
2626
Bundle-Activator: org.rdkit.knime.RDKitTypesPluginActivator
2727
Bundle-ManifestVersion: 2

org.rdkit.knime.types/plugin.xml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,27 @@
4141
suggestAsDefault="true">
4242
</renderer>
4343
</dataValue>
44+
<dataValue
45+
valueClass="org.knime.chem.types.SmilesValue">
46+
<renderer
47+
rendererFactoryClass="org.rdkit.knime.types.RDKitMolValueRenderer$Factory"
48+
suggestAsDefault="false">
49+
</renderer>
50+
</dataValue>
51+
<dataValue
52+
valueClass="org.knime.chem.types.SdfValue">
53+
<renderer
54+
rendererFactoryClass="org.rdkit.knime.types.RDKitMolValueRenderer$Factory"
55+
suggestAsDefault="false">
56+
</renderer>
57+
</dataValue>
58+
<dataValue
59+
valueClass="org.knime.chem.types.SmartsValue">
60+
<renderer
61+
rendererFactoryClass="org.rdkit.knime.types.RDKitMolValueRenderer$Factory"
62+
suggestAsDefault="false">
63+
</renderer>
64+
</dataValue>
4465
</extension>
4566

4667
<extension point="org.knime.workbench.ui.startupMessages">

org.rdkit.knime.types/rdkit-chemsrc/org/rdkit/knime/types/RDKitMolValueRenderer.java

Lines changed: 108 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,9 @@
5757
import java.awt.Graphics2D;
5858
import java.io.StringReader;
5959

60+
import org.RDKit.GenericRDKitException;
6061
import org.RDKit.MolDraw2DSVG;
62+
import org.RDKit.MolDrawOptions;
6163
import org.RDKit.MolSanitizeException;
6264
import org.RDKit.RDKFuncs;
6365
import org.RDKit.ROMol;
@@ -75,6 +77,12 @@
7577
import org.knime.core.data.renderer.DataValueRenderer;
7678
import org.w3c.dom.svg.SVGDocument;
7779

80+
import org.knime.chem.types.MolValue;
81+
import org.knime.chem.types.SdfValue;
82+
import org.knime.chem.types.SmartsValue;
83+
import org.knime.chem.types.SmilesValue;
84+
85+
7886
/**
7987
* This a renderer that draws nice 2D depictions of RDKit molecules.
8088
*
@@ -152,60 +160,125 @@ protected void setValue(final Object value) {
152160
m_bIsMissingCell = (value instanceof DataCell && ((DataCell)value).isMissing());
153161

154162
RDKitMolValue molCell = null;
155-
156-
// We have an old plain RDKit Mol Value
157-
if (value instanceof RDKitMolValue) {
158-
molCell = (RDKitMolValue)value;
159-
}
160-
161-
// We have a wrapped RDKit Mol Value (or an error)
162-
else if (value instanceof AdapterValue) {
163-
final AdapterValue adapter = (AdapterValue)value;
164-
165-
if (adapter.getAdapterError(RDKitMolValue.class) != null) {
166-
m_bIsMissingCell = true;
167-
m_strError = adapter.getAdapterError(RDKitMolValue.class).getError();
163+
ROMol omol = null;
164+
boolean trySanitizing = true;
165+
try {
166+
// We have an old plain RDKit Mol Value
167+
if (value instanceof RDKitMolValue) {
168+
molCell = (RDKitMolValue)value;
168169
}
170+
171+
// We have a wrapped RDKit Mol Value (or an error)
172+
else if (value instanceof AdapterValue) {
173+
final AdapterValue adapter = (AdapterValue)value;
174+
175+
try {
176+
if (adapter.getAdapterError(RDKitMolValue.class) != null) {
177+
m_bIsMissingCell = true;
178+
m_strError = adapter.getAdapterError(RDKitMolValue.class).getError();
179+
}
180+
else {
181+
molCell = adapter.getAdapter(RDKitMolValue.class);
182+
}
183+
} catch (final IllegalArgumentException ex) {
184+
// we land here if there's no adapter in place
185+
molCell = null;
186+
}
187+
}
188+
// We just have a missing cell (which might be caused by some error)
169189
else {
170-
molCell = adapter.getAdapter(RDKitMolValue.class);
190+
m_bIsMissingCell = (value instanceof DataCell && ((DataCell)value).isMissing());
191+
if (value instanceof MissingCell) {
192+
m_strError = ((MissingCell)value).getError();
193+
}
171194
}
172-
}
195+
} catch (final Exception ex) {
196+
// If conversion fails we set a null value, which will show up as error messgae
197+
omol = null;
198+
// Logging something here may swamp the log files - not desired.
173199

174-
// We just have a missing cell (which might be caused by some error)
175-
else {
176-
m_bIsMissingCell = (value instanceof DataCell && ((DataCell)value).isMissing());
177-
if (value instanceof MissingCell) {
178-
m_strError = ((MissingCell)value).getError();
179-
}
180200
}
181-
182201
if (molCell != null) {
183-
// Try to render the cell
184202
m_strSmiles = molCell.getSmilesValue();
185-
ROMol omol = null;
203+
omol = molCell.readMoleculeValue();
204+
} else {
205+
// see if we have a value that we can understand
206+
try {
207+
RWMol tmol = null;
208+
if (value instanceof SmilesValue) {
209+
String val = ((SmilesValue) value).getSmilesValue();
210+
tmol = RWMol.MolFromSmiles(val,0,false);
211+
}
212+
else if (value instanceof SdfValue) {
213+
String val = ((SdfValue) value).getSdfValue();
214+
tmol = RWMol.MolFromMolBlock(val,false);
215+
}
216+
else if (value instanceof MolValue) {
217+
String val = ((MolValue) value).getMolValue();
218+
tmol = RWMol.MolFromMolBlock(val,false);
219+
}
220+
else if (value instanceof SmartsValue) {
221+
String val = ((SmartsValue) value).getSmartsValue();
222+
tmol = RWMol.MolFromSmarts(val);
223+
trySanitizing=false;
224+
}
225+
if(tmol != null) {
226+
// save a copy in case something goes badly wrong in the sanitization
227+
omol = new ROMol(tmol);
228+
if(trySanitizing) {
229+
try {
230+
RDKFuncs.sanitizeMol(tmol);
231+
omol.delete();
232+
omol = tmol;
233+
} catch (final Exception ex) {
234+
trySanitizing=false;
235+
tmol.delete();
236+
tmol = null;
237+
}
238+
}
239+
// don't put this in an "else", we want to execute it if sanitization fails above.
240+
if(!trySanitizing) {
241+
// do a minimal amount of sanitization so that we can draw things properly
242+
omol.updatePropertyCache(false);
243+
RDKFuncs.symmetrizeSSSR(omol);
244+
RDKFuncs.setHybridization(omol);
245+
tmol.delete();
246+
}
247+
}
248+
} catch (final Exception ex) {
249+
omol = null;
250+
}
251+
}
252+
if(omol != null) {
253+
// Try to render the cell
186254
final Thread t = Thread.currentThread();
187255
final ClassLoader contextClassLoader = t.getContextClassLoader();
188256
t.setContextClassLoader(getClass().getClassLoader());
189257

190258
try {
191-
omol = molCell.readMoleculeValue();
192-
193259
RWMol mol;
194260
mol = new RWMol(omol);
195-
try {
196-
RDKFuncs.prepareMolForDrawing(mol);
197-
} catch(final MolSanitizeException ex) {
198-
mol.delete();
199-
mol = new RWMol(omol);
200-
// skip kekulization. If this still fails we throw up our hands
261+
if(trySanitizing) {
262+
try {
263+
RDKFuncs.prepareMolForDrawing(mol);
264+
} catch(final MolSanitizeException ex) {
265+
mol.delete();
266+
mol = new RWMol(omol);
267+
// skip kekulization. If this still fails we throw up our hands
268+
RDKFuncs.prepareMolForDrawing(mol,false);
269+
}
270+
} else {
271+
// skip kekulization
201272
RDKFuncs.prepareMolForDrawing(mol,false);
202273
}
203274
final MolDraw2DSVG molDrawing = new MolDraw2DSVG(300, 300);
275+
MolDrawOptions opts = molDrawing.drawOptions();
276+
// we've already prepared the molecule appropriately, so don't try again:
277+
opts.setPrepareMolsBeforeDrawing(false);
204278
molDrawing.drawMolecule((ROMol)mol);
205279
molDrawing.finishDrawing();
206280

207-
// the svg namespace causes problems with the javascript table (github #29)
208-
final String svg = molDrawing.getDrawingText().replaceAll("svg:", "").replaceAll("xmlns:svg=", "xmlns=");
281+
final String svg = molDrawing.getDrawingText();
209282
if(mol != omol){
210283
mol.delete();
211284
}
@@ -228,8 +301,7 @@ else if (value instanceof AdapterValue) {
228301
// labels to be printed off their places
229302
m_svgDocument.getRootElement().removeAttributeNS(
230303
"http://www.w3.org/XML/1998/namespace", "space");
231-
}
232-
catch (final Exception ex) {
304+
}catch (final Exception ex) {
233305
// If conversion fails we set a null value, which will show up as error messgae
234306
m_svgDocument = null;
235307
// Logging something here may swam the log files - not desired.

org.rdkit.knime.update/feature.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<feature
33
id="org.rdkit.knime.update"
44
label="RDKit Update Site"
5-
version="4.1.0.qualifier">
5+
version="4.2.0.qualifier">
66

77
<description url="http://www.example.com/description">
88
[Enter Feature Description here.]

org.rdkit.knime.wizards.feature/feature.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<feature
33
id="org.rdkit.knime.wizards.feature"
44
label="RDKit KNIME Wizards"
5-
version="4.1.0.qualifier"
5+
version="4.2.0.qualifier"
66
provider-name="NIBR"
77
plugin="org.rdkit.knime.wizards">
88

org.rdkit.knime.wizards.samples/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
33
Bundle-Name: RDKit Node Wizards Samples
44
Bundle-SymbolicName: org.rdkit.knime.wizards.samples;singleton:=true
55
Automatic-Module-Name: org.rdkit.knime.wizards.samples
6-
Bundle-Version: 4.1.0.qualifier
6+
Bundle-Version: 4.2.0.qualifier
77
Bundle-Activator: org.rdkit.knime.wizards.samples.Activator
88
Bundle-Vendor: NIBR
99
Require-Bundle: org.knime.base;bundle-version="[3.6.2,5.0.0)",

org.rdkit.knime.wizards/META-INF/MANIFEST.MF

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ Bundle-ManifestVersion: 2
33
Bundle-Name: RDKit Nodes Wizards
44
Bundle-SymbolicName: org.rdkit.knime.wizards;singleton:=true
55
Automatic-Module-Name: org.rdkit.knime.wizards
6-
Bundle-Version: 4.1.0.qualifier
6+
Bundle-Version: 4.2.0.qualifier
77
Bundle-Activator: org.rdkit.knime.wizards.RDKitNodesWizardsPlugin
88
Bundle-Vendor: NIBR
99
Require-Bundle: org.knime.base;bundle-version="[3.6.2,5.0.0)",

0 commit comments

Comments
 (0)