A pharmacophore fingerprint records the three-dimensional arrangement of binding features a molecule can present, so two compounds from completely different scaffolds can be compared on the thing a protein actually reads. That encoding is the 10,549-pharmacophore three-point PharmPrint™, and comparing two of them is PharmSim™.
Its cost has never been the fingerprint. Almost all of it is generating the conformer ensemble; the bit calculation itself is a small fraction. PharmCast is a model that predicts the complete fingerprint directly from a SMILES string, removing the conformational stage rather than accelerating it. That is why the speed-up is of a different order to what optimization normally buys.
The fingerprint
A fixed geometric vocabulary, not a substructural one
Every pharmacophore in the scheme is a triangle of three typed features at three measured distances. Enumerate every combination of feature types and distance ranges and you get a fixed vocabulary of possible triangles. Each one is a bit. A molecule sets the bit for every triangle it can actually form.
Because the vocabulary is geometric rather than substructural, two molecules with nothing in common on paper can score highly against each other if they present their features in the same places. That is exactly the comparison a scaffold hop needs, and it is not what a two-dimensional fingerprint measures.
What PharmCast predicts
PharmCast reads a canonical SMILES and predicts all 10,549 pharmacophores, one output each. It was trained on ensemble fingerprints, the bitwise OR of 100 conformers per molecule, so what it reproduces is the ensemble fingerprint and the similarity between two of them. The output is the standard native format: the same 330 unsigned 32-bit words the real calculation emits, in the same bit convention, so existing PharmSim tooling consumes it unchanged.
Input
- Structure
- Canonical SMILES
- Features
- 2,048-bit Morgan radius 2, plus 11 descriptors
Output
- Fingerprint
- 10,549 pharmacophores, stored as 330 × uint32
- Format
- Native
.pfp, byte-identical convention
Accuracy
Measured on molecules the model has never seen
| Regime | Median error | Correlation r | Pairwise ranking |
|---|---|---|---|
| Catalog chemistry | 0.008 | 0.980 | 94% |
| Loop peptides, reserved test set | 0.016 | 0.984 | 95% |
| Large compounds, above 600 Da | 0.040 | 0.938 | 83% |
| The real calculation against itself | 0.006 | 0.995 | ceiling |
That last row is the one that sets the scale. Rebuilding the same molecules with a different embedding seed reproduces pair similarity to 0.006 at r 0.995, so the reference calculation agrees with itself an order of magnitude more tightly than PharmCast agrees with it. The ground truth is not the problem, and 0.006 is the floor no surrogate can beat.
Where it holds, and where it does not
PharmCast is calibrated for catalog-like chemistry up to about 600 Da, activity-backed ChEMBL chemistry from 142 to 1000 Da, and peptides above that. Outside those ranges it is extrapolating, and the error profile above shows what that costs.
The reason is in the training set. The screening collection is filtered at 600 Da on ingest, so it contributes nothing above that line by construction. What the model sees above it comes from the activity-backed ChEMBL set, which spans 142 to 1000 Da, and from the peptide set. That is why ChEMBL is the population where error is highest, and why error rises with mass: coverage above 600 Da is thinner than below it.
| Source set | Molecules fingerprinted at the version 10 snapshot |
|---|---|
| Screening collection | 4,609,488 |
| ChEMBL | 1,214,214 |
| Loop peptides | 136,494 |
| All three | 5,960,196 |
What it is trained on
Every molecule fingerprinted with the real calculation, not a shortcut
The screening collection
The source is the June 2026 release of the Enamine screening collection, which currently states 4,774,670 compounds. These are real, orderable material: compounds synthesized and held in stock, quality controlled to at least 90% purity, not a virtual enumeration. Enamine's much larger combinatorial spaces are not included.
Property filters on ingest keep compounds up to 600 Da, at most 10 rotatable bonds and no more than one Lipinski violation; 4,612,044 survive. That filtered set is the index PharmCast draws from, and it is being fingerprinted continuously with the real 100-conformer calculation. PharmCast draws on the 4,609,488 fingerprinted at the time of the frozen snapshot. The 600 Da filter is applied here, on ingest, which is precisely why the collection contributes no catalog chemistry above that line; what the model sees above it comes from the ChEMBL and peptide sets.
| Property | 5th pct | Median | 95th pct |
|---|---|---|---|
| Molecular weight | 255 | 344 | 465 |
| cLogP | 0.7 | 2.7 | 4.7 |
| Fraction sp3 carbon | 0.09 | 0.35 | 0.71 |
This is a lead-like library rather than a fragment or biologics-adjacent one. The median compound weighs 344, carries three rings of which two are aromatic, five rotatable bonds, and sits at cLogP 2.7. Only 8% carry defined stereochemistry, so the collection is predominantly flat, achiral scaffolding decorated with substituents.
Wide in frameworks, deep in analogs
Two measurements of the same collection pull in opposite directions, and both are true. Reduced to Bemis-Murcko scaffolds it is broad: 679 distinct frameworks per thousand molecules, 88% of them appearing exactly once, and the ten commonest together account for only 4.0%. But compared whole-molecule against whole-molecule (exhaustively, all 4,612,044 against each other with no sampling), it is dense.
The resolution is that the collection is wide in frameworks and deep in analogs around them: many scaffolds, each decorated many times over with closely related substituents. That has a direct consequence for how any model on this data must be evaluated: a random split places near-identical analogs on both sides and reports an optimistic number.
All of it is 2D structural similarity. Two compounds that look alike on paper can present different three-dimensional pharmacophores, and two that look unrelated can present similar ones. It describes the catalog, not what the molecules do, which is the entire reason the 3D fingerprint exists.
The peptide set, and why it is not just more molecules
An RCSB query at 2.5 Å resolution or better with R-free at or below 0.22 returned 71,018 entries, of which 69,450 yielded usable fragments: 1,524,535 loop instances across 135,408 chains, collapsing to 117,741 distinct sequences and 133,136 distinct capped molecules. Loops are runs of two to six residues lying between annotated secondary structure, read from the helix and strand records in the mmCIF itself rather than re-derived.
Each fragment is capped with its real flanking atoms (an acetyl built from the preceding residue, an N-methylamide from the following one), so it never presents a free amine and acid the protein does not have. Backbone continuity is enforced by requiring the carbon-to-nitrogen distance between consecutive residues to fall between 1.0 and 2.0 Å rather than trusting residue numbering, which rejected 54,520 candidates that numbering alone would have accepted.
Ensemble enhancement is the novel step. Each distinct peptide gets one fingerprint that ORs together every rigid crystallographic conformation actually observed for it in the PDB with 100 computed conformers, generated exactly as for the screening collection. The conformer count therefore runs above 100, and the fingerprint carries both what nature was caught doing and what the molecule can do.
Repeats are kept rather than deduplicated, and the reason is measurable. Across 1,500 sequences seen in three or more entries, the median agreement between observations of the same sequence is 0.878, but 18% fall below 0.70, carrying genuinely different pharmacophores from one crystal structure to the next, and only 19% are near copies. Collapsing them to one representative would throw that away.
The same fingerprints read a drug back to a peptide. We PharmCasted the co-complexed ligands of the RCSB against the peptide loops extracted from the RCSB for PharmCast training, every ligand with a measured potency against all 3,368,420 capped peptides of one to five residues, with PharmCast on both sides. This identified overlaps between small molecule ligands and peptides, which is our reverse peptide mimetic project. 25 of the 38 closest peptides occur as complete loops in real protein structures. The clearest is nirmatrelvir, the Paxlovid active ingredient and a designed peptidomimetic: its closest peptide, AMVP, reaches a pharmacophore Tanimoto of 0.913 against a Morgan similarity of 0.167, and the loop AMVPN, taken from its own crystal structure exactly as deposited, is shown here superposed on the drug.
Model card
- Release
- PharmCast version 10, trained 1 September 2026
- Architecture
- Feedforward network, 2,059 inputs to one sigmoid output per pharmacophore; 8,045,877 parameters
- Training
- 5,887,229 molecules for gradient updates, from a frozen snapshot of 5,946,696: 4,609,488 screening collection, 1,214,214 activity-backed ChEMBL, 122,994 loop peptides; the released weights are the epoch-68 ones restored
- Holdout
- 59,467 molecules, 1% stratified by molecular weight, used for early stopping only
- Median per-molecule MCC
- 0.914 on the reserved peptide test set
- Naming
- Screening collection, ChEMBL, Peptides. The letters name the source sets, not the version.
Measured on molecules the model never trained on. The peptide row is the reserved test set of 13,500 loops held out by construction; the other two are every molecule fingerprinted after the training set was frozen:
| Population | Median error | Pearson r | Within 0.05 |
|---|---|---|---|
| Loop peptides, reserved test set | 0.016 | 0.984 | 88% |
| ChEMBL, activity backed | 0.027 | 0.936 | 75% |
| Catalog chemistry | 0.008 | 0.980 | 89% |
| The real calculation against itself | 0.006 | 0.995 | ceiling |
Get the model
Weights and code, both Apache-2.0
Download PharmCast version 10, 32,887,857 bytes, Apache-2.0, published with its SHA-256.
You do not need the weights to use the model: fingerprint a molecule or compare two here, and it runs on this site.
The code is available now. It is pure Python over NumPy, PyTorch and RDKit,
and runs on Apple Silicon, Intel macOS, Windows and Linux alike. CPU only, an
8-million-parameter network gains nothing from a GPU. words_batch is
the API that matters: the model earns its speed in a batch, and a single call is
dominated by featurization overhead.
from pharmcast import PharmCast, pharmtan, pharmsim
pc = PharmCast.load("pharmcast_scp_v10.pt")
a, b = pc.words_batch(["CC(=O)Oc1ccccc1C(=O)O", "OC(=O)c1ccccc1O"])
pharmtan(a, b) # 0.358, the PharmSim coefficient
pharmsim(a, b) # ...with the shared and exclusive bit sets shown
Citation
Muskal, S. M. and McGregor, M. J. PharmCast: rapid generation of three-dimensional pharmacophore fingerprints from two-dimensional structure without conformer generation. bioRxiv, 2026. doi: 10.64898/2026.09.02.748999
Steven M. Muskal1, Malcolm J. McGregor2
1Eidogen-Sertanty, Inc.
2SRI International, 333 Ravenswood Avenue, Menlo Park, CA 94025, USA
Correspondence: smuskal@eidogen-sertanty.com
The method it builds on:
McGregor, M. J. and Muskal, S. M.
Pharmacophore fingerprinting. 1.
Application to QSAR and focused library design.
J. Chem. Inf. Comput. Sci. 1999.
McGregor, M. J. and Muskal, S. M.
Pharmacophore fingerprinting. 2.
Application to primary library design.
J. Chem. Inf. Comput. Sci. 2000.
Talk to us
Applications, licensing, early access to the weights