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 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 testSimilarityMapKWArgs(self): # Morgan2 BV m1 = Chem.MolFromSmiles('CC[C@](F)(Cl)c1ccccc1') m2 = Chem.MolFromSmiles('CC[C@@](F)(Cl)c1ccccc1') weights = sm.GetAtomicWeightsForFingerprint( m1, m2, lambda m, i: sm.GetAPFingerprint( m, atomId=i, includeChirality=False)) for w in weights: self.assertAlmostEqual(w, 0.100, 4) weights = sm.GetAtomicWeightsForFingerprint( m1, m2, lambda m, i: sm.GetAPFingerprint( m, atomId=i, includeChirality=True)) for i, w in enumerate(weights): if i != 2: self.assertAlmostEqual(w, 0.098, 3) else: self.assertAlmostEqual(w, -0.082, 3) weights = sm.GetAtomicWeightsForFingerprint( m1, m2, lambda m, i: sm.GetTTFingerprint( m, atomId=i, includeChirality=False)) for w in weights: self.assertTrue(w > 0.0) weights = sm.GetAtomicWeightsForFingerprint( m1, m2, lambda m, i: sm.GetTTFingerprint( m, atomId=i, includeChirality=True)) for i, w in enumerate(weights): if i > 4: self.assertTrue(w > 0.0) else: self.assertTrue(w < 0.0) weights = sm.GetAtomicWeightsForFingerprint( m1, m2, lambda m, i: sm.GetMorganFingerprint( m, radius=1, atomId=i, useChirality=False)) weights2 = sm.GetAtomicWeightsForFingerprint( m1, m2, lambda m, i: sm.GetMorganFingerprint( m, radius=1, atomId=i, useChirality=True)) # testing explicit values here seems silly, just check that the contribution of the # chiral center drops: self.assertTrue(weights[2] > weights2[2])
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) print(['%.2f' % w for w in weights]) # ['0.11', '0.11', '0.08', '0.07', '-0.03', '0.07', '0.02'] target_mol_simi_fig = SimilarityMaps.GetSimilarityMapFromWeights(mol, weights)