Skill Tracer
Skills › Scientific Agent Skills › medchem › rules_catalog.md

rules_catalog.md

333 lines · skills/medchem/references/rules_catalog.md at 5f2bc03

Open on GitHub
1# Medchem Rules and Filters Catalog
2
3Catalog of medicinal chemistry rules, alert sets, and filters in **medchem 2.1.1** (reviewed 2026-10-01).
4
5Thresholds below describe the **implemented functions**, which can differ from simplified literature summaries. See [versioned basic-rule source](https://github.com/datamol-io/medchem/blob/2.1.1/medchem/rules/basic_rules.py) and [official API](https://medchem-docs.datamol.io/stable/api/medchem.rules.html). Examples assume valid `mol`/`mols` supplied by the caller.
6

Medchem Rules and Filters Catalog

Catalog of medicinal chemistry rules, alert sets, and filters in medchem 2.1.1 (reviewed 2026-10-01).

Thresholds below describe the implemented functions, which can differ from simplified literature summaries. See versioned basic-rule source and official API. Examples assume valid mol/mols supplied by the caller.

Raw lines 1 to 6
7## Table of Contents
8
91. [Drug-Likeness Rules](#drug-likeness-rules)
102. [Lead-Likeness Rules](#lead-likeness-rules)
113. [Fragment Rules](#fragment-rules)
124. [CNS and Target-Class Rules](#cns-and-target-class-rules)
135. [Structural Alert Filters](#structural-alert-filters)
146. [Named Catalogs](#named-catalogs)
157. [Complexity Metrics](#complexity-metrics)
168. [Chemical Group Collections](#chemical-group-collections)
179. [Filter Selection Guidelines](#filter-selection-guidelines)
19---

Table of Contents

  1. Drug-Likeness Rules
  2. Lead-Likeness Rules
  3. Fragment Rules
  4. CNS and Target-Class Rules
  5. Structural Alert Filters
  6. Named Catalogs
  7. Complexity Metrics
  8. Chemical Group Collections
  9. Filter Selection Guidelines

Raw lines 7 to 20
21## Drug-Likeness Rules

Drug-Likeness Rules

Raw lines 21 to 22
23### Rule of Five (Lipinski)
25**Reference:** Lipinski et al., *Adv Drug Deliv Rev* (1997) 23:3–25
27**Criteria:** MW ≤ 500, LogP ≤ 5, HBD ≤ 5, HBA ≤ 10
29```python
30mc.rules.basic_rules.rule_of_five(mol)
31# or
32mc.rules.RuleFilters(rule_list=["rule_of_five"])
33```

Rule of Five (Lipinski)

Reference: Lipinski et al., Adv Drug Deliv Rev (1997) 23:3–25

Criteria: MW ≤ 500, LogP ≤ 5, HBD ≤ 5, HBA ≤ 10

mc.rules.basic_rules.rule_of_five(mol)
# or
mc.rules.RuleFilters(rule_list=["rule_of_five"])
Raw lines 23 to 34
35### Rule of Five Beyond
37**Reference:** Doak et al., (2015) — compounds beyond Ro5 for large binding sites
39**Criteria:** MW ≤ 1000, LogP ∈ [-2, 10], HBD ≤ 6, HBA ≤ 15, TPSA ≤ 250, rotatable bonds ≤ 20
41```python
42mc.rules.basic_rules.rule_of_five_beyond(mol)
43```

Rule of Five Beyond

Reference: Doak et al., (2015) — compounds beyond Ro5 for large binding sites

Criteria: MW ≤ 1000, LogP ∈ [-2, 10], HBD ≤ 6, HBA ≤ 15, TPSA ≤ 250, rotatable bonds ≤ 20

mc.rules.basic_rules.rule_of_five_beyond(mol)
Raw lines 35 to 44
45### Rule of Veber
47**Reference:** Veber et al., *J Med Chem* (2002) 45:2615–2623
49**Criteria:** Rotatable bonds ≤ 10, TPSA ≤ 140 Ų
51```python
52mc.rules.basic_rules.rule_of_veber(mol)
53```

Rule of Veber

Reference: Veber et al., J Med Chem (2002) 45:2615–2623

Criteria: Rotatable bonds ≤ 10, TPSA ≤ 140 Ų

mc.rules.basic_rules.rule_of_veber(mol)
Raw lines 45 to 54
55### REOS (Rapid Elimination Of Swill)
57**Implementation reference:** [Walters & Namchuk (2003), Designing screens: how to make your hits a hit](https://pubmed.ncbi.nlm.nih.gov/12669025/).
59**Implemented criteria:** MW 200–500, cLogP −5 to 5, HBD 0–5, HBA 0–10, rotatable bonds 0–8, heavy atoms 15–50 (inclusive). The implementation computes formal charge but does not constrain it, despite the docstring advertising −2 to 2. Add an explicit charge bound when needed.
61```python
62mc.rules.basic_rules.rule_of_reos(mol)
63```

REOS (Rapid Elimination Of Swill)

Implementation reference: Walters & Namchuk (2003), Designing screens: how to make your hits a hit.

Implemented criteria: MW 200–500, cLogP −5 to 5, HBD 0–5, HBA 0–10, rotatable bonds 0–8, heavy atoms 15–50 (inclusive). The implementation computes formal charge but does not constrain it, despite the docstring advertising −2 to 2. Add an explicit charge bound when needed.

mc.rules.basic_rules.rule_of_reos(mol)
Raw lines 55 to 64
65### Egan, Ghose, Pfizer, GSK, Xu
67Additional literature filters available as `rule_of_egan`, `rule_of_ghose`, `rule_of_pfizer_3_75`, `rule_of_gsk_4_400`, `rule_of_xu`.

Egan, Ghose, Pfizer, GSK, Xu

Additional literature filters available as rule_of_egan, rule_of_ghose, rule_of_pfizer_3_75, rule_of_gsk_4_400, rule_of_xu.

Raw lines 65 to 68
69### Rule of Druglike (Soft)
71Combined soft drug-likeness criteria:
73```python
74mc.rules.basic_rules.rule_of_druglike_soft(mol)
75```
77---

Rule of Druglike (Soft)

Combined soft drug-likeness criteria:

mc.rules.basic_rules.rule_of_druglike_soft(mol)

Raw lines 69 to 78
79## Lead-Likeness Rules

Lead-Likeness Rules

Raw lines 79 to 80
81### Rule of Oprea
83**Implementation reference:** [Oprea (2000), Property distribution of drug-related chemical databases](https://pubmed.ncbi.nlm.nih.gov/10756480/).
85**Implemented criteria:** HBD 0–2, HBA 2–9, rotatable bonds 2–8, rings 1–4 (inclusive). This function does not constrain MW or cLogP; add explicit bounds if the project needs them.
87```python
88mc.rules.basic_rules.rule_of_oprea(mol)
89```

Rule of Oprea

Implementation reference: Oprea (2000), Property distribution of drug-related chemical databases.

Implemented criteria: HBD 0–2, HBA 2–9, rotatable bonds 2–8, rings 1–4 (inclusive). This function does not constrain MW or cLogP; add explicit bounds if the project needs them.

mc.rules.basic_rules.rule_of_oprea(mol)
Raw lines 81 to 90
91### Rule of Leadlike (Soft)
93**Implemented criteria:** MW 150–400, cLogP −3 to 4, HBD ≤4, HBA ≤7, TPSA ≤160 Ų, rotatable bonds ≤9, rigid bonds ≤30, rings ≤4, maximum ring-system size ≤18, carbons 3–35, heteroatoms 1–15, heteroatom/carbon ratio 0.1–1.1, formal charge −4 to 4, charged atoms ≤4, stereocenters ≤2.
95```python
96mc.rules.basic_rules.rule_of_leadlike_soft(mol)
97```
99---

Rule of Leadlike (Soft)

Implemented criteria: MW 150–400, cLogP −3 to 4, HBD ≤4, HBA ≤7, TPSA ≤160 Ų, rotatable bonds ≤9, rigid bonds ≤30, rings ≤4, maximum ring-system size ≤18, carbons 3–35, heteroatoms 1–15, heteroatom/carbon ratio 0.1–1.1, formal charge −4 to 4, charged atoms ≤4, stereocenters ≤2.

mc.rules.basic_rules.rule_of_leadlike_soft(mol)

Raw lines 91 to 100
101## Fragment Rules

Fragment Rules

Raw lines 101 to 102
103### Rule of Three
105**Reference:** Congreve et al., *Drug Discov Today* (2003) 8:876–877
107**Implemented criteria:** MW ≤300, cLogP ≤3, HBD ≤3, HBA ≤3, rotatable bonds ≤3. There is no TPSA bound in `rule_of_three`. `rule_of_three_extended` adds TPSA ≤60 Ų and cLogP ≥−3 but permits HBA ≤6; it is not simply the base rule plus TPSA.
109```python
110mc.rules.basic_rules.rule_of_three(mol)
111```
113Also available: `rule_of_three_extended` and `rule_of_two`. `rule_of_four` instead selects larger, lipophilic PPI-inhibitor space (MW ≥400, cLogP ≥4, rings ≥4, HBA ≥4); it is not a fragment filter.
115---

Rule of Three

Reference: Congreve et al., Drug Discov Today (2003) 8:876–877

Implemented criteria: MW ≤300, cLogP ≤3, HBD ≤3, HBA ≤3, rotatable bonds ≤3. There is no TPSA bound in rule_of_three. rule_of_three_extended adds TPSA ≤60 Ų and cLogP ≥−3 but permits HBA ≤6; it is not simply the base rule plus TPSA.

mc.rules.basic_rules.rule_of_three(mol)

Also available: rule_of_three_extended and rule_of_two. rule_of_four instead selects larger, lipophilic PPI-inhibitor space (MW ≥400, cLogP ≥4, rings ≥4, HBA ≥4); it is not a fragment filter.


Raw lines 103 to 116
117## CNS and Target-Class Rules

CNS and Target-Class Rules

Raw lines 117 to 118
119### Rule of CNS
121**Implemented criteria:** MW 135–582, cLogP −0.2 to 6.1, TPSA 3–118 Ų, HBD ≤3, HBA ≤5. These are inclusive heuristic bounds, not evidence of blood-brain barrier penetration.
123```python
124mc.rules.basic_rules.rule_of_cns(mol)
125```

Rule of CNS

Implemented criteria: MW 135–582, cLogP −0.2 to 6.1, TPSA 3–118 Ų, HBD ≤3, HBA ≤5. These are inclusive heuristic bounds, not evidence of blood-brain barrier penetration.

mc.rules.basic_rules.rule_of_cns(mol)
Raw lines 119 to 126
127### Rule of Respiratory
129Target-class filter for respiratory drugs:
131```python
132mc.rules.basic_rules.rule_of_respiratory(mol)
133```

Rule of Respiratory

Target-class filter for respiratory drugs:

mc.rules.basic_rules.rule_of_respiratory(mol)
Raw lines 127 to 134
135### Generative Design Rules
137For ML-generated molecules:
139```python
140mc.rules.basic_rules.rule_of_generative_design(mol)
141mc.rules.basic_rules.rule_of_generative_design_strict(mol)
142```
144---

Generative Design Rules

For ML-generated molecules:

mc.rules.basic_rules.rule_of_generative_design(mol)
mc.rules.basic_rules.rule_of_generative_design_strict(mol)

Raw lines 135 to 145
146## Structural Alert Filters

Structural Alert Filters

Raw lines 146 to 147
148### PAINS (Pan Assay INterference compoundS)
150**Reference:** Baell & Holloway, *J Med Chem* (2010) 53:2719–2740
152Apply via named catalog — not a `basic_rules` function:
154```python
155mc.functional.catalog_filter(mols, catalogs=["pains"], n_jobs=-1)
156# or query: NOT HASALERT("pains")
157```
159Sub-catalogs: `pains_a`, `pains_b`, `pains_c`.

PAINS (Pan Assay INterference compoundS)

Reference: Baell & Holloway, J Med Chem (2010) 53:2719–2740

Apply via named catalog — not a basic_rules function:

mc.functional.catalog_filter(mols, catalogs=["pains"], n_jobs=-1)
# or query: NOT HASALERT("pains")

Sub-catalogs: pains_a, pains_b, pains_c.

Raw lines 148 to 160
161### Common Alerts Filters
163ChEMBL-curated rule sets (Glaxo, Dundee, BMS, MLSMR, etc.):
165```python
166alert_filter = mc.structural.CommonAlertsFilters(alerts_set=["BMS", "Dundee", "Glaxo"])
167df = alert_filter(mols=mol_list, n_jobs=-1)
168# current common-alert status: exclude | ok
169```

Common Alerts Filters

ChEMBL-curated rule sets (Glaxo, Dundee, BMS, MLSMR, etc.):

alert_filter = mc.structural.CommonAlertsFilters(alerts_set=["BMS", "Dundee", "Glaxo"])
df = alert_filter(mols=mol_list, n_jobs=-1)
# current common-alert status: exclude | ok
Raw lines 161 to 170
171### NIBR Filters
173Novartis screening-deck curation ([Schuffenhauer et al., 2020](https://dx.doi.org/10.1021/acs.jmedchem.0c01332)):
175```python
176nibr_filter = mc.structural.NIBRFilters()
177df = nibr_filter(mols=mol_list, n_jobs=-1)
178# class rejects explicit exclusion alerts; also apply accumulated severity cutoff
179passes = df["pass_filter"] & (df["severity"] < 10)
180```
182Or via functional API with `max_severity=10`.

NIBR Filters

Novartis screening-deck curation (Schuffenhauer et al., 2020):

nibr_filter = mc.structural.NIBRFilters()
df = nibr_filter(mols=mol_list, n_jobs=-1)
# class rejects explicit exclusion alerts; also apply accumulated severity cutoff
passes = df["pass_filter"] & (df["severity"] < 10)

Or via functional API with max_severity=10.

Raw lines 171 to 183
184### Lilly Demerits (optional)
186Install native upstream tools with `medchem install-lilly`; requires C++/make/zlib/Ruby and network access for installation. The native integration uses upstream 2.1 rules and was not executed locally. The wrapper requires native `pass_filter=True` and either a missing score or a score strictly below `max_demerits=160` (a score of 160 fails). Native hard-rejection and atom-count rules also apply.
188```python
189mc.functional.lilly_demerit_filter(mols, max_demerits=160, n_jobs=-1)
190```
192---

Lilly Demerits (optional)

Install native upstream tools with medchem install-lilly; requires C++/make/zlib/Ruby and network access for installation. The native integration uses upstream 2.1 rules and was not executed locally. The wrapper requires native pass_filter=True and either a missing score or a score strictly below max_demerits=160 (a score of 160 fails). Native hard-rejection and atom-count rules also apply.

mc.functional.lilly_demerit_filter(mols, max_demerits=160, n_jobs=-1)

Raw lines 184 to 193
194## Named Catalogs
196Available via `mc.catalogs.list_named_catalogs()` and `NamedCatalogs` static methods:
198| Catalog | Purpose |
199|---------|---------|
200| `pains`, `pains_a/b/c` | PAINS substructure filters |
201| `brenk` | Unwanted functional groups |
202| `nih` | NIH screening filters |
203| `zinc` | ZINC structural filters |
204| `glaxo`, `dundee`, `bms` | Pharma-derived alert sets |
205| `mlsmr`, `inpharmatica`, `lint` | Additional screening sets |
206| `nibr` | NIBR catalog (substructure) |
207| `bredt` | Bredt rule violations (unstable structures) |
208| `tox`, `toxicophore`, `carcinogen` | Toxicity patterns |
209| `reactive_unstable_toxic` | Reactive/unstable groups |
210| `unstable_graph` | Unstable molecular graphs |
212```python
213cat = mc.catalogs.NamedCatalogs.brenk()
214passes = mc.functional.catalog_filter(mols, catalogs=[cat], n_jobs=-1)
215```
217---

Named Catalogs

Available via mc.catalogs.list_named_catalogs() and NamedCatalogs static methods:

CatalogPurpose
pains, pains_a/b/cPAINS substructure filters
brenkUnwanted functional groups
nihNIH screening filters
zincZINC structural filters
glaxo, dundee, bmsPharma-derived alert sets
mlsmr, inpharmatica, lintAdditional screening sets
nibrNIBR catalog (substructure)
bredtBredt rule violations (unstable structures)
tox, toxicophore, carcinogenToxicity patterns
reactive_unstable_toxicReactive/unstable groups
unstable_graphUnstable molecular graphs
cat = mc.catalogs.NamedCatalogs.brenk()
passes = mc.functional.catalog_filter(mols, catalogs=[cat], n_jobs=-1)

Raw lines 194 to 218
219## Complexity Metrics
221Compared to ZINC-15 percentile thresholds via `ComplexityFilter` or `complexity_filter()`:
223| Metric | Description |
224|--------|-------------|
225| `bertz` | Bertz molecular complexity |
226| `sas` | Synthetic accessibility score |
227| `qed` | Quantitative Estimate of Drug-likeness |
228| `clogp` | Calculated LogP |
229| `whitlock` | Whitlock CT (rings, unsaturation, heteroatoms, chirality) |
230| `barone` | Barone complexity |
231| `smcm` | Synthetic complexity metric |
232| `twc` | Total walk count |
234```python
235mc.functional.complexity_filter(mols, complexity_metric="bertz", limit="99", n_jobs=-1)
236```
238`limit="99"` uses a strict upper threshold in the molecule's molecular-weight bin. Available ZINC-15 labels are `median`, `90`, `99`, `999` (99.9%), and `max`; `95` is invalid. QED is also compared with an upper cutoff, so this is not a high-QED selector. Scores that are NaN pass upstream; check finiteness if applicable. The new `mc.complexity.SPS(mol)` computes normalized SpacialScore; filtering with `spacialscore` requires custom threshold statistics.
240---

Complexity Metrics

Compared to ZINC-15 percentile thresholds via ComplexityFilter or complexity_filter():

MetricDescription
bertzBertz molecular complexity
sasSynthetic accessibility score
qedQuantitative Estimate of Drug-likeness
clogpCalculated LogP
whitlockWhitlock CT (rings, unsaturation, heteroatoms, chirality)
baroneBarone complexity
smcmSynthetic complexity metric
twcTotal walk count
mc.functional.complexity_filter(mols, complexity_metric="bertz", limit="99", n_jobs=-1)

limit="99" uses a strict upper threshold in the molecule's molecular-weight bin. Available ZINC-15 labels are median, 90, 99, 999 (99.9%), and max; 95 is invalid. QED is also compared with an upper cutoff, so this is not a high-QED selector. Scores that are NaN pass upstream; check finiteness if applicable. The new mc.complexity.SPS(mol) computes normalized SpacialScore; filtering with spacialscore requires custom threshold statistics.


Raw lines 219 to 241
242## Chemical Group Collections
244Browse with `mc.groups.list_default_chemical_groups()`:
246| Group | Application |
247|-------|-------------|
248| `privileged_scaffolds` | Common drug scaffolds |
249| `common_warhead_covalent_inhibitors` | Covalent warhead patterns |
250| `electrophilic_warheads_for_kinases` | Kinase covalent motifs |
251| `rings_in_drugs` | Ring systems in approved drugs |
252| `phase_2_hetereocyclic_rings` | Phase 2 heterocycles |
253| `common_monomer_repeating_units` | Polymer/repeating units |
254| `emerging_perfluoroalkyls` | PFAS-related patterns |
256```python
257group = mc.groups.ChemicalGroup(groups=["privileged_scaffolds"])
258group.has_match(mol)
259```
261Custom groups: provide a CSV via `groups_db` with both `smiles` and `smarts`, plus `name` and `group`. SMILES/SMARTS and exact-match settings can yield different answers. `ChemicalGroup.filter(names)` narrows pattern names in place; `get_matches(mol)` returns a DataFrame. Query `HASGROUP` requires an individual functional-group name, not one of these collection names.
263---

Chemical Group Collections

Browse with mc.groups.list_default_chemical_groups():

GroupApplication
privileged_scaffoldsCommon drug scaffolds
common_warhead_covalent_inhibitorsCovalent warhead patterns
electrophilic_warheads_for_kinasesKinase covalent motifs
rings_in_drugsRing systems in approved drugs
phase_2_hetereocyclic_ringsPhase 2 heterocycles
common_monomer_repeating_unitsPolymer/repeating units
emerging_perfluoroalkylsPFAS-related patterns
group = mc.groups.ChemicalGroup(groups=["privileged_scaffolds"])
group.has_match(mol)

Custom groups: provide a CSV via groups_db with both smiles and smarts, plus name and group. SMILES/SMARTS and exact-match settings can yield different answers. ChemicalGroup.filter(names) narrows pattern names in place; get_matches(mol) returns a DataFrame. Query HASGROUP requires an individual functional-group name, not one of these collection names.


Raw lines 242 to 264
265## Filter Selection Guidelines

Filter Selection Guidelines

Raw lines 265 to 266
267### Initial Screening (HTS deck)
269```python
270qf = mc.query.QueryFilter('MATCHRULE("rule_of_five") AND NOT HASALERT("pains")')
271mask = qf(mols=mol_list, n_jobs=-1)
272```

Initial Screening (HTS deck)

qf = mc.query.QueryFilter('MATCHRULE("rule_of_five") AND NOT HASALERT("pains")')
mask = qf(mols=mol_list, n_jobs=-1)
Raw lines 267 to 273
274### Hit-to-Lead
276```python
277rules = mc.rules.RuleFilters(rule_list=["rule_of_oprea"])(mols, n_jobs=-1)
278nibr = mc.structural.NIBRFilters()(mols, n_jobs=-1)
279```

Hit-to-Lead

rules = mc.rules.RuleFilters(rule_list=["rule_of_oprea"])(mols, n_jobs=-1)
nibr = mc.structural.NIBRFilters()(mols, n_jobs=-1)
Raw lines 274 to 280
281### Lead Optimization
283```python
284rules = mc.rules.RuleFilters(rule_list=["rule_of_druglike_soft"])(mols, n_jobs=-1)
285alerts = mc.structural.CommonAlertsFilters(alerts_set=["BMS", "Dundee", "Glaxo"])(mols, n_jobs=-1)
286complexity = mc.functional.complexity_filter(mols, complexity_metric="bertz", limit="90", n_jobs=-1)
287```

Lead Optimization

rules = mc.rules.RuleFilters(rule_list=["rule_of_druglike_soft"])(mols, n_jobs=-1)
alerts = mc.structural.CommonAlertsFilters(alerts_set=["BMS", "Dundee", "Glaxo"])(mols, n_jobs=-1)
complexity = mc.functional.complexity_filter(mols, complexity_metric="bertz", limit="90", n_jobs=-1)
Raw lines 281 to 288
289### CNS Targets
291```python
292qf = mc.query.QueryFilter('MATCHRULE("rule_of_cns") AND HASPROP("tpsa", <=, 90)')
293mask = qf(mols, n_jobs=-1)
294```

CNS Targets

qf = mc.query.QueryFilter('MATCHRULE("rule_of_cns") AND HASPROP("tpsa", <=, 90)')
mask = qf(mols, n_jobs=-1)
Raw lines 289 to 295
296### Fragment-Based Discovery
298```python
299rules = mc.rules.RuleFilters(rule_list=["rule_of_three"])(mols, n_jobs=-1)
300complexity = mc.functional.complexity_filter(mols, complexity_metric="bertz", limit="90", n_jobs=-1)
301```
303---

Fragment-Based Discovery

rules = mc.rules.RuleFilters(rule_list=["rule_of_three"])(mols, n_jobs=-1)
complexity = mc.functional.complexity_filter(mols, complexity_metric="bertz", limit="90", n_jobs=-1)

Raw lines 296 to 304
305## Important Considerations
307**Filters are guidelines, not absolutes:**
308- Some marketed oral drugs violate Ro5; the fraction depends on the dataset and rule definition
309- Natural products and prodrugs often fail standard rules
310- Passing filters does not establish clinical success, toxicity, permeability, or synthesis feasibility
311- PAINS alerts require assay-specific counter-screens; a motif match alone does not prove interference
312- Record original structures and any salt, protonation, tautomer, or stereochemistry normalization
314**Combine with ML when appropriate:**
316```python
317rules_df = mc.rules.RuleFilters(rule_list=["rule_of_five"])(mols, n_jobs=-1)
318filtered_mols = [m for m, ok in zip(mols, rules_df["pass_all"]) if ok]
319# score filtered_mols with downstream ML model
320```
322---

Important Considerations

Filters are guidelines, not absolutes:

  • Some marketed oral drugs violate Ro5; the fraction depends on the dataset and rule definition
  • Natural products and prodrugs often fail standard rules
  • Passing filters does not establish clinical success, toxicity, permeability, or synthesis feasibility
  • PAINS alerts require assay-specific counter-screens; a motif match alone does not prove interference
  • Record original structures and any salt, protonation, tautomer, or stereochemistry normalization

Combine with ML when appropriate:

rules_df = mc.rules.RuleFilters(rule_list=["rule_of_five"])(mols, n_jobs=-1)
filtered_mols = [m for m, ok in zip(mols, rules_df["pass_all"]) if ok]
# score filtered_mols with downstream ML model

Raw lines 305 to 323
324## References
3261. Lipinski CA et al. *Adv Drug Deliv Rev* (1997) 23:3–25
3272. Veber DF et al. *J Med Chem* (2002) 45:2615–2623
3283. Oprea TI. *J Comput Aided Mol Des* (2000) 14:251–264; https://doi.org/10.1023/a:1008130001697
3294. Congreve M et al. *Drug Discov Today* (2003) 8:876–877
3305. Baell JB & Holloway GA. *J Med Chem* (2010) 53:2719–2740
3316. Walters WP & Namchuk M. (2003), Designing screens: how to make your hits a hit; https://pubmed.ncbi.nlm.nih.gov/12669025/
3327. Schuffenhauer A et al. *J Med Chem* (2020) — NIBR screening deck
3338. Doak BC et al. (2015) — Beyond Rule of Five

References

  1. Lipinski CA et al. Adv Drug Deliv Rev (1997) 23:3–25
  2. Veber DF et al. J Med Chem (2002) 45:2615–2623
  3. Oprea TI. J Comput Aided Mol Des (2000) 14:251–264; https://doi.org/10.1023/a:1008130001697
  4. Congreve M et al. Drug Discov Today (2003) 8:876–877
  5. Baell JB & Holloway GA. J Med Chem (2010) 53:2719–2740
  6. Walters WP & Namchuk M. (2003), Designing screens: how to make your hits a hit; https://pubmed.ncbi.nlm.nih.gov/12669025/
  7. Schuffenhauer A et al. J Med Chem (2020) — NIBR screening deck
  8. Doak BC et al. (2015) — Beyond Rule of Five
Raw lines 324 to 333