File size: 4,216 Bytes
43e7ae4 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 |
"""
Molecular Variations Module
This module handles generation of multiple visualizations
and variations of chemical structures.
"""
from rdkit import Chem
from rdkit.Chem import Draw
def generate_molecule_variations(base_smiles, num_variations=12):
"""Generate multiple variations of a chemical structure for the grid display."""
mol = Chem.MolFromSmiles(base_smiles)
if not mol:
return []
variations = []
# Generate different rendering styles and sizes
sizes = [(150, 150), (180, 180), (200, 200), (160, 160)]
styles = [True, False] # kekulize vs non-kekulize
for i in range(num_variations):
size = sizes[i % len(sizes)]
kekulize = styles[i % len(styles)]
try:
# Create variation with different rendering parameters
img = Draw.MolToImage(mol, size=size, kekulize=kekulize)
variations.append({
'image': img,
'smiles': base_smiles,
'variation_id': i + 1,
'size': size,
'kekulize': kekulize
})
except:
# Fallback to basic rendering
try:
img = Draw.MolToImage(mol, size=(150, 150), kekulize=True)
variations.append({
'image': img,
'smiles': base_smiles,
'variation_id': i + 1,
'size': (150, 150),
'kekulize': True
})
except:
continue
return variations
def generate_chemical_series_variations(base_smiles):
"""Generate a series of related chemical structures for drug discovery."""
mol = Chem.MolFromSmiles(base_smiles)
if not mol:
return []
variations = []
# Create different visualization styles
styles = [
{'size': (200, 200), 'kekulize': True, 'style': 'Standard'},
{'size': (180, 180), 'kekulize': False, 'style': 'Kekulé'},
{'size': (220, 220), 'kekulize': True, 'style': 'Large'},
{'size': (160, 160), 'kekulize': False, 'style': 'Compact'},
{'size': (200, 200), 'kekulize': True, 'style': 'Detailed'},
{'size': (190, 190), 'kekulize': False, 'style': 'Minimal'},
{'size': (210, 210), 'kekulize': True, 'style': 'Enhanced'},
{'size': (170, 170), 'kekulize': False, 'style': 'Focused'},
{'size': (200, 200), 'kekulize': True, 'style': 'Classic'},
{'size': (185, 185), 'kekulize': False, 'style': 'Modern'},
{'size': (195, 195), 'kekulize': True, 'style': 'Scientific'},
{'size': (175, 175), 'kekulize': False, 'style': 'Clean'}
]
for i, style_config in enumerate(styles):
try:
print(f"Generating variation {i+1}: {style_config['style']}")
img = Draw.MolToImage(mol, size=style_config['size'], kekulize=style_config['kekulize'])
print(f"Successfully generated image for {style_config['style']}, type: {type(img)}")
variations.append({
'image': img,
'smiles': base_smiles,
'variation_id': i + 1,
'style': style_config['style'],
'size': style_config['size'],
'kekulize': style_config['kekulize']
})
except Exception as e:
print(f"Failed to generate image for {style_config['style']}: {e}")
continue
return variations
def generate_molecule_images(smiles_list):
"""Generate images for a list of SMILES strings."""
images = []
for smiles in smiles_list:
mol = Chem.MolFromSmiles(smiles)
if mol:
# Create a high-quality image with better rendering
img = Draw.MolToImage(mol, size=(200, 200), kekulize=True)
images.append(img)
else:
# Add a placeholder if SMILES is invalid
try:
from PIL import Image
images.append(Image.new('RGB', (200, 200), color='white'))
except ImportError:
# Fallback if PIL not available
images.append(None)
return images
|