Wrapper for RDKit's RunReactants to improve stereochemistry handling
This repository is a fork of rdchiral. It has been modified for improved performance while maintaining high consistency with the upstream library. Depending on the operation, rdchiral_plus is 1.7×–5× faster than the original rdchiral, and is competitive with the fast C++ version (rdchiral_cpp). This library has the benefits of being written in Python and achieves a higher round-trip accuracy than either the original or the C++ library. rdchiral_plus is pip installable cross platform.
The interface (rdchiralRun, rdchiralRunText, rdchiralReaction, rdchiralReactants, extract_from_reaction, extract_from_reaction_smiles, etc.) and returned data structures remain unchanged from the original library, so existing code should work with no modifications. While behavior is mostly consistent with the original library, this fork includes several important fixes and improvements.
- Fix cis/trans outcomes for conjugated systems: Fixes incorrect cis/trans outcomes for conjugated systems that could previously depend on atom numbering. In particular, when a template only specifies part of a conjugated system, the copied double-bond stereo directions may need to be reversed consistently
- Broader stereochemistry handling: Stereochemistry for tetrahedral centers with lone pairs is accounted for
- One-pot reactions: Templates defining multiple reactions on the same product are now properly handled by initializing templates with parentheses where needed
- Recursive template application: Templates can be recursively applied with a max_depth parameter, useful for symmetric reactions, or reactions that occur at multiple sites in a molecule
- Configurable template extraction: Extends template extraction to support a configurable fragment
radiusand an option to disable matching/including “special groups” (no_special_groups), which can change which atoms are included in extracted fragments. - Deterministic template extraction: Replaced random shuffle-based tetrahedral center correction loops with deterministic permutation parity - the old behavior could lead to inconsistent results or appear to hang in rare instances.
- Stereochemistry tracking: Inversions of tetrahedral centers are counted as a changed atom, and included in the extracted template
- Spectator tracking: Spectator molecules are included in extracted template dictionaries
- Automatic dependency installation: RDKit is automatically installed as a dependency
The changes above result in minor differences in behavior compared to the original library. In most cases where behavior is different, rdchiral_plus produces the more accurate result. As an example, the table below shows the roundtrip success rate of extracting a template from an atom mapped reaction SMILES, applying that template to the product SMILES, and then recovering the expected reactant SMILES. rdchiral_plus reduces the number of incorrect roundtrips by 98% compared to rdchiral, and 99% compared to rdchiral_cpp, achieving a 99.96% roundtrip success rate for extract template -> apply to products -> recover expected reactants.
| library | successful roundtrips | success rate |
|---|---|---|
| rdchiral | 49223 / 50016 | 98.41% |
| rdchiral_cpp | 48694 / 50016 | 97.36% |
| rdchiral_plus | 49998 / 50016 | 99.96% |
See here for details on how consistency is measured against the original library and full details of what changes you can expect compared to the original rdchiral library.
- RDKit (version >= 2019)
- Python (version >= 3.10)
Install rdchiral_plus from PyPI:
pip install rdchiral-plusOr install rdchiral_plus with pip directly from this repo:
pip install git+https://github.com/denovochem/rdchiral_plus.gitThis fork can be optionally compiled with mypyc. In our testing performance is not noticeably improved, as most of the computationally expensive work in this library is done with rdkit, which is already primarily written in C++.
For mypyc compilation:
RDCHIRAL_USE_MYPYC=1 pip install "git+https://github.com/denovochem/rdchiral_plus.git"from rdchiral import rdchiralRun, rdchiralRunText, rdchiralReaction, rdchiralReactants
# Run directly from SMARTS and SMILES strings
# This is slower than pre-initializing rdchiralReaction and rdchiralReactants when
# processing a large number of reactions
reaction_smarts = '[C:1][OH:2]>>[C:1][O:2][C]'
reactant_smiles = 'OCC(=O)OCCCO'
outcomes = rdchiralRunText(reaction_smarts, reactant_smiles)
print(outcomes)
# Pre-initialize then run
rxn = rdchiralReaction(reaction_smarts)
reactants = rdchiralReactants(reactant_smiles)
outcomes = rdchiralRun(rxn, reactants)
print(outcomes)
# Get list of atoms that changed
outcomes, mapped_outcomes = rdchiralRun(rxn, reactants, return_mapped=True)
print(outcomes, mapped_outcomes)Full documentation is available here
- Feature ideas and bug reports are welcome on the Issue Tracker.
- Fork the source code on GitHub, make changes and file a pull request.
rdchiral_plus is licensed under the MIT license.