Note
Go to the end to download the full example code.
Kováts retention indices from an n-alkane ladder#
Under isothermal gas chromatography, \(\log t'\) of the n-alkanes
rises linearly with carbon number. Kováts placed every other compound on
that ladder: kovats_retention_index()
interpolates \(\log t'\) between the bracketing alkanes, giving an
index (n-octane = 800, n-nonane = 900, …) that is far more
transferable between instruments than a raw retention time.
import matplotlib.pyplot as plt
import numpy as np
from chemistrykit.analytical import kovats_retention_index
t0 = 1.20 # dead time, min
carbons = np.arange(6, 12)
# Illustrative isothermal alkane retention times following log t' = a + b*n.
t_alkanes = t0 + 0.035 * 2.05**carbons
# Unknowns eluting between the alkanes (retention times in min, chosen to
# give indices close to literature values on a nonpolar phase):
unknowns = {"toluene": 9.57, "ethylbenzene": 17.40, "1-octanol": 71.8}
for name, t_x in unknowns.items():
n = int(np.searchsorted(t_alkanes, t_x)) - 1 + carbons[0]
i = n - carbons[0]
I = kovats_retention_index(t_x, t_alkanes[i], t_alkanes[i + 1], n=n, dead_time=t0)
print(f"{name:13s}: t_R = {t_x:5.2f} min, between C{n} and C{n + 1} -> I = {I:.0f}")
toluene : t_R = 9.57 min, between C7 and C8 -> I = 763
ethylbenzene : t_R = 17.40 min, between C8 and C9 -> I = 855
1-octanol : t_R = 71.80 min, between C10 and C11 -> I = 1060
fig, ax = plt.subplots(figsize=(7, 4.5))
ax.plot(100 * carbons, np.log10(t_alkanes - t0), "o-", color="gray", label="n-alkanes (I = 100 n)")
for name, t_x in unknowns.items():
n = int(np.searchsorted(t_alkanes, t_x)) - 1 + carbons[0]
i = n - carbons[0]
I = kovats_retention_index(t_x, t_alkanes[i], t_alkanes[i + 1], n=n, dead_time=t0)
ax.plot([I], [np.log10(t_x - t0)], "s", markersize=8, label=f"{name}: I = {I:.0f}")
ax.set_xlabel("retention index I")
ax.set_ylabel(r"$\log_{10} t'_R$ (adjusted retention time, min)")
ax.set_title("Kováts index: interpolation on the alkane ladder")
ax.legend()
plt.tight_layout()
plt.show()

Total running time of the script: (0 minutes 0.048 seconds)