Ejemplo n.º 1
0
 def graph(self, m):
     from rdkit.Chem import EditableMol, Atom, rdchem
     hcount = m.GetNumAtoms(False) - m.GetNumAtoms(True)
     # create new molecule using single bonds only
     em = EditableMol(Mol())
     nbridx = [None] * m.GetNumAtoms()
     iatom = 0
     for atom in m.GetAtoms():
         atnum = atom.GetAtomicNum()
         if atnum == 1 and atom.GetIsotope() == 1:
             #if atom.GetMass() > 1: pass
             hcount += 1
         else:
             newatom = Atom(atnum)
             #if atom.GetTotalDegree() == 0: newatom.SetNoImplicit(True) # otherwise [Na]. becomes [NaH].
             #newatom.SetFormalCharge(atom.GetFormalCharge())
             newatom.SetFormalCharge(0)
             em.AddAtom(newatom)
             aidx = atom.GetIdx()
             nbridx[aidx] = iatom
             iatom += 1
             for a2 in atom.GetNeighbors():
                 a2idx = nbridx[a2.GetIdx()]
                 if a2idx != None:
                     em.AddBond(aidx, a2idx, rdchem.BondType.SINGLE)
     #cansmi = self.cansmiles(em.GetMol())
     cansmi = MolToSmiles(m, isomericSmiles=True)
     #cansmi = cansmi.replace('+','').replace('-','').replace('[N]','N').replace('[O]','O').replace('[C]','C').replace('[I]','I').replace('[S]','S').replace('[P]','P').replace('[B]','B').replace('[Br]','Br').replace('[Cl]','Cl')
     return "%s%s%d%+d" % (cansmi, ' H', hcount, GetFormalCharge(m))
Ejemplo n.º 2
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.º 3
0
def decode(v):
    """Decode a molvector into a molecule

     :param v: molvector
     :result rdkit.RWMol:
    """
    chunksize = atom_size + bond_chunk_size
    nchunks = len(v) // chunksize
    m = RWMol()

    bonds = {}

    for i in range(nchunks):
        start = i * (atom_size + bond_chunk_size)

        el, c, h, b1, o1, b2, o2, b3, o3, b4, o4 = v[start:start + chunksize]

        atom = Atom(el)
        atom.SetFormalCharge(c)
        atom.SetNumExplicitHs(h)
        atom_idx = m.AddAtom(atom)
        assert atom_idx == i

        for b, o in ((b1, o1), (b2, o2), (b3, o3), (b4, o4)):
            if o:
                to_atom = atom_idx + o
                bonds[tuple(sorted((atom_idx, to_atom)))] = b

    for (a1, a2), btype in bonds.items():
        try:
            m.AddBond(a1 % m.GetNumAtoms(), a2 % m.GetNumAtoms(),
                      BondType.values[btype])
        except:
            pass
    return m
Ejemplo n.º 4
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.º 5
0
def set_atom_feat(a: Atom, key: str, val: int):
    if key == 'atomic_num':
        a.SetAtomicNum(val)
    elif key == 'formal_charge':
        a.SetFormalCharge(val)
    elif key == 'chiral_tag':
        a_chiral = rdchem.ChiralType.values[val]
        a.SetChiralTag(a_chiral)
    elif key == 'num_explicit_hs':
        a.SetNumExplicitHs(val)
    elif key == 'is_aromatic':
        a.SetIsAromatic(bool(val))
    return a
Ejemplo n.º 6
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