def num_bond_in_ring(mol: Chem.rdchem.Mol): """ Check the number of the bonds that are in the ring, count vector. """ count = 0 n_atoms = mol.GetNumAtoms() for a1 in range(n_atoms): for a2 in range(a1 + 1, n_atoms): bond = mol.GetBondBetweenAtoms(a1, a2) if bond is None: continue elif bond.IsInRing(): count += 1 return [count]
def trim_side_chain(mol: Chem.rdchem.Mol, core, unwanted_side_chains): """Trim list of side chain from a molecule.""" mol = Chem.AddHs(mol) match = mol.GetSubstructMatch(core) map2idx = {} map2nei = {} unwanted2map = {} for patt in unwanted_side_chains: unwanted2map[patt] = [ a.GetAtomMapNum() for a in patt.GetAtoms() if a.GetAtomMapNum() ] unwanted_mapping = list( itertools.chain.from_iterable(unwanted2map.values())) for atom in core.GetAtoms(): num = atom.GetAtomMapNum() if num and num in unwanted_mapping: mol_atom_idx = match[atom.GetIdx()] map2idx[mol_atom_idx] = num nei_atoms = mol.GetAtomWithIdx(mol_atom_idx).GetNeighbors() map2nei[mol_atom_idx] = [ n.GetIdx() for n in nei_atoms if n.GetIdx() in match ] emol = Chem.EditableMol(mol) for atom_idx, atom_map in map2idx.items(): dummy = Chem.rdchem.Atom("*") dummy.SetAtomMapNum(atom_map) nei_idx = map2nei.get(atom_idx, [None])[0] if nei_idx: bond = mol.GetBondBetweenAtoms(atom_idx, nei_idx) emol.RemoveBond(atom_idx, nei_idx) new_ind = emol.AddAtom(dummy) emol.AddBond(nei_idx, new_ind, bond.GetBondType()) mol = emol.GetMol() mol = Chem.RemoveHs(mol) query_param = AdjustQueryParameters() query_param.makeDummiesQueries = False query_param.adjustDegree = False query_param.aromatizeIfPossible = True for patt, _ in unwanted2map.items(): cur_frag = dm.fix_mol(patt) mol = Chem.DeleteSubstructs(mol, cur_frag, onlyFrags=True) return dm.keep_largest_fragment(mol)