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