{"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_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom PIL import Image, ImageChops\nimport seaborn as sns\nimport matplotlib.pyplot as plt\nimport re\nimport warnings\nimport cv2\nfrom tqdm import tqdm\ntqdm.pandas()\nwarnings.filterwarnings(\"ignore\")","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Training Data\n","metadata":{}},{"cell_type":"code","source":"train_data = pd.read_csv('../input/bms-molecular-translation/train_labels.csv')\ntrain_data.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(\"Training Data Size\",train_data.shape[0])\nprint('Number of unique chemical identifier:',len(train_data['InChI'].value_counts().index))","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Checking NAN values","metadata":{}},{"cell_type":"code","source":"train_data.isna().sum()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"If we carefully watch image-name, first 3 characters in the id represents the folder structure,\nso using this lets construct the fully qualified image path for each image using below code","metadata":{}},{"cell_type":"code","source":"image_path = \"../input/bms-molecular-translation/train/{}/{}/{}/{}.png\"\nimage_id_to_path = lambda image_id :image_path.format(image_id[0], image_id[1], image_id[2], image_id) ","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_data['image_path'] = train_data['image_id'].apply(image_id_to_path)\ntrain_data.head()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Image Height and Width","metadata":{}},{"cell_type":"code","source":"height_shape=[]\nwidth_shape=[]\n\nfor idx,image_id in enumerate(train_data.image_id.values[:1000]):\n    image = cv2.imread(train_data['image_path'][idx])\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n    height_shape.append(image.shape[0])\n    width_shape.append(image.shape[1])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"plt.figure(figsize=(12, 7))\nsns.distplot(width_shape)\nplt.title(\"Image Width Distribution\", fontsize=14)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Observation \n* most of image has the Image Width below the 800","metadata":{}},{"cell_type":"code","source":"plt.figure(figsize=(12, 7))\nsns.distplot(height_shape)\nplt.title(\"Image Height Distribution\", fontsize=14)","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Observation \n* most of image has the Image Height below the 500","metadata":{}},{"cell_type":"markdown","source":"# Distribution of label(InChI) length","metadata":{}},{"cell_type":"code","source":"label_lengths = train_data['InChI'].progress_apply(lambda x: len(x))\nsns.set_style(\"whitegrid\")\nplt.figure(figsize = (10, 6))\nplt.title('Distribution of label length', fontsize = '15')\nsns.kdeplot(label_lengths, fill = True, color = '#EE370F', \n            edgecolor = 'black', alpha = 0.9)\nplt.xlabel('InChlI length')\nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"Observation \n* most of image InChI label length is below 250","metadata":{}},{"cell_type":"markdown","source":"#  Image and Image InChI ","metadata":{}},{"cell_type":"code","source":"df = train_data[:6]\nplt.figure(figsize = (15, 15))\nfor ind, (image_id, label) in enumerate(zip(df['image_id'], df[\"InChI\"].values)):\n    plt.subplot(3, 2, ind + 1)\n    image = cv2.imread(image_id_to_path(image_id))\n    image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)\n\n    plt.imshow(image)\n    plt.title(f\"{label[:30]}...\", fontsize=15)\n    plt.axis(\"off\")\n    \nplt.show()","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"print(train_data['InChI'].iloc[0])\nprint(\"Length of InChI of this Image\",len(train_data['InChI'].iloc[0]))\nImage.open(train_data['image_path'].iloc[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# STRUCTURE\n\nEvery InChI starts with the string \"InChI=\" followed by the version \n\nIf the InChI is standard, this is followed by the letter S for standard InChIs, which is a fully standardized InChI flavor maintaining the same level of attention to structure details and the same conventions for drawing perception.\n\nThe remaining information is structured as a sequence of layers and sub-layers, with each layer providing one specific type of information.\n\nThe layers and sub-layers are separated by the delimiter \"/\" and start with a characteristic prefix letter (except for the chemical formula sub-layer of the main layer).\n\nThe six layers with important sublayers are:\n\n","metadata":{}},{"cell_type":"markdown","source":"\n## 1. Main Layer\n Main layer can be split up into three sub-layers:\n\n\n* Chemical formula (no prefix). This is the only sublayer that must occur in every InChI.\n* Atom connections (prefix: \"c\").\nThe atoms in the chemical formula (except for hydrogens) are numbered in sequence. This sublayer describes which atoms are connected by bonds to which other ones.\n* Hydrogen atoms (prefix: \"h\").\nDescribes how many hydrogen atoms are connected to each of the other atoms.\n\n\n## 2. Charge Layer\n\n* Charge Sublayer (prefix: \"q\")\n* Proton Sublayer (prefix: \"p\")\n\n\n## 3. Stereochemical Layer\nThe two types of represented stereochemistry, double bond and tetrahedral,\n\n* Double Bonds and Cumulenes (prefix: \"b\")\n* Tetrahedral Stereochemistry of Atoms and Allenes (prefixes: \"t\")\n\n\n\n## 4. Isotopic Layer\n\n* prefixes: \"i\", \"h\", as well as \"b\", \"t\", \"m\", \"s\" for isotopic stereochemistry\n\n\n## 5. Fixed-H Layer\n\n* prefix: \"f\". NEVER INCLUDED IN STANDARD INCHI\n\n\n## 6. Reconnected Layer\n\n* prefix: \"r\". NEVER INCLUDED IN STANDARD INCHI","metadata":{}},{"cell_type":"code","source":"Image.open(train_data['image_path'].iloc[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Version Number","metadata":{}},{"cell_type":"code","source":"print(\"InChi Version \",train_data['InChI'].iloc[0].split(\"/\")[0])\nImage.open(train_data['image_path'].iloc[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Chemical formula","metadata":{}},{"cell_type":"code","source":"print(\"Chemical Formula\",train_data['InChI'].iloc[0].split(\"/\")[1])\nImage.open(train_data['image_path'].iloc[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Atom Connection","metadata":{}},{"cell_type":"code","source":"print(\"Atom Connection\",train_data['InChI'].iloc[0].split(\"/\")[2])\nImage.open(train_data['image_path'].iloc[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"# Hydrogen atoms","metadata":{}},{"cell_type":"code","source":"print(\"Hydrogen atoms \",train_data['InChI'].iloc[0].split(\"/\")[3].split(\",\")[0])\nImage.open(train_data['image_path'].iloc[0])","metadata":{"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":"### From Below Image you can easily understand the all layers ","metadata":{}},{"cell_type":"markdown","source":"![image.png](attachment:67dd7a75-a58b-4369-bf93-f468a683bbcf.png)","metadata":{},"attachments":{"67dd7a75-a58b-4369-bf93-f468a683bbcf.png":{"image/png":"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"}}},{"cell_type":"markdown","source":"# References:\n* https://www.inchi-trust.org/technical-faq-2/\n* https://www.kaggle.com/ayuraj/bms-eda-and-dataset-visualization-w-w-b\n* https://www.kaggle.com/dschettler8845/molecular-translation-eda-smart-baseline","metadata":{}},{"cell_type":"markdown","source":"\nIf you find the work useful please considering upvoting the kernel. Share your own opinion and things to improve/add","metadata":{}}]}