Kit de ferramentas de quiminformática para controle molecular refinado. Análise de SMILES/SDF, descritores (MW, LogP, TPSA), fingerprints, busca de subestruturas, geração 2D/3D, similaridade, reações. Para fluxos de trabalho padrão com interface mais simples, use datamol (wrapper do RDKit). Use rdkit para controle avançado, sanitização customizada, algoritmos especializados.
Scanned 9/8/2026
Install to Claude Code
npx -y skills add artubss/SKILLS-CLAUDE-CODE --skill rdkit --agent claude-codeInstalls into .claude/skills of the current project.
Are you the author of Rdkit?
Add the live security badge to your README — it updates automatically with every re-scan.
[](https://www.skillsdirectory.com/skills/artubss-rdkit)More formats (shields.io, HTML) on the badges page.
---
name: rdkit
description: "Kit de ferramentas de quiminformática para controle molecular refinado. Análise de SMILES/SDF, descritores (MW, LogP, TPSA), fingerprints, busca de subestruturas, geração 2D/3D, similaridade, reações. Para fluxos de trabalho padrão com interface mais simples, use datamol (wrapper do RDKit). Use rdkit para controle avançado, sanitização customizada, algoritmos especializados."
---
# 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:
```python
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:
```python
# 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:
```python
# 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*` retornam `None` em caso de falha com mensagens de erro
- Sempre verifique se há `None` antes 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:**
```python
# 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:**
```python
# 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:**
```python
# 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:**
```python
# 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:**
```python
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:**
```python
# 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:**
```python
# 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:**
```python
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:**
```python
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:**
```python
# 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:**
```python
# 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:**
```python
# Á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:**
```python
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:**
```python
# 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:**
```python
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:**
```python
# 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:**
```python
# Embed com parte de molécula constrangida a coordenadas específicas
AllChem.ConstrainedEmbed(mol, core_mol)
```
### 9. Visualização Molecular
**Desenho Básico:**
```python
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:**
```python
# 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:**
```python
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:**
```python
# 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:**
```python
# 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:**
```python
# Adicione hidrogênios explícitos
mol_h = Chem.AddHs(mol)
# Remova hidrogênios explícitos
mol = Chem.RemoveHs(mol_h)
```
**Kekulização e Aromaticidade:**
```python
# Converta ligações aromáticas em alternância simples/dupla
Chem.Kekulize(mol)
# Configure aromaticidade
Chem.SetAromaticity(mol)
```
**Substituindo Subestruturas:**
```python
# 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:**
```python
# 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:**
```python
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:**
```python
# 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:**
```python
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
```python
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
```python
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
```python
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:
```python
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:**
```python
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:**
```python
# 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:
```python
# 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
1. **Esquecer de verificar se há None:** Sempre valide moléculas após análise
2. **Falhas de sanitização:** Use `DetectChemistryProblems()` para depurar
3. **Hidrogênios faltando:** Use `AddHs()` ao calcular propriedades que dependem de hidrogênio
4. **2D vs 3D:** Gere coordenadas apropriadas antes de visualização ou análise 3D
5. **Regras de correspondência SMARTS:** Lembre-se que propriedades não especificadas correspondem a qualquer coisa
6. **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 funcionalidade
- `descriptors_reference.md` - Lista completa de descritores moleculares disponíveis com descrições
- `smarts_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 descritores
- `similarity_search.py` - Realize triagem de similaridade baseada em fingerprint
- `substructure_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.Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.
No comments yet. Be the first to comment!