Skip to content

Instantly share code, notes, and snippets.

@ptosco
Last active January 18, 2024 01:12
Show Gist options
  • Save ptosco/dc4d27153e6e8e45aed654761e4d7409 to your computer and use it in GitHub Desktop.
Save ptosco/dc4d27153e6e8e45aed654761e4d7409 to your computer and use it in GitHub Desktop.
DistinctMatches
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"from rdkit import Chem\n",
"from rdkit.Chem import rdFMCS, rdDepictor"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"pattern='C~C~C(~C)~C'"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"borneol = Chem.MolFromSmiles(\"O[C@H]1C[C@H]2C([C@@]1(C)CC2)(C)C\")"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"squalene = Chem.MolFromSmiles(\"CC(=CCC/C(=C/CC/C(=C/CC/C=C(/CC/C=C(/CCC=C(C)C)\\C)\\C)/C)/C)C\")"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"sesquiterpene = Chem.MolFromSmiles(\n",
" \"CC(=O)O[C@H]1CC[C@]2([C@H](C1(C)C)CC=C([C@@H]2CC/C(=C/C(=O)O)/C)C)C\")"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [],
"source": [
"triterpene = Chem.MolFromSmiles(\n",
" \"OCC12CCC(C2C2C(CC1)(C)C1(C)CCC3C(C1CC2)(C)CCC(C3(C)C)O)C(=C)C\")"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [],
"source": [
"pat = Chem.MolFromSmiles(pattern)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<rdkit.Chem.rdchem.Mol at 0x7f98e72d7990>"
]
},
"execution_count": 8,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pat"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"def get_distinct_matches(mol, pat):\n",
" class Attempt:\n",
" def __init__(self, cand_list, distinct_matches_set):\n",
" self.cand_list = cand_list\n",
" self.distinct_matches_set = distinct_matches_set\n",
" self.placed_idx_set = set(sum([list(i) for i in self.distinct_matches_set], []))\n",
"\n",
" matches_uniquified = mol.GetSubstructMatches(pat, uniquify=True)\n",
" if (len(matches_uniquified) < 2):\n",
" return matches_uniquified\n",
" matches_idx_set = set(sum([list(m) for m in matches_uniquified], []))\n",
" degree = [0]*mol.GetNumAtoms()\n",
" for b in mol.GetBonds():\n",
" bi = b.GetBeginAtomIdx()\n",
" ei = b.GetEndAtomIdx()\n",
" if (bi in matches_idx_set and ei in matches_idx_set):\n",
" degree[bi] += 1\n",
" degree[ei] += 1\n",
" matches_uniquified_sorted = sorted([(sum([degree[i] for i in m]),\n",
" frozenset(m)) for m in matches_uniquified])\n",
" max_distinct_matches = len(matches_idx_set) // len(matches_uniquified[0])\n",
" adj_mat = Chem.GetAdjacencyMatrix(mol)\n",
" largest_distinct_matches_set = set()\n",
" largest_distinct_matches_num = 0\n",
" for i, (_, primer) in enumerate(matches_uniquified_sorted):\n",
" attempt = Attempt(list(matches_uniquified_sorted), {primer})\n",
" attempt.cand_list.pop(i)\n",
" attempts = [attempt]\n",
" while attempts:\n",
" attempt = attempts.pop(0)\n",
" while 1:\n",
" sorted_cand_list = sorted([(\n",
" sum(sum([[adj_mat[x][y] for x in m] for y in attempt.placed_idx_set], [])),\n",
" m, e) for e, m in attempt.cand_list\n",
" if not m.intersection(attempt.placed_idx_set) and any(\n",
" (any(adj_mat[y][x] for x in m) for y in attempt.placed_idx_set))], reverse=True)\n",
" if not sorted_cand_list:\n",
" break\n",
" d, cand, e = sorted_cand_list.pop(0)\n",
" for j, (alt_d, alt_cand, _) in enumerate(sorted_cand_list):\n",
" if (alt_d < d):\n",
" break\n",
" deg_attempt = Attempt(\n",
" [(alt_e, m) for alt_d, m, alt_e in sorted_cand_list[j:]],\n",
" set(attempt.distinct_matches_set))\n",
" attempts.append(deg_attempt)\n",
" attempt.distinct_matches_set.add(cand)\n",
" attempt.placed_idx_set = attempt.placed_idx_set.union(cand)\n",
" attempt.cand_list.remove((e, cand))\n",
" n_distinct_matches = len(attempt.distinct_matches_set)\n",
" if (n_distinct_matches > largest_distinct_matches_num):\n",
" largest_distinct_matches_num = n_distinct_matches\n",
" largest_distinct_matches_set = attempt.distinct_matches_set\n",
" if (largest_distinct_matches_num == max_distinct_matches):\n",
" break\n",
" if (largest_distinct_matches_num == max_distinct_matches):\n",
" break\n",
" if (largest_distinct_matches_num == max_distinct_matches):\n",
" break\n",
" return tuple(sorted([tuple(sorted(m)) for m in largest_distinct_matches_set]))"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<rdkit.Chem.rdchem.Mol at 0x7f98e72d7080>"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"borneol"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2.12 ms, sys: 7 µs, total: 2.13 ms\n",
"Wall time: 1.94 ms\n"
]
},
{
"data": {
"text/plain": [
"((1, 2, 5, 6, 7), (3, 4, 8, 9, 10))"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"get_distinct_matches(borneol, pat)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<rdkit.Chem.rdchem.Mol at 0x7f98e72d7350>"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"squalene"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 2.56 ms, sys: 0 ns, total: 2.56 ms\n",
"Wall time: 2.39 ms\n"
]
},
{
"data": {
"text/plain": [
"((0, 1, 2, 3, 29),\n",
" (4, 5, 6, 7, 28),\n",
" (8, 9, 10, 11, 27),\n",
" (12, 13, 14, 15, 26),\n",
" (16, 17, 18, 19, 25),\n",
" (20, 21, 22, 23, 24))"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"get_distinct_matches(squalene, pat)"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<rdkit.Chem.rdchem.Mol at 0x7f98e72d74e0>"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"sesquiterpene"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 4.06 ms, sys: 0 ns, total: 4.06 ms\n",
"Wall time: 3.88 ms\n"
]
},
{
"data": {
"text/plain": [
"((4, 5, 9, 10, 11),\n",
" (6, 7, 8, 12, 25),\n",
" (13, 14, 15, 16, 24),\n",
" (17, 18, 19, 20, 23))"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"get_distinct_matches(sesquiterpene, pat)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<rdkit.Chem.rdchem.Mol at 0x7f98e72d7710>"
]
},
"execution_count": 16,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"triterpene"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPU times: user 230 ms, sys: 0 ns, total: 230 ms\n",
"Wall time: 230 ms\n"
]
},
{
"data": {
"text/plain": [
"((1, 2, 3, 4, 10),\n",
" (5, 6, 29, 30, 31),\n",
" (7, 8, 9, 11, 20),\n",
" (12, 13, 14, 18, 19),\n",
" (15, 16, 17, 21, 22),\n",
" (23, 24, 25, 26, 27))"
]
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"%%time\n",
"get_distinct_matches(triterpene, pat)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.6.9"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment