⚗️ Dimorphite-DL
A fast, accurate, and modular open-source program for enumerating the ionization states of drug-like small molecules over a user-specified pH range.
⚠️ This repository is a modernized fork of Durrant Lab's original Dimorphite-DL (original article), reworked for easier installation and integration into bigger cheminformatics projects — see CHANGES.md for the full history.
✨ Features
- ⚡ Fast pH-range enumeration — adds/removes hydrogens for any pH window you specify, with a tunable
--pka_precision(number of standard deviations around each predicted pKa). - 🧬 Broad functional-group coverage — alcohols, amides, amines/anilines, azides, carboxyls, guanidines, imides, nitro groups, phosphates/phosphonates (including ATP/NAD-style polyphosphate chains), sulfates/sulfonates/sulfonamides, thiols, indoles/pyrroles, aromatic nitrogens, and more.
- 🖥️ CLI and 🐍 Python API — run it as a
dimorphitecommand, or calldimorphite_dl.run(...)directly from your own scripts. - 📄 Flexible input — SMILES from the command line, an
.smifile, or a Python SMILES string / RDKitMolobject (or list of either). - 🏷️ Optional state labeling — tag each output SMILES as
PROTONATED,DEPROTONATED, orBOTH. - 🛡️ Bounded output —
--max_variantscaps the number of protonation variants generated per input compound. - ✅ Modern tooling —
pyproject.tomlpackaging, apytesttest suite,rufflinting/formatting, and CI across Linux/macOS/Windows × Python 3.11-3.13.
✍️ Copyright and Citation Notice
Olivier J. M. Béquignon is neither the copyright holder of the original Dimorphite-DL algorithm nor responsible for it. This repository packages and modernizes Jacob D. Durrant's original work (Apache-2.0 licensed) — see CONTRIBUTORS.md for the original authors.
Citing
If you use Dimorphite-DL in your research, please cite the original publication:
Ropp PJ, Kaminsky JC, Yablonski S, Durrant JD (2019) Dimorphite-DL: An open-source program for enumerating the ionization states of drug-like small molecules. J Cheminform 11:14. DOI: 10.1186/s13321-019-0336-9
📦 Installation
pip install dimorphite-ojmb
Or from source:
git clone https://github.com/OlivierBeq/dimorphite_dl.git
pip install ./dimorphite_dl
🛠️ Requirements
💡 Usage
Command line
usage: dimorphite [-h] [--min_ph MIN] [--max_ph MAX] [--pka_precision PRE]
[--smiles SMI] [--smiles_file FILE] [--output_file FILE]
[--max_variants MXV] [--label_states] [--silent]
Dimorphite 1.2.4: Creates models of appropriately protonated small moleucles.
Apache 2.0 License. Copyright 2020 Jacob D. Durrant.
Options:
-h, --help Show this message and exit.
--min_ph MIN minimum pH to consider (default: 6.4)
--max_ph MAX maximum pH to consider (default: 8.4)
--pka_precision PRE pKa precision factor (number of standard devations,
default: 1.0)
--smiles SMI SMILES string to protonate NOTE: This argument is
mutually exclusive with smiles_file. [required]
--smiles_file FILE file that contains SMILES strings to protonate NOTE:
This argument is mutually exclusive with smiles.
[required]
--output_file FILE output file to write protonated SMILES (optional)
--max_variants MXV limit number of variants per input compound (default:
128)
--label_states label protonated SMILES with target state (i.e.,
"DEPROTONATED", "PROTONATED", or "BOTH").
--silent do not print any messages to the screen
The default pH range is 6.4 to 8.4, considered biologically relevant pH.
dimorphite --smiles_file sample_molecules.smi
dimorphite --smiles "CCC(=O)O" --min_ph -3.0 --max_ph -2.0
dimorphite --smiles "CCCN" --min_ph -3.0 --max_ph -2.0 --output_file output.smi
dimorphite --smiles_file sample_molecules.smi --pka_precision 2.0 --label_states
Python API
import dimorphite_dl
# Using the dimorphite_dl.run() function, you can run Dimorphite-DL exactly as
# you would from the command line. Here's an example:
dimorphite_dl.run(smiles="CCCN", min_ph=-3.0, max_ph=-2.0)
# One can also provide multiple SMILES at once.
dimorphite_dl.run(["C[C@](F)(Br)CC(O)=O", "CCCCCN"], min_ph=5.0, max_ph=9.0, silent=True)
RDKit Mol objects are accepted too, either on their own or in a list:
from rdkit import Chem
mol = Chem.MolFromSmiles("CCCN")
dimorphite_dl.run(mol, min_ph=-3.0, max_ph=-2.0, silent=True)
dimorphite_dl.run([mol], min_ph=-3.0, max_ph=-2.0, silent=True)
Running the tests
From a source checkout:
pip install -e ".[test]"
pytest
⚠️ Caveats
Dimorphite-DL deprotonates indoles and pyrroles around pH 14.5. But these substructures can also be protonated around pH -3.5. Dimorphite does not perform the protonation.
📄 License
This project is licensed under the Apache 2.0 License - see the LICENSE.txt file for details.
📚 API Documentation
def run(smiles, min_ph=6.4, max_ph=8.4, pka_precision=1.0, max_variants=128, label_states=False, silent=False):
Runs Dimorphite-DL protonation on one or more molecules.
Parameters
- smiles : str | Chem.Mol | list[str] | list[Chem.Mol]
A SMILES string, an RDKit
Molobject, or a list of either, to protonate.Nonereturns[None]. - min_ph : float
Minimum pH to consider (default:
6.4). - max_ph : float
Maximum pH to consider (default:
8.4). - pka_precision : float
pKa precision factor — number of standard deviations around each predicted pKa to consider (default:
1.0). - max_variants : int
Limit on the number of protonation variants generated per input compound (default:
128). - label_states : bool
If
True, each result becomes a(smiles_list, state)tuple, wherestateis"PROTONATED","DEPROTONATED","BOTH", a list thereof (one per site), orNoneif the molecule has no ionizable site. - silent : bool Suppress the citation banner and warning messages.
- return_type : list
One entry per input molecule, in the same order: a SMILES string (or
(smiles_list, state)tuple iflabel_states=True), orNoneif the molecule could not be parsed.
👥 Authors and Contacts
See the CONTRIBUTORS.md file for a full list of original contributors. Please contact Jacob Durrant (durrantj@pitt.edu) with any questions about the original algorithm, or open an issue for questions about this fork.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dimorphite_ojmb-1.3.0.tar.gz.
File metadata
- Download URL: dimorphite_ojmb-1.3.0.tar.gz
- Upload date:
- Size: 29.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5f2188c1942b340db07d457d818bb9c54e933ba2388ad5348a5e07ecdbcd83e0
|
|
| MD5 |
3d3f9e6c410058828d19a03b0a7eff18
|
|
| BLAKE2b-256 |
50f4b0b637cfc62393ae44f4cdd59cb33794f5fb42934c4fab2c3bf58781abf7
|
File details
Details for the file dimorphite_ojmb-1.3.0-py3-none-any.whl.
File metadata
- Download URL: dimorphite_ojmb-1.3.0-py3-none-any.whl
- Upload date:
- Size: 24.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
twine/6.1.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
837f9e2bb202298041b8ce05cc92db805248161121d3b893ee8e14cdbaac9d12
|
|
| MD5 |
360ffc386491191b02484573451520d4
|
|
| BLAKE2b-256 |
ed22afc480716d9f3f624e026e7135dc422c621816c53045750ce6096d4805ae
|