Presenter

Presenter Module

This module provides functionality for presenting Greenhouse Gas (GHG) emissions computation results in various output formats such as Excel, JSON, LaTeX, and HTML.

Classes:
ExcelWriter:

Formats and writes data to an Excel file.

JSONWriter:

Formats and writes data to a JSON file.

LatexWriter:

Formats and writes data to a LaTeX file using PyLaTeX.

HTMLWriter:

Formats and writes data to an HTML file.

Presenter:

Reads and processes GHG emission calculation results and outputs them using various writers.

Functions:
enforce_unity_sum(vector: List[float], epsilon: float = 0.001) -> List[float]:

Ensures the sum of values in a vector is approximately 1.0 within a given epsilon tolerance.

landcover_pie(axis: plt.Axes, values: List[float], labels: List[str], colors: List[Any],

title: Optional[str] = None, show_legend: bool = False) -> None:

Creates a pie chart of land cover composition using matplotlib.

parse_landcover_composition(vector: List[float]) -> List[float]:

Parses a vector representing land cover composition into a standardized format.

write_par_to_dict(input_name: str, parameter: Any, par_dict: Dict, reservoir_name: str,

precision: int = 3) -> Dict:

Writes a parameter to a dictionary of parameter name-value pairs.

rollout(var_name: str, var_vector: Union[Sequence, Dict]) -> Iterator[Tuple[str, Any]]:

Creates variable names and values from a sequence or dictionary.

round_parameter(number: Union[float, list], number_decimals: int) -> Union[float, list]:

Rounds a number or each element in a list to the specified number of decimals.

Notes

  • Each writer class (ExcelWriter, JSONWriter, LatexWriter, HTMLWriter) is designed to handle specific output formats, ensuring the presentation of inputs, outputs, and internal variables in a structured manner.

  • All writer classes inherit from the abstract base class Writer, which enforces the implementation of the write method and provides utility methods such as round_parameter, rollout, and write_par_to_dict.

Usage:

[To be added later]

class reemission.presenter.ExcelWriter(inputs: Inputs, outputs: Dict, intern_vars: Dict, output_file_path: str, output_config: Dict, input_config: Dict, intern_vars_config: Dict, parameter_config: Dict, config_ini: Dict, author: str, title: str)[source]

Formats and writes data to an Excel file.

inputs

Inputs object containing input data.

Type:

Inputs

outputs

Outputs dictionary.

Type:

Dict

intern_vars

Internal variables dictionary.

Type:

Dict

output_file_path

Path where the output Excel file will be saved.

Type:

str

output_config

Configuration file with formatting settings for outputs.

Type:

Dict

input_config

Configuration file with formatting settings for inputs.

Type:

Dict

intern_vars_config

Configuration dictionary with formatting settings for internal variables.

Type:

Dict

parameter_config

Configuration file with formatting settings for parameters.

Type:

Dict

config_ini

Global parameter configuration dict (usually from .ini file).

Type:

Dict

author

Author of the Excel document.

Type:

str

title

Title of the Excel document.

Type:

str

output_df

DataFrame containing model outputs.

Type:

pd.DataFrame

input_df

DataFrame containing model inputs.

Type:

pd.DataFrame

intern_vars_df

DataFrame containing internal variables.

Type:

pd.DataFrame

__post_init__()[source]

Initialize output DataFrames which will be output as Excel sheets.

add_inputs(reservoir_name: str) None[source]

Create an inputs DataFrame for a given reservoir and append it to the main input DataFrame.

Parameters:

reservoir_name (str) – Name of the reservoir for which inputs are to be added.

add_internals(reservoir_name: str) None[source]

Add internal variables selected for presentation for a given reservoir.

Parameters:

reservoir_name (str) – Name of the reservoir.

add_outputs(reservoir_name: str) None[source]

Add outputs selected for presentation for a given reservoir.

Parameters:

reservoir_name (str) – Name of the reservoir for which outputs are to be added.

author: str
config_ini: Dict
dict_data_to_df(id: str, data: Dict, config: Dict, index_name: str = 'Name') DataFrame[source]

Parse data in a dictionary format into pandas DataFrame format.

Parameters:
  • id (str) – Identifier for the data (e.g., reservoir name).

  • data (Dict) – Dictionary containing data to be parsed into DataFrame.

  • config (Dict) – Configuration dictionary specifying which parameters to include.

  • index_name (str, optional) – Name of the index column in the DataFrame. Defaults to ‘Name’.

