pyEQL Tutorial: Searching the Property Database

pyeql-logo.png

pyEQL is an open-source python library for solution chemistry calculations and ion properties developed by the Kingsbury Lab at Princeton University.

Documentation | How to Install | GitHub

Installation

Uncomment and run the code cell below, if you do not already have pyEQL

[1]:
# pip install pyEQL

First, import the property database

pyEQL’s built-in property database contains physichochemical, transport, and model parameters for hundreds of solutes. This information is used behind the scenes when you interact with a Solution object, but it can also be accessed directly.

[2]:
from pyEQL import IonDB

How to Search the Database

Query an example document

You can think of the database like list of dict that contain structure data. More specifically, the database is a list of `Solute objects <https://pyeql.readthedocs.io/en/latest/database.html#the-solute-class>`__ that have been serialized to dictionaries. We refer to each of these dict as “documents” (consistent with MongoDB terminology) or “records”

To see what one document looks like, use query_one(), which retrieves a single record from the database. The record is a dict.

[3]:
IonDB.query_one()
[3]:
{'_id': ObjectId('65f70cc603066ca9747ebf2c'),
 'formula': 'Ac[+3]',
 'charge': 3,
 'molecular_weight': '227.0 g/mol',
 'elements': ['Ac'],
 'chemsys': 'Ac',
 'pmg_ion': {'Ac': 1,
  'charge': 3,
  '@module': 'pymatgen.core.ion',
  '@class': 'Ion',
  '@version': None},
 'formula_html': 'Ac<sup>+3</sup>',
 'formula_latex': 'Ac$^{+3}$',
 'formula_hill': 'Ac',
 'formula_pretty': 'Ac^+3',
 'oxi_state_guesses': {'Ac': 3},
 'n_atoms': 1,
 'n_elements': 1,
 'size': {'radius_ionic': {'value': '1.26 Å',
   'reference': 'pymatgen',
   'data_type': 'experimental'},
  'radius_hydrated': None,
  'radius_vdw': {'value': '2.47 Å',
   'reference': 'pymatgen',
   'data_type': 'experimental'},
  'molar_volume': None,
  'radius_ionic_marcus': {'value': '1.18 ± 0.02 Å',
   'reference': 'Marcus2015',
   'data_type': 'experimental'}},
 'thermo': {'ΔG_hydration': {'value': '-3086.0 ± 10 kJ/mol',
   'reference': '10.1021/acs.jpca.9b05140',
   'data_type': 'experimental'},
  'ΔG_formation': None},
 'transport': {'diffusion_coefficient': None},
 'model_parameters': {'activity_pitzer': {'Beta0': None,
   'Beta1': None,
   'Beta2': None,
   'Cphi': None,
   'Max_C': None},
  'molar_volume_pitzer': {'Beta0': None,
   'Beta1': None,
   'Beta2': None,
   'Cphi': None,
   'V_o': None,
   'Max_C': None},
  'viscosity_jones_dole': {'B': None},
  'diffusion_temp_smolyakov': {'a1': None, 'a2': None, 'd': None}}}

Query a specific document

The IonDB is a `maggma.Store <https://materialsproject.github.io/maggma/getting_started/stores/>`__ that can be queried using a MongoDB-like syntax. The basic syntax is

IonDB.query_one({field: value})

where field is a top-level key in the Solute dict, such as formula, charge, or elements. See this page and the maggma documentation (link WIP) for more detailed examples.

