def __init__(self, smiles): DGLGraph.__init__(self) self.nodes_dict = {} if smiles is None: return self.smiles = smiles self.mol = get_mol(smiles) mol = Chem.MolFromSmiles(smiles) self.smiles3D = Chem.MolToSmiles(mol, isomericSmiles=True) self.smiles2D = Chem.MolToSmiles(mol) self.stereo_cands = decode_stereo(self.smiles2D) cliques, edges = tree_decomp(self.mol) root = 0 for i, c in enumerate(cliques): cmol = get_clique_mol(self.mol, c) csmiles = get_smiles(cmol) self.nodes_dict[i] = dict( smiles=csmiles, mol=get_mol(csmiles), clique=c, ) if min(c) == 0: root = i self.add_nodes(len(cliques)) if root > 0: for attr in self.nodes_dict[0]: self.nodes_dict[0][attr], self.nodes_dict[root][attr] = \ self.nodes_dict[root][attr], self.nodes_dict[0][attr] src = np.zeros((len(edges) * 2, ), dtype='int') dst = np.zeros((len(edges) * 2, ), dtype='int') for i, (_x, _y) in enumerate(edges): x = 0 if _x == root else root if _x == 0 else _x y = 0 if _y == root else root if _y == 0 else _y src[2 * i] = x dst[2 * i] = y src[2 * i + 1] = y dst[2 * i + 1] = x self.add_edges(src, dst) for i in self.nodes_dict: self.nodes_dict[i]['nid'] = i + 1 if self.out_degree(i) > 1: set_atommap(self.nodes_dict[i]['mol'], self.nodes_dict[i]['nid']) self.nodes_dict[i]['is_leaf'] = (self.out_degree(i) == 1)
def __init__(self, smiles): self.smiles = smiles self.mol = get_mol(smiles) #Stereo Generation mol = Chem.MolFromSmiles(smiles) self.smiles3D = Chem.MolToSmiles(mol, isomericSmiles=True) self.smiles2D = Chem.MolToSmiles(mol) self.stereo_cands = decode_stereo(self.smiles2D) cliques, edges = tree_decomp(self.mol) self.nodes = [] root = 0 for i, c in enumerate(cliques): cmol = get_clique_mol(self.mol, c) node = MolTreeNode(get_smiles(cmol), c) self.nodes.append(node) if min(c) == 0: root = i for x, y in edges: self.nodes[x].add_neighbor(self.nodes[y]) self.nodes[y].add_neighbor(self.nodes[x]) if root > 0: self.nodes[0], self.nodes[root] = self.nodes[root], self.nodes[0] for i, node in enumerate(self.nodes): node.nid = i + 1 if len(node.neighbors) > 1: #Leaf node mol is not marked set_atommap(node.mol, node.nid) node.is_leaf = (len(node.neighbors) == 1)
def recover(self, original_mol): clique = [] clique.extend(self.clique) if not self.is_leaf: for cidx in self.clique: original_mol.GetAtomWithIdx(cidx).SetAtomMapNum(self.nid) for nei_node in self.neighbors: clique.extend(nei_node.clique) if nei_node.is_leaf: #Leaf node, no need to mark continue for cidx in nei_node.clique: #allow singleton node override the atom mapping if cidx not in self.clique or len(nei_node.clique) == 1: atom = original_mol.GetAtomWithIdx(cidx) atom.SetAtomMapNum(nei_node.nid) clique = list(set(clique)) label_mol = get_clique_mol(original_mol, clique) self.label = Chem.MolToSmiles(Chem.MolFromSmiles( get_smiles(label_mol))) self.label_mol = get_mol(self.label) for cidx in clique: original_mol.GetAtomWithIdx(cidx).SetAtomMapNum(0) return self.label
def __init__(self, smiles, clique=[]): self.smiles = smiles self.mol = get_mol(self.smiles) self.clique = [x for x in clique] # copy self.neighbors = [] self.neighbor_bonds = []
def _recover_node(self, i, original_mol): node = self.nodes_dict[i] clique = [] clique.extend(node['clique']) if not node['is_leaf']: for cidx in node['clique']: original_mol.GetAtomWithIdx(cidx).SetAtomMapNum(node['nid']) for j in self.successors(i).numpy(): nei_node = self.nodes_dict[j] clique.extend(nei_node['clique']) if nei_node['is_leaf']: continue for cidx in nei_node['clique']: if cidx not in node['clique'] or len(nei_node['clique']) == 1: atom = original_mol.GetAtomWithIdx(cidx) atom.SetAtomMapNum(nei_node['nid']) clique = list(set(clique)) label_mol = get_clique_mol(original_mol, clique) node['label'] = Chem.MolToSmiles( Chem.MolFromSmiles(get_smiles(label_mol))) node['label_mol'] = get_mol(node['label']) for cidx in clique: original_mol.GetAtomWithIdx(cidx).SetAtomMapNum(0) return node['label']
def __init__(self, smiles): self.smiles = smiles self.mol = get_mol(smiles) self.mol_graph = self.build_mol_graph() self.cliques, self.edges = tree_decomp(self.mol) self.mol_tree = self.build_mol_tree() self.order = [] self.set_anchor()
def mol2graph(mol_batch): padding = torch.zeros(ATOM_FDIM + BOND_FDIM) fatoms, fbonds = [], [padding] #Ensure bond is 1-indexed in_bonds, all_bonds = [], [(-1, -1)] #Ensure bond is 1-indexed scope = [] total_atoms = 0 #print("bu batchdekiler") for smiles in mol_batch: mol = get_mol(smiles) #print(smiles) #mol = Chem.MolFromSmiles(smiles) n_atoms = mol.GetNumAtoms() for atom in mol.GetAtoms(): fatoms.append(atom_features(atom)) in_bonds.append([]) for bond in mol.GetBonds(): a1 = bond.GetBeginAtom() a2 = bond.GetEndAtom() x = a1.GetIdx() + total_atoms y = a2.GetIdx() + total_atoms b = len(all_bonds) all_bonds.append((x, y)) fbonds.append(torch.cat([fatoms[x], bond_features(bond)], 0)) in_bonds[y].append(b) b = len(all_bonds) all_bonds.append((y, x)) fbonds.append(torch.cat([fatoms[y], bond_features(bond)], 0)) in_bonds[x].append(b) scope.append((total_atoms, n_atoms)) total_atoms += n_atoms total_bonds = len(all_bonds) fatoms = torch.stack(fatoms, 0) fbonds = torch.stack(fbonds, 0) agraph = torch.zeros(total_atoms, MAX_NB).long() bgraph = torch.zeros(total_bonds, MAX_NB).long() for a in range(total_atoms): for i, b in enumerate(in_bonds[a]): agraph[a, i] = b for b1 in range(1, total_bonds): x, y = all_bonds[b1] for i, b2 in enumerate(in_bonds[x]): if all_bonds[b2][0] != y: bgraph[b1, i] = b2 return fatoms, fbonds, agraph, bgraph, scope
def __init__(self, smiles, clique=None): if clique is None: clique = [] self.smiles = smiles self.mol = get_mol(self.smiles) self.clique = [x for x in clique] # copy self.neighbors = [] self.is_leaf = None self.nid = None self.label = None self.label_mol = None self.cands = None self.cand_mols = None self.idx = None self.wid = None
def __init__(self, smiles): self.smiles = smiles self.mol = get_mol(smiles) # Stereo Generation mol = Chem.MolFromSmiles(smiles) self.smiles3D = Chem.MolToSmiles(mol, isomericSmiles=True) self.smiles2D = Chem.MolToSmiles(mol) self.stereo_cands = decode_stereo(self.smiles2D) self.node_pair2bond = {} cliques, edges = tree_decomp(self.mol) self.nodes = [] root = 0 for i, c in enumerate(cliques): cmol = get_clique_mol(self.mol, c) node = MolTreeNode(get_smiles(cmol), c) self.nodes.append(node) if min(c) == 0: root = i self.n_edges = 0 self.n_virtual_edges = 0 for x, y in edges: self.nodes[x].add_neighbor(self.nodes[y]) self.nodes[y].add_neighbor(self.nodes[x]) xy_bond = self.nodes[x].add_neighbor_bond(self.nodes[y], self.mol) yx_bond = self.nodes[y].add_neighbor_bond(self.nodes[x], self.mol) self.node_pair2bond[(x, y)] = xy_bond self.node_pair2bond[(y, x)] = yx_bond if isinstance(xy_bond, RDKitBond) or isinstance( yx_bond, RDKitBond): self.n_virtual_edges += 1 self.n_edges += 1 # change if root > 0: self.nodes[0], self.nodes[root] = self.nodes[root], self.nodes[0] for i, node in enumerate(self.nodes): node.nid = i + 1 if len(node.neighbors) > 1: # Leaf node mol is not marked set_atommap(node.mol, node.nid) node.is_leaf = (len(node.neighbors) == 1)