Returns:

DataFrame containing parsed data.

Return type:

pd.DataFrame

input_config: Dict
input_df: DataFrame
inputs: Inputs
intern_vars: Dict
intern_vars_config: Dict
intern_vars_df: DataFrame
output_config: Dict
output_df: DataFrame
output_file_path: str
outputs: Dict
parameter_config: Dict
title: str
write() None[source]

Write input/output data (all reservoirs) to an Excel file.

class reemission.presenter.HTMLWriter(inputs: Inputs, outputs: Dict, intern_vars: Dict, output_file_path: str, output_config: Dict, input_config: Dict, intern_vars_config: Dict, parameter_config: Dict, config_ini: Dict, author: str, title: str)[source]

Format and write data to an HTML file.

__post_init__() None[source]

Initialize the HTML content with a basic structure.

add_inputs_table(output_name: str) None[source]

Add information with model inputs (for each reservoir) to the HTML content.

add_intern_vars_table(output_name: str) None[source]

Add internal variables table to the HTML content.

add_landcover_piecharts(output_name: str) None[source]

Add landcover piecharts to the HTML content.

add_outputs_table(output_name: str) None[source]

Add outputs table to the HTML content.

add_plot(fig, caption: str, dpi: int = 200) None[source]

Add a plot to the HTML content using PNG format for faster rendering.

add_plots(output_name: str) None[source]

Generate and add emission plots to the HTML content.

add_section(title: str) None[source]

Add a section to the HTML content.

add_subsection(title: str) None[source]

Add a subsection to the HTML content.

add_table(data: Dict, config: Dict, column_names: Tuple[str, str, str]) None[source]

Add a table to the HTML content.

author: str
config_ini: Dict
html_fragments: List[str]
input_config: Dict
inputs: Inputs
intern_vars: Dict
intern_vars_config: Dict
output_config: Dict
output_file_path: str
outputs: Dict
parameter_config: Dict
plot_emission_bars(axis: Axes, output_name: str) None[source]

Plot total emissions as a bar chart.

title: str
write() None[source]

Write the HTML content to the output file.

class reemission.presenter.JSONWriter(inputs: Inputs, outputs: Dict, intern_vars: Dict, output_file_path: str, output_config: Dict, input_config: Dict, intern_vars_config: Dict, parameter_config: Dict, config_ini: Dict, author: str, title: str)[source]

Format and write data to a JSON file.

inputs

Inputs object with input data.

Type:

Inputs

outputs

Outputs dictionary.

Type:

Dict

intern_vars

Internal variables dictionary.

Type:

Dict

output_file_path

Path where the output file is to be saved/written to.

Type:

str

output_config

Configuration dictionary with formatting settings for outputs.

Type:

Dict

input_config

Configuration dictionary with formatting settings for inputs.

Type:

Dict

intern_vars_config

Configuration dictionary with formatting settings for internal variables.

Type:

Dict

parameter_config

Configuration file with formatting settings for parameters.

Type:

Dict

config_ini

Global parameter configuration dict (usually from .ini file).

Type:

Dict

author

Author of the document.

Type:

str

title

Title of the document.

Type:

str

json_dict

Output dictionary saved to the output JSON file. Automatically initialized.

Type:

Dict

__post_init__()[source]

Initialize json_dict which will be output as JSON.

add_inputs(reservoir_name: str) None[source]

Add inputs selected for presentation for a given reservoir to json_dict.

Parameters:

reservoir_name (str) – Name of the reservoir.

add_internals(reservoir_name: str) None[source]

Add internal variables selected for presentation for a given reservoir to json_dict.

Parameters:

reservoir_name (str) – Name of the reservoir.

add_outputs(reservoir_name: str) None[source]

Add outputs selected for presentation for a given reservoir to json_dict.

Parameters:

reservoir_name (str) – Name of the reservoir.

author: str
config_ini: Dict
input_config: Dict
inputs: Inputs
intern_vars: Dict
intern_vars_config: Dict
json_dict: Dict
output_config: Dict
output_file_path: str
outputs: Dict
parameter_config: Dict
parse_dict_data(config: Dict, data: Dict, item_names: Tuple) Dict[source]

Parse data dictionary into a structured format based on configuration.