[4]:
# a document with the formula "Na[+1]"
IonDB.query_one({"formula":'Na[+1]'})
[4]:
{'_id': ObjectId('65f70cc603066ca9747ec00c'),
 'formula': 'Na[+1]',
 'charge': 1,
 'molecular_weight': '22.98976928 g/mol',
 'elements': ['Na'],
 'chemsys': 'Na',
 'pmg_ion': {'Na': 1,
  'charge': 1,
  '@module': 'pymatgen.core.ion',
  '@class': 'Ion',
  '@version': None},
 'formula_html': 'Na<sup>+1</sup>',
 'formula_latex': 'Na$^{+1}$',
 'formula_hill': 'Na',
 'formula_pretty': 'Na^+1',
 'oxi_state_guesses': {'Na': 1},
 'n_atoms': 1,
 'n_elements': 1,
 'size': {'radius_ionic': {'value': '1.16 Å',
   'reference': 'pymatgen',
   'data_type': 'experimental'},
  'radius_hydrated': {'value': '3.58 Å',
   'reference': 'Nightingale1959',
   'data_type': 'experimental'},
  'radius_vdw': {'value': '2.27 Å',
   'reference': 'pymatgen',
   'data_type': 'experimental'},
  'molar_volume': {'value': '-5.0 cm**3/mol',
   'reference': 'Calculation of the Partial Molal Volume of Organic Compounds and Polymers. Progress in Colloid & Polymer Science (94), 20-39.',
   'data_type': 'experimental'},
  'radius_ionic_marcus': {'value': '1.02 ± 0.02 Å',
   'reference': 'Marcus2015',
   'data_type': 'experimental'}},
 'thermo': {'ΔG_hydration': {'value': '-427.0 ± 6 kJ/mol',
   'reference': 'Marcus2015',
   'data_type': 'experimental'},
  'ΔG_formation': None},
 'transport': {'diffusion_coefficient': {'value': '1.334e-05 cm**2/s',
   'reference': 'CRC',
   'data_type': 'experimental'}},
 'model_parameters': {'activity_pitzer': {'Beta0': None,
   'Beta1': None,
   'Beta2': None,
   'Cphi': None,
   'Max_C': None},
  'molar_volume_pitzer': {'Beta0': None,
   'Beta1': None,
   'Beta2': None,
   'Cphi': None,
   'V_o': None,
   'Max_C': None},
  'viscosity_jones_dole': {'B': {'value': '0.085 dm**3/mol',
    'reference': 'https://doi.org/10.1021/cr00040a004',
    'data_type': 'fitted'}},
  'diffusion_temp_smolyakov': {'a1': {'value': '1.52 dimensionless',
    'reference': 'https://doi.org/10.1016/j.cemconres.2017.08.030',
    'data_type': 'fitted'},
   'a2': {'value': '3.7 dimensionless',
    'reference': 'https://doi.org/10.1016/j.cemconres.2017.08.030',
    'data_type': 'fitted'},
   'd': {'value': '122 dimensionless',
    'reference': 'https://doi.org/10.1016/j.cemconres.2017.08.030',
    'data_type': 'fitted'}},
  'dielectric_zuber': {'value': '3.62 dimensionless',
   'reference': 'https://doi.org/10.1016/j.fluid.2014.05.037',
   'data_type': 'fitted'}}}

Only return a subset of the document

If you don’t need to see the entire document, you can restrict the data returned by the query (in MongoDB, this is called “projection”). To use this feature, pass a second argument that is a list containing only the fields that you want returned. Note that there is a unique identified (field name _id) that is always returned.

[5]:
# a document with the formula "Na[+1]", where we only want the formula, charge, and molecular_weight
IonDB.query_one({"formula":'Na[+1]'}, ["formula","charge","molecular_weight"])
[5]:
{'formula': 'Na[+1]',
 'charge': 1,
 'molecular_weight': '22.98976928 g/mol',
 '_id': ObjectId('65f70cc603066ca9747ec00c')}
[6]:
# a document with the charge -1, where we only want the formula, charge, and molecular_weight
IonDB.query_one({"charge":-1}, ["formula","charge","molecular_weight"])
[6]:
{'formula': 'Ag(CN)2[-1]',
 'charge': -1,
 'molecular_weight': '159.903 g/mol',
 '_id': ObjectId('65f70cc603066ca9747ebf2d')}

NOTE: Be mindful of data types when querying. charge is an int. If we tried to query charge as if it were a str, we would get no results:

[7]:
# a document with the charge -1, where we only want the formula, charge, and molecular_weight
IonDB.query_one({"charge":"-1"}, ["formula","charge","molecular_weight"])

Query nested fields

If you want to query a field that is not a top-level key (such as transport / diffusion_coefficient), you can place a . between the field names at each level, e.g.

