I am a biologist so please forgive me as I likely won't be as rigorous as a professional chemist. I am using the RDKit package to extract organic molecules from salts, where one ion is organic and the other inorganic. My code is attached below.

My strategy is to first isolate the organic ion, and then add or subtract protons, $\ce{H+}$, as necessary. For organic anions I try to form the neutral molecule by protonating atoms with negative formal charge; for organic cations I try to remove $\ce{H+}$ from an atom with positive formal charge.

In the simple case of sodium acetate, this method works as expected to give acetic acid:

Acetic acid from sodium acetate

However, this approach fails with sodium trihydroxy(phenyl)borate:

Sodium trihydroxy(phenyl)borate

since there is no way to add an extra proton to the boron atom which has negative formal charge.

I am guessing that it is not really possible to neutralize the trihydroxy(phenyl)borate anion by adding a proton. Removing one of the $\ce{-OH}$ groups would work, but that is not acceptable for me, because that is not dependent on the pH. Is this correct, or there is another explanation?

The code:


from rdkit.Chem import SaltRemover
remover = SaltRemover.SaltRemover(defnData=SMARTS_inorganic_ion)
mol_acetate = remover.StripMol(mol_sodium_acetate)

def neutralize_atoms(mol):
    # Recognize charged atoms
    pattern = Chem.MolFromSmarts(
    at_matches = mol.GetSubstructMatches(pattern)
    at_matches_list = [y[0] for y in at_matches]
    if len(at_matches_list) > 0:
        for at_idx in at_matches_list:
            atom = mol.GetAtomWithIdx(at_idx)
            chg = atom.GetFormalCharge()
            hcount = atom.GetTotalNumHs()
            # Adjut the number of hydrogen according to the change in charge
            atom.SetNumExplicitHs(hcount - chg)
    return mol
  • 7
    $\begingroup$ You basically found that boric acid is not a Brønsted-Lowry acid but a Lewis acid. $\endgroup$
    – Loong
    Jan 10, 2022 at 15:41
  • $\begingroup$ Side note: CCDC's Python API contains a function to test if an entry is organic (reference). Though to run their scripts, you need some special libraries behind a subscription. $\endgroup$
    – Buttonwood
    Jan 10, 2022 at 15:56
  • $\begingroup$ Just add proton to oxygen - that's what happens. $\endgroup$
    – Mithoron
    Jan 10, 2022 at 18:13

1 Answer 1


Essentially, you are trying to determine the conjugate acid of the borate anion.

Yes, that approach is likely to fail with boric acid & borate anions. In fact if you want to form the conjugate acid of $\ce{RB(OH)3-}$ by protonation, instead of protonating the boron atom, you should protonate the oxygen atom, because that's the atom that possesses an actual lone pair that can accept the proton.

Formal "protonation" of borate anion

Formally speaking, this species in the middle would be the conjugate acid, because you have added a proton to the original base. In practice, the water molecule would "fall off" to reveal the original boric acid. [Of course, this is probably quite difficult to code in a foolproof way.]

The boric acid / borate pair is special:* it doesn't work via the usual "release $\ce{H+}$" like what acetic acid does.† Instead, boric acid accepts $\ce{OH-}$ to form borate. So, instead of adding and subtracting $\ce{H+}$, you need to give and take $\ce{OH-}$. Naturally, both of these two methods (producing $\ce{H+}$ and absorbing $\ce{OH-}$) have the same effect on the pH, that is, they both bring the pH down. Effectively, the following reaction is responsible for the acidity:

$$\ce{RB(OH)2 + H2O <=> RB(OH)3- + H+}$$

and it's not right to say that this is pH-independent. If you add more acid to the borate anion, the position of this equilibrium clearly shifts to the left, which regenerates the original boric acid. Conversely, if you add more base to this system, then the base will react with $\ce{H+}$ on the right, pulling the equilibrium position over to the right and generating more of the borate anion.

* Some might argue that borate is a problematic conjugate base because boric acid is a problematic acid, but I find that reasoning to be slightly circular. I think it's clearer to ascribe weirdness to the entire acid-base system.

† Actually, it's possible for boric acid to work as an acid by releasing $\ce{H+}$: $$\ce{RB(OH)2 <=> RB(OH)(O)- + H+}$$ but that's a different conjugate base, and your question focuses on $\ce{RB(OH)3-}$, so we can't go down that path.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.