Parameters:
  • config (Dict) – Configuration dictionary indicating which parameters to include.

  • data (Dict) – Dictionary containing data to be parsed.

  • item_names (Tuple) – Tuple of item names to include in the parsed output.

Returns:

Parsed dictionary data.

Return type:

Dict

title: str
write() None[source]

Write output data (all reservoirs) to a JSON file.

class reemission.presenter.LatexWriter(inputs: Inputs, outputs: Dict, intern_vars: Dict, output_file_path: str, output_config: Dict, input_config: Dict, intern_vars_config: Dict, parameter_config: Dict, config_ini: Dict, author: str, title: str)[source]

Format and write data to a LaTeX file using PyLaTeX.

inputs

Inputs object with input data.

Type:

Inputs

outputs

Outputs dictionary.

Type:

Dict

intern_vars

Internal variables dictionary.

Type:

Dict

output_file_path

Path where the output file is to be saved/written to.

Type:

str

output_config

Configuration file with formatting settings.

Type:

Dict

input_config

Configuration file with formatting settings.

Type:

Dict

intern_vars_config

Configuration dictionary with formatting settings.

Type:

Dict

parameter_config

Configuration file with formatting settings.

Type:

Dict

config_ini

Global parameter configuration dict (usually from .ini file).

Type:

Dict

author

Author of the document.

Type:

str

title

Title of the document.

Type:

str

document

PyLaTeX Document object.

Type:

Document

__post_init__() None[source]

Initialize the PyLaTeX document with specified geometry.

add_header(header_title: str = 'GHG emission estimation results') None[source]

Adds a header to the LaTeX document source code.

Parameters:

header_title (str) – The title to be added in the header. Defaults to “GHG emission estimation results”.

Returns:

None

add_inputs_subsection(reservoir_name: str) None[source]

Writes inputs information to the LaTeX document source code.

Parameters:

reservoir_name (str) – The name of the reservoir.

Returns:

None

add_inputs_table(output_name: str, precision: int = 4) None[source]

Add information with model inputs (for each reservoir).

Parameters:
  • output_name (str) – Name of the output/reservoir.

  • precision (int) – Number of decimal points in the output input values.

add_intern_var_subsection(reservoir_name: str) None[source]

Writes internal variable information to the LaTeX document source code.

Parameters:

reservoir_name (str) – The name of the reservoir.

Returns:

None

add_intern_vars_table(output_name: str, precision: int = 4) None[source]

Adds internal variables table to the LaTeX document.

Parameters:
  • output_name (str) – Name of the internal variable/reservoir.

  • precision (int) – Number of decimal points in the output values.

add_landcover_charts(output_name: str, plot_fraction: float = 0.95, dpi: int = 300) None[source]

Add pie charts with landcover proportions for reservoir and catchment.

Parameters:
  • output_name (str) – Name of the output/reservoir.

  • plot_fraction (float) – Fraction of text width the plot takes on the page. Default is 0.95.

  • dpi (int) – Resolution of the created figure within PDF. Default is 300.

add_outputs_subsection(reservoir_name: str) None[source]

Writes outputs information to the LaTeX document source code.

Parameters:

reservoir_name (str) – The name of the reservoir.

Returns:

None

add_outputs_table(output_name: str, precision: int = 4) None[source]

Adds outputs table to the LaTeX document.

Parameters:
  • output_name (str) – Name of the output/reservoir.

  • precision (int) – Number of decimal points in the output values.

add_parameters(precision: int = 4) None[source]

Add information about model parameters such as conversion factors and other useful details to the report.

Parameters:

precision (int) – Number of decimal points in output parameters. Default is 4.

add_parameters_section() None[source]

Writes model parameter information to the LaTeX document source code.

Parameters:

None

Returns:

None

add_plots(output_name: str, plot_fraction: float = 0.75, dpi: int = 300) None[source]

Generate and add emission plots to the document.

Parameters:
  • output_name (str) – Name of the output/reservoir.

  • plot_fraction (float) – Fraction of text width the plot takes on the page. Default is 0.75.

  • dpi (int) – Resolution of the created figure within PDF. Default is 300.

add_title_section(title: str, author: str) None[source]

Writes the title section to the LaTeX document source code.

Parameters:
  • title (str) – The title of the document.

  • author (str) – The author of the document.

Returns:

None

author: str
config_ini: Dict
static geometry() Dict[source]

Create document geometry structure.