[8]:
IonDB.query_one({"size.radius_vdw.value": "2.27 Å"}, ["formula", "size.radius_vdw.value"])
[8]:
{'formula': 'Na2CO3(aq)',
 'size': {'radius_vdw': {'value': '2.27 Å'}},
 '_id': ObjectId('65f70cc603066ca9747ebff5')}

Note that in the Solute documents, most quantitative data are stored as ``str`` so that there is no ambiguity about their units. In the example above, the value of the van der Waals radius is "2.27 Å" (a str, including a unit), NOT 2.27 (a float).

You can easily extract the value by turning the str into a Quantity (see Converting Units), or by using python string operations to split the value and the units, e.g.

[9]:
# string operations
print(float("2.27 Å".split(" ")[0]))
2.27
[10]:
# pint Quantity
from pyEQL import ureg
print(ureg.Quantity("2.27 Å").magnitude)
2.27

Query multiple documents

query_one only returns a single document (a single dict). You can instead use query with exactly the same syntax to return a generator of all documents that match your query.

[11]:
# all documents with a charge of +2, returning only the formulas
IonDB.query({"charge":2}, ["formula","molecular_weight"])
[11]:
<generator object MongoStore.query at 0x7f02a4a7fed0>

A generator is not very useful unless we turn it into a list. You can do this with list() or with a list comprehension

[12]:
# using list()
list(IonDB.query({"charge":2}, ["formula","molecular_weight"]))
[12]:
[{'formula': 'Ag[+2]',
  'molecular_weight': '107.8682 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf30')},
 {'formula': 'Au[+2]',
  'molecular_weight': '196.966569 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf38')},
 {'formula': 'Ba[+2]',
  'molecular_weight': '137.327 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf45')},
 {'formula': 'Be[+2]',
  'molecular_weight': '9.012182 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf47')},
 {'formula': 'Ca[+2]',
  'molecular_weight': '40.078 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf59')},
 {'formula': 'Cd[+2]',
  'molecular_weight': '112.411 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf5e')},
 {'formula': 'Co[+2]',
  'molecular_weight': '58.933195 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf6c')},
 {'formula': 'Cr[+2]',
  'molecular_weight': '51.9961 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf71')},
 {'formula': 'Cu[+2]',
  'molecular_weight': '63.546 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf81')},
 {'formula': 'Dy[+2]',
  'molecular_weight': '162.5 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf83')},
 {'formula': 'Eu[+2]',
  'molecular_weight': '151.964 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf88')},
 {'formula': 'Fe[+2]',
  'molecular_weight': '55.845 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf8f')},
 {'formula': 'Ge[+2]',
  'molecular_weight': '72.64 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf94')},
 {'formula': 'Hg[+2]',
  'molecular_weight': '200.59 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfb4')},
 {'formula': 'In[+2]',
  'molecular_weight': '114.818 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfba')},
 {'formula': 'Mg[+2]',
  'molecular_weight': '24.305 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfea')},
 {'formula': 'Mn[+2]',
  'molecular_weight': '54.938045 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfee')},
 {'formula': 'Nd[+2]',
  'molecular_weight': '144.242 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec010')},
 {'formula': 'Ni[+2]',
  'molecular_weight': '58.6934 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec015')},
 {'formula': 'Pb[+2]',
  'molecular_weight': '207.2 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec028')},
 {'formula': 'Pd[+2]',
  'molecular_weight': '106.42 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec029')},
 {'formula': 'Po[+2]',
  'molecular_weight': '210.0 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec02b')},
 {'formula': 'Pr[+2]',
  'molecular_weight': '140.90765 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec02d')},
 {'formula': 'Pt[+2]',
  'molecular_weight': '195.084 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec02f')},
 {'formula': 'Ra[+2]',
  'molecular_weight': '226.0 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec031')},
 {'formula': 'Ru[+2]',
  'molecular_weight': '101.07 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec041')},
 {'formula': 'Sc[+2]',
  'molecular_weight': '44.955912 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec04e')},
 {'formula': 'Sm[+2]',
  'molecular_weight': '150.36 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec055')},
 {'formula': 'Sn[+2]',
  'molecular_weight': '118.71 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec057')},
 {'formula': 'Sr[+2]',
  'molecular_weight': '87.62 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec05e')},
 {'formula': 'Tc[+2]',
  'molecular_weight': '98.0 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec062')},
 {'formula': 'Ti[+2]',
  'molecular_weight': '47.867 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec066')},
 {'formula': 'Tm[+2]',
  'molecular_weight': '168.93421 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec06e')},
 {'formula': 'UO2[+2]',
  'molecular_weight': '270.02771 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec074')},
 {'formula': 'V[+2]',
  'molecular_weight': '50.9415 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec079')},
 {'formula': 'Yb[+2]',
  'molecular_weight': '173.04 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec081')},
 {'formula': 'Zn[+2]',
  'molecular_weight': '65.409 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec089')}]
