🧬 jCompoundMapper Python Wrapper
A simple and reliable Python wrapper for calculating jCompoundMapper molecular fingerprints. This library takes care of installing a matching Java runtime, dispatching molecules to the bundled jCMapperCLI executable, and collecting the results into a tidy pandas DataFrame — so you can stay in RDKit/pandas-land.
✨ Features
- 🧩 17 fingerprint types — DFS, ASP, AP2D, AT2D, AP3D, AT3D, CATS2D, CATS3D, PHAP2POINT2D, PHAP3POINT2D, PHAP2POINT3D, PHAP3POINT3D, ECFP, ECFPVariant, LSTAR, SHED, RAD2D, RAD3D and MACCS, straight from jCompoundMapper.
- ☕ Zero Java setup — automatically downloads, caches and reuses a matching JRE on first use; nothing to install by hand.
- ⚡ Parallel by design — spread the work across multiple CPU cores with configurable
njobs/chunksize, each worker running its own single-core-pinned JVM. - 🧯 Never silently misaligned — molecules that fail to parse are skipped explicitly and reinserted as
NaNrows, never dropped without a trace. - 📊 pandas-native output — results come back as a ready-to-use
DataFrame, one row per molecule. - 🎛️ Configurable fingerprints — override depth, distance cutoff, stretch factor, atom typing and aromaticity flags per fingerprint via
FpParamType.
✍️ Copyright and Citation Notice
Olivier J. M. Béquignon is neither the copyright holder of jCompoundMapper nor responsible for it. The work carried out here concerns solely the Python wrapper.
Citing
If you use this wrapper in your research, please cite the original jCompoundMapper publication in addition to this software package:
-
Original jCompoundMapper paper:
Hinselmann, G., Rosenbaum, L., Jahn, A., Fechner, N., Zell, A. (2011), jCompoundMapper: An open source Java library and command-line tool for chemical fingerprints. Journal of Cheminformatics, 3, 3. DOI: 10.1186/1758-2946-3-3
-
This wrapper:
Béquignon, O. J. M. jCompoundMapper_pywrapper: a Python wrapper for jCompoundMapper molecular fingerprints. https://github.com/OlivierBeq/jCompoundMapper_pywrapper
📦 Installation
pip install jcompoundmapper-pywrapper
Or from source:
git clone https://github.com/OlivierBeq/jCompoundMapper_pywrapper.git
pip install ./jCompoundMapper_pywrapper
🛠️ Requirements
- Python 3.11+
- RDKit
💡 Usage
Getting started
from jcompoundmapper_pywrapper import JCompoundMapper
from rdkit import Chem
smiles_list = [
# erlotinib
"n1cnc(c2cc(c(cc12)OCCOC)OCCOC)Nc1cc(ccc1)C#C",
# midecamycin
"CCC(=O)O[C@@H]1CC(=O)O[C@@H](C/C=C/C=C/[C@@H]([C@@H](C[C@@H]([C@@H]([C@H]1OC)O[C@H]2[C@@H]([C@H]([C@@H]([C@H](O2)C)O[C@H]3C[C@@]([C@H]([C@@H](O3)C)OC(=O)CC)(C)O)N(C)C)O)CC=O)C)O)C",
# selenofolate
"C1=CC(=CC=C1C(=O)NC(CCC(=O)OCC[Se]C#N)C(=O)O)NCC2=CN=C3C(=N2)C(=O)NC(=N3)N",
# cisplatin
"N.N.Cl[Pt]Cl",
]
mols = [Chem.MolFromSmiles(smiles) for smiles in smiles_list]
jcm = JCompoundMapper()
print(jcm.calculate(mols))
By default, the DFS fingerprint is calculated with 1024 bits. Any of the following fingerprints can be requested instead: DFS, ASP, AP2D, AT2D, AP3D, AT3D, CATS2D, CATS3D, PHAP2POINT2D, PHAP3POINT2D, PHAP2POINT3D, PHAP3POINT3D, ECFP, ECFPVariant, LSTAR, SHED, RAD2D, RAD3D or MACCS (always 166 bits, regardless of nbits).
jcm = JCompoundMapper('ECFP')
print(jcm.calculate(mols, nbits=2048))
# or, using the Fingerprint enum
from jcompoundmapper_pywrapper import Fingerprint
jcm = JCompoundMapper(Fingerprint.ECFP)
print(jcm.calculate(mols, nbits=2048))
3D fingerprints
⚠️ Molecules with 3D conformers must be provided to calculate 3D fingerprints (i.e.
AP3D,AT3D,CATS3D,PHAP2POINT3D,PHAP3POINT3DandRAD3D) — aValueErroris raised otherwise. ⚠️ A warning is raised if molecules lack explicit hydrogen atoms, since this may affect fingerprint values.
from rdkit.Chem import AllChem
mols_3d = [Chem.AddHs(mol) for mol in mols]
_ = [AllChem.EmbedMolecule(mol) for mol in mols_3d]
jcm = JCompoundMapper('RAD3D')
print(jcm.calculate(mols_3d))
Advanced fingerprint parameters
Each fingerprint ships with sensible defaults (search depth, distance cutoff, stretch factor, atom typing scheme and aromaticity flag). Custom parameters can be supplied via FpParamType:
from jcompoundmapper_pywrapper import DEFAULT_FP_PARAMETERS
custom_ecfp_params = DEFAULT_FP_PARAMETERS['ECFP']
custom_ecfp_params.depth = 6
jcm = JCompoundMapper('ECFP', custom_ecfp_params)
print(jcm.calculate(mols))
⚡ Parallel processing
Speed things up by spreading molecules across several CPU cores. Each worker runs its own single-core-pinned JVM, so parallelism comes purely from the number of processes spawned — not from oversubscribing the host:
jcm = JCompoundMapper('ECFP')
print(jcm.calculate(mols, njobs=8))
By default, molecules are auto-balanced evenly across njobs workers (chunksize=None), which minimizes JVM startup overhead while keeping every worker busy — the fastest setting for most workloads. A fixed chunksize can be provided instead if finer control is needed.
📄 License
This project is licensed under the MIT License - see the LICENSE file for details.
📚 API Documentation
def calculate(mols, nbits=1024, show_banner=True, njobs=1, chunksize=None):
Calculates jCompoundMapper molecular fingerprints. Installs a matching JRE on first use if none is found.
Parameters
- mols : Iterable[Chem.Mol] RDKit molecule objects for which to obtain jCompoundMapper fingerprints.
- nbits : int
Size of the fingerprints. Ignored for
MACCS, which is always 166 bits. - show_banner : bool Displays default notice about jCompoundMapper.
- njobs : int
Number of concurrent processes used to calculate fingerprints in parallel; must not exceed the
number of available CPU cores. Each spawned Java process is pinned to a single core
(
-XX:ActiveProcessorCount=1), since parallelism comes from spawningnjobsOS processes rather than from letting each JVM oversubscribe the host's full core count. - chunksize : int | None
Number of molecules processed per worker process. If
None(default), molecules are auto-balanced across allnjobsworkers so every worker gets work. Ignored ifnjobsis 1. - return_type : pd.DataFrame Pandas DataFrame containing jCompoundMapper fingerprint values, one row per molecule.
JCompoundMapper(fingerprint='DFS', params=None)
Wrapper to obtain a single type of molecular fingerprint from jCompoundMapper.
Parameters
- fingerprint : str | Fingerprint
Name of the fingerprint to calculate, either as a string or a
Fingerprintenum member. - params : FpParamType | None
Custom fingerprint parameters. If
None(default), the fingerprint's entry inDEFAULT_FP_PARAMETERSis used.
FpParamType(depth, dist_cutoff, stretch_factor, atom_type, arom_flag)
Parameter set of a jCompoundMapper fingerprint.
Attributes
- depth : int | None
Search depth; only meaningful for 2D fingerprints (
DFS,ASP,AP2D,AT2D,CATS2D,PHAP2POINT2D,PHAP3POINT2D,ECFP,ECFPVariant,LSTAR,SHED,RAD2D,MACCS). - dist_cutoff : float | None
Distance cutoff; only meaningful for 3D fingerprints (
AP3D,AT3D,CATS3D,PHAP2POINT3D,PHAP3POINT3D,RAD3D). - stretch_factor : float | None Stretch factor; only meaningful for 3D fingerprints.
- atom_type : AtomType Atom typing scheme used to seed the fingerprint.
- arom_flag : bool
Whether aromaticity perception is used. Default:
False.
Metadata
Release files for jcompoundmapper-pywrapper 0.1.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| jcompoundmapper_pywrapper-0.1.0.tar.gz | 16.8 MB | Without provenance | Details for jcompoundmapper_pywrapper-0.1.0.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| jcompoundmapper_pywrapper-0.1.0-py3-none-any.whl | Python 3 | none | any | Details for jcompoundmapper_pywrapper-0.1.0-py3-none-any.whl |
Total release size: 33.7 MB
Release files / jcompoundmapper_pywrapper-0.1.0.tar.gz
| Download URL | jcompoundmapper_pywrapper-0.1.0.tar.gz |
|---|---|
| Size | 16.8 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a7b1b4193f204b9ec87db082912c8ffff355ec5179ad70ee1acbe38d0782cf7a
|
|
BLAKE2b-256 checksum How to use checksums |
f1de004549d99754a7bbdc91341b71bbe9ddf2046ea14ae3e7f9c03455685ca9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.3
|
Release files / jcompoundmapper_pywrapper-0.1.0-py3-none-any.whl
| Download URL | jcompoundmapper_pywrapper-0.1.0-py3-none-any.whl |
|---|---|
| Size | 16.8 MB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2c7658f40e9a8947554ea8f726133ea3ee806d91020c2d7520b52317ebe3caf6
|
|
BLAKE2b-256 checksum How to use checksums |
ce27156368cb30dfe8f37ca56159b37d8d6fe6405216c40c578f804e72a989c5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.3
|
Security for jcompoundmapper-pywrapper 0.1.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.