Source code for chempy.printing.tables


class _RxnTable(object):

    _rsys_meth = None

    def __init__(self, idx_rxn_pairs, substances, colors=None, missing=None, missing_color='eee8aa'):
        self.idx_rxn_pairs = idx_rxn_pairs
        self.substances = substances
        self.colors = colors or {}
        self.missing = missing or []
        self.missing_color = missing_color

    @classmethod
    def from_ReactionSystem(cls, rsys, color_categories=True):
        idx_rxn_pairs, unconsidered_ri = getattr(rsys, cls._rsys_meth)()
        colors = rsys._category_colors() if color_categories else {}
        missing = [not rsys.substance_participation(sk) for sk in rsys.substances]
        return cls(idx_rxn_pairs, rsys.substances, colors=colors, missing=missing), unconsidered_ri

    def _repr_html_(self):
        from .web import css
        return css(self, substances=self.substances, colors=self.colors)

    def _cell_label_html(self, printer, ori_idx, rxn):
        """ Reaction formatting callback. (reaction index -> string) """
        pretty = rxn.unicode(self.substances, with_param=True, with_name=False)
        return '<a title="%d: %s">%s</a>' % (ori_idx, pretty, printer._print(rxn.name or rxn.param))

    def _cell_html(self, printer, A, ri, ci=None):
        args = []
        if ci is not None and ri > ci:
            r = '-'
        else:
            if ci is None:  # A is a vector
                c = A[ri]
                is_missing = self.missing[ri]
            else:  # A is a matrix
                c = A[ri][ci]
                is_missing = self.missing[ri] or self.missing[ci]

            if c is None:
                r = ''
            else:
                r = ', '.join(self._cell_label_html(printer, *r) for r in c)

            if is_missing:
                args.append('style="background-color: #%s;"' % self.missing_color)

        return '<td %s>%s</td>' % (' '.join(args), r)


[docs]class UnimolecularTable(_RxnTable): """ Table of unimolecular reactions in a ReactionSystem Parameters ---------- rsys : ReactionSystem sinks_sources_disjoint : tuple, None or True Colors sinks & sources. When ``True`` :meth:`sinks_sources_disjoint` is called. html_cell_label : Reaction formatting callback The function takes an integer, a Reaction instance and a dict of Substances as parameters and return a string. Returns ------- string: html representation list: reactions not considered """ _rsys_meth = '_unimolecular_reactions' def _html(self, printer, **kwargs): if 'substances' not in kwargs: kwargs['substances'] = self.substances ss = printer._get('substances', **kwargs) rows = '\n'.join('<tr><td>%s</td>%s</tr>' % ( printer._print(s), self._cell_html(printer, self.idx_rxn_pairs, rowi) ) for rowi, s in enumerate(ss.values())) return '<table>%s</table>' % rows
[docs]class BimolecularTable(_RxnTable): """ Table of bimolecular reactions Parameters ---------- idx_rxn_pairs : iterable of (int, Reaction) pairs substances : dict Mapping substance key to Substance instance. sinks_sources_disjoint : tuple, None or True Colors sinks & sources. When ``True`` :meth:`sinks_sources_disjoint` is called. Returns ------- string: html representation list: reactions not considered """ _rsys_meth = '_bimolecular_reactions' def _html(self, printer, **kwargs): if 'substances' not in kwargs: kwargs['substances'] = self.substances ss = printer._get('substances', **kwargs) header = '<th></th>' + ''.join('<th>%s</th>' % printer._print(s) for s in ss.values()) rows = ['<tr><td>%s</td>%s</tr>' % ( printer._print(s), ''.join(self._cell_html(printer, self.idx_rxn_pairs, rowi, ci) for ci in range(len(ss))) ) for rowi, s in enumerate(ss.values())] return '<table>%s</table>' % '\n'.join([header, '\n'.join(rows)])