Vernalis Ertl Scaffold Keys Node crashes

Dear all,
I just tried to use the Ertl Scaffold Keys node for the first time today, inputting a list of 585 substances (as SMILES), and the node simply crashes (i.e. KNIME completely crashes) without warning after ca. 8% of execution (very reproducible).
I am currently running KNIME 5.4.3 with Vernalis Version Vernalis Research, UK Vernalis Core-extension for KNIME Workbench 1.38.0.v202503121017
OS is Win 11 24H2.
Any idea what might be going on?
Thanks

Joachim

Hi Joachim,

Thanks for this report. It’s not behavior we have seen previously with this node.

There are a couple of things which it would be really helpful if you could do to help try to pin this behavior down.

  1. Immediately after the crash, when you restart KNIME, could you look back at the end of the KNIME Log (View → Open KNIME Log) and see if there’s anything that looks related to the crash
  2. Could you check in your KNIME installation folder for any files called something like hs_err_pid12345.log and again look what the latest one, corresponding to the crash says

(If you’d rather not share these publicly on the forum, do feel free to drop the information to us in an email at the address in any of our node descriptions)

Also, I’m wondering whether there is a specific SMILES string in there which is causing this behavior. The easiest way to try this is to surround the Scaffold Keys node in a Chunk Loop Start / Loop End Loop, and add a Save Workflow node between the Chunk Loop Start and Scaffold Keys nodes:

image

Run the workflow (with a chunk size of 1) a couple of times and see if it is always the same molecule causing the problem (when you reopen the workflow, it should be saved with the loop partially executed, on the molecule that triggered the failure) - if it is always the same structure, we will need to figure a mechanism for you to share it with us if at all possible to help further debug.

The other question is what settings are you using in the node?

image

We did have a bug with Key depiction code previously, but I thought we had managed to fix that (I will check that we did so in the public version in addition to our internal version - UPDATE: The rendering code fix is present in the public code!)

Thanks again,

Steve

(PS thanks also to @steffen_KNIME for bringing this post to my attention!)

Hi Steve,

thank you for your quick reply. I have located the latest hs_err*** file, will attach it to this reply.
Config settings were these:
image

reproduced the error just now, the knime.log reads like this:

