#!/usr/bin/env python

from rdkit import Chem
from rdkit.Chem import AllChem 

import sys
#for line in sys.stdin:
#	m = Chem.MolFromSmiles(line)

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

smi = Chem.SmilesWriter('out.smi')
sdf = Chem.SDWriter('out.sdf')
rules=(
# Carboxylic Acid ionization
   ('[O-]','[$([OH]C(=O))]'),

# Thiocarboxylic Acid ionization
   ('[S-]','[$([SH]C(=O))]'),

# Tetrazole ionization (Tautomer 1)
   ('c1[n-]nnn1','c1[nH]nnn1'),

# Tetrazole ionization (Tautomer 2)
   ('c1[n-]nnn1','c1n[nH]nn1'),

# Aromatic thiol ionization
   ('[S-]','[$([SH]c)]'),

# Sulphate ionization
   ('[O-]','[$([OH]S(=O)(=O)[O,C,N])]'),

# Activated sulphonamide
   ('[N-]','[$([NH]S(=O)(=O)C(F)(F))]'),

# Now the bases

# Amines 1 
   ('[NH3+]','[$([NX3;H2][CX4])]'),

# Amines 2 
   ('[NH2+]','[$([NX3;H1]([CX4])[CX4])]'),

# Amines 3 
   ('[NH1+]','[$([NX3;H0]([CX4])([CX4])[CX4])]'),

# Amidines 1  
   ('[NH2+]','[$([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])]') ,

# Amidines 2  
   ('[NH1+]','[$([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])]') ,

# Guandidines 1  
   ('[NH2+]','[$([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])]') ,

# Guandidines 2  
   ('[NH2+]','[$([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])]') ,

# Guandidines 3  
   ('[NH1+]','[$([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])]') ,

# Guandidines 4  
   ('[NH1+]','[$([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])]') ,

# Miscellaneous (infrequently occurring acids

# Ascobic acid-like 
   ('[O-]','[$([OH]C1=CC(=O)O[CX4]1)]'),

# Tetramic acid-like 
   ('[C-1]','[$([CX4;H2;r]1C(=O)N[CX4]C(=O)1)]'),
)

for reagent1 in reagentlist1:
   print '# ---------------------'
   Chem.SanitizeMol(reagent1)

   for repl,patt in rules:
      repl = Chem.MolFromSmiles(repl,sanitize=False)
      patt = Chem.MolFromSmarts(patt)
      ps = AllChem.ReplaceSubstructs(reagent1,patt,repl,replaceAll=True)
      ps[0].UpdatePropertyCache(False)
      Chem.GetSymmSSSR(ps[0])
      print "Input: " , Chem.MolToSmiles(reagent1), "    Output: ", Chem.MolToSmiles(ps[0])
      reagent1=ps[0]

# Finally, clean up and write smiles and sdf versions
   Chem.SanitizeMol(reagent1)
   AllChem.Compute2DCoords(reagent1)
   smi.write(reagent1)
   sdf.write(reagent1)