Returns:

Dictionary containing the document geometry options.

Return type:

Dict

input_config: Dict
inputs: Inputs
intern_vars: Dict
intern_vars_config: Dict
output_config: Dict
output_file_path: str
outputs: Dict
parameter_config: Dict
plot_emission_bars(axis: Axes, output_name: str) None[source]

Visualize total emissions (unit x surface area) for the calculated gases.

Parameters:
  • axis (plt.Axes) – Matplotlib axes object.

  • output_name (str) – Name of the output/reservoir.

plot_landcover_piecharts(axes: ndarray, output_name: str) None[source]

Plot pie charts of landcover compositions for reservoir and catchment.

Parameters:
  • axes (np.ndarray) – Array of matplotlib axes objects.

  • output_name (str) – Name of the output/reservoir.

plot_profile(axis: Axes, emission: str, output_name: str, annotate: bool = True) None[source]

Plot an emission profile using matplotlib.

Parameters:
  • axis (plt.Axes) – Matplotlib axes object.

  • emission (str) – Name of the gas/emission to plot.

  • output_name (str) – Name of the output/reservoir.

  • annotate (bool) – Flag setting whether emission values are added to plot. Default is True.

title: str
write() None[source]

Writes output data (all reservoirs) to .tex and .pdf files.

Parameters:

None

Returns:

None

class reemission.presenter.Presenter(inputs: Inputs, outputs: Dict, intern_vars: Dict, writers: List[Writer] | None = None, author: str = 'Anonymous', title: str = 'Results')[source]

Reads and processes results of GHG emission calculations and outputs them in different formats.

inputs

An instance of Inputs class containing input data.

Type:

Inputs

outputs

Dictionary containing model outputs.

Type:

Dict

intern_vars

Dictionary of internal variables.

Type:

Dict

writers

Optional list of Writer objects for output.

Type:

Optional[List[Writer]]

author

Name of the author. Default is ‘Anonymous’.

Type:

str

title

Title of the document. Default is ‘Results’.

Type:

str

__post_init__()[source]

Loads configuration files after instance initialization.

add_writer(writer: Type[Writer], output_file: str) None[source]

Adds a Writer object to the list of writers.

Parameters:
  • writer (Type[Writer]) – Type of Writer to instantiate.

  • output_file (str) – Path to the output file for the Writer.

Returns:

None

author: str = 'Anonymous'
classmethod fromfiles(input_file: str, output_file: str, interns_file: str, **kwargs)[source]

Creates an instance of Presenter from JSON files.

Parameters:
  • input_file (str) – Path to JSON file containing input data.

  • output_file (str) – Path to JSON file containing model outputs.

  • interns_file (str) – Path to JSON file containioutput_file_pathng internal variables.

  • **kwargs – Additional keyword arguments for customization.

Returns:

An instance of Presenter initialized with data loaded from files.

Return type:

Presenter

inputs: Inputs
intern_vars: Dict
output() None[source]

Outputs GHG emission calculation results using writers.

outputs: Dict
title: str = 'Results'
writers: List[Writer] | None = None
class reemission.presenter.Writer[source]

Abstract base class for all writers.

static rollout(var_name: str, var_vector: Sequence | Dict) Iterator[Tuple[str, Any]][source]

Creates variable names and values from a sequence or dictionary.

Parameters:
  • var_name (str) – Base name for the variables.

  • var_vector (Union[Sequence, Dict]) – Sequence or dictionary containing variable values.

Yields:

Iterator[Tuple[str, Any]] – Iterator yielding tuples of variable names and values.

Example

a variable var = [3,4,5] becomes: (‘var_0’, 3), (‘var_1’, 4), (‘var_2’, 5).

static round_parameter(number: float | list, number_decimals: int) float | list[source]

Rounds a number or each element in a list to the specified number of decimals.

Parameters:
  • number (Union[float, list]) – The number or list of numbers to round.

  • number_decimals (int) – Number of decimal places to round to.

Returns:

Rounded number or list of rounded numbers.

Return type:

Union[float, list]

abstract write() None[source]

Writes outputs to the format of choice.

static write_par_to_dict(input_name: str, parameter: Any, par_dict: Dict, reservoir_name: str, precision: int = 3) Dict[source]

Writes a parameter to a dictionary of parameter name-value pairs.

