def to_rdkit_molecule(data): """ MoleculeContainer to RDKit molecule object converter """ mol = RWMol() conf = Conformer() mapping = {} is_3d = False for n, a in data.atoms(): ra = Atom(a.number) ra.SetAtomMapNum(n) if a.charge: ra.SetFormalCharge(a.charge) if a.isotope != a.common_isotope: ra.SetIsotope(a.isotope) if a.radical: ra.SetNumRadicalElectrons(a.radical) mapping[n] = m = mol.AddAtom(ra) conf.SetAtomPosition(m, (a.x, a.y, a.z)) if a.z: is_3d = True if not is_3d: conf.Set3D(False) for n, m, b in data.bonds(): mol.AddBond(mapping[n], mapping[m], _bond_map[b.order]) mol.AddConformer(conf) SanitizeMol(mol) return mol
def to_fmt_obj(self, fmtobj, *args, **kwargs): self.rdkit_mol.RemoveAllConformers() for ii in range(self.get_nframes()): conf = Conformer() for idx in range(self.get_natoms()): conf.SetAtomPosition(idx, self.data["coords"][ii][idx]) self.rdkit_mol.AddConformer(conf, assignId=True) return fmtobj.to_bond_order_system(self.data, self.rdkit_mol, *args, **kwargs)
def get_mol(self, ids=None): pmol = Chem.RWMol() all_coords = self.get_feature_coords(ids=ids) for item in all_coords: a = Chem.Atom(self.__feat_dict_mol[item[0]]) pmol.AddAtom(a) c = Conformer(len(all_coords)) for i, coords in enumerate(all_coords): c.SetAtomPosition(i, Point3D(*coords[1])) pmol.AddConformer(c, True) return pmol
def xyz_to_rdmol(nxyz, smiles): mol = get_mol(smiles) mol = AddHs(mol) num_atoms = len(nxyz) conformer = Conformer(num_atoms) for i, quad in enumerate(nxyz): conformer.SetAtomPosition(i, quad[1:]) mol.AddConformer(conformer) return mol
def conf2xyz(conf: Chem.Conformer, outputname, atom_list: list, comment_line=''): natoms = conf.GetNumAtoms() s = "{}\n{}\n".format(natoms, comment_line) for i in range(natoms): position = conf.GetAtomPosition(i) symbol = atom_list[i] s += "{}\t{:.6} {:.6} {:.6}\n".format(symbol, position.x, position.y, position.z) with open(outputname, 'w') as f: f.write(s)
def to_rdkit_molecule(data): """ MoleculeContainer to RDKit molecule object converter """ mol = RWMol() mapping = {} for n, a in data.atoms(): ra = Atom(a.atomic_number) ra.SetAtomMapNum(n) if a.charge: ra.SetFormalCharge(a.charge) if a.isotope: ra.SetIsotope(a.isotope) if a.is_radical: ra.SetNumRadicalElectrons(1) mapping[n] = mol.AddAtom(ra) for n, m, b in data.bonds(): mol.AddBond(mapping[n], mapping[m], _bond_map[b.order]) conf = Conformer() for n, a in data.atoms(): conf.SetAtomPosition(mapping[n], (a.x, a.y, 0)) conf.Set3D(False) mol.AddConformer(conf) for c in data._conformers: conf = Conformer() for n, xyz in c.items(): conf.SetAtomPosition(mapping[n], xyz) mol.AddConformer(conf) SanitizeMol(mol) return mol
def convert_molecule(molecule): from rdkit.Chem import Mol, EditableMol, Atom, Conformer mol = Mol() emol = EditableMol(mol) conformer = Conformer() atom_map = {} for atom in molecule.atoms: a = Atom(atom.element.number) atom_map[atom] = i = emol.AddAtom(a) conformer.SetAtomPosition(i, atom.coord().data()) for bond in molecule.bonds: a1, a2 = bond.atoms emol.AddBond(atom_map[a1], atom_map[a2]) mol = emol.GetMol() mol.AddConformer(conformer) return mol, atom_map
def get_mol(self, ids=None): """ Returns RDKit Mol object of a pharmacophore where features are replaced with atoms :param ids: iterable with feature ids to be used :type ids: iterable (int) :return: RDKit RWMol """ pmol = Chem.RWMol() all_coords = self.get_feature_coords(ids=ids) for item in all_coords: a = Chem.Atom(self.__feat_dict_mol[item[0]]) pmol.AddAtom(a) c = Conformer(len(all_coords)) for i, coords in enumerate(all_coords): c.SetAtomPosition(i, Point3D(*coords[1])) pmol.AddConformer(c, True) return pmol
def to_rdkit_molecule(data: MoleculeContainer): """ MoleculeContainer to RDKit molecule object converter """ mol = RWMol() mapping = {} bonds = data._bonds for n, a in data.atoms(): ra = Atom(a.atomic_number) ra.SetAtomMapNum(n) if a.charge: ra.SetFormalCharge(a.charge) if a.isotope: ra.SetIsotope(a.isotope) if a.is_radical: ra.SetNumRadicalElectrons(1) mapping[n] = mol.AddAtom(ra) for n, m, b in data.bonds(): mol.AddBond(mapping[n], mapping[m], _bond_map[b.order]) for n in data._atoms_stereo: ra = mol.GetAtomWithIdx(mapping[n]) env = bonds[n] s = data._translate_tetrahedron_sign(n, [x for x in mapping if x in env]) ra.SetChiralTag(_chiral_ccw if s else _chiral_cw) for nm, s in data._cis_trans_stereo.items(): n, m = nm if m in bonds[n]: # cumulenes unsupported nn, nm, *_ = data._stereo_cis_trans[nm] b = mol.GetBondBetweenAtoms(mapping[n], mapping[m]) b.SetStereoAtoms(mapping[nn], mapping[nm]) b.SetStereo(_cis if s else _trans) conf = Conformer() for n, a in data.atoms(): conf.SetAtomPosition(mapping[n], (a.x, a.y, 0)) conf.Set3D(False) mol.AddConformer(conf, assignId=True) for c in data._conformers: conf = Conformer() for n, xyz in c.items(): conf.SetAtomPosition(mapping[n], xyz) mol.AddConformer(conf, assignId=True) SanitizeMol(mol) AssignStereochemistry(mol, flagPossibleStereoCenters=True, force=True) return mol
def check_conformer( mol: Mol, conformer: Conformer, ) -> bool: # throw warnings if # - the conformer is actually 2D (useless Z coordinate in graph) # - some atoms have all-zero coordinates, which implies bad conformer _positions: np.array = conformer.GetPositions() if not _positions[:, 2].any(): _warning_msg = f'Conformer has no Z coordinates. Continuing ...' _LOGGER.warning(_warning_msg) if not np.array([_p.any() for _p in _positions]).all(): _warning_msg = f'Conformer has atom(s) with invalid coordinates ' \ f'(0.0, 0.0, 0.0). Continuing ...' _LOGGER.warning(_warning_msg) # make sure that the molecule and conformer are of the same size return len(mol.GetAtoms()) == len(mol.GetConformer().GetPositions())
def atom_coords(atom: Chem.Atom, conf: Chem.Conformer) -> List[float]: """Returns the x, y, and z coordinates of an atom in a molecule conformer. """ p = conf.GetAtomPosition(atom.GetIdx()) fts = [p.x, p.y, p.z] return fts