[13]:
# using a comprehension
[doc for doc in IonDB.query({"charge":2}, ["formula","molecular_weight"])]
[13]:
[{'formula': 'Ag[+2]',
  'molecular_weight': '107.8682 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf30')},
 {'formula': 'Au[+2]',
  'molecular_weight': '196.966569 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf38')},
 {'formula': 'Ba[+2]',
  'molecular_weight': '137.327 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf45')},
 {'formula': 'Be[+2]',
  'molecular_weight': '9.012182 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf47')},
 {'formula': 'Ca[+2]',
  'molecular_weight': '40.078 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf59')},
 {'formula': 'Cd[+2]',
  'molecular_weight': '112.411 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf5e')},
 {'formula': 'Co[+2]',
  'molecular_weight': '58.933195 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf6c')},
 {'formula': 'Cr[+2]',
  'molecular_weight': '51.9961 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf71')},
 {'formula': 'Cu[+2]',
  'molecular_weight': '63.546 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf81')},
 {'formula': 'Dy[+2]',
  'molecular_weight': '162.5 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf83')},
 {'formula': 'Eu[+2]',
  'molecular_weight': '151.964 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf88')},
 {'formula': 'Fe[+2]',
  'molecular_weight': '55.845 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf8f')},
 {'formula': 'Ge[+2]',
  'molecular_weight': '72.64 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebf94')},
 {'formula': 'Hg[+2]',
  'molecular_weight': '200.59 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfb4')},
 {'formula': 'In[+2]',
  'molecular_weight': '114.818 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfba')},
 {'formula': 'Mg[+2]',
  'molecular_weight': '24.305 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfea')},
 {'formula': 'Mn[+2]',
  'molecular_weight': '54.938045 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ebfee')},
 {'formula': 'Nd[+2]',
  'molecular_weight': '144.242 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec010')},
 {'formula': 'Ni[+2]',
  'molecular_weight': '58.6934 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec015')},
 {'formula': 'Pb[+2]',
  'molecular_weight': '207.2 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec028')},
 {'formula': 'Pd[+2]',
  'molecular_weight': '106.42 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec029')},
 {'formula': 'Po[+2]',
  'molecular_weight': '210.0 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec02b')},
 {'formula': 'Pr[+2]',
  'molecular_weight': '140.90765 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec02d')},
 {'formula': 'Pt[+2]',
  'molecular_weight': '195.084 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec02f')},
 {'formula': 'Ra[+2]',
  'molecular_weight': '226.0 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec031')},
 {'formula': 'Ru[+2]',
  'molecular_weight': '101.07 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec041')},
 {'formula': 'Sc[+2]',
  'molecular_weight': '44.955912 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec04e')},
 {'formula': 'Sm[+2]',
  'molecular_weight': '150.36 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec055')},
 {'formula': 'Sn[+2]',
  'molecular_weight': '118.71 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec057')},
 {'formula': 'Sr[+2]',
  'molecular_weight': '87.62 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec05e')},
 {'formula': 'Tc[+2]',
  'molecular_weight': '98.0 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec062')},
 {'formula': 'Ti[+2]',
  'molecular_weight': '47.867 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec066')},
 {'formula': 'Tm[+2]',
  'molecular_weight': '168.93421 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec06e')},
 {'formula': 'UO2[+2]',
  'molecular_weight': '270.02771 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec074')},
 {'formula': 'V[+2]',
  'molecular_weight': '50.9415 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec079')},
 {'formula': 'Yb[+2]',
  'molecular_weight': '173.04 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec081')},
 {'formula': 'Zn[+2]',
  'molecular_weight': '65.409 g/mol',
  '_id': ObjectId('65f70cc603066ca9747ec089')}]