Parameters:
  • input_name (str) – Name of the input parameter.

  • parameter (Any) – Parameter data. It can be a single value, sequence, or nested sequence.

  • par_dict (Dict) – Dictionary of parameter names and values in the form {reservoir_name: {par_name: par_values}}.

  • reservoir_name (str) – Name of the reservoir for which the parameter is to be added.

  • precision (int, optional) – Number of decimal points for the parameter. Defaults to 3.

Returns:

Updated dictionary of parameter names and values.

Return type:

Dict

reemission.presenter.emission_bars(axis: Axes, gases: List[str], values: List[float], output_name: str) None[source]

Visualize total emissions (unit x surface area) for the calculated gases.

Parameters:
  • axis (plt.Axes) – Matplotlib axes object.

  • gases (List[str]) – List of gas names to be displayed on the y-axis.

  • values (List[float]) – List of total annual emissions for each gas.

  • output_name (str) – Name of the output/reservoir.

reemission.presenter.emission_profile(axis: Axes, years: List[int], emissions: List[float], title: str, y_label: str, annotate: bool = True) None[source]

Plots a profile of emissions over time.

Parameters:
  • axis (plt.Axes) – Matplotlib axes object.

  • years (List[int]) – List of years corresponding to the emissions.

  • emissions (List[float]) – List of emissions corresponding to the years.

  • title (str) – Title of the plot.

  • y_label (str) – Label for the y-axis.

  • annotate (bool) – Flag setting whether emission values are added to plot. Default is True.

Raises:

ValueError – If the lengths of years and emissions do not match, or if they contain non-numeric values.

reemission.presenter.enforce_unity_sum(vector: List[float], epsilon: float = 0.001) List[float][source]

Ensures the sum of values in the vector is approximately 1.0 within a given epsilon tolerance.

Parameters:
  • vector (List[float]) – The input vector of float values to be normalized.

  • epsilon (float, optional) – Tolerance level around 1.0 within which the sum of the vector should lie. Defaults to 0.001.

Returns:

A normalized vector where the sum of values is approximately 1.0.

Return type:

List[float]

Note

  • If the sum of values in the input vector is not within the range [1.0 - epsilon, 1.0 + epsilon], the vector is normalized by dividing each element by the current sum of the vector.

reemission.presenter.format_number(x) str[source]

Formats a number for display in a human-readable way. :param x: The number to format. It can be an int, float, or None. :type x: Any

Returns:

A string representation of the number formatted for readability.

Return type:

str

Note

  • If x is None, it returns “—” (or “N/A”).

  • If x is an integer, it returns the integer as a string.

  • For floats, it formats them based on their magnitude:
    • Very large or very negative values are formatted with 1 decimal point.

    • Moderate values are formatted with up to 5 significant digits.

    • Very small values are formatted with 3 significant digits.

    • Extremely small values are formatted in engineering notation.

reemission.presenter.landcover_pie(axis: Axes, values: List[float], labels: List[str], colors: List[Any], title: str | None = None, show_legend: bool = False) None[source]

Creates a pie chart of land cover composition.

Parameters:
  • axis (plt.Axes) – The matplotlib axis object where the pie chart will be drawn.

  • values (List[float]) – List of float values representing the proportions of each land cover type.

  • labels (List[str]) – List of strings representing labels for each land cover type.

  • colors (List[Any]) – List of colors corresponding to each land cover type.

  • title (str, optional) – Title of the pie chart. Defaults to None.

  • show_legend (bool, optional) – Whether to display the legend. Defaults to False.

Returns:

None

Note

  • The function creates a pie chart using matplotlib on the provided axis (axis).

  • Only land cover types with non-zero values (values > 0) are included in the chart.

  • The pie is exploded to highlight the land cover type with the highest proportion.

  • Labels and percentages are formatted and positioned for readability.

reemission.presenter.parse_landcover_composition(vector: List[float]) List[float][source]

Parses a vector representing land cover composition into a standardized format.

Parameters:

vector (List[float]) – A vector representing land cover composition. It should be either a 9-element vector or a 27-element vector.

Returns:

A 9-element vector representing the parsed land cover composition.

Return type:

List[float]

Raises:

ValueError – If the provided vector does not have a length of 9 or 27.

Note

  • If the input vector length is 9, it is returned as-is.

  • If the input vector length is 27, it is split into three equal parts, each part is summed element-wise, resulting in a 9-element vector.