2025-03-26 08:31:07,707 : WARN : comm-pool-thread-2 : : ScaffoldKeysNodeModel : Ertl Scaffold Keys : 3:29 : No column selected. SMILES auto-selected.
2025-03-26 08:33:50,832 : WARN : ModalContext : : Node : RowID : 3:13 : 194 duplicate(s) now unique.
2025-03-26 08:34:00,868 : WARN : Node Repository Initializer : : DBDriverRegistry : : : No valid file urls found for user driver (MySQL) “MySQL”.
2025-03-26 08:34:00,869 : ERROR : Node Repository Initializer : : DBDriverRegistry : : : Database driver wrapper creation failed for driver (MySQL) “MySQL”.
2025-03-26 08:34:00,871 : ERROR : Node Repository Initializer : : DBDriverRegistry : : : Failed to register driver (MySQL) “MySQL”.
java.lang.ClassNotFoundException: com.mysql.fabric.jdbc.FabricMySQLDriver

  • at java.base/java.net.URLClassLoader.findClass(Unknown Source)*
  • at java.base/java.lang.ClassLoader.loadClass(Unknown Source)*
  • at java.base/java.lang.ClassLoader.loadClass(Unknown Source)*
  • at org.knime.database.driver.DBDriverRegistry.createDriver(DBDriverRegistry.java:446)*
  • at org.knime.database.driver.DBDriverRegistry.createDriverWrapper(DBDriverRegistry.java:477)*
  • at org.knime.database.driver.DBDriverRegistry.registerUserDrivers(DBDriverRegistry.java:787)*
  • at org.knime.database.driver.DBDriverRegistry.registerUserDrivers(DBDriverRegistry.java:755)*
  • at org.knime.database.driver.DBDriverRegistry.(DBDriverRegistry.java:619)*
  • at org.knime.database.driver.DBDriverRegistry.(DBDriverRegistry.java:235)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorSettings.(MSAccessConnectorSettings.java:85)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeModel.(MSAccessConnectorNodeModel.java:88)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeFactory.createNodeModel(MSAccessConnectorNodeFactory.java:62)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeFactory.createNodeModel(MSAccessConnectorNodeFactory.java:1)*
  • at org.knime.core.node.ContextAwareNodeFactory.createNodeModel(ContextAwareNodeFactory.java:78)*
  • at org.knime.core.node.NodeFactory.callCreateNodeModel(NodeFactory.java:569)*
  • at org.knime.core.node.Node.(Node.java:305)*
  • at org.knime.core.node.Node.(Node.java:277)*
  • at org.knime.core.node.extension.NodeSpec.of(NodeSpec.java:123)*
  • at org.knime.core.node.extension.NodeSpec.of(NodeSpec.java:186)*
  • at org.knime.core.node.extension.NodeSpecCache$Initializer.computeNodeSpecIgnoringErrors(NodeSpecCache.java:190)*
  • at java.base/java.util.stream.ReferencePipeline$7$1.accept(Unknown Source)*
  • at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)*
  • at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)*
  • at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)*
  • at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source)*
  • at org.knime.core.node.extension.NodeSpecCache$Initializer.run(NodeSpecCache.java:168)*
  • at java.base/java.lang.Thread.run(Unknown Source)*
    2025-03-26 08:34:00,880 : WARN : Node Repository Initializer : : DBDriverRegistry : : : No valid file urls found for user driver (Oracle_19) “Oracle”.
    2025-03-26 08:34:00,881 : ERROR : Node Repository Initializer : : DBDriverRegistry : : : Database driver wrapper creation failed for driver (Oracle_19) “Oracle”.
    2025-03-26 08:34:00,881 : ERROR : Node Repository Initializer : : DBDriverRegistry : : : Failed to register driver (Oracle_19) “Oracle”.
    java.lang.ClassNotFoundException: oracle.jdbc.OracleDriver
  • at java.base/java.net.URLClassLoader.findClass(Unknown Source)*
  • at java.base/java.lang.ClassLoader.loadClass(Unknown Source)*
  • at java.base/java.lang.ClassLoader.loadClass(Unknown Source)*
  • at org.knime.database.driver.DBDriverRegistry.createDriver(DBDriverRegistry.java:446)*
  • at org.knime.database.driver.DBDriverRegistry.createDriverWrapper(DBDriverRegistry.java:477)*
  • at org.knime.database.driver.DBDriverRegistry.registerUserDrivers(DBDriverRegistry.java:787)*
  • at org.knime.database.driver.DBDriverRegistry.registerUserDrivers(DBDriverRegistry.java:755)*
  • at org.knime.database.driver.DBDriverRegistry.(DBDriverRegistry.java:619)*
  • at org.knime.database.driver.DBDriverRegistry.(DBDriverRegistry.java:235)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorSettings.(MSAccessConnectorSettings.java:85)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeModel.(MSAccessConnectorNodeModel.java:88)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeFactory.createNodeModel(MSAccessConnectorNodeFactory.java:62)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeFactory.createNodeModel(MSAccessConnectorNodeFactory.java:1)*
  • at org.knime.core.node.ContextAwareNodeFactory.createNodeModel(ContextAwareNodeFactory.java:78)*
  • at org.knime.core.node.NodeFactory.callCreateNodeModel(NodeFactory.java:569)*
  • at org.knime.core.node.Node.(Node.java:305)*
  • at org.knime.core.node.Node.(Node.java:277)*
  • at org.knime.core.node.extension.NodeSpec.of(NodeSpec.java:123)*
  • at org.knime.core.node.extension.NodeSpec.of(NodeSpec.java:186)*
  • at org.knime.core.node.extension.NodeSpecCache$Initializer.computeNodeSpecIgnoringErrors(NodeSpecCache.java:190)*
  • at java.base/java.util.stream.ReferencePipeline$7$1.accept(Unknown Source)*
  • at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)*
  • at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)*
  • at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)*
  • at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source)*
  • at org.knime.core.node.extension.NodeSpecCache$Initializer.run(NodeSpecCache.java:168)*
  • at java.base/java.lang.Thread.run(Unknown Source)*
    2025-03-26 08:34:00,884 : WARN : Node Repository Initializer : : DBDriverRegistry : : : No valid file urls found for user driver (PostGres) “PostGres”.
    2025-03-26 08:34:00,886 : ERROR : Node Repository Initializer : : DBDriverRegistry : : : Database driver wrapper creation failed for driver (PostGres) “PostGres”.
    2025-03-26 08:34:00,888 : ERROR : Node Repository Initializer : : DBDriverRegistry : : : Failed to register driver (PostGres) “PostGres”.
    java.lang.ClassNotFoundException: org.postgresql.Driver
  • at java.base/java.net.URLClassLoader.findClass(Unknown Source)*
  • at java.base/java.lang.ClassLoader.loadClass(Unknown Source)*
  • at java.base/java.lang.ClassLoader.loadClass(Unknown Source)*
  • at org.knime.database.driver.DBDriverRegistry.createDriver(DBDriverRegistry.java:446)*
  • at org.knime.database.driver.DBDriverRegistry.createDriverWrapper(DBDriverRegistry.java:477)*
  • at org.knime.database.driver.DBDriverRegistry.registerUserDrivers(DBDriverRegistry.java:787)*
  • at org.knime.database.driver.DBDriverRegistry.registerUserDrivers(DBDriverRegistry.java:755)*
  • at org.knime.database.driver.DBDriverRegistry.(DBDriverRegistry.java:619)*
  • at org.knime.database.driver.DBDriverRegistry.(DBDriverRegistry.java:235)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorSettings.(MSAccessConnectorSettings.java:85)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeModel.(MSAccessConnectorNodeModel.java:88)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeFactory.createNodeModel(MSAccessConnectorNodeFactory.java:62)*
  • at org.knime.database.extension.msaccess.node.connector.MSAccessConnectorNodeFactory.createNodeModel(MSAccessConnectorNodeFactory.java:1)*
  • at org.knime.core.node.ContextAwareNodeFactory.createNodeModel(ContextAwareNodeFactory.java:78)*
  • at org.knime.core.node.NodeFactory.callCreateNodeModel(NodeFactory.java:569)*
  • at org.knime.core.node.Node.(Node.java:305)*
  • at org.knime.core.node.Node.(Node.java:277)*
  • at org.knime.core.node.extension.NodeSpec.of(NodeSpec.java:123)*
  • at org.knime.core.node.extension.NodeSpec.of(NodeSpec.java:186)*
  • at org.knime.core.node.extension.NodeSpecCache$Initializer.computeNodeSpecIgnoringErrors(NodeSpecCache.java:190)*
  • at java.base/java.util.stream.ReferencePipeline$7$1.accept(Unknown Source)*
  • at java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source)*
  • at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(Unknown Source)*
  • at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(Unknown Source)*
  • at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source)*
  • at java.base/java.util.stream.ReferencePipeline.forEach(Unknown Source)*
  • at org.knime.core.node.extension.NodeSpecCache$Initializer.run(NodeSpecCache.java:168)*
  • at java.base/java.lang.Thread.run(Unknown Source)*

