def testDrawMorgan(self): from rdkit.Chem import rdMolDescriptors m = Chem.MolFromSmiles('c1ccccc1CC1CC1') bi = {} fp = rdMolDescriptors.GetMorganFingerprintAsBitVect(m, radius=2, bitInfo=bi) self.assertTrue(872 in bi) svg1 = Draw.DrawMorganBit(m, 872, bi) aid, r = bi[872][0] svg2 = Draw.DrawMorganEnv(m, aid, r) self.assertEqual(svg1, svg2) self.assertTrue("style='fill:#CCCCCC;" in svg1) self.assertTrue("style='fill:#E5E533;" in svg1) self.assertTrue("style='fill:#9999E5;" in svg1) svg1 = Draw.DrawMorganBit(m, 872, bi, centerColor=None) aid, r = bi[872][0] svg2 = Draw.DrawMorganEnv(m, aid, r, centerColor=None) self.assertEqual(svg1, svg2) self.assertTrue("style='fill:#CCCCCC;" in svg1) self.assertTrue("style='fill:#E5E533;" in svg1) self.assertFalse("style='fill:#9999E5;" in svg1) with self.assertRaises(KeyError): Draw.DrawMorganBit(m, 32, bi)
def testDrawMorgan(self): m = Chem.MolFromSmiles('c1ccccc1CC1CC1') bi = {} _ = rdMolDescriptors.GetMorganFingerprintAsBitVect(m, radius=2, bitInfo=bi) self.assertTrue(872 in bi) svg1 = Draw.DrawMorganBit(m, 872, bi) aid, r = bi[872][0] svg2 = Draw.DrawMorganEnv(m, aid, r) self.assertEqual(svg1, svg2) self.assertTrue("style='fill:#CCCCCC;" in svg1) self.assertTrue("style='fill:#E5E533;" in svg1) self.assertTrue("style='fill:#9999E5;" in svg1) svg1 = Draw.DrawMorganBit(m, 872, bi, centerColor=None) aid, r = bi[872][0] svg2 = Draw.DrawMorganEnv(m, aid, r, centerColor=None) self.assertEqual(svg1, svg2) self.assertTrue("style='fill:#CCCCCC;" in svg1) self.assertTrue("style='fill:#E5E533;" in svg1) self.assertFalse("style='fill:#9999E5;" in svg1) with self.assertRaises(KeyError): Draw.DrawMorganBit(m, 32, bi) if hasattr(Draw, 'MolDraw2DCairo'): # Github #3796: make sure we aren't trying to generate metadata: png = Draw.DrawMorganBit(m, 872, bi, useSVG=False) self.assertIn(b'PNG', png) self.assertIsNone(Chem.MolFromPNGString(png))
def draw_fp_bit(fp_func,base_path,mol,idx=None,**kwargs): info = {} Mol_add_atomSymbol(mol) fp = fp_func(mol,bitInfo=info,**kwargs) if not os.path.exists(base_path): os.mkdir(base_path) if idx is None: for key in info.keys(): print("Bit {} : \n".format(key)) sub_svg=Draw.DrawMorganBit(mol,key,info,useSVG=True) key = str(key) full_path = join(base_path,key) Draw_from_svg(sub_svg,full_path) else: sub_svg=Draw.DrawMorganBit(mol,idx,info,useSVG=True) Draw_from_svg(sub_svg,join(base_path,idx))
def draw_fragment(self, fragment_id: Union[str, int], show_zscore: bool = True) -> str: """Draw a specified fragmnet. Args: fragment_id (Union[str, int]): User-defined fragment string, or position of the Morgan fingerprint bit to be drawn. show_zscore (bool, optional): Annotate drawing with zscore. Defaults to True. Returns: str: Molecule drawing SVG. """ # images will be annotated with zscore legend = f"zscore = {self.zscores[fragment_id]:.2f}" if show_zscore else "" # handle drawing of user-defined fragments if self.user_frags: mol = Chem.MolFromSmarts(fragment_id) img = Draw.MolsToGridImage([mol], molsPerRow=1, subImgSize=(200, 200), legends=[legend]) # handle drawing of auto-generated fragments mol = self._get_mol_with_frag(fragment_id) bit_info = {} if self.fp_type == "morgan": _ = rdMolDescriptors.GetMorganFingerprintAsBitVect( mol, radius=self.fp_rad, nBits=self.fp_bits, bitInfo=bit_info) img = Draw.DrawMorganBit(mol, fragment_id, bit_info, useSVG=True, legend=legend) if self.fp_type == "rdkit": _ = Chem.RDKFingerprint( mol, minPath=self.fp_rad, maxPath=self.fp_rad, fpSize=self.fp_bits, bitInfo=bit_info, ) img = Draw.DrawRDKitBit(mol, fragment_id, bit_info, useSVG=True, legend=legend) return img
def DrawBitFromSmiles(smiles, fp_choice, weboutput=True): fp_choice = int(fp_choice) mol = Chem.MolFromSmiles(smiles) bitInfo = {} fp = AllChem.GetMorganFingerprint(mol, 3, bitInfo=bitInfo, useChirality=True) if fp_choice in bitInfo: svg = Draw.DrawMorganBit(mol, fp_choice, bitInfo, useSVG=True) if weboutput: svg = svg.replace("\n", "") return (svg) else: return (None)
# 64: ((1, 1), (2, 1)), 74: ((3, 1),), # 81: ((0, 0), (1, 0), (2, 0), (3, 0)), 100: ((5, 0),), # 121: ((4, 2),), 122: ((4, 0),), # 131: ((2, 2),), 172: ((4, 1),), # 175: ((1, 2),), 179: ((0, 2),), # 186: ((6, 1),), 192: ((3, 2),), # 195: ((5, 1),), 214: ((0, 1),) # } # 对bit进行可视化 bits = list(bi.keys()) print(bits) [19, 33, 64, 74, 81, 100, 121, 122, 131, 172, 175, 179, 186, 192, 195, 214] bits = [19, 64, 81] imgs = [] for bit in bits: mfp2_svg = Draw.DrawMorganBit(mol, bit, bi) imgs.append(mfp2_svg) def displayingsinrow(imgs, col=4): plt.figure(figsize=(20, 20)) columns = col for i, image in enumerate(imgs): ax = plt.subplot(len(imgs) / columns, columns, i) ax.set_axis_off() plt.imshow(image) displayingsinrow(imgs) bi_tuple = [(mol, bit, bi) for bit in list(bi.keys())]
continue # remove 3D info for Draw Bits, may fail for Kekulize m = Chem.MolFromSmiles(Chem.MolToSmiles(m)) if m is None: continue info = {} fp = AllChem.GetMorganFingerprintAsBitVect(m, 2, nBits=nBits, bitInfo=info) if bit in set(fp.GetOnBits()): bit_examples.append((m, bit, info)) example_count += 1 break # http://rdkit.blogspot.com/2018/10/using-new-fingerprint-bit-rendering-code.html examples_svg = [Draw.DrawMorganBit(*i) for i in bit_examples] # remove two '\n' at the start and end of svg examples_svg = [i.strip() for i in examples_svg] examples_svg = [i.replace('\n<svg', '<svg') for i in examples_svg] for list_, svg in zip(bits_examples, examples_svg): list_.append(svg) svg_cols = [f'example_{i+1}' for i in range(4)] for col, list_ in zip(svg_cols, bits_examples): df[col] = list_ df = df.sort_values(by='zinc_freq', ascending=False) df = df.reset_index(drop=True) df.index += 1 df['bit'] = [f'bit:<br>{i}' for i in df['bit']] df['log2_FC'] = [f'log2(FC):<br>{i:.2f}' for i in df['log2_FC']] for col in ['active_freq', 'decoy_freq', 'mean_freq', 'zinc_freq']: