{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "ionize Tutorial\n", "===============" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**ionize** is a Python module for calculating the properties of ions in aqueous solution. \n", "\n", "To load the library, simply import **ionize**." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "from __future__ import print_function, absolute_import, division\n", "import ionize\n", "\n", "# We'll also import numpy to set up some of our inputs. \n", "# And pprint to prettily print some lists.\n", "import numpy\n", "import pprint\n", "\n", "# And set up inline plotting.\n", "from matplotlib.pyplot import *\n", "%matplotlib inline\n", "\n", "# Prettify numpy printing\n", "numpy.set_printoptions(precision=3)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ion\n", "----\n", "The basic building block of an **ionize** simulation is an ionic species, modeled by the **Ion** class. Call **ionize**.**Ion**(*name*, *z*, *pKa*, *absolute_mobility*). *name* is the name of the ion, typically as a string. *z* is a list containing the charge states of the ion. *pKa* is a list of the pKas of the charge states, with the same order as the list *z*. *absolute_mobility* is a list containing the absolute, infinite dilution mobilities of each charge state, ordered the same as the other two lists, in units of m2V-1s-1." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ion('myAcid')\n", "Ion(alias=None, nightingale_data=None, reference_temperature=25.0, name='myBase', molecular_weight=None, valence=[1], reference_mobility=[2e-08], heat_capacity=None, reference_pKa=[8.0], enthalpy=None)\n" ] } ], "source": [ "# Initialize an ion and print it. \n", "acid = ionize.Ion('myAcid', [-1], [5], [-25e-9])\n", "base = ionize.Ion('myBase', [1], [8], [20e-9])\n", "print(acid) # The string includes only the class and name.\n", "print(repr(base)) # The representation contains enough information to reconstruct the ion. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once an ion species is initialized, you can call the properties of the ion, typically as a function of pH, ionic strength, and temperature, in that order. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "myAcid Ka at (I=0 M) = [ 1.001e-05]\n", "myAcid Ka at (I=0.5 M) = [ 1.781e-05]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/lewis/Documents/github/ionize/ionize/Ion/mobility.py:43: UserWarning: Insufficient information for Onsager-Fuoss correction to mobility. Returning the Robinson-Stokes approximation.\n", " warnings.warn(\"Insufficient information for Onsager-Fuoss \"\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "print('myAcid Ka at (I=0 M) =', acid.acidity())\n", "print('myAcid Ka at (I=0.5 M) =', acid.acidity(ionic_strength=0.5))\n", "\n", "pH = numpy.linspace(0,14)\n", "\n", "for I in [None, 0., 0.001, 0.01, 0.1]:\n", " mu = [base.mobility(p, I) for p in pH]\n", " if I is not None:\n", " label = 'I={} M'.format(I)\n", " else:\n", " label = 'I=None'\n", " plot(pH, mu, label=label)\n", "\n", "xlabel('pH'); xlim(0, 14)\n", "ylabel('effective mobility (m^2/v/s)'); ylim(-.1e-8, 2.1e-8)\n", "legend()\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note the difference between ionic_strength parameters here. If ionic_strength is 0, the numerical value of 0 is used in each calculation. However, it is impossible to have a solution of pH 0 with ionic_strength of 0. \n", "\n", "When the default value of None is used for ionic_strength, ionize uses the minimum ionic strength at the selected pH. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Using the **ionize** database\n", "\n", "Individually initializing ions is error-prone and time-consuming. To simplify the process, load ions from \n", "the database by initializing the database, and accessing the database like a dictionary. " ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Ion(alias=None, nightingale_data=None, reference_temperature=25.0, name='histidine', molecular_weight=155.15, valence=[-1, 1, 2], reference_mobility=[-2.8300000000000002e-08, 2.8800000000000003e-08, 4.47e-08], heat_capacity=[-233.0, 176.0, 0.0], reference_pKa=[9.33, 6.04, 2.0], enthalpy=[43800.0, 29500.0, 3600.0])\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/lewis/Documents/github/ionize/ionize/Ion/mobility.py:43: UserWarning: Insufficient information for Onsager-Fuoss correction to mobility. Returning the Robinson-Stokes approximation.\n", " warnings.warn(\"Insufficient information for Onsager-Fuoss \"\n" ] }, { "data": { "image/png": "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\nAAAASUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "db = ionize.Database()\n", "histidine = db['histidine']\n", "print(repr(histidine))\n", "\n", "for ionic_strength in (None, 0):\n", " mu_histidine = [histidine.mobility(p, ionic_strength=ionic_strength) for p in pH]\n", " plot(pH, mu_histidine, label=\"I={}\".format(ionic_strength))\n", " \n", "xlabel('pH'); xlim([0, 14])\n", "ylabel('effective mobility (m^2/v/s)')\n", "legend()\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### search_ion()\n", "\n", "You can also search for ions in the database by name using **Database().search()**. Call it by specifying a *search_string*. **search()** will print the names of all ions that contain the *search_string*. **search** will not return a list of strings, so load the ion when you find what you want. " ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Search results for 'amino'\n", "--------------------------\n", "('2-amino-2-methyl-1-propanol',\n", " 'e-aminocaproic acid',\n", " 'gamma-aminobutyric acid',\n", " 'o-aminobenzoic acid',\n", " 'p-aminobenzoic acid')\n", "\n", "Search results for 'chloric'\n", "----------------------------\n", "('chloric acid', 'hydrochloric acid', 'perchloric acid')\n", "\n", "Search results for 'per'\n", "------------------------\n", "('copper',\n", " 'diperodone',\n", " 'perchloric acid',\n", " 'periodic acid',\n", " 'permanganic acid',\n", " 'peroxysulfuric acid',\n", " 'perrhenic acid',\n", " 'piperidine')\n", "\n", "Oh, copper is what I was looking for.\n", "Ion('copper')\n" ] } ], "source": [ "print(\"Search results for 'amino'\\n--------------------------\")\n", "pprint.pprint(db.search('amino'))\n", "print(\"\\nSearch results for 'chloric'\\n----------------------------\")\n", "pprint.pprint(db.search('chloric'))\n", "print(\"\\nSearch results for 'per'\\n------------------------\")\n", "pprint.pprint(db.search('per'))\n", "print('\\nOh, copper is what I was looking for.')\n", "print(db.load('copper'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Other db functions\n", "You can get the database data as a dictionary using the data method." ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "522 ions in database.\n" ] } ], "source": [ "print(len(db.data), 'ions in database.')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Solution\n", "--------\n", "Getting the properties of a single ionic species in solution is useful, but the real challenge of dealing with aqueous solutions of ions is finding properties based on the equilibrium state of multiple ionic species. **ionize** can perform those calculations using the **Solution** class. **Solution** objects are initialized using **ionize**.**Solution**(*ions*, *concentrations*), where ions is a list of **Ion** objects and concentration is a list concentrations of the ions, with concentrations in molar." ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "ename": "SyntaxError", "evalue": "Missing parentheses in call to 'print' (, line 5)", "output_type": "error", "traceback": [ "\u001b[1;36m File \u001b[1;32m\"\"\u001b[1;36m, line \u001b[1;32m5\u001b[0m\n\u001b[1;33m print 'pH =', buffer.pH\u001b[0m\n\u001b[1;37m ^\u001b[0m\n\u001b[1;31mSyntaxError\u001b[0m\u001b[1;31m:\u001b[0m Missing parentheses in call to 'print'\n" ] } ], "source": [ "hcl=database.load('hydrochloric acid')\n", "tris=database.load('tris')\n", "buffer=ionize.Solution([tris, hcl], [0.1, 0.085])\n", "\n", "print 'pH =', buffer.pH\n", "print 'I =', buffer.ionic_strength, 'M'\n", "print 'conductivity =', buffer.conductivity(), 'S/m'\n", "print 'buffering capacity =', buffer.buffering_capacity(), 'M'\n", "print 'debye length =', buffer.debye(), 'm'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solutions** can be initialized with ion names instead of ions. If so, the **Solution** calls **load_ion** to determine the ion identities." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print [ion.name for ion in ionize.Solution(['bis-tris', 'acetic acid'], [0.1, 0.03]).ions]\n", "print ionize.Solution(['bis-tris', 'acetic acid'], [0.1, 0.03]).concentration(database.load('acetic acid'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We can iterate through solutions to quickly calculate the pH of a titration between two ions" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "c_tris = 0.1\n", "c_hcl = numpy.linspace(0.0, 0.2, 50)\n", "t_pH = [ionize.Solution(['tris', 'hydrochloric acid'], [c_tris, c_h], temperature=25).pH for c_h in c_hcl]\n", "\n", "plot(c_hcl/c_tris, t_pH)\n", "xlabel('[HCl]/[Tris]')\n", "ylabel('pH')\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A **Solution** can also be initialized without ions, e.g. as water. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "water = ionize.Solution()\n", "print 'I =', water.ionic_strength, 'M'\n", "print 'pH =', water.pH\n", "print 'conductivity =', water.conductivity(), 'S/m'" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A **Solution** can also be added and multiplied through operator overloading. This can be useful when calculating the results of diltuions, as below. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print 'Stock:', buffer\n", "dilution = 0.5 * buffer + 0.5 * water\n", "print 'Dilution:', dilution" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solutions** can be titrated to a specified pH. To do so, make a solution, and then specify a titrant, a property, and a target. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "buff = ionize.Solution([tris], 0.1)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print buff.titrate('hydrochloric acid', 8.2)\n", "print buff.titrate('hydrochloric acid', 3)\n", "print buff.conductivity()\n", "print repr(buff.titrate('hydrochloric acid', 3, titration_property = 'conductivity'))\n", "print repr(buff.titrate('hydrochloric acid', 8))\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Temperature Effects\n", "-------------------\n", "Both **Ion** objects and **Solution** objects take T as an optional argument for temperature. Temperature should be specified in degrees C. \n", "\n", "**Ion** objects adjust their absolute mobility and pKa attributes based on temperature. They also make adjustments to their ionic strength correction algorithms based on temperature. The type of temperature adjustment data depends on the specific ion. For small ions, emperical data from literature is included. For organic molecules, ΔH and ΔCp values may be provided. All ions also correct their mobilities for viscosity. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "silver = database.load('silver')\n", "tris = database.load('tris')\n", "T = numpy.linspace(20.0, 80.0)\n", "mu_silver = [silver.absolute_mobility(Tp) for Tp in T]\n", "mu_tris = [tris.absolute_mobility(Tp) for Tp in T]\n", "pKa_silver = [silver.pKa(0, Tp) for Tp in T]\n", "pKa_tris = [tris.pKa(0, Tp) for Tp in T]\n", "\n", "figure()\n", "plot(T, mu_silver, label = 'Silver')\n", "plot(T, mu_tris, label = 'Tris')\n", "legend(loc = 'upper left')\n", "xlabel('Temperature ($^{\\circ}$C)'); ylabel('Absolute mobility ($m^2V^{-1}s^{-1}$)')\n", "show()\n", "figure()\n", "plot(T, pKa_silver, label = 'Silver')\n", "plot(T, pKa_tris, label = 'Tris')\n", "legend(loc = 'lower left')\n", "xlabel('Temperature ($^{\\circ}$C)'); ylabel('pKa')\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Solution** objects send their temperature correction parameters to the object that they contain. In addition, they use the temperature input to correct their ionic strength correction parameters. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "buffer_ref = ionize.Solution(['tris', 'hydrochloric acid'], [.200, .100], temperature=25.)\n", "mu_ref = buffer_ref.ions[1].mobility()\n", "mup = []\n", "pH = []\n", "I = []\n", "mu=[]\n", "cond = []\n", "for Tp in T:\n", " buffer = ionize.Solution([tris, hcl], [.200, .100], temperature=Tp)\n", " mu.append(buffer.ions[1].mobility())\n", " mup.append(buffer.ions[1].mobility()/mu_ref)\n", " pH.append(buffer.pH)\n", " I.append(buffer.ionic_strength)\n", " cond.append(buffer.conductivity())\n", "# mup.append(hcl.nightingale_function(Tp))\n", "cond_norm = [c / cond[0] for c in cond]\n", "figure()\n", "plot(T, pH); xlabel('Temperature ($^{\\circ}$C)'); ylabel('pH')\n", "show()\n", "\n", "figure()\n", "plot(T, mup, label='chloride'); xlabel('Temperature ($^{\\circ}$C)'); ylabel('$\\mu$(T)/$\\mu$(T$_o$)'); legend(loc='upper left')\n", "show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Conservation Functions\n", "--------------------\n", "Conservation functions are spatially invariant quantities that remain constant as a solution undergoes electrophoresis. They are useful in calculating ion concentrations in zones formed during electrophoresis. \n", "\n", "### The Kohlrausch Regulating Function (KRF)\n", "The most basic conservation function is the KRF. This function is only valid for strongly ionized species, when water dissociation doesn't play a strong role. Solutions can calculate their own KRF values. They throw a warning if they contain species that are not strongly ionized." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "saltwater = ionize.Solution(['sodium', 'hydrochloric acid'], [0.1, 0.1])\n", "print saltwater.kohlrausch()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print buffer_ref.ions\n", "print buffer_ref.kohlrausch()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Alberty Conservation Function\n", "\n", "The Alberty conservation function is useful for weakly ionized monovalent species, when water dissocation doesn't play a strong role. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "tcap = ionize.Solution(['tris', 'caproic acid'], [0.1, 0.05])\n", "print tcap.alberty()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "tcit = ionize.Solution(['tris', 'citric acid'], [0.1, 0.05])\n", "print tcit.alberty()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Jovin Conservation Function\n", "\n", "The Jovin conservation function is applicable under the same conditions that the Alberty conservation function is. It is often used as a compliment." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print tcap.jovin()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print tcit.jovin()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The Gas Conservation Functions" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "print tcap.gas()\n", "print tcit.gas()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Serialization, Saving, and Loading\n", "You can also save and load ions and solutions in JSON format." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [ "# %load_ext snakeviz" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# %%snakeviz\n", "# database = ionize.Database()\n", "# pH = np.linspace(0, 14)\n", "# for ion in database:\n", "# for p in pH:\n", "# ion.mobility(p)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "database" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "import itertools\n", "concentrations = np.linspace(0, 0.14)\n", "ref_mob = 50.e-9\n", "z = [1, 2]\n", "for zp, zm in itertools.product(z, repeat=2):\n", " positive_ion = ionize.Ion('positive', [zp], [14], [ref_mob])\n", " negative_ion = ionize.Ion('negative', [-zm], [0], [-ref_mob])\n", " mob = []\n", " i = []\n", " for c in concentrations:\n", " sol = ionize.Solution([positive_ion, negative_ion], [c/zp, c/zm])\n", " mob.append(sol.ions[0].actual_mobility() / ref_mob )\n", " i.append(sol.ionic_strength)\n", " plot(i, mob, label='-{}:{}'.format(zm, zp))\n", "ylim(0, 1)\n", "# xlim(0, .14)\n", "legend(loc='lower left')\n", "xlabel('Concentration (M)')\n", "ylabel('$\\mu$/$\\mu_o$')\n", "show()\n", " " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.5.1" } }, "nbformat": 4, "nbformat_minor": 0 }