pyEQL
Tutorial: Searching the Property Database¶
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)']