| from lynxkite_core.ops import op |
| from lynxkite_graph_analytics.core import Bundle, TableName, ColumnNameByTableName |
| import base64 |
| import io |
|
|
|
|
| def pil_to_data(image): |
| buffer = io.BytesIO() |
| image.save(buffer, format="webp") |
| b64 = base64.b64encode(buffer.getvalue()).decode("utf-8") |
| return "data:image/webp;base64," + b64 |
|
|
|
|
| def smiles_to_data(smiles): |
| import rdkit |
|
|
| m = rdkit.Chem.MolFromSmiles(smiles) |
| if m is None: |
| return None |
| img = rdkit.Chem.Draw.MolToImage(m) |
| data = pil_to_data(img) |
| return data |
|
|
|
|
| @op("LynxKite Graph Analytics", "Draw molecules", icon="microscope-filled") |
| def draw_molecules( |
| b: Bundle, |
| *, |
| table_name: TableName, |
| smiles_column: ColumnNameByTableName, |
| image_column: str = "image", |
| ): |
| """Adds molecule images in a table.""" |
| b = b.copy() |
| df = b.dfs[table_name] |
| df = df.copy() |
| df[image_column] = df[smiles_column].apply(smiles_to_data) |
| b.dfs[table_name] = df |
| return b |
|
|