Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
 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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
 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)
Ejemplo n.º 6
0
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
Ejemplo n.º 7
0
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
Ejemplo n.º 8
0
    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
Ejemplo n.º 9
0
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
Ejemplo n.º 10
0
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())
Ejemplo n.º 11
0
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