Kit de Ferramentas de Quiminformática RDKit
Visão Geral
RDKit é uma biblioteca abrangente de quiminformática fornecendo APIs Python para análise e manipulação de moléculas. Esta habilidade fornece orientações para leitura/escrita de estruturas moleculares, cálculo de descritores, fingerprinting, busca de subestruturas, reações químicas, geração de coordenadas 2D/3D e visualização molecular. Use esta habilidade para descoberta de medicamentos, química computacional e tarefas de pesquisa quiminformática.
Capacidades Principais
1. I/O Molecular e Criação
Leitura de Moléculas:
Leia estruturas moleculares de vários formatos:
from rdkit import Chem
# De strings SMILES
mol = Chem.MolFromSmiles('Cc1ccccc1') # Retorna objeto Mol ou None
# De arquivos MOL
mol = Chem.MolFromMolFile('path/to/file.mol')
# De blocos MOL (dados em string)
mol = Chem.MolFromMolBlock(mol_block_string)
# De InChI
mol = Chem.MolFromInchi('InChI=1S/C6H6/c1-2-4-6-5-3-1/h1-6H')
Escrita de Moléculas:
Converta moléculas em representações textuais:
# Para SMILES canônico
smiles = Chem.MolToSmiles(mol)
# Para bloco MOL
mol_block = Chem.MolToMolBlock(mol)
# Para InChI
inchi = Chem.MolToInchi(mol)
Processamento em Lote:
Para processar múltiplas moléculas, use objetos Supplier/Writer:
# Leia arquivos SDF
suppl = Chem.SDMolSupplier('molecules.sdf')
for mol in suppl:
if mol is not None: # Verifique erros de análise
# Processe a molécula
pass
# Leia arquivos SMILES
suppl = Chem.SmilesMolSupplier('molecules.smi', titleLine=False)
# Para arquivos grandes ou dados comprimidos
with gzip.open('molecules.sdf.gz') as f:
suppl = Chem.ForwardSDMolSupplier(f)
for mol in suppl:
# Processe a molécula
pass
# Processamento multithreaded para grandes conjuntos de dados
suppl = Chem.MultithreadedSDMolSupplier('molecules.sdf')
# Escreva moléculas em SDF
writer = Chem.SDWriter('output.sdf')
for mol in molecules:
writer.write(mol)
writer.close()
Notas Importantes:
- Todas as funções
MolFrom*retornamNoneem caso de falha com mensagens de erro - Sempre verifique se há
Noneantes de processar moléculas - Moléculas são automaticamente sanitizadas na importação (valida valência, percebe aromaticidade)
2. Sanitização e Validação Molecular
RDKit sanitiza automaticamente moléculas durante a análise, executando 13 etapas incluindo verificação de valência, percepção de aromaticidade e atribuição de quiralidade.
Controle de Sanitização:
# Desabilite sanitização automática
mol = Chem.MolFromSmiles('C1=CC=CC=C1', sanitize=False)
# Sanitização manual
Chem.SanitizeMol(mol)
# Detecte problemas antes da sanitização
problems = Chem.DetectChemistryProblems(mol)
for problem in problems:
print(problem.GetType(), problem.Message())
# Sanitização parcial (pule etapas específicas)
from rdkit.Chem import rdMolStandardize
Chem.SanitizeMol(mol, sanitizeOps=Chem.SANITIZE_ALL ^ Chem.SANITIZE_PROPERTIES)
Problemas de Sanitização Comuns:
- Átomos com valência explícita excedentem máximo permitido levantarão exceções
- Anéis aromáticos inválidos causarão erros de kekulização
- Elétrons radicais podem não ser corretamente atribuídos sem especificação explícita
3. Análise e Propriedades Moleculares
Acessando Estrutura Molecular:
# Itere átomos e ligações
for atom in mol.GetAtoms():
print(atom.GetSymbol(), atom.GetIdx(), atom.GetDegree())
for bond in mol.GetBonds():
print(bond.GetBeginAtomIdx(), bond.GetEndAtomIdx(), bond.GetBondType())
# Informação de anéis
ring_info = mol.GetRingInfo()
ring_info.NumRings()
ring_info.AtomRings() # Retorna tuplas de índices de átomos
# Verifique se átomo está em anel
atom = mol.GetAtomWithIdx(0)
atom.IsInRing()
atom.IsInRingSize(6) # Verifique anéis de 6 membros
# Encontre o menor conjunto de anéis menores (SSSR)
from rdkit.Chem import GetSymmSSSR
rings = GetSymmSSSR(mol)
Estereoquímica:
# Encontre centros quirais
from rdkit.Chem import FindMolChiralCenters
chiral_centers = FindMolChiralCenters(mol, includeUnassigned=True)
# Retorna lista de tuplas (atom_idx, chirality)
# Atribua estereoquímica a partir de coordenadas 3D
from rdkit.Chem import AssignStereochemistryFrom3D
AssignStereochemistryFrom3D(mol)
# Verifique estereoquímica de ligação
bond = mol.GetBondWithIdx(0)
stereo = bond.GetStereo() # STEREONONE, STEREOZ, STEREOE, etc.
Análise de Fragmentos:
# Obtenha fragmentos desconectados
frags = Chem.GetMolFrags(mol, asMols=True)
# Fragmente em ligações específicas
from rdkit.Chem import FragmentOnBonds
frag_mol = FragmentOnBonds(mol, [bond_idx1, bond_idx2])
# Conte sistemas de anéis
from rdkit.Chem.Scaffolds import MurckoScaffold
scaffold = MurckoScaffold.GetScaffoldForMol(mol)
4. Descritores e Propriedades Moleculares
Descritores Básicos:
from rdkit.Chem import Descriptors
# Peso molecular
mw = Descriptors.MolWt(mol)
exact_mw = Descriptors.ExactMolWt(mol)
# LogP (lipofilicidade)
logp = Descriptors.MolLogP(mol)
# Área de superfície polar topológica
tpsa = Descriptors.TPSA(mol)
# Número de doadores/aceitadores de ligação de hidrogênio
hbd = Descriptors.NumHDonors(mol)
hba = Descriptors.NumHAcceptors(mol)
# Número de ligações rotatórias
rot_bonds = Descriptors.NumRotatableBonds(mol)
# Número de anéis aromáticos
aromatic_rings = Descriptors.NumAromaticRings(mol)
Cálculo de Descritores em Lote:
# Calcule todos os descritores de uma vez
all_descriptors = Descriptors.CalcMolDescriptors(mol)
# Retorna dicionário: {'MolWt': 180.16, 'MolLogP': 1.23, ...}
# Obtenha lista de nomes de descritores disponíveis
descriptor_names = [desc[0] for desc in Descriptors._descList]
Regra de Cinco de Lipinski:
# Verifique similaridade com droga
mw = Descriptors.MolWt(mol) <= 500
logp = Descriptors.MolLogP(mol) <= 5
hbd = Descriptors.NumHDonors(mol) <= 5
hba = Descriptors.NumHAcceptors(mol) <= 10
is_drug_like = mw and logp and hbd and hba
5. Fingerprints e Similaridade Molecular
Tipos de Fingerprint:
from rdkit.Chem import AllChem, RDKFingerprint
from rdkit.Chem.AtomPairs import Pairs, Torsions
from rdkit.Chem import MACCSkeys
# Fingerprint topológico RDKit
fp = Chem.RDKFingerprint(mol)
# Fingerprints Morgan (fingerprints circulares, similares a ECFP)
fp = AllChem.GetMorganFingerprint(mol, radius=2)
fp_bits = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, nBits=2048)
# Chaves MACCS (chave estrutural de 166 bits)
fp = MACCSkeys.GenMACCSKeys(mol)
# Fingerprints de pares de átomos
fp = Pairs.GetAtomPairFingerprint(mol)
# Fingerprints de torção topológica
fp = Torsions.GetTopologicalTorsionFingerprint(mol)
# Fingerprints Avalon (se disponível)
from rdkit.Avalon import pyAvalonTools
fp = pyAvalonTools.GetAvalonFP(mol)
Cálculo de Similaridade:
from rdkit import DataStructs
# Calcule similaridade de Tanimoto
fp1 = AllChem.GetMorganFingerprintAsBitVect(mol1, radius=2)
fp2 = AllChem.GetMorganFingerprintAsBitVect(mol2, radius=2)
similarity = DataStructs.TanimotoSimilarity(fp1, fp2)
# Calcule similaridade para múltiplas moléculas
similarities = DataStructs.BulkTanimotoSimilarity(fp1, [fp2, fp3, fp4])
# Outras métricas de similaridade
dice = DataStructs.DiceSimilarity(fp1, fp2)
cosine = DataStructs.CosineSimilarity(fp1, fp2)
Clustering e Diversidade:
# Clustering de Butina baseado em similaridade de fingerprint
from rdkit.ML.Cluster import Butina
# Calcule matriz de distância
dists = []
fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 2) for mol in mols]
for i in range(len(fps)):
sims = DataStructs.BulkTanimotoSimilarity(fps[i], fps[:i])
dists.extend([1-sim for sim in sims])
# Agrupe com limiar de distância
clusters = Butina.ClusterData(dists, len(fps), distThresh=0.3, isDistData=True)
6. Busca de Subestruturas e SMARTS
Correspondência Básica de Subestruturas:
# Defina query usando SMARTS
query = Chem.MolFromSmarts('[#6]1:[#6]:[#6]:[#6]:[#6]:[#6]:1') # Anel benzeno
# Verifique se molécula contém subestrutura
has_match = mol.HasSubstructMatch(query)
# Obtenha todas as correspondências (retorna tupla de tuplas com índices de átomos)
matches = mol.GetSubstructMatches(query)
# Obtenha apenas primeira correspondência
match = mol.GetSubstructMatch(query)
Padrões SMARTS Comuns:
# Álcoois primários
primary_alcohol = Chem.MolFromSmarts('[CH2][OH1]')
# Ácidos carboxílicos
carboxylic_acid = Chem.MolFromSmarts('C(=O)[OH]')
# Amidas
amide = Chem.MolFromSmarts('C(=O)N')
# Heterociclos aromáticos
aromatic_n = Chem.MolFromSmarts('[nR]') # Nitrogênio aromático em anel
# Macrociclos (anéis > 12 átomos)
macrocycle = Chem.MolFromSmarts('[r{12-}]')
Regras de Correspondência:
- Propriedades não especificadas em query correspondem a qualquer valor em target
- Hidrogênios são ignorados a menos que explicitamente especificados
- Átomo query carregado não corresponde a átomo target descarregado
- Átomo query aromático não corresponde a átomo target alifático (a menos que query seja genérica)
7. Reações Químicas
SMARTS de Reação:
from rdkit.Chem import AllChem
# Defina reação usando SMARTS: reagentes >> produtos
rxn = AllChem.ReactionFromSmarts('[C:1]=[O:2]>>[C:1][O:2]') # Redução de cetona
# Aplique reação a moléculas
reactants = (mol1,)
products = rxn.RunReactants(reactants)
# Produtos é tupla de tuplas (uma tupla por conjunto de produtos)
for product_set in products:
for product in product_set:
# Sanitize produto
Chem.SanitizeMol(product)
Características de Reação:
- Mapeamento de átomos preserva átomos específicos entre reagentes e produtos
- Átomos dummy em produtos são substituídos por átomos correspondentes de reagentes
- Ligações "any" herdam ordem de ligação de reagentes
- Quiralidade preservada a menos que explicitamente alterada
Similaridade de Reação:
# Gere fingerprints de reação
fp = AllChem.CreateDifferenceFingerprintForReaction(rxn)
# Compare reações
similarity = DataStructs.TanimotoSimilarity(fp1, fp2)
8. Geração de Coordenadas 2D e 3D
Geração de Coordenadas 2D:
from rdkit.Chem import AllChem
# Gere coordenadas 2D para representação
AllChem.Compute2DCoords(mol)
# Alinhe molécula a estrutura modelo
template = Chem.MolFromSmiles('c1ccccc1')
AllChem.Compute2DCoords(template)
AllChem.GenerateDepictionMatching2DStructure(mol, template)
Geração de Coordenadas 3D e Conformadores:
# Gere conformador 3D único usando ETKDG
AllChem.EmbedMolecule(mol, randomSeed=42)
# Gere múltiplos conformadores
conf_ids = AllChem.EmbedMultipleConfs(mol, numConfs=10, randomSeed=42)
# Otimize geometria com campo de força
AllChem.UFFOptimizeMolecule(mol) # Campo de força UFF
AllChem.MMFFOptimizeMolecule(mol) # Campo de força MMFF94
# Otimize todos os conformadores
for conf_id in conf_ids:
AllChem.MMFFOptimizeMolecule(mol, confId=conf_id)
# Calcule RMSD entre conformadores
from rdkit.Chem import AllChem
rms = AllChem.GetConformerRMS(mol, conf_id1, conf_id2)
# Alinhe moléculas
AllChem.AlignMol(probe_mol, ref_mol)
Embedding Constrangido:
# Embed com parte de molécula constrangida a coordenadas específicas
AllChem.ConstrainedEmbed(mol, core_mol)
9. Visualização Molecular
Desenho Básico:
from rdkit.Chem import Draw
# Desenhe molécula única para imagem PIL
img = Draw.MolToImage(mol, size=(300, 300))
img.save('molecule.png')
# Desenhe diretamente para arquivo
Draw.MolToFile(mol, 'molecule.png')
# Desenhe múltiplas moléculas em grade
mols = [mol1, mol2, mol3, mol4]
img = Draw.MolsToGridImage(mols, molsPerRow=2, subImgSize=(200, 200))
Destacando Subestruturas:
# Destaque correspondência de subestrutura
query = Chem.MolFromSmarts('c1ccccc1')
match = mol.GetSubstructMatch(query)
img = Draw.MolToImage(mol, highlightAtoms=match)
# Cores de destaque customizadas
highlight_colors = {atom_idx: (1, 0, 0) for atom_idx in match} # Vermelho
img = Draw.MolToImage(mol, highlightAtoms=match,
highlightAtomColors=highlight_colors)
Customizando Visualização:
from rdkit.Chem.Draw import rdMolDraw2D
# Crie drawer com opções customizadas
drawer = rdMolDraw2D.MolDraw2DCairo(300, 300)
opts = drawer.drawOptions()
# Customize opções
opts.addAtomIndices = True
opts.addStereoAnnotation = True
opts.bondLineWidth = 2
# Desenhe molécula
drawer.DrawMolecule(mol)
drawer.FinishDrawing()
# Salve em arquivo
with open('molecule.png', 'wb') as f:
f.write(drawer.GetDrawingText())
Integração com Jupyter Notebook:
# Habilite exibição inline em Jupyter
from rdkit.Chem.Draw import IPythonConsole
# Customize exibição padrão
IPythonConsole.ipython_useSVG = True # Use SVG em vez de PNG
IPythonConsole.molSize = (300, 300) # Tamanho padrão
# Moléculas agora exibem automaticamente
mol # Mostra imagem de molécula
Visualizando Bits de Fingerprint:
# Mostre que características moleculares um bit de fingerprint representa
from rdkit.Chem import Draw
# Para fingerprints Morgan
bit_info = {}
fp = AllChem.GetMorganFingerprintAsBitVect(mol, radius=2, bitInfo=bit_info)
# Desenhe ambiente para bit específico
img = Draw.DrawMorganBit(mol, bit_id, bit_info)
10. Modificação Molecular
Adicionando/Removendo Hidrogênios:
# Adicione hidrogênios explícitos
mol_h = Chem.AddHs(mol)
# Remova hidrogênios explícitos
mol = Chem.RemoveHs(mol_h)
Kekulização e Aromaticidade:
# Converta ligações aromáticas em alternância simples/dupla
Chem.Kekulize(mol)
# Configure aromaticidade
Chem.SetAromaticity(mol)
Substituindo Subestruturas:
# Substitua subestrutura por outra estrutura
query = Chem.MolFromSmarts('c1ccccc1') # Benzeno
replacement = Chem.MolFromSmiles('C1CCCCC1') # Ciclohexano
new_mol = Chem.ReplaceSubstructs(mol, query, replacement)[0]
Neutralizando Cargas:
# Remova cargas formais adicionando/removendo hidrogênios
from rdkit.Chem.MolStandardize import rdMolStandardize
# Usando Uncharger
uncharger = rdMolStandardize.Uncharger()
mol_neutral = uncharger.uncharge(mol)
11. Trabalhando com Hashes Moleculares e Padronização
Hashing Molecular:
from rdkit.Chem import rdMolHash
# Gere hash do scaffold de Murcko
scaffold_hash = rdMolHash.MolHash(mol, rdMolHash.HashFunction.MurckoScaffold)
# Hash de SMILES canônico
canonical_hash = rdMolHash.MolHash(mol, rdMolHash.HashFunction.CanonicalSmiles)
# Hash de regioisômero (ignora estereoquímica)
regio_hash = rdMolHash.MolHash(mol, rdMolHash.HashFunction.Regioisomer)
SMILES Randomizado:
# Gere representações SMILES aleatórias (para aumento de dados)
from rdkit.Chem import MolToRandomSmilesVect
random_smiles = MolToRandomSmilesVect(mol, numSmiles=10, randomSeed=42)
12. Características Farmacofóricas e 3D
Características Farmacofóricas:
from rdkit.Chem import ChemicalFeatures
from rdkit import RDConfig
import os
# Carregue fábrica de características
fdef_path = os.path.join(RDConfig.RDDataDir, 'BaseFeatures.fdef')
factory = ChemicalFeatures.BuildFeatureFactory(fdef_path)
# Obtenha características farmacofóricas
features = factory.GetFeaturesForMol(mol)
for feat in features:
print(feat.GetFamily(), feat.GetType(), feat.GetAtomIds())
Fluxos de Trabalho Comuns
Análise de Similaridade com Medicamentos
from rdkit import Chem
from rdkit.Chem import Descriptors
def analyze_druglikeness(smiles):
mol = Chem.MolFromSmiles(smiles)
if mol is None:
return None
# Calcule descritores de Lipinski
results = {
'MW': Descriptors.MolWt(mol),
'LogP': Descriptors.MolLogP(mol),
'HBD': Descriptors.NumHDonors(mol),
'HBA': Descriptors.NumHAcceptors(mol),
'TPSA': Descriptors.TPSA(mol),
'RotBonds': Descriptors.NumRotatableBonds(mol)
}
# Verifique Regra de Cinco de Lipinski
results['Lipinski'] = (
results['MW'] <= 500 and
results['LogP'] <= 5 and
results['HBD'] <= 5 and
results['HBA'] <= 10
)
return results
Triagem de Similaridade
from rdkit import Chem
from rdkit.Chem import AllChem
from rdkit import DataStructs
def similarity_screen(query_smiles, database_smiles, threshold=0.7):
query_mol = Chem.MolFromSmiles(query_smiles)
query_fp = AllChem.GetMorganFingerprintAsBitVect(query_mol, 2)
hits = []
for idx, smiles in enumerate(database_smiles):
mol = Chem.MolFromSmiles(smiles)
if mol:
fp = AllChem.GetMorganFingerprintAsBitVect(mol, 2)
sim = DataStructs.TanimotoSimilarity(query_fp, fp)
if sim >= threshold:
hits.append((idx, smiles, sim))
return sorted(hits, key=lambda x: x[2], reverse=True)
Filtragem por Subestrutura
from rdkit import Chem
def filter_by_substructure(smiles_list, pattern_smarts):
query = Chem.MolFromSmarts(pattern_smarts)
hits = []
for smiles in smiles_list:
mol = Chem.MolFromSmiles(smiles)
if mol and mol.HasSubstructMatch(query):
hits.append(smiles)
return hits
Melhores Práticas
Tratamento de Erros
Sempre verifique se há None ao analisar moléculas:
mol = Chem.MolFromSmiles(smiles)
if mol is None:
print(f"Falha ao analisar: {smiles}")
continue
Otimização de Performance
Use formatos binários para armazenamento:
import pickle
# Pickle moléculas para carregamento rápido
with open('molecules.pkl', 'wb') as f:
pickle.dump(mols, f)
# Carregue moléculas pickled (muito mais rápido que reanalisar)
with open('molecules.pkl', 'rb') as f:
mols = pickle.load(f)
Use operações em lote:
# Calcule fingerprints para todas as moléculas de uma vez
fps = [AllChem.GetMorganFingerprintAsBitVect(mol, 2) for mol in mols]
# Use cálculos de similaridade em lote
similarities = DataStructs.BulkTanimotoSimilarity(fps[0], fps[1:])
Segurança em Thread
Operações RDKit são geralmente thread-safe para:
- I/O molecular (SMILES, blocos mol)
- Geração de coordenadas
- Fingerprinting e descritores
- Busca de subestruturas
- Reações
- Desenho
Não thread-safe: MolSuppliers quando acessados concorrentemente.
Gerenciamento de Memória
Para grandes conjuntos de dados:
# Use ForwardSDMolSupplier para evitar carregar arquivo inteiro
with open('large.sdf') as f:
suppl = Chem.ForwardSDMolSupplier(f)
for mol in suppl:
# Processe uma molécula por vez
pass
# Use MultithreadedSDMolSupplier para processamento paralelo
suppl = Chem.MultithreadedSDMolSupplier('large.sdf', numWriterThreads=4)
Armadilhas Comuns
- Esquecer de verificar se há None: Sempre valide moléculas após análise
- Falhas de sanitização: Use
DetectChemistryProblems()para depurar - Hidrogênios faltando: Use
AddHs()ao calcular propriedades que dependem de hidrogênio - 2D vs 3D: Gere coordenadas apropriadas antes de visualização ou análise 3D
- Regras de correspondência SMARTS: Lembre-se que propriedades não especificadas correspondem a qualquer coisa
- Segurança em thread com MolSuppliers: Não compartilhe objetos supplier entre threads
Recursos
references/
Esta habilidade inclui documentação de referência de API detalhada:
api_reference.md- Listagem abrangente de módulos, funções e classes RDKit organizadas por funcionalidadedescriptors_reference.md- Lista completa de descritores moleculares disponíveis com descriçõessmarts_patterns.md- Padrões SMARTS comuns para grupos funcionais e características estruturais
Carregue estas referências ao precisar de detalhes de API específicos, informações de parâmetros ou exemplos de padrões.
scripts/
Scripts de exemplo para fluxos de trabalho RDKit comuns:
molecular_properties.py- Calcule propriedades moleculares abrangentes e descritoressimilarity_search.py- Realize triagem de similaridade baseada em fingerprintsubstructure_filter.py- Filtre moléculas por padrões de subestrutura
Estes scripts podem ser executados diretamente ou usados como templates para fluxos de trabalho customizados.