Source code for rxn_network.pathways.base

"""Basic interface for a reaction pathway."""

from __future__ import annotations

from abc import ABCMeta
from typing import TYPE_CHECKING

from monty.json import MSONable

if TYPE_CHECKING:
    from pymatgen.entries.computed_entries import ComputedEntry

    from rxn_network.core import Composition
    from rxn_network.reactions.base import Reaction


[docs] class Pathway(MSONable, metaclass=ABCMeta): """Base definition for a reaction pathway.""" _reactions: list[Reaction] @property def entries(self) -> set[ComputedEntry]: """Entry objects in this pathway.""" return {entry for rxn in self._reactions for entry in rxn.entries} @property def all_reactants(self) -> set[Composition]: """Reactant compositions for all reactions in the pathway.""" return {entry for rxn in self._reactions for entry in rxn.reactants} @property def all_products(self) -> set[Composition]: """Product compositions reaction in the pathway.""" return {entry for rxn in self._reactions for entry in rxn.products} @property def compositions(self) -> list[Composition]: """All compositions in the reaction.""" return list(self.all_reactants | self.all_products) @property def reactants(self) -> set[Composition]: """The reactant compositions of this whole/net reaction pathway.""" return self.all_reactants - self.all_products @property def products(self) -> set[Composition]: """The product compositions of this whole/net reaction pathway.""" return self.all_products - self.all_reactants @property def intermediates(self) -> set[Composition]: """Intermediate compositions in this reaction pathway.""" return self.all_products & self.all_reactants @property def energy(self) -> float: """Total energy of this reaction pathway.""" return sum(rxn.energy for rxn in self._reactions) @property def energy_per_atom(self) -> float: """Total normalized energy of this reaction pathway.""" return sum(rxn.energy_per_atom for rxn in self._reactions)