# Chemical Reactions

## Making a Reaction

chemlib.chemistry.Reaction

  alias of `chemlib.chemistry.chemlib.chemistry.Reaction._name`

Instantiate a `chemlib.Reaction` object with a list of reactant Compounds and product Compounds.

    >>> from chemlib import Compound, Reaction
    >>> N2O5 = Compound("N2O5")
    >>> H2O = Compound("H2O")
    >>> HNO3 = Compound("HNO3")
    >>> r = Reaction([N2O5, H2O], [HNO3])

classmethod chemlib.chemistry.Reaction.by_formula(cls, formula: str)

OR Instantiate a `chemlib.Reaction` object using a string to represent the formula:

In the formula string, place the formulae of reactants separated by `+` signs on the left side of the arrow `-->`. On the right side of the arrow, place the formulae of products separated by `+` signs:

    >>> from chemlib import Reaction
    >>> r = Reaction.by_formula("N2O5 + H2O --> HNO3")

> chemlib.chemistry.Reaction.formula: str

>     >>> r.formula
>     '1N₂O₅ + 1H₂O₁ --> 1H₁N₁O₃'

> chemlib.chemistry.Reaction.is_balanced: boolean

>     >>> r.is_balanced
>     False

> chemlib.chemistry.Reaction.reactant_formulas: list

>     >>> r.reactant_formulas
>     ['N₂O₅', 'H₂O₁']

> chemlib.chemistry.Reaction.product_formulas: list

>     >>> r.product_formulas
>     ['H₁N₁O₃']

## Combustion Reactions

class chemlib.chemistry.Combustion(compound)

Inherits from `chemlib.chemistry.Reaction`

Makes a chemical reaction involving the combustion of one compound. Formula will be balanced.

    >>> from chemlib import Compound, Combustion
    >>> methane = Compound('CH4')
    >>> c = Combustion(methane)
    >>> c.formula
    '1C₁H₄ + 2O₂ --> 2H₂O₁ + 1C₁O₂'
    >>> c.is_balanced
    True

## Balancing the Equation

chemlib.chemistry.Reaction.balance(self) → None

Balances the chemical equation using linear algebra. See Applications of Linear Algebra in Chemistry.

    >>> r.balance()
    >>> r.formula
    '1N₂O₅ + 1H₂O₁ --> 2H₁N₁O₃'
    >>> r.is_balanced
    True

## Stoichiometry

chemlib.chemistry.Reaction.get_amounts(self, compound_number, **kwargs)

  Get stoichiometric amounts of ALL compounds in the reaction given the amount of one compound.

  Parameters

    - compound_number (int) – The chosen compound in the reaction by order of appearance.

    - kwargs – The amount of the chosen compound (grams=, moles=, or molecules=)

  Returns

    the amounts of each compound in the reaction

  Return type

    list of dicts

  Raises

    - ValueError – if the compound_number is less than 1 or greater than the number of compounds in the reaction

    - ValueError – if more than one argument is given under kwargs

Best demonstrated by example:

    >>> r.formula
    '1N₂O₅ + 1H₂O₁ --> 2H₁N₁O₃'

Get the amounts of ALL compounds in the above reaction given 5 grams of N₂O₅. It is the first compound in the reaction by order of appearance (left to right).

    >>> r.get_amounts(1, grams=5)
    [{'Compound': 'N₂O₅', 'Grams': 5, 'Moles': 0.0463, 'Molecules': 2.787e+22}, {'Compound': 'H₂O₁', 'Grams': 0.834, 'Moles': 0.0463, 'Molecules': 2.787e+22}, {'Compound': 'H₁N₁O₃', 'Grams': 5.835, 'Moles': 0.0926, 'Molecules': 5.575e+22}]

Get the amounts of ALL compounds in the above reaction given 3.5 moles of HNO₃. It is the third compound in the reaction by order of appearance (left to right).

    >>> r.get_amounts(3, moles=3.5)
    [{'Compound': 'N₂O₅', 'Grams': 189.018, 'Moles': 1.75, 'Molecules': 1.054e+24}, {'Compound': 'H₂O₁', 'Grams': 31.518, 'Moles': 1.75, 'Molecules': 1.054e+24}, {'Compound': 'H₁N₁O₃', 'Grams': 220.535, 'Moles': 3.5, 'Molecules': 2.107e+24}]

## Limiting Reagent

chemlib.chemistry.Reaction.limiting_reagent(self, *args, mode='grams')

  Get the limiting reagent (limiting reactant) in the chemical reaction.

  Parameters

    - args – The amounts of each reactant to use in the chemical reaction.

    - mode (str) – The units of each amount in args. Default is grams, can also be moles or molecules.

  Returns

    The limiting reagent of the reaction.

  Return type

    chemlib.chemistry.Compound

  Raises

    - TypeError – If the number of args doesn’t match the number of reactants in the reaction.

    - ValueError – If the mode is not grams, moles, or molecules.

  Find the limiting reagent of the reaction when using 50 grams of the first reactant (N₂O₅) and 80 grams of the second reactant (H₂O):

      >>> lr = r.limiting_reagent(50, 80)
      >>> lr.formula
      'N₂O₅'

  Find the limiting reagent of the reaction when using 3 moles of the first reactant (N₂O₅) and 1 mole of the second reactant (H₂O):

      >>> lr = r.limiting_reagent(3, 1, mode = 'moles')
      >>> lr.formula
      'H₂O₁'