will try to check your suggestion with the chunk loop, back to you with results if the problem is a specific SMILE.

hs_err_pid2256.log (127.7 KB)

Dear Steve,

as per your suggestion, I have been digging a bit deeper into the error, utilizing the Chunk loop method as you suggested (thanks for this life hack… )

In the first iterations on the run, it reproducibly failed to process the following SMILE:
Row69 C\C=C\C=C\1/C(=CC(=O)CC1(C)C)C

Looking closer at my list, I found the two subsequent SMILES to be highly similar and as assumed, removing the Row69 made the node crash on Row70.

Row70 C\C=C/C=C\1/C(=CC(=O)CC1(C)C)C
Row71 C\C=C\C=C/1\C(=CC(=O)CC1(C)C)C
Row72 C\C=C/C=C/1\C(=CC(=O)CC1(C)C)C

therefore, I removed all four (Row69-72) from the next attempt, and it failed again, but this time much earlier.
Row20 OCCc1ccccc1
was the ‘offending’ SMILE this time. As this line has been processed in previous attempts, I would conclude it is not something to do with the nature of the SMILE being processed.
Maybe the .log files I provided earlier will give us a clue on what is happening here.

Kind regards

Joachim

Hi Joachim,

Thanks for these updates (and sorry for the delay getting back to you)

