Ah, I'm replying too late... sorry about that.
There's a command line utility in rdkit.Chem.ChemUtils.TemplateExpand that
could also be used for this purpose. The big difference is that it uses
isotope labels on the dummy atoms to do the matching.
A style point: you can now create an RWMol (instead of an EditableMol) in
order to get an editable molecule in Python. this would be:
em = Chem.RWMol(new_mol)
instead of
em = EditableMol(new_mol)
The advantage is that you don't need to call GetMol() at the end in order
to end up with a "normal" molecule.
It certainly wouldn't be bad if this were easier. That's maybe something
for the next release.
Best,
-greg
On Mon, Apr 16, 2018 at 5:37 AM, Patrick Walters <wpwalt...@gmail.com>
wrote:
> Thanks Andrew, the SMILES approach seemed to have quite a few edge cases
> so I wrote something to work directly on a molecule.
>
>
> #!/usr/bin/env python
>
> import sys
> from rdkit import Chem
> from collections import defaultdict
> from rdkit.Chem.rdchem import EditableMol
>
>
> # Thanks to steeveslab-blog for example of how to edit RDKit molecules
> # http://asteeves.github.io/blog/2015/01/14/editing-in-rdkit/
> # Thanks to Andrew Dalke for the function name
>
>
> def weld_r_groups(input_mol):
> # First pass loop over atoms and find the atoms with an AtomMapNum
> join_dict = defaultdict(list)
> for atom in input_mol.GetAtoms():
> map_num = atom.GetAtomMapNum()
> if map_num > 0:
> join_dict[map_num].append(atom)
>
> # Second pass, transfer the atom maps to the neighbor atoms
> for idx, atom_list in join_dict.items():
> if len(atom_list) == 2:
> atm_1, atm_2 = atom_list
> nbr_1 = [x.GetOtherAtom(atm_1) for x in atm_1.GetBonds()][0]
> nbr_1.SetAtomMapNum(idx)
> nbr_2 = [x.GetOtherAtom(atm_2) for x in atm_2.GetBonds()][0]
> nbr_2.SetAtomMapNum(idx)
>
> # Nuke all of the dummy atoms
> new_mol = Chem.DeleteSubstructs(input_mol, Chem.MolFromSmarts('[#0]'))
>
> # Third pass - arrange the atoms with AtomMapNum, these will be
> connected
> bond_join_dict = defaultdict(list)
> for atom in new_mol.GetAtoms():
> map_num = atom.GetAtomMapNum()
> if map_num > 0:
> bond_join_dict[map_num].append(atom.GetIdx())
>
> # Make an editable molecule and add bonds between atoms with
> correspoing AtomMapNum
> em = EditableMol(new_mol)
> for idx, atom_list in bond_join_dict.items():
> if len(atom_list) == 2:
> start_atm, end_atm = atom_list
> em.AddBond(start_atm, end_atm, order=Chem.rdchem.BondType.
> SINGLE)
>
> final_mol = em.GetMol()
>
> # remove the AtomMapNum values
> for atom in final_mol.GetAtoms():
> atom.SetAtomMapNum(0)
> final_mol = Chem.RemoveHs(final_mol)
>
> return final_mol
>
>
> if __name__ == "__main__":
> mol_to_weld = Chem.MolFromSmiles(
> "CN(C)CC(Br)c1cc([*:2])c([*:1])cn1.[H]C([H])([H])[*:1].[H][*:2]")
> welded_mol = weld_r_groups(mol_to_weld)
> print(Chem.MolToSmiles(welded_mol))
>
>
> Best,
>
> Pat
>
>
> On Sun, Apr 15, 2018 at 12:16 PM, Patrick Walters <wpwalt...@gmail.com>
> wrote:
>
>> Hi All,
>>
>> I was about to write a function to reassemble a molecule from a core +
>> R-groups, but I thought I'd check and see if such a function already
>> exists. This is work with the output of rdRGroupDecomposition
>>
>> Gvien a core:
>> CN(C)CC(Br)c1cc([*:2])c([*:1])cn1
>>
>> Plus a set of R-groups
>> [H]C([H])([H])[*:1]
>> [H][*:2]
>>
>> Reconnect the pieces to generate a molecule
>> CN(C)CC(Br)c1ccc(C)cn1
>>
>> Thanks,
>>
>> Pat
>>
>>
>>
>>
>
> ------------------------------------------------------------
> ------------------
> Check out the vibrant tech community on one of the world's most
> engaging tech sites, Slashdot.org! http://sdm.link/slashdot
> _______________________________________________
> Rdkit-discuss mailing list
> Rdkit-discuss@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/rdkit-discuss
>
>
------------------------------------------------------------------------------
Check out the vibrant tech community on one of the world's most
engaging tech sites, Slashdot.org! http://sdm.link/slashdot
_______________________________________________
Rdkit-discuss mailing list
Rdkit-discuss@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss