{"cells":[{"metadata":{},"cell_type":"markdown","source":"# What is Murcko Scaffold?\nMurcko scaffold is the method for extracting molecule backbone. Murcko scaffold is obtained by extracting the ring structures and the linkers that connect them.\n\nExtracting Murcko scaffold enable us to cluster the structure of the molecule. Therefore, it is possible to separate molecules with extremely similar structures from train and validation.We obtain structurally divirse data splits by this technique.\n\nThis notebook presents two methods for extracting scaffold. I don't know which method is the better for this task, so please let me know in the comments."},{"metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"cell_type":"code","source":"!conda install -y -c rdkit rdkit","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"import pandas as pd\nfrom tqdm.auto import tqdm\ntqdm.pandas()\n\nimport cv2\nimport matplotlib.pyplot as plt\nimport numpy as np\nfrom sklearn.model_selection import GroupKFold\n\n\nfrom rdkit import Chem\nfrom rdkit.Chem.Scaffolds import MurckoScaffold\n\nfrom collections import defaultdict","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Method 1: Basic Murcko Scaffold\nBasic Murcko Scaffold extracts scaffold considering the difference in atoms."},{"metadata":{},"cell_type":"markdown","source":"# Method 2: Bemis/Murcko Scaffold (BM Scaffold)\nBasic Murcko Scaffold treats as different scaffolds when the shape is the same but only the atoms are different as shown in the image below.(left scaffold: \"c1ccccc1\" right scaffold: \"c1ccncc1)\n\n![image.png](attachment:image.png)\n\nBM scaffold extracts scaffold by ignoring the bond type and the difference between atoms and focusing only on the shape.\nWhen extraction of BM scaffold fails, return basic Murcko Scaffold in this notebook. The image below is an example of a scaffold that fails to extract the BM scaffold. In BM scaffold, all atoms are replaced with carbon (valence=4), so when a phosphorus (valence=5) atom appears, for example, the valence is insufficient and an error is thrown.\n\n![failed_example.png](attachment:failed_example.png)","attachments":{"image.png":{"image/png":"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"},"failed_example.png":{"image/png":"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"}}},{"metadata":{},"cell_type":"markdown","source":"# Read csv and extract scaffold(SMILES format)\nSMILES is a string notation used to describe the structure of a compound. (In cheminformatics, SMILES is a more popular format than InChI, as far as I know:))"},{"metadata":{"trusted":true},"cell_type":"code","source":"train = pd.read_csv('../input/bms-molecular-translation/train_labels.csv')\n\ndef get_train_file_path(image_id):\n    return \"../input/bms-molecular-translation/train/{}/{}/{}/{}.png\".format(\n        image_id[0], image_id[1], image_id[2], image_id \n    )\n\n# method 1\ndef get_basic_marcko_scaffold(inchi):\n    return MurckoScaffold.MurckoScaffoldSmiles(mol=Chem.MolFromInchi(inchi),includeChirality=False)\n\n# method 2\ndef get_bm_scaffold(smiles):\n    try:\n        scaffold = Chem.MolToSmiles(MurckoScaffold.MakeScaffoldGeneric(mol=Chem.MolFromSmiles(smiles)))\n    except Exception:\n        print(\"Raise AtomValenceException, return basic Murcko Scaffold\")\n        scaffold = smiles\n    return scaffold\n\ntrain['file_path'] = train['image_id'].progress_apply(get_train_file_path)\ntrain[\"basic_murcko_scaffold\"] = train[\"InChI\"].progress_apply(get_basic_marcko_scaffold)\ntrain[\"BM_scaffold\"] = train[\"basic_murcko_scaffold\"].progress_apply(get_bm_scaffold)\nprint(f'train.shape: {train.shape}')\ndisplay(train.head())","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"train[\"basic_murcko_scaffold\"].value_counts().head(20)","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## The data `scaffold == \"\"` don't have scaffold because they don't have any ring structures.\nFor example, 10 molecules structures are illustrated."},{"metadata":{"trusted":true},"cell_type":"code","source":"def InchiToImage(Inchi):\n    display(Chem.Draw.MolToImage(Chem.MolFromInchi(Inchi)))\ndef SmilesToImage(Smiles):\n    display(Chem.Draw.MolToImage(Chem.MolFromSmiles(Smiles)))","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"for image_id in train[train[\"basic_murcko_scaffold\"]==\"\"][\"image_id\"].head(10):\n    mol_data = train[train[\"image_id\"]==image_id].iloc[0,:]\n    print(\"image_id: \"+mol_data[\"image_id\"])\n    \n    InchiToImage(mol_data[\"InChI\"])\n    \n    image = cv2.imread(mol_data[\"file_path\"])\n    plt.imshow(image)\n    plt.show()","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"# Group KFold"},{"metadata":{},"cell_type":"markdown","source":"## By basic Murcko Scaffold"},{"metadata":{"trusted":true},"cell_type":"code","source":"i=0\ngkf = GroupKFold(n_splits=5)\nfor train_index,valid_index in gkf.split(train,groups=train[\"basic_murcko_scaffold\"]):\n    train_df = train.iloc[train_index,:]\n    valid_df = train.iloc[valid_index,:]\n    print(\"Fold %d: train size: %d , valid size: %d\"%(i,train_df.shape[0],valid_df.shape[0]))\n    \n    # MS means Murcko Scaffold.\n    train_df.to_csv(\"train_MS_%d.csv\"%i,index=False)\n    valid_df.to_csv(\"valid_MS_%d.csv\"%i,index=False)\n    i+=1","execution_count":null,"outputs":[]},{"metadata":{},"cell_type":"markdown","source":"## By BM Scaffold"},{"metadata":{"trusted":true},"cell_type":"code","source":"i=0\ngkf = GroupKFold(n_splits=5)\nfor train_index,valid_index in gkf.split(train,groups=train[\"BM_scaffold\"]):\n    train_df = train.iloc[train_index,:]\n    valid_df = train.iloc[valid_index,:]\n    print(\"Fold %d: train size: %d , valid size: %d\"%(i,train_df.shape[0],valid_df.shape[0]))\n    \n    # BMS means BM Scaffold.\n    train_df.to_csv(\"train_BMS_%d.csv\"%i,index=False)\n    valid_df.to_csv(\"valid_BMS_%d.csv\"%i,index=False)\n    i+=1","execution_count":null,"outputs":[]},{"metadata":{"trusted":true},"cell_type":"code","source":"","execution_count":null,"outputs":[]}],"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat":4,"nbformat_minor":4}