Un indice bien connu pour parler de la similitude des composés est le "coefficient de Tanimoto". Cependant, il y a pas mal de gens qui disent seulement "coefficient de Tanimoto", et il y a pas mal d'occasions de s'inquiéter sur "N'est-ce pas assez pour expliquer?"
Le nombre de composés est de 10.
smiles = [
'C1=CC=C2C3CC(CNC3)CN2C1=O',
'CN1c2c(C(N(C)C1=O)=O)[nH0](CC(CO)O)c[nH0]2',
'CN1C2CC(CC1C1C2O1)OC(C(c1ccccc1)CO)=O',
'CN1C2CC(CC1C1C2O1)OC(C(c1cccnc1)CO)=O', #Similaire au composé ci-dessus
'CN(C=1C(=O)N(c2ccccc2)N(C1C)C)C',
'CN(C=1C(=O)N(C2CCCCC2)N(C1C)C)C', #Similaire au composé ci-dessus
'OCC1C(C(C(C(OCC2C(C(C(C(OC(c3ccccc3)C#N)O2)O)O)O)O1)O)O)O',
'OCc1ccccc1OC1C(C(C(C(CO)O1)O)O)O',
'OCc1cc(N)ccc1OC1C(C(C(C(CO)O1)O)O)O', #Similaire au composé ci-dessus
'[nH0]1c(OC)c2c([nH0]cc[nH0]2)[nH0]c1',
]
from rdkit import Chem
mols = [Chem.MolFromSmiles(smile) for smile in smiles]
from rdkit.Chem import AllChem
fps = [AllChem.GetMorganFingerprint(mol, 3, useFeatures=True) for mol in mols]
from rdkit import DataStructs
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
En faisant cela, vous pouvez voir la distribution du coefficient de Tanimoto. Il semble que celui avec un coefficient de Tanimoto = 1 soit la même molécule, mais il existe d'autres paires moléculaires avec un coefficient de Tanimoto plus élevé. Découvrez (ou imaginez) ce que c'est
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()
L'empreinte digitale Morgan a également divers paramètres, et leur modification change également la valeur du coefficient de Tanimoto.
fps = [AllChem.GetMorganFingerprint(mol, 2, useFeatures=True) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()
fps = [AllChem.GetMorganFingerprint(mol, 1, useFeatures=True) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()
fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 3, 1024) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()
fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 3, 2048) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()
Il n'y en a que deux car il est difficile de tout calculer. L'une des choses importantes est que dans les résultats de calcul ci-dessous, il y a 10 cas ou plus avec un coefficient de Tanimoto de 1,0. En d'autres termes, sachez que le coefficient de Tanimoto peut être de 1,0 même s'il ne s'agit pas de la même molécule.
fps = [AllChem.GetMACCSKeysFingerprint(mol) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()
fps = [Chem.RDKFingerprint(mol) for mol in mols]
sim_matrix = [DataStructs.BulkTanimotoSimilarity(fp, fps) for fp in fps]
plt.hist(np.array(sim_matrix).flatten(), bins=20)
plt.grid()
plt.show()
from rdkit.Chem import rdFMCS
matrix = []
for mol1 in mols:
for mol2 in mols:
mcs = rdFMCS.FindMCS([mol1, mol2])
a1 = len(mol1.GetAtoms())
a2 = len(mol2.GetAtoms())
matrix.append(mcs.numAtoms / (a1 + a2 - mcs.numAtoms) )
plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()
from rdkit.Chem import rdFMCS
matrix = []
for mol1 in mols:
for mol2 in mols:
mcs = rdFMCS.FindMCS([mol1, mol2], atomCompare=rdFMCS.AtomCompare.CompareAny)
a1 = len(mol1.GetAtoms())
a2 = len(mol2.GetAtoms())
matrix.append(mcs.numAtoms / (a1 + a2 - mcs.numAtoms) )
plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()
from rdkit.Chem import rdFMCS
matrix = []
for mol1 in mols:
for mol2 in mols:
mcs = rdFMCS.FindMCS([mol1, mol2])
a1 = len(mol1.GetBonds())
a2 = len(mol2.GetBonds())
matrix.append(mcs.numBonds / (a1 + a2 - mcs.numBonds) )
plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()
from rdkit.Chem import rdFMCS
matrix = []
for mol1 in mols:
for mol2 in mols:
mcs = rdFMCS.FindMCS([mol1, mol2], bondCompare=rdFMCS.BondCompare.CompareOrderExact)
a1 = len(mol1.GetBonds())
a2 = len(mol2.GetBonds())
matrix.append(mcs.numBonds / (a1 + a2 - mcs.numBonds) )
plt.hist(np.array(matrix).flatten(), bins=20)
plt.grid()
plt.show()
Recommended Posts