This looks from the hserr***.log file to be caused by something about the 2D coordinate generation step during the molecule depiction.

I’m going to tag @ptosco and @greglandrum here in the hope one of them can shed some light on what is happening either within the RDKit toolkit, or in my use of it, as it seems strange that we don’t see it elsewhere. (The line of code which appears to be the problem is this one:

based on the content of the hs_err*.log file)

I can also create a minimal reproducible example - see attached -
Ertl SegFault.knwf (8.4 KB)

Adding some debugging to the source code immediately before the call to ROMol#compute2DCoords() gives us the following details:

mol:  // From mol.toBinary()
-17,-66,-83,-34,0,0,0,0,16,0,0,0,2,0,0,0,0,0,0,0,8,0,0,0,8,0,0,0,-128,1,6,0,104,0,0,0,3,2,2,6,0,40,0,0,0,3,4,6,0,104,0,0,0,3,3,1,6,0,104,0,0,0,3,3,1,6,0,40,0,0,0,3,4,8,0,40,0,0,0,3,2,6,0,96,0,0,0,2,2,6,0,96,0,0,0,2,2,11,0,1,42,2,2,0,1,2,36,4,2,3,40,2,3,4,32,4,5,40,2,4,6,0,6,7,0,7,1,4,4,66,1,0,0,0,6,1,7,6,4,3,2,23,4,0,0,0,0,0,0,0,22

atoms: C,C,C,C,C,O,C,C

bonds: DOUBLE,SINGLE,DOUBLE,SINGLE,DOUBLE,SINGLE,SINGLE,SINGLE

ERROR KNIME-Worker-10-Ertl Scaffold Keys 3:3 ROMolScaffold SMILES - C=C1C=CC(=O)CC1 // from mol.MolToSMILES()

And we always crash on the very first call to the method

Thanks

Steve

This was fixed in RDKit:
Avoid a segfault in CoordGen when a double bond has stereo spec but no stereo atoms by ptosco ¡ Pull Request #8415 ¡ rdkit/rdkit
and will become part of the 2025_03_2 release.

2 Likes

Thanks @ptosco_w

In the meantime, armed with the understanding of the cause of this problem, I have a fix which will hopefully make its way across the builds from KNIME AP v5.2 onwards over the course of the afternoon (it will be v1.38.2) for our code.

NB - The same bug also affects the output table from RDKit Find Murcko Scaffolds - I can’t fix that one, but it should be fixed as and when the RDKit toolkit update makes it’s way over to the RDKit KNIME build.

Steve

Fixed in v1.38.2 - see:

Thanks again for reporting,

Steve

Dear Steve, dear @ptosco_w ,

thank you for taking care of this. I will update my KNIME for the Vernalis ext and report on success

1 Like

Reporting back, node performed well and completed! So for me, the workaround helped and solved my problem!
Thanks again @Vernalis @ptosco_w for resolving this for me!

1 Like

Great! Thanks for letting us know,

Steve