Counting Documents

You can use count() to see how many documents the database contains

[14]:
IonDB.count()
[14]:
351

Count works with queries, too.

[15]:
# number of documents with a charge of -3
IonDB.count({"charge": -3})
[15]:
7

More Advanced Query Syntax

Match multiple items with $in

If you want to query documents that match any one of a set of values, use $in with a list of possible values. Note that the $in operator and your list constitute their own dictionary, e.g. {"$in":<list>}. This entire dictionary is the “value” of your query for the associated field. For example:

[16]:
# all alkali cations
IonDB.count({"formula":
             {"$in": ["Li[+1]", "Na[+1]", "K[+1]", "Rb[+1]", "Cs[+1]"]}
            }
            )
[16]:
5

Greater than or less than - $gt / $gte / $lt / $lte

In a similar manner, you can query fields whose values are greater than / less than or equal to some value

[17]:
# all solutes with a charge less than 0
IonDB.count({"charge":
             {"$lt": 0}
            }
            )
[17]:
81
[18]:
# all solutes with a charge greater than or equal to 1
IonDB.count({"charge":
             {"$gte": 1}
            }
            )
[18]:
108

Unique Values

It’s often useful to understand how many unique values of a field there are. To do so, use distinct() with any field name

[19]:
# list of all unique `formula`
IonDB.distinct('formula')
[19]:
['Hf[+4]',
 'Au[+3]',
 'Yb[+3]',
 'HSO3[-1]',
 'BaH6(CO)4(aq)',
 'HI(aq)',
 'Cd[+2]',
 'Nd[+3]',
 'P2O7[-4]',
 'Ni[+3]',
 'Ru[+2]',
 'Rb2SO4(aq)',
 'P(HO2)2[-1]',
 'Ta[+3]',
 'Cs2SO4(aq)',
 'OH[-1]',
 'HS[-1]',
 'Mn[+2]',
 'Sn[+2]',
 'H2SO4(aq)',
 'P3O10[-5]',
 'KClO3(aq)',
 'Co(CN)6[-3]',
 'Au(CN)2[-1]',
 'H2CO3(aq)',
 'NaOH(aq)',
 'H4IN(aq)',
 'NaHCO2(aq)',
 'SrCl2(aq)',
 'Ca(NO3)2(aq)',
 'CsI(aq)',
 'SO3[-1]',
 'AsO4[-3]',
 'MnSO4(aq)',
 'NaCrO4(aq)',
 'HO2[-1]',
 'Cu[+2]',
 'Pt[+2]',
 'RbOH(aq)',
 'FeCl3(aq)',
 'NaNO2(aq)',
 'Mo[+3]',
 'In[+3]',
 'BaBr2(aq)',
 'CeCl3(aq)',
 'NaH3(CO)2(aq)',
 'Nd[+2]',
 'CO32[-1]',
 'CSN[-1]',
 'TcO4[-1]',
 'Fe(CN)6[-4]',
 'SeO4[-1]',
 'Eu[+3]',
 'NO2[-1]',
 'PF6[-1]',
 'HCO3[-1]',
 'ZnBr2(aq)',
 'KSO4[-1]',
 'CoI2(aq)',
 'SrI2(aq)',
 'B(H5C6)4[-1]',
 'NaF(aq)',
 'SeO3[-1]',
 'Hg[+2]',
 'W[+3]',
 'Na3PO4(aq)',
 'Rb[+1]',
 'SO4[-1]',
 'CaBr2(aq)',
 'MgI2(aq)',
 'CSeN[-1]',
 'Pr[+3]',
 'Ag[+3]',
 'MgCl2(aq)',
 'N[-0.33333333]',
 'Sb(OH)6[-1]',
 'RbBr(aq)',
 'Na2SO4(aq)',
 'Ca(ClO4)2(aq)',
 'Tb[+3]',
 'CuSO4(aq)',
 'CuCl2(aq)',
 'LiOH(aq)',
 'CsOH(aq)',
 'NaCl(aq)',
 'Pb[+2]',
 'Np[+3]',
 'Ac[+3]',
 'CaCl2(aq)',
 'La[+3]',
 'AgNO3(aq)',
 'BF4[-1]',
 'BeSO4(aq)',
 'CsNO2(aq)',
 'H5N2[+1]',
 'IrO4[-1]',
 'Pd[+2]',
 'La(NO3)3(aq)',
 'Tc[+2]',
 'CoCl2(aq)',
 'Cr[+3]',
 'KI(aq)',
 'Au(CN)4[-1]',
 'Th[+4]',
 'PrCl3(aq)',
 'Pr[+2]',
 'Sr(NO3)2(aq)',
 'Cd(ClO4)2(aq)',
 'NaHCO3(aq)',
 'MnCl2(aq)',
 'Ti[+3]',
 'Co[+3]',
 'NaClO4(aq)',
 'Ni[+2]',
 'Ag[+1]',
 'NaP(HO2)2(aq)',
 'MgH6(CO)4(aq)',
 'NaBr(aq)',
 'CsF(aq)',
 'CsH3(CO)2(aq)',
 'Sm[+2]',
 'CsBr(aq)',
 'Re[+1]',
 'Al2(SO4)3(aq)',
 'Na[+1]',
 'NdCl3(aq)',
 'ReO4[-1]',
 'Tl[+1]',
 'In[+1]',
 'ZnI2(aq)',
 'NaI(aq)',
 'HF2[-1]',
 'MnO4[-1]',
 'B(OH)3(aq)',
 'Dy[+2]',
 'H2SNO3[-1]',
 'NiCl2(aq)',
 'K3PO4(aq)',
 'FeCl2(aq)',
 'In[+2]',
 'U(ClO5)2(aq)',
 'Pm[+3]',
 'NO3[-1]',
 'Cs[+1]',
 'Po[+2]',
 'KBrO3(aq)',
 'IO4[-1]',
 'Cd(NO3)2(aq)',
 'K3Fe(CN)6(aq)',
 'Ce[+4]',
 'LiClO4(aq)',
 'H4SNO4(aq)',
 'Cu[+3]',
 'HSeO3[-1]',
 'CrO4[-2]',
 'PO3[-1]',
 'H4NCl(aq)',
 'NaSO4[-1]',
 'Ag(CN)2[-1]',
 'Co(NO3)2(aq)',
 'PHO4[-2]',
 'Dy[+3]',
 'Pb(NO3)2(aq)',
 'H4BrN(aq)',
 'ZnCl2(aq)',
 'Au[+1]',
 'Ru[+3]',
 'K2CO3(aq)',
 'Sb(HO2)2[-1]',
 'Li2SO4(aq)',
 'BaI2(aq)',
 'Ca[+2]',
 'CNO[-1]',
 'Tl(ClO4)3(aq)',
 'Li[+1]',
 'NaBrO3(aq)',
 'BrO3[-1]',
 'Re[-1]',
 'ZnSO4(aq)',
 'Co[+2]',
 'Bi[+3]',
 'GdCl3(aq)',
 'Zn[+2]',
 'Zr[+4]',
 'KCrO4(aq)',
 'H[+1]',
 'Br[-0.33333333]',
 'H4N[+1]',
 'Tc[+3]',
 'NaCO3[-1]',
 'Lu[+3]',
 'Sr[+2]',
 'Tl(NO3)3(aq)',
 'HNO3(aq)',
 'CN[-1]',
 'SrBr2(aq)',
 'V[+2]',
 'LiNO2(aq)',
 'KCSN(aq)',
 'NaH5C3O2(aq)',
 'Y[+3]',
 'RbH3(CO)2(aq)',
 'SeO4[-2]',
 'LiBr(aq)',
 'LiNO3(aq)',
 'H5C6O7[-3]',
 'K2PHO4(aq)',
 'SO3[-2]',
 'KP(HO2)2(aq)',
 'KCl(aq)',
 'RbCl(aq)',
 'P(OH)2[-1]',
 'Zn(NO3)2(aq)',
 'Fe[+2]',
 'Ir[+3]',
 'Na2PHO4(aq)',
 'Ba(ClO4)2(aq)',
 'CO3[-2]',
 'K2SO4(aq)',
 'CH3COO[-1]',
 'Rh[+3]',
 'TlH9(CO)6(aq)',
 'RbNO3(aq)',
 'ClO3[-1]',
 'U(ClO)2(aq)',
 'Cr[+2]',
 'YNO3(aq)',
 'SO4[-2]',
 'WO4[-1]',
 'USO6(aq)',
 'HCO2[-1]',
 'H4NClO4(aq)',
 'B(OH)4[-1]',
 'Re[+3]',
 'Be[+2]',
 'Np[+4]',
 'YCl3(aq)',
 'PO3F[-2]',
 'Th(NO3)4(aq)',
 'I[-1]',
 'Fe[+3]',
 'NaCSN(aq)',
 'Cl[-1]',
 'Sc[+3]',
 'Sm[+3]',
 'Gd[+3]',
 'Ag[+2]',
 'KNO3(aq)',
 'Ho[+3]',
 'Ni(NO3)2(aq)',
 'Cu(NO3)2(aq)',
 'Nd(NO3)3(aq)',
 'CrCl3(aq)',
 'Na2CO3(aq)',
 'H8S(NO2)2(aq)',
 'Cd(NO2)2(aq)',
 'Ge[+2]',
 'S[-2]',
 'NiSO4(aq)',
 'Tl(NO2)3(aq)',
 'IO3[-1]',
 'H2O(aq)',
 'Nb[+3]',
 'Yb[+2]',
 'UO2[+1]',
 'NaNO3(aq)',
 'KF(aq)',
 'Br[-1]',
 'K[+1]',
 'Cr(NO3)3(aq)',
 'Mg(NO3)2(aq)',
 'Sn[+4]',
 'PO4[-3]',
 'HCl(aq)',
 'SiF6[-2]',
 'Au[+2]',
 'CsCl(aq)',
 'ScCl3(aq)',
 'LiI(aq)',
 'S2O3[-2]',
 'SmCl3(aq)',
 'WO4[-2]',
 'H4N2O3(aq)',
 'Tm[+2]',
 'Al[+3]',
 'MgSO4(aq)',
 'SO42[-1]',
 'Ti[+2]',
 'Eu[+2]',
 'KNO2(aq)',
 'Zn(ClO4)2(aq)',
 'BaCl2(aq)',
 'Pa[+3]',
 'HClO4(aq)',
 'SO2[-1]',
 'Co(H3N)6[-3]',
 'H3O[+1]',
 'Sr(ClO4)2(aq)',
 'K4Fe(CN)6(aq)',
 'Mg[+2]',
 'Er[+3]',
 'Ba[+2]',
 'U[+4]',
 'MgBr2(aq)',
 'Pb(ClO4)2(aq)',
 'RbNO2(aq)',
 'Ra[+2]',
 'CdSO4(aq)',
 'U(NO4)2(aq)',
 'Na2S2O3(aq)',
 'KOH(aq)',
 'VO2[+1]',
 'PH9(NO2)2(aq)',
 'Eu(NO3)3(aq)',
 'F[-1]',
 'V[+3]',
 'CoBr2(aq)',
 'HSO4[-1]',
 'LiH3(CO)2(aq)',
 'KHCO3(aq)',
 'ClO4[-1]',
 'Cu[+1]',
 'Tl[+3]',
 'U[+3]',
 'Mg(ClO4)2(aq)',
 'KH3(CO)2(aq)',
 'Pu[+4]',
 'LaCl3(aq)',
 'BO2[-1]',
 'C2N3[-1]',
 'Ga[+3]',
 'UO2[+2]',
 'HOsO5[-1]',
 'MoO4[-2]',
 'EuCl3(aq)',
 'Tm[+3]',
 'RbI(aq)',
 'CaI2(aq)',
 'Fe(CN)6[-3]',
 'Ce[+3]',
 'Mn[+3]',
 'Os[+3]',
 'LiCl(aq)',
 'CsNO3(aq)',
 'Ba(NO3)2(aq)',
 'ClO2[-1]',
 'Sc[+2]',
 'HBr(aq)',
 'KClO4(aq)',
 'KBr(aq)',
 'RbF(aq)']