11import _ from "lodash" ;
2- import { MultiDirectedGraph } from "graphology " ;
2+ import { GraphEdge , GraphNode , ScaffoldGraph } from "../../types/GraphData " ;
33
44function colorOfEdge ( edge : string ) {
5- if ( edge === "Fragment" ) {
6- return "#99ccff" ; // Muted Blue
7- } else if ( edge === "Generic" ) {
8- return "#ff9999" ; // Muted Red
9- } else if ( edge === "GenericBond" ) {
10- return "#99ff99" ; // Muted Green
11- } else if ( edge === "RemoveAttachment" ) {
12- return "#666666" ; // Dark Gray
13- } else {
14- return "#cccc66" ; // Muted Yellow
15- }
5+ if ( edge === "Fragment" ) return "#99ccff" ;
6+ if ( edge === "Generic" ) return "#ff9999" ;
7+ if ( edge === "GenericBond" ) return "#99ff99" ;
8+ if ( edge === "RemoveAttachment" ) return "#666666" ;
9+ return "#cccc66" ;
1610}
1711
18-
1912export function molListFromSmiArray ( smiArray , rdkit ) {
2013 const molList = new rdkit . MolList ( ) ;
2114 smiArray . forEach ( ( smiName ) => {
@@ -38,8 +31,9 @@ export function scaffold_net_chunking_method(
3831 params ,
3932) {
4033 var scaffold_net_ins = new rdkit . ScaffoldNetwork ( ) ;
41- scaffold_net_ins . set_scaffold_params ( JSON . stringify ( params ) )
34+ scaffold_net_ins . set_scaffold_params ( JSON . stringify ( params ) ) ;
4235 let network ;
36+
4337 for ( let i = 0 ; i < array . length ; i += chunkSize ) {
4438 let smiles_mol_list ;
4539 try {
@@ -54,69 +48,77 @@ export function scaffold_net_chunking_method(
5448 smiles_mol_list ?. delete ( ) ;
5549 }
5650 }
57-
5851 scaffold_net_ins ?. delete ( ) ;
59- var graph = new MultiDirectedGraph ( ) ;
60-
52+
53+ // Return plain object instead of graphology Graph
54+ const nodes : GraphNode [ ] = [ ] ;
6155 for ( let i = 0 ; i < network . nodes . size ( ) ; i ++ ) {
6256 try {
6357 var smiles_string = network . nodes . get ( i ) ;
64- graph . addNode ( i . toString ( ) , {
65- molCounts : network . molCounts . get ( i ) ,
58+ nodes . push ( {
59+ id : i . toString ( ) ,
6660 smiles : smiles_string ,
61+ molCounts : network . molCounts . get ( i ) ,
6762 nodeType : array . includes ( smiles_string ) ? "whole" : "fragment" ,
6863 } ) ;
6964 } catch ( e ) {
70- console . error ( "Error in adding node to graph : " , e ) ;
65+ console . error ( "Error in adding node: " , e ) ;
7166 }
7267 }
68+
69+ const edges : GraphEdge [ ] = [ ] ;
7370 for ( let i = 0 ; i < network . edges . size ( ) ; i ++ ) {
7471 try {
7572 let network_edge = network . edges . get ( i ) ;
76- graph . addEdgeWithKey (
77- i . toString ( ) ,
78- network_edge . beginIdx ,
79- network_edge . endIdx ,
80- {
81- label : network_edge . type ,
82- color : colorOfEdge ( network_edge . type ) ,
83- } ,
84- ) ;
73+ edges . push ( {
74+ id : i . toString ( ) ,
75+ source : network_edge . beginIdx . toString ( ) ,
76+ target : network_edge . endIdx . toString ( ) ,
77+ label : network_edge . type ,
78+ color : colorOfEdge ( network_edge . type ) ,
79+ } ) ;
8580 } catch ( e ) {
86- console . error ( "Error in adding edge to graph : " , e ) ;
81+ console . error ( "Error in adding edge: " , e ) ;
8782 }
8883 }
89-
90- return graph ;
84+
85+ return { nodes , edges } ;
9186}
9287
93- export function graph_molecule_image_generator ( rdkit , graph , svgSize = 120 ) {
94- let new_graph = graph ;
95- try {
96- new_graph . forEachNode ( ( node , attr ) => {
97- var mol = rdkit . get_mol ( attr . smiles ) ;
88+ export function graph_molecule_image_generator ( rdkit , graphData , svgSize = 120 ) {
89+ try {
90+ graphData . nodes . forEach ( ( node ) => {
91+ var mol = rdkit . get_mol ( node . smiles ) ;
9892 var svg_string = mol . get_svg ( svgSize , svgSize ) ;
9993 var blob_link = new Blob ( [ svg_string ] , { type : "image/svg+xml" } ) ;
100- new_graph . setNodeAttribute ( node , ' image' , URL . createObjectURL ( blob_link ) )
94+ node . image = URL . createObjectURL ( blob_link ) ;
10195 mol ?. delete ( ) ;
102- } )
103- } catch ( e ) {
104- console . error ( e )
96+ } ) ;
97+ } catch ( e ) {
98+ console . error ( e ) ;
10599 }
106- return new_graph ;
100+ return graphData ;
101+ }
102+
103+ // Serialize plain object to JSON (works in workers)
104+ export function serializeGraph ( graph : ScaffoldGraph ) {
105+ return JSON . stringify ( graph ) ;
106+ }
107+
108+ // Deserialize from JSON
109+ export function deserializeGraph ( json : string ) : ScaffoldGraph {
110+ return JSON . parse ( json ) ;
107111}
108112
109113export const initRDKit = ( ( ) => {
110114 let rdkitLoadingPromise : Promise < any > ;
111-
112115 return ( ) : Promise < any > => {
113116 if ( ! rdkitLoadingPromise ) {
114117 rdkitLoadingPromise = new Promise ( ( resolve , reject ) => {
115118 const script = document . createElement ( "script" ) ;
116119 script . src = "/rdkit/RDKit_minimal.js" ;
117120 script . async = true ;
118121 document . body . appendChild ( script ) ;
119-
120122 script . addEventListener ( "load" , ( ) => {
121123 globalThis
122124 . initRDKitModule ( )
@@ -129,7 +131,6 @@ export const initRDKit = (() => {
129131 } ) ;
130132 } ) ;
131133 }
132-
133134 return rdkitLoadingPromise ;
134135 } ;
135136} ) ( ) ;
0 commit comments