[docs]defgraph_from_smiles(smiles_or_mol,properties,augmented_features=None,augmented_properties=None):""" Converts SMILES string or RDKit molecule to graph Data object Parameters ---------- smiles_or_mol : Union[str, rdkit.Chem.rdchem.Mol] SMILES string or RDKit molecule object properties : Any Properties to include in the graph augmented_features : list List of augmented features to include augmented_properties : list, optional List of augmented properties to include Returns ------- dict Graph object dictionary """# try:ifisinstance(smiles_or_mol,str):mol=Chem.MolFromSmiles(smiles_or_mol)else:mol=smiles_or_mol# atomsatom_features_list=[]foratominmol.GetAtoms():# print(atom.GetSymbol(), atom_to_feature_vector(atom)[0])atom_features_list.append(atom_to_feature_vector(atom))x=np.array(atom_features_list,dtype=np.int64)# bondsnum_bond_features=3# bond type, bond stereo, is_conjugatediflen(mol.GetBonds())>0:# mol has bondsedges_list=[]edge_features_list=[]forbondinmol.GetBonds():i=bond.GetBeginAtomIdx()j=bond.GetEndAtomIdx()edge_feature=bond_to_feature_vector(bond)# add edges in both directionsedges_list.append((i,j))edge_features_list.append(edge_feature)edges_list.append((j,i))edge_features_list.append(edge_feature)# data.edge_index: Graph connectivity in COO format with shape [2, num_edges]edge_index=np.array(edges_list,dtype=np.int64).T# data.edge_attr: Edge feature matrix with shape [num_edges, num_edge_features]edge_attr=np.array(edge_features_list,dtype=np.int64)else:# mol has no bondsedge_index=np.empty((2,0),dtype=np.int64)edge_attr=np.empty((0,num_bond_features),dtype=np.int64)graph=dict()graph["edge_index"]=edge_indexgraph["edge_feat"]=edge_attrgraph["node_feat"]=xgraph["num_nodes"]=len(x)# Handle properties and augmented propertiesprops_list=[]ifpropertiesisnotNone:props_list.append(np.array(properties,dtype=np.float32))ifaugmented_propertiesisnotNone:aug_props=get_augmented_property(mol,augmented_properties)ifaug_props:props_list.append(np.array(aug_props,dtype=np.float32))ifprops_list:combined_props=np.concatenate(props_list)graph['y']=combined_props.reshape(1,-1)else:graph['y']=np.full((1,1),np.nan,dtype=np.float32)# Handle augmented featuresifaugmented_featuresisnotNone:graph['morgan']=add_fingerprint_feature(mol,'morgan'if'morgan'inaugmented_featureselseNone,getmorganfingerprint)graph['maccs']=add_fingerprint_feature(mol,'maccs'if'maccs'inaugmented_featureselseNone,getmaccsfingerprint)else:graph['morgan']=Nonegraph['maccs']=Nonereturngraph
# except Exception as e:# print(f"Error: {e} during converting {smiles_or_mol} to graph")# return None