#!/usr/bin/python

from rdkit import Chem
from rdkit.Chem import AllChem 

import sys

reagentlist1 = Chem.SmilesMolSupplier(sys.argv[1],'\t',0,1,0)

smi = Chem.SmilesWriter('out.smi')
sdf = Chem.SDWriter('out.sdf')

for reagent1 in reagentlist1:

   Chem.SanitizeMol(reagent1)

# First the acids

# Carboxylic Acid ionization
   repl1 = Chem.MolFromSmiles('[O-]')
   patt1 = Chem.MolFromSmarts('[$([OH]C(=O))]')
   m1 = AllChem.ReplaceSubstructs(reagent1,patt1,repl1,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(reagent1), "    Output: ", Chem.MolToSmiles(m1[0])

# Thiocarboxylic Acid ionization
   repl2 = Chem.MolFromSmiles('[S-]')
   patt2 = Chem.MolFromSmarts('[$([SH]C(=O))]')
   m2 = AllChem.ReplaceSubstructs(m1[0],patt2,repl2,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m1[0]), "    Output: ", Chem.MolToSmiles(m2[0])

# Tetrazole ionization (Tautomer 1)
   repl3 = Chem.MolFromSmiles('c1[n-]nnn1')
   patt3 = Chem.MolFromSmarts('c1[nH]nnn1')
   m3 = AllChem.ReplaceSubstructs(m2[0],patt3,repl3,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m2[0]), "    Output: ", Chem.MolToSmiles(m3[0])

# Tetrazole ionization (Tautomer 2)
   repl4 = Chem.MolFromSmiles('c1[n-]nnn1')
   patt4 = Chem.MolFromSmarts('c1n[nH]nn1')
   m4 = AllChem.ReplaceSubstructs(m3[0],patt4,repl4,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m3[0]), "    Output: ", Chem.MolToSmiles(m4[0])

# Aromatic thiol ionization
   repl5 = Chem.MolFromSmiles('[S-]')
   patt5 = Chem.MolFromSmarts('[$([SH]c)]')
   m5 = AllChem.ReplaceSubstructs(m4[0],patt5,repl5,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m4[0]), "    Output: ", Chem.MolToSmiles(m5[0])

# Sulphate ionization
   repl6 = Chem.MolFromSmiles('[O-]')
   patt6 = Chem.MolFromSmarts('[$([OH]S(=O)(=O)[O,C,N])]')
   m6 = AllChem.ReplaceSubstructs(m5[0],patt6,repl6,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m5[0]), "    Output: ", Chem.MolToSmiles(m6[0])

# Activated sulphonamide
   repl7 = Chem.MolFromSmiles('[N-]')
   patt7 = Chem.MolFromSmarts('[$([NH]S(=O)(=O)C(F)(F))]')
   m7 = AllChem.ReplaceSubstructs(m6[0],patt7,repl7,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m6[0]), "    Output: ", Chem.MolToSmiles(m7[0])

# Now the bases

# Amines 1 
   repl8 = Chem.MolFromSmiles('[NH3+]')
   patt8 = Chem.MolFromSmarts('[$([NX3;H2][CX4])]')
   m8 = AllChem.ReplaceSubstructs(m7[0],patt8,repl8,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m7[0]), "    Output: ", Chem.MolToSmiles(m8[0])

# Amines 2 
   repl9 = Chem.MolFromSmiles('[NH2+]')
   patt9 = Chem.MolFromSmarts('[$([NX3;H1]([CX4])[CX4])]')
   m9 = AllChem.ReplaceSubstructs(m8[0],patt9,repl9,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m8[0]), "    Output: ", Chem.MolToSmiles(m9[0])

# Amines 3 
   repl10 = Chem.MolFromSmiles('[NH1+]')
   patt10 = Chem.MolFromSmarts('[$([NX3;H0]([CX4])([CX4])[CX4])]')
   m10 = AllChem.ReplaceSubstructs(m9[0],patt10,repl10,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m9[0]), "    Output: ", Chem.MolToSmiles(m10[0])

# Amidines 1  
   repl11 = Chem.MolFromSmiles('[NH2+]')
   patt11 = Chem.MolFromSmarts('[$([NH1;+0]=[C;!r]([NH2;+0])[CX4,c]),$([NH1;+0]=[C;!r]([NH1;+0][CX4,c])[CX4,c]),$([NH1;+0]=[C;!r]([NH0;+0]([CX4,c])[CX4,c])[CX4,c])]') 
   m11 = AllChem.ReplaceSubstructs(m10[0],patt11,repl11,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m10[0]), "    Output: ", Chem.MolToSmiles(m11[0])

# Amidines 2  
   repl12 = Chem.MolFromSmiles('[NH1+]')
   patt12 = Chem.MolFromSmarts('[$([NH0;+0]([CX4,c])=[C;!r]([NH2;+0])[CX4,c]),$([NH0;+0]([CX4,c])=[C;!r]([NH1;+0][CX4,c])[CX4,c]),$([NH0;+0]([CX4,c])=[C;!r]([NH0;+0]([CX4,c])[CX4,c])[CX4,c])]') 
   m12 = AllChem.ReplaceSubstructs(m11[0],patt12,repl12,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m11[0]), "    Output: ", Chem.MolToSmiles(m12[0])

# Guandidines 1  
   repl13 = Chem.MolFromSmiles('[NH2+]')
   patt13 = Chem.MolFromSmarts('[$([NH1;+0]=[C;!r]([NH2;+0])[NX3;H1][CX4,c,#1]),$([NH1;+0]=[C;!r]([NH1;+0][CX4,c])[NX3;H1][CX4,c]),$([NH1;+0]=[C;!r]([NH0;+0]([CX4,c])[CX4,c])[NX3;H1][CX4,c])]') 
   m13 = AllChem.ReplaceSubstructs(m12[0],patt13,repl13,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m12[0]), "    Output: ", Chem.MolToSmiles(m13[0])

# Guandidines 2  
   repl14 = Chem.MolFromSmiles('[NH2+]')
   patt14 = Chem.MolFromSmarts('[$([NH1;+0]=[C;!r]([NH2;+0])[NX3;H0]([CX4,c])[CX4,c]),$([NH1;+0]=[C;!r]([NH1;+0][CX4,c])[NX3;H0]([CX4,c])[CX4,c]),$([NH1;+0]=[C;!r]([NH0;+0]([CX4,c])[CX4,c])[NX3;H0]([CX4,c])[CX4,c])]') 
   m14 = AllChem.ReplaceSubstructs(m13[0],patt14,repl14,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m13[0]), "    Output: ", Chem.MolToSmiles(m14[0])

# Guandidines 3  
   repl15 = Chem.MolFromSmiles('[NH1+]')
   patt15 = Chem.MolFromSmarts('[$([NH0;+0]([CX4,c])=[C;!r]([NH2;+0])[NX3;H1][CX4,c,#1]),$([NH0;+0]([CX4,c])=[C;!r]([NH1;+0][CX4,c])[NX3;H1][CX4,c]),$([NH0;+0]([CX4,c])=[C;!r]([NH0;+0]([CX4,c])[CX4,c])[NX3;H1][CX4,c])]') 
   m15 = AllChem.ReplaceSubstructs(m14[0],patt15,repl15,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m14[0]), "    Output: ", Chem.MolToSmiles(m15[0])

# Guandidines 4  
   repl16 = Chem.MolFromSmiles('[NH1+]')
   patt16 = Chem.MolFromSmarts('[$([NH0;+0]([CX4,c])=[C;!r]([NH2;+0])[NX3;H0]([CX4,c])[CX4,c]),$([NH0;+0]([CX4,c])=[C;!r]([NH1;+0][CX4,c])[NX3;H0]([CX4,c])[CX4,c]),$([NH0;+0]([CX4,c])=[C;!r]([NH0;+0]([CX4,c])[CX4,c])[NX3;H0]([CX4,c])[CX4,c])]') 
   m16 = AllChem.ReplaceSubstructs(m15[0],patt16,repl16,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m15[0]), "    Output: ", Chem.MolToSmiles(m16[0])

# Miscellaneous (infrequently occurring acids

# Ascobic acid-like 
   repl17 = Chem.MolFromSmiles('[O-]')
   patt17 = Chem.MolFromSmarts('[$([OH]C1=CC(=O)O[CX4]1)]')
   m17 = AllChem.ReplaceSubstructs(m16[0],patt17,repl17,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m16[0]), "    Output: ", Chem.MolToSmiles(m17[0])

# Tetramic acid-like 
   repl18 = Chem.MolFromSmiles('[C-1]')
   patt18 = Chem.MolFromSmarts('[$([CX4;H2;r]1C(=O)N[CX4]C(=O)1)]')
   m18 = AllChem.ReplaceSubstructs(m17[0],patt18,repl18,replaceAll=True)
   print "Input: " , Chem.MolToSmiles(m17[0]), "    Output: ", Chem.MolToSmiles(m18[0])

# Finally, clean up and write smiles and sdf versions

   Chem.SanitizeMol(m18[0])
   AllChem.Compute2DCoords(m18[0])
   smi.write(m18[0])
   sdf.write(m18[0])


