I couldn't figure out how to do this in a straightforward manner, so I went
full caveman. The following code isn't pretty, but seems to do the job:
from rdkit import Chem
from rdkit.Chem import AllChem
import itertools
smiles1 = "C([O-])([O-])=O.[Na+].[Na+]"
smiles2 = "[Cl-].[Li+].C(C)(C)[Mg]Cl"
rxn1 =
AllChem.ReactionFromSmarts('[Pd,Cu,Fe,N,Na,K,Li,Cs,Mg;+;!v4:1].[#1,F,Cl,Br,I,B,C,c,O,N,n;-;!v4:2]>>[*+0:1]-[*+0:2]')
rxn2 =
AllChem.ReactionFromSmarts('[Pd,Cu,Fe,Mg;+2;!v4:1].[#1,F,Cl,Br,I,B,C,c,O,N,n;-1;!v4:2]>>[*+1:1]-[*+0:2]')
neutrals = []
charged = []
smiles = smiles1 #smiles2
frags = smiles.split('.')
for frag in frags:
mol = Chem.MolFromSmiles(frag)
charge = Chem.GetFormalCharge(mol)
if charge == 0:
neutrals.append(mol)
else:
charged.append(mol)
while len(charged) > 1:
copy = charged.copy()
parent = copy.pop()
for mol in copy:
prods = rxn1.RunReactants((parent,mol))
if not prods:
prods = rxn1.RunReactants((mol,parent))
if not prods:
prods = rxn2.RunReactants((mol,parent))
if not prods:
prods = rxn2.RunReactants((parent,mol))
if(prods):
charged.remove(mol)
nmol = prods[0][0]
Chem.SanitizeMol(nmol)
charge = Chem.GetFormalCharge(nmol)
if charge == 0:
neutrals.append(nmol)
else:
charged.append(nmol)
break
charged.remove(parent)
smiles = ".".join([Chem.MolToSmiles(x) for x in neutrals+charged])
print(smiles)
On Mon, Feb 22, 2021 at 7:41 PM Good Eats <[email protected]> wrote:
> Hi all,
>
> I am trying to convert ionic salts into their covalent forms. I devised a
> reaction transformation to do this, but am running into problems getting to
> work correctly.
> e.g. C([O-])([O-])=O.[Na+].[Na+] --> C([O][Na])([O][Na])=O
> [Cl-].[Li+].C(C)(C)[Mg]Cl --> [Cl][Li].C(C)(C)[Mg]Cl
>
> If I feed the disconnected form of NaHCO3 into the code below, it works
> okay. However once I go to a salt with more than two disconnected
> components (like Na2CO3), only the first bond is formed and the other
> sodium ion vanishes.
> Similarly if there are other neutral fragments in the input (see mol2 in
> the code), those fragments also vaish when I run the reaction.
>
> I think I must be missing something in my reaction SMARTS. Anyone have
> some pointers for me?
>
> Many thanks!
>
>
> from rdkit import Chem
> from rdkit.Chem import AllChem
>
> mol1 = Chem.MolFromSmiles("C([O-])([O-])=O.[Na+].[Na+]")
> mol2 = Chem.MolFromSmiles("[Cl-].[Li+].C(C)(C)[Mg]Cl")
> rxn =
> AllChem.ReactionFromSmarts('([N,Na,K,Li,Cs,Mg;+,++:1].[H,F,Cl,Br,I,B,C,c,O,N,n;-:2])>>[*+0:1]-[*+0:2]')
>
> prods = rxn.RunReactants((mol1,))
> for prod in prods:
> print(Chem.MolToSmiles(prod[0]))
>
> prods = rxn.RunReactants((mol2,))
> for prod in prods:
> print(Chem.MolToSmiles(prod[0]))
>
> Output:
> O=C([O-])O[Na]
> O=C([O-])O[Na]
> O=C([O-])O[Na]
> O=C([O-])O[Na]
> [Li]Cl
>
_______________________________________________
Rdkit-discuss mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/rdkit-discuss