Source code for pyretis.inout.report.report_md

# -*- coding: utf-8 -*-
# Copyright (c) 2023, PyRETIS Development Team.
# Distributed under the LGPLv2.1+ License. See LICENSE for more info.
"""Functions for generating reports.

The reports are useful for displaying results from the analysis.

Important methods defined here
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

generate_report_mdflux (:py:func:`.generate_report_mdflux`)
    Generate a report for a MD flux simulation.
"""
from pyretis.inout.report.markup import (generate_rst_table,
                                         generate_latex_table)
from pyretis.inout.formats.formatter import apply_format


__all__ = ['generate_report_mdflux']


[docs]def generate_report_mdflux(analysis, output='rst'): """Generate a report for a MD flux simulation. Parameters ---------- analysis : dict This is the output from the analysis. output : string, optional This is the desired output format. It must match one of the formats defined in :py:const:`pyretis.inout.report.report.__TEMPLATES`. Default is 'rst' (reStructuredText). Returns ------- out : dictionary The generated report as a string. """ report = {'figures': {}, 'tables': {}} # generate some tables: cross_out = analysis['cross']['out'] report['figures']['flux'] = analysis['cross']['figures'] report['figures']['energy'] = analysis['energy']['figures'] report['figures']['order'] = analysis['order']['figures'] report['tables']['md-flux'] = _table_md_flux(cross_out, fmt=output)[1] report['tables']['md-cycles'] = _table_md_flux_cycles(cross_out, fmt=output)[1] report['tables']['md-efficiency'] = _table_md_efficiency(cross_out, fmt=output)[1] return report
[docs]def _table_md_efficiency(results, fmt='rst'): """Generate table with MD-flux results for efficiencies and correlations. Parameters ---------- results : dict These are the results obtained by :py:func:`.analyse_flux`. fmt : string, optional Determines if we create reStructuredText ('rst') or latex ('tex'). Returns ------- out[0] : list of strings These are the rows of the table. out[1] : string This is a string in the desired format which represents the table. """ # table for interfaces: table = [] for i, _ in enumerate(results['interfaces']): pmd = results['pMD'][i] teff = results['teffMD'][i] corr = results['corrMD'][i] prel = results['1-p'][i] row = [ f'{i + 1:^10d}', apply_format(pmd, '{:^10.6f}'), apply_format(prel, '{:^10.6f}'), apply_format(teff, '{:^10.6f}'), apply_format(corr, '{:^10.6f}'), ] table.append(row) if fmt in ['tex', 'latex']: table_str = generate_latex_table(table, 'Efficiency', ['Interface', r'$p_\text{MD}$', r'$\frac{1-p}{p}$', 'Efficiency time', 'Correlation'], fixnum={1, 2, 3, 4}) elif fmt in ['txt']: table_str = generate_rst_table(table, 'Efficiency', ['Interface', 'p_MD', '(1-p_MD)/p_MD', 'Efficiency time', 'Correlation']) else: table_str = generate_rst_table(table, 'Efficiency', ['Interface', r':math:`p_\text{MD}`', r':math:`\frac{1-p}{p}`', 'Efficiency time', 'Correlation']) table_txt = '\n'.join(table_str) return table, table_txt
[docs]def _table_md_flux_cycles(results, fmt='rst'): """Generate a table for the MD-flux results for cycle numbers. The table will display the number of steps in state A, state B, overall state A and B and the total number of MD cycles. Parameters ---------- results : dict These are the results obtained by :py:func:`.analyse_flux`. fmt : string, optional Determines if we create reStructuredText ('rst') or latex ('tex'). Returns ------- out[0] : list of strings These are the rows of the table. out[1] : string This is a string in the desired format which represents the table. """ # table for interfaces: table = [ ['A', f'{results["times"]["A"]:8d}'], ['B', f'{results["times"]["B"]:8d}'], ['overall A', f'{results["times"]["OA"]:8d}'], ['overall B', f'{results["times"]["OB"]:8d}'], ['Total cycles', f'{results["totalcycle"]:8d}'], ] if fmt in ['tex', 'latex']: table_str = generate_latex_table(table, 'Cycles spent in state', ['State', 'Cycles'], fixnum={2}) else: table_str = generate_rst_table(table, 'Cycles spent in state', ['State', 'Cycles']) table_txt = '\n'.join(table_str) return table, table_txt
[docs]def _table_md_flux(results, fmt='rst'): """Generate the table for the MD-flux results. Parameters ---------- results : dict These are the results obtained by :py:func:`.analyse_flux`. fmt : string, optional Determines if we create reStructuredText ('rst') or latex ('tex'). Returns ------- out[0] : list of strings These are the rows of the table. out[1] : string This is a string in the desired format which represents the table. """ # table for interfaces: table = [] for i, idet in enumerate(results['interfaces']): flux = results['runflux'][i][-1] error = results['errflux'][i][2] relerror = results['errflux'][i][4] row = [ f'{i + 1:^4d}', apply_format(idet, '{:^8.4f}'), apply_format(flux, '{:^10.6f}'), apply_format(error, '{:^10.6f}'), apply_format(relerror, '{:^10.6f}'), f'{results["ncross"][i]:^8d}', f'{results["neffcross"][i]:^8d}', apply_format(results['neffc/nc'][i], '{:^10.6f}'), apply_format(results['cross_time'][i], '{:^10.6f}'), ] table.append(row) if fmt in ['tex', 'latex']: table_str = generate_latex_table(table, 'Flux for interfaces', ['Int.', 'Position', 'Flux / units', 'Error', 'Rel. error', 'Ncross', 'Neffcross', 'Neffcross/Ncross', 'Steps per cross'], fixnum={2, 3, 4, 5, 6, 7, 8}) else: table_str = generate_rst_table(table, 'Flux for interfaces', ['Int.', 'Position', 'Flux / units', 'Error', 'Rel. error', 'Ncross', 'Neffcross', 'Neffcross/Ncross', 'Steps per cross']) table_txt = '\n'.join(table_str) return table, table_txt