Python package for calculating the masses of substances required for chemical synthesis directly from the reaction string. It includes solutions for all intermediate steps, including chemical formula parsing, molar mass calculation and reaction balancing with different matrix methods.
Install from pypi:
pip install chemsynthcalcLet's say that we need to prepare 3 grams of YBCO by solid-state synthesis from respective carbonates. The reaction string will look something like this (to simplify, let's leave it without oxygen nonstoichiometry):
from chemsynthcalc import ChemicalReaction
reaction_string = "BaCO3 + Y2(CO3)3 + CuCO3 + O2 → YBa2Cu3O7 + CO2"Now, we can create a chemical reaction object of the ChemicalReaction class, which will be used in the calculation. We need to specify the arguments for our particular case:
>>> reaction = ChemicalReaction(
reaction = reaction_string, # our reaction string
target = 0, # index of target compound in the product list
target_mass = 3, # desired mass of target compound,
mode = "balance" # mode of coefficients calculations,
)Now, to perform the automatic calculation, all we need to do is to put:
>>> reaction.print_results(print_rounding_order=4)
# assuming that we use analytical balances with 4 digit presicionAnd we get our output in the terminal:
initial reaction: BaCO3+Y2(CO3)3+CuCO3+O2→YBa2Cu3O7+CO2
reaction matrix:
[[1. 0. 0. 0. 2. 0.]
[1. 3. 1. 0. 0. 1.]
[3. 9. 3. 2. 7. 2.]
[0. 2. 0. 0. 1. 0.]
[0. 0. 1. 0. 3. 0.]]
mode: balance
formulas: ['BaCO3', 'Y2(CO3)3', 'CuCO3', 'O2', 'YBa2Cu3O7', 'CO2']
coefficients: [8, 2, 12, 1, 4, 26]
normalized coefficients: [2, 0.5, 3, 0.25, 1, 6.5]
algorithm: inverse
is balanced: True
final reaction: 8BaCO3+2Y2(CO3)3+12CuCO3+O2→4YBa2Cu3O7+26CO2
final reaction normalized: 2BaCO3+0.5Y2(CO3)3+3CuCO3+0.25O2→YBa2Cu3O7+6.5CO2
molar masses: [197.335, 357.835676, 123.554, 31.998, 666.190838, 44.009]
target: YBa2Cu3O7
masses: [1.7773, 0.8057, 1.6692, 0.036, 3.0, 1.2882]
BaCO3: M = 197.3350 g/mol, m = 1.7773 g
Y2(CO3)3: M = 357.8357 g/mol, m = 0.8057 g
CuCO3: M = 123.5540 g/mol, m = 1.6692 g
O2: M = 31.9980 g/mol, m = 0.0360 g
YBa2Cu3O7: M = 666.1908 g/mol, m = 3.0000 g
CO2: M = 44.0090 g/mol, m = 1.2882 gNow, we've got all the masses ready for our planned synthesis!
- Formula parsing
>>> from chemsynthcalc import ChemicalFormula >>> ChemicalFormula("C2H5OH").parsed_formula {'C': 2.0, 'H': 6.0, 'O': 1.0}
- Calculation of the molar mass
>>> ChemicalFormula("C2H5OH").molar_mass 46.069
- Mass, atomic, and oxide percent calculations with
mass_percent,atomic_percentandoxide_percent(including user-defined oxides) properties ofChemicalFormula. - Auto-balancing chemical equations by 4 different matrix methods in
balancemode:>>> from chemsynthcalc import ChemicalReaction >>> reaction_string = "K4Fe(CN)6 + KMnO4 + H2SO4 = KHSO4 + Fe2(SO4)3 + MnSO4 + HNO3 + CO2 + H2O" >>> ChemicalReaction(reaction_string, mode="balance").final_reaction 10K4Fe(CN)6+122KMnO4+299H2SO4=162KHSO4+5Fe2(SO4)3+122MnSO4+60HNO3+60CO2+188H2O
- Calculation of masses for user-defined coefficients in
force(calculates regardless of balance) andcheck(checks if reaction is balanced by user-defined coefficients) modes.>>> ChemicalReaction("BaCO3+TiO2=BaTiO3", mode="force").masses #we can drop CO2 product and still get masses in this mode. [0.84623763, 0.34248749, 1.0]
Setting the coefficients directly into>>> ChemicalReaction("2H2+O2=2H2O", mode="check").coefficients #we can be sure that reaction is balanced with our coefficients in this mode [2, 1, 2]
ChemicalReactioninstance:>>> reaction = ChemicalReaction("H2+O2=H2O", mode="check") >>> reaction.coefficients = [2,1,2] >>> reaction.coefficients [2, 1, 2] >>> reaction.is_balanced True
- Calculation of coefficients with
ChemicalReaction.balanceobject individually by each of 4 different algorithms (inverse, general pseudoinverse, partial pseudoinverse and combinatorial algorithms). - Export of results of both
ChemicalFormulaandChemicalReactioninto .txt file (with.to_txt()), into JSON object (with.to_json()) or JSON file (with.to_json_file()).
The code is provided under the MIT license.
If you have any questions, please contact Egor Syrov at [email protected] or create an issue at github https://github.com/Syrov-Egor/chemsynthcalc/issues.