def testSimilarityMapsMolDraw2D(self): # nothing really sensible to test here, just make sure things run mol = Chem.MolFromSmiles( 'COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21') refmol = Chem.MolFromSmiles( 'CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1') d = Draw.MolDraw2DSVG(400, 400) d.ClearDrawing() _, maxWeight = sm.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: sm.GetMorganFingerprint(m, i, radius=2, fpType='bv'), draw2d=d) d.FinishDrawing() with open('similarityMap1_out.svg', 'w+') as outf: outf.write(d.GetDrawingText()) # Github #2904: make sure we can provide our own colormap as a list: colors = [(0, 1, 0, 0.5), (1, 1, 1), (0, 0, 1, 0.5)] d = Draw.MolDraw2DSVG(400, 400) d.ClearDrawing() _, maxWeight = sm.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: sm.GetMorganFingerprint(m, i, radius=2, fpType='bv'), draw2d=d, colorMap=colors) d.FinishDrawing() with open('similarityMap1_out2.svg', 'w+') as outf: outf.write(d.GetDrawingText()) # Github #2904: make sure we can provide our own colormap as a matplotlib colormap: try: from matplotlib import cm d = Draw.MolDraw2DSVG(400, 400) d.ClearDrawing() _, maxWeight = sm.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: sm.GetMorganFingerprint( m, i, radius=2, fpType='bv'), draw2d=d, colorMap=cm.PiYG) d.FinishDrawing() with open('similarityMap1_out3.svg', 'w+') as outf: outf.write(d.GetDrawingText()) except ImportError: pass
def _similarityMapSVG(ms, width=500, height=500, radius=2, fingerprint='morgan', format='svg'): if matplotlib is None: raise ValueError('matplotlib not useable') _call(ms, 'UpdatePropertyCache', strict=False) _apply(ms, ct._sssr) fn = None if fingerprint == 'morgan': fn = lambda x, i: SimilarityMaps.GetMorganFingerprint( x, i, radius=radius) elif fingerprint == 'tt': fn = SimilarityMaps.GetAPFingerprint elif fingerprint == 'ap': fn = SimilarityMaps.GetTTFingerprint SimilarityMaps.GetSimilarityMapForFingerprint(ms[0], ms[1], fn, size=(width, height)) sio = io.StringIO() pyplot.savefig(sio, format=format, bbox_inches='tight', dpi=100) return sio.getvalue()
def sim_map_mf(results, query, fp_func, metric, out_file): file_counter = 1 for m in query: mol_keys = [] for i in results: if results[i]["q_num"] == m: Chem.Compute2DCoords(results[i]["mol"]) try: fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( query[results[i]["q_num"]]["mol"], results[i]["mol"], fp_func, metric=fpsearch.sim_dict[metric]) fig.set_figwidth(3.255) fig.set_figheight(3.255) filename = f"{i}.png" fig.savefig(filename, bbox_inches="tight") mol_keys.append(i) except: d = rdMolDraw2D.MolDraw2DCairo(600, 600) d.DrawMolecule(results[i]["mol"]) d.FinishDrawing() d.WriteDrawingText(f"{i}.png") mol_keys.append(i) pages = gen_pdf_pages(mol_keys, results) export_pdf(pages, f"{out_file}_{file_counter}.pdf") file_counter += 1
def morgan_fingerprint_vis(product_smiles, sim_smiles): mol = Chem.MolFromSmiles(sim_smiles) refmol = Chem.MolFromSmiles(product_smiles) fp1 = SimilarityMaps.GetMorganFingerprint(mol) fp2 = SimilarityMaps.GetMorganFingerprint(refmol) fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( refmol, mol, SimilarityMaps.GetMorganFingerprint) return DataStructs.FingerprintSimilarity(fp1, fp2)
def draw_mol_comparison(self, refmol, mol): ''' Compare the structure of two molecules. The function takes the molecule names as input. ''' fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( refMol=self.molecules(refmol), probeMol=self.molecules(mol), fpFunction=SimilarityMaps.GetMorganFingerprint, metric=DataStructs.TanimotoSimilarity) return fig, maxweight
def draw_map(): """ Creates similarity maps using the provided molecules (SMILES). """ m1 = Chem.MolFromSmiles('c1ccccc1O') m2 = Chem.MolFromSmiles('c1ccccc1N') # Morgan Fingerprint (with normalization) # Can also be used with APFingerprint or TTFingerprint fig1, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( m1, m2, SimilarityMaps.GetMorganFingerprint) fig1.savefig('/path/to/similaritymap.png', bbox_inches='tight') # TT Fingerprint (with normalization) fig2, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( m1, m2, SimilarityMaps.GetTTFingerprint) fig2.savefig('/path/to/similaritymap.png', bbox_inches='tight') # Morgan Fingerprint (without normalization) weights = SimilarityMaps.GetAtomicWeightsForFingerprint( m1, m2, SimilarityMaps.GetMorganFingerprint) fig3 = SimilarityMaps.GetSimilarityMapFromWeights(m2, weights, size=(150, 150)) fig3.savefig('/path/to/similaritymap.png', bbox_inches='tight') # the degree of partial charge by using atomic charge AllChem.ComputeGasteigerCharges(m1) charges = [ float(atom.GetProp('_GasteigerCharge')) for atom in m1.GetAtoms() ] fig4 = SimilarityMaps.GetSimilarityMapFromWeights(m2, charges, size=(150, 150), scale=10) fig4.savefig('/path/to/molcharge_similaritymap.png', bbox_inches='tight')
def draw_finger_print(smile_file): with open(smile_file, 'r') as f: for mol in f: refmol = Chem.MolFromSmiles( 'CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1' ) # this is the template here ms = Chem.MolFromSmiles(mol) fp = SimilarityMaps.GetAPFingerprint(ms, fpType='normal') fp = SimilarityMaps.GetTTFingerprint(ms, fpType='normal') fp = SimilarityMaps.GetMorganFingerprint(ms, fpType='bv') fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( refmol, ms, SimilarityMaps.GetMorganFingerprint) fig.save('/home/nad/Desktop/navid22.png')
def _similarityMap(ms, width=100, height=100, radius=2, fingerprint = 'morgan'): if matplotlib is None: raise ValueError('matplotlib not useable') if fingerprint=='morgan': fn = lambda x,i:SimilarityMaps.GetMorganFingerprint(x,i,radius=radius) elif fingerprint=='tt': fn = SimilarityMaps.GetAPFingerprint elif fingerprint=='ap': fn = SimilarityMaps.GetTTFingerprint fig, maxv = SimilarityMaps.GetSimilarityMapForFingerprint(ms[0], ms[1], fn, size=(width, height)) sio = StringIO.StringIO() pyplot.savefig(sio, format='png', bbox_inches='tight', dpi=100) return sio.getvalue()
def testSimilarityMapsMolDraw2D(self): # nothing really sensible to test here, just make sure things run mol = Chem.MolFromSmiles( 'COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21') refmol = Chem.MolFromSmiles( 'CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1') d = Draw.MolDraw2DSVG(400, 400) d.ClearDrawing() _, maxWeight = sm.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: sm.GetMorganFingerprint(m, i, radius=2, fpType='bv'), draw2d=d) d.FinishDrawing() with open('similarityMap1_out.svg', 'w+') as outf: outf.write(d.GetDrawingText())
def get_atom_pair_similarity(correct_ligand, mol_to_fix, type_fp='normal', use_features=False): type_fp = type_fp correct_ligand_fingerprint = SimilarityMaps.GetAPFingerprint( correct_ligand, nBits=4096, fpType=type_fp, ) mol_to_fix_fingerprint = SimilarityMaps.GetAPFingerprint( mol_to_fix, nBits=4096, fpType=type_fp, ) test = 1 sim_func = DataStructs.FingerprintSimilarity temp_autoinducer_TanimotoSimilarty = sim_func( correct_ligand_fingerprint, mol_to_fix_fingerprint, metric=DataStructs.TanimotoSimilarity) test = 1 curr_metric = DataStructs.TanimotoSimilarity fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( correct_ligand, mol_to_fix, lambda m, idx: SimilarityMaps.GetAPFingerprint( m, atomId=idx, fpType='normal'), metric=curr_metric) # print(maxweight) # fig.suptitle('test title', fontsize=20) ax = fig.gca() # ax.title plt.title('test', fontsize=30) fig.set_size_inches(7, 7) fig.set_dpi(600) fig.savefig('test_ap.png', bbox_inches='tight') test = 1
def testSimilarityMap(self): # Morgan2 BV refWeights = [0.5, 0.5, 0.5, -0.5, 0.5, 0.5] weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetMorganFingerprint(m, i, radius=2, fpType='bv')) for w,r in zip(weights, refWeights): self.assertEqual(w, r) fig, maxWeight = sm.GetSimilarityMapForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetMorganFingerprint(m, i, radius=2, fpType='bv')) self.assertEqual(maxWeight, 0.5) weights, maxWeight = sm.GetStandardizedWeights(weights) self.assertEqual(maxWeight, 0.5) refWeights = [1.0, 1.0, 1.0, -1.0, 1.0, 1.0] for w,r in zip(weights, refWeights): self.assertEqual(w, r) weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetMorganFingerprint(m, i, fpType='count')) self.assertTrue(weights[3] < 0) weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetMorganFingerprint(m, i, fpType='bv', useFeatures=True)) self.assertTrue(weights[3] < 0) # hashed AP BV refWeights = [0.09523, 0.17366, 0.17366, -0.23809, 0.17366, 0.17366] weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetAPFingerprint(m, i, fpType='bv', nBits=1024)) for w,r in zip(weights, refWeights): self.assertAlmostEqual(w, r, 4) weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetAPFingerprint(m, i, fpType='normal')) self.assertTrue(weights[3] < 0) weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetAPFingerprint(m, i, fpType='hashed')) self.assertTrue(weights[3] < 0) # hashed TT BV refWeights = [0.5, 0.5, -0.16666, -0.5, -0.16666, 0.5] weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetTTFingerprint(m, i, fpType='bv', nBits=1024, nBitsPerEntry=1)) for w,r in zip(weights, refWeights): self.assertAlmostEqual(w, r, 4) weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetTTFingerprint(m, i, fpType='normal')) self.assertTrue(weights[3] < 0) weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetTTFingerprint(m, i, fpType='hashed')) self.assertTrue(weights[3] < 0) # RDK fingerprint BV refWeights = [0.42105, 0.42105, 0.42105, -0.32895, 0.42105, 0.42105] weights = sm.GetAtomicWeightsForFingerprint(self.mol1, self.mol2, lambda m, i: sm.GetRDKFingerprint(m, i, nBits=1024, nBitsPerHash=1)) for w,r in zip(weights, refWeights): self.assertAlmostEqual(w, r, 4)
def testGithub4763(self): mol = Chem.MolFromSmiles( 'COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21') refmol = Chem.MolFromSmiles( 'CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1') d = Draw.MolDraw2DSVG(400, 400) d.ClearDrawing() _, maxWeight = sm.GetSimilarityMapForFingerprint( refmol, mol, lambda m, i: sm.GetMorganFingerprint(m, i, radius=2, fpType='bv'), draw2d=d, colorMap="coolwarm") d.FinishDrawing() svg = d.GetDrawingText() with open('github4763.svg', 'w+') as outf: outf.write(svg) self.assertFalse('fill:#FBFCFB7F' in svg) self.assertTrue('fill:#DDDCDB' in svg)
def sim_map(results, query, fp_func, metric, out_file): for i in results: Chem.Compute2DCoords(results[i]["mol"]) try: fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( query[results[i]["q_num"]]["mol"], results[i]["mol"], fp_func, metric=fpsearch.sim_dict[metric]) fig.set_figwidth(3.255) fig.set_figheight(3.255) filename = f"{i}.png" fig.savefig(filename, bbox_inches="tight") except: d = rdMolDraw2D.MolDraw2DCairo(600, 600) d.DrawMolecule(results[i]["mol"]) d.FinishDrawing() d.WriteDrawingText(f"{i}.png") pages = gen_pdf_pages(list(results.keys()), results) export_pdf(pages, out_file)
def _similarityMap(ms, params): if matplotlib is None: raise ValueError('matplotlib not useable') fp = params.get('fingerprint', 'morgan') if fp == 'morgan': rad = int(params.get('radius', 2)) fn = lambda x, i: SimilarityMaps.GetMorganFingerprint(x, i, radius=rad) elif fp == 'tt': fn = SimilarityMaps.GetAPFingerprint elif fp == 'ap': fn = SimilarityMaps.GetTTFingerprint w = int(params.get('w', 100)) h = int(params.get('h', 100)) fig, maxv = SimilarityMaps.GetSimilarityMapForFingerprint(ms[0], ms[1], fn, size=(w, h)) sio = StringIO.StringIO() pyplot.savefig(sio, format='png', bbox_inches='tight', dpi=100) return sio.getvalue()
# 目标分子 # 指纹函数 # 相似性函数(默认是 Dice similarity) # 目标分子 targetmol = Chem.MolFromSmiles( 'COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21') # 参考分子 refmol = Chem.MolFromSmiles('CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1') d = Draw.MolDraw2DSVG(400, 400) d.ClearDrawing() target_mol_simi_fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( refmol, targetmol, lambda m, i: SimilarityMaps.GetMorganFingerprint( m, i, radius=2, fpType='bv'), draw2d=d ) print(target_mol_simi_fig) # Figure(250x250) print(maxweight) # 0.12255947497949138 d.FinishDrawing() with open('/drug_development/studyRdkit/st_rdcit/img/mol28.svg', 'w+') as outf: outf.write(d.GetDrawingText()) # 原子颜色越绿,对相似性的贡献越大。 # 或者可以用以下方法 weights = SimilarityMaps.GetAtomicWeightsForFingerprint( refmol, mol, SimilarityMaps.GetMorganFingerprint)
def calculate_similarities(gd, gd_mlc, request, sr): user_id = request.user.id print("user id of current user is ", user_id) instances = Similar.objects.filter(user_id=user_id) instances.delete() results = Prediction.objects.filter(user_id=user_id) results.delete() gd.reset_index(inplace=True) gd = gd.rename(columns={'index': 'Compounds'}) gd_mlc.reset_index(inplace=True) gd_mlc = gd_mlc.rename(columns={'index': 'Compounds'}) print("calculating similarities", gd.columns, gd_mlc.columns) binary_prob = gd mlc_prob = gd_mlc compounds = binary_prob["Compounds"].tolist() prob_data = {} targets = binary_prob.columns[1:len(binary_prob.columns)] similar_compounds = {} target_ids = { 'EGFR': 'CHEMBL203', 'IGF1R': 'CHEMBL1957', 'MIA-PaCa': 'CHEMBL614725', 'mTOR': 'CHEMBL2842' } train_data = pd.read_csv('Static/data/train-data.csv') k = 0 start = time.time() for c in compounds: prob_data[c] = {} img_name = uuid.uuid4().hex id = uuid.uuid4().hex j = 0 active = False for i in range(0, len(targets)): prob_data[c][targets[i]] = {} prob_model1 = binary_prob[binary_prob["Compounds"] == c][ targets[i]].tolist()[0] prob_model2 = mlc_prob[mlc_prob["Compounds"] == c][ targets[i]].tolist()[0] prob_data[c][targets[i]]['probability'] = round( ((prob_model1 + prob_model2) / 2), 2) if prob_data[c][targets[i]]['probability'] >= 50: print("inside if") active = True tid = target_ids[targets[i]] smiles = train_data[train_data["target_chembl_ID"] == tid]["canonical_smiles"].tolist() mol1 = Chem.MolFromSmiles(c) fp0 = FingerprintMols.FingerprintMol(mol1) compound_fig = Draw.MolToMPL(mol1, size=(120, 120)) # image_cf = img_name + '_qmol_.png' # compound_fig.savefig('Static/pictures/similarity/' + image_cf, bbox_inches='tight') # #com = Compound() # new_image = Similarity(name = image_cf, user_id = request.user.id, type = 'query', # image_id = id, similarity = 0.0 ) # new_image.save() similar_compounds[c] = [] for s in smiles: if s != c: mol2 = Chem.MolFromSmiles(s) fp1 = FingerprintMols.FingerprintMol(mol2) similarity = DataStructs.TanimotoSimilarity(fp0, fp1) if similarity > 0.9: fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( mol2, mol1, SimilarityMaps.GetMorganFingerprint, metric=DataStructs.TanimotoSimilarity) name = img_name + '_' + str(j) + '.png' fig.savefig('Static/pictures/similarity/' + name, bbox_inches='tight', pad_inches=0, transparent=True, orientation="landscape") new_image = Similar(name=name, user_id=user_id, type='similar', image_id=id, similarity=similarity, smile=s) new_image.save() r_compound_fig = Draw.MolToMPL(mol2, size=(120, 120)) image_rf = img_name + '_rmol_' + str(j) + '.png' r_compound_fig.savefig( 'Static/pictures/similarity/' + image_rf, bbox_inches='tight') new_image = Similar(name=image_rf, user_id=user_id, type='response', image_id=id, similarity=similarity, smile=s) new_image.save() # new_sim = {'smile': s, 'similarity': round(similarity, 2), 'image': name, 'query': image_cf, # 'result': image_rf} # similar_compounds[c].append(new_sim) j += 1 matplotlib.pyplot.clf() k += 1 if active == True: print("Saving active compound") mol1 = Chem.MolFromSmiles(c) compound_fig = Draw.MolToMPL(mol1, size=(120, 120)) image_cf = img_name + '_qmol_.png' compound_fig.savefig('Static/pictures/similarity/' + image_cf, bbox_inches='tight') # com = Compound() new_image = Similar(name=image_cf, user_id=request.user.id, type='query', image_id=id, similarity=0.0, smile=c) new_image.save() new_results = Prediction(user_id=request.user.id, data=prob_data) new_results.save() end = time.time() print('elapsed time ', end - start) request.session['results'] = True request.session.save() request.session['set_res'] = True request.session.modified = True return redirect('dashboard')
#name: Similarity Maps Using Fingerprints #description: Similarity Maps Using Fingerprints, RDKit based #help-url: /help/domains/chem/functions/sim-maps.md #language: python #tags: demo, chem, rdkit #input: string mol = COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21 {semType: Molecule} [Molecule, in SMILES format] #input: string refmol = CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1 {semType: Molecule} [Reference molecule, in SMILES format] #input: int radius = 2 [Fingerprint function radius] #output: double maxweight [The maximum weight that was found when creating the map] #output: graphics simMap [Similarity Map] from rdkit import Chem from rdkit.Chem.Draw import SimilarityMaps mol = Chem.MolFromSmiles(mol) refmol = Chem.MolFromSmiles(refmol) from rdkit import DataStructs simMap, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint( refmol, mol, lambda m, idx: SimilarityMaps.GetMorganFingerprint( m, atomId=idx, radius=radius, fpType='count'), metric=DataStructs.TanimotoSimilarity)
from rdkit import Chem from rdkit.Chem.Draw import SimilarityMaps import matplotlib.pyplot as plt if __name__ == '__main__': mol = Chem.MolFromSmiles('COc1cccc2cc(C(=O)NCCCCN3CCN(c4cccc5nccnc54)CC3)oc21') refmol = Chem.MolFromSmiles('CCCN(CCCCN1CCN(c2ccccc2OC)CC1)Cc1ccc2ccccc2c1') fig, maxweight = SimilarityMaps.GetSimilarityMapForFingerprint(refmol, mol, SimilarityMaps.GetMorganFingerprint) handlelim = [0, 1] # plt.xlim(handlelim) # plt.ylim(handlelim) # plt.show()