From a478c5872509caadc7d3e2a006499150ad1e486c Mon Sep 17 00:00:00 2001 From: Davide Laghi Date: Tue, 5 Nov 2024 10:23:16 +0100 Subject: [PATCH 01/10] implement the new config files --- jade/configuration.py | 103 +++++ .../Benchmarks_Configuration/C_Model.xlsx | Bin 15711 -> 0 bytes .../Benchmarks_Configuration/C_Model.yaml | 413 ++++++++++++++++++ .../Benchmarks_Configuration/HCPB_TBM_1D.xlsx | Bin 13679 -> 0 bytes .../Benchmarks_Configuration/HCPB_TBM_1D.yaml | 111 +++++ .../Benchmarks_Configuration/ITER_1D.xlsx | Bin 14513 -> 0 bytes .../Benchmarks_Configuration/ITER_1D.yaml | 236 ++++++++++ .../ITER_Cyl_SDDR.xlsx | Bin 14040 -> 0 bytes .../ITER_Cyl_SDDR.yaml | 98 +++++ .../Benchmarks_Configuration/WCLL_TBM_1D.xlsx | Bin 13709 -> 0 bytes .../Benchmarks_Configuration/WCLL_TBM_1D.yaml | 120 +++++ jade/output.py | 15 + jade/plotter.py | 30 +- tests/configuration_test.py | 36 +- 14 files changed, 1150 insertions(+), 12 deletions(-) delete mode 100644 jade/default_settings/Benchmarks_Configuration/C_Model.xlsx create mode 100644 jade/default_settings/Benchmarks_Configuration/C_Model.yaml delete mode 100644 jade/default_settings/Benchmarks_Configuration/HCPB_TBM_1D.xlsx create mode 100644 jade/default_settings/Benchmarks_Configuration/HCPB_TBM_1D.yaml delete mode 100644 jade/default_settings/Benchmarks_Configuration/ITER_1D.xlsx create mode 100644 jade/default_settings/Benchmarks_Configuration/ITER_1D.yaml delete mode 100644 jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.xlsx create mode 100644 jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml delete mode 100644 jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.xlsx create mode 100644 jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml diff --git a/jade/configuration.py b/jade/configuration.py index 4ec9f2b3..1b247a22 100644 --- a/jade/configuration.py +++ b/jade/configuration.py @@ -21,14 +21,21 @@ You should have received a copy of the GNU General Public License along with JADE. If not, see . """ + +from __future__ import annotations + import datetime import logging import os import sys +from dataclasses import dataclass import pandas as pd +import yaml from jade.exceptions import fatal_exception +from jade.output import BinningType +from jade.plotter import PlotType class Configuration: @@ -208,3 +215,99 @@ def get_lib_name(self, suffix: str) -> str: except KeyError: name = suffix return name + + +@dataclass +class ComputationalConfig: + """Configuration for a computational benchmark. + + Attributes + ---------- + excel_options : dict[int, ExcelOptions] + Options for the Excel benchmark. + atlas_options : dict[int, AtlasOptions] + Options for the Atlas benchmark. + """ + + excel_options: dict[int, ExcelOptions] + atlas_options: dict[int, AtlasOptions] + + @classmethod + def from_yaml(cls, file: str | os.PathLike) -> ComputationalConfig: + """Build the configuration for a computational benchmark from a yaml file. + + Parameters + ---------- + file : str | os.PathLike + path to the yaml file. + + Returns + ------- + ComputationalConfig + The configuration for the computational benchmark. + """ + with open(file) as f: + cfg = yaml.safe_load(f) + + atlas_options = {} + for key, value in cfg["Atlas"].items(): + atlas_options[int(key)] = AtlasOptions(**value) + + excel_options = {} + for key, value in cfg["Excel"].items(): + excel_options[int(key)] = ExcelOptions(**value) + + return cls(excel_options=excel_options, atlas_options=atlas_options) + + +@dataclass +class ExcelOptions: + identifier: int # identifier of the tally + x: BinningType | list[BinningType] # tally dataframe column name to use for x axis + x_name: str # x label + y: BinningType | list[BinningType] # tally dataframe column name to use for y axis + y_name: str # y label + cut_y: int | None = ( + None # max number of columns, after that the DF is split and goes to next line + ) + + def __post_init__(self): + # enforce that the binning type is a valid one, try to convert if possible + for attribute in [self.x, self.y]: + if type(attribute) is str: + split = attribute.split("-") + if len(split) > 1: + attribute = [] + for bintype in split: + try: + attribute.append(BinningType(bintype)) + except ValueError: + raise ValueError(f"Invalid binning type: {bintype}") + else: + try: + attribute = BinningType(attribute) + except ValueError: + raise ValueError(f"Invalid binning type: {attribute}") + # try: + # self.x = BinningType(self.x) + # except ValueError: + # raise ValueError(f"Invalid binning type for x: {self.x}") + # try: + # self.y = BinningType(self.y) + # except ValueError: + # raise ValueError(f"Invalid binning type for y: {self.y}") + + +@dataclass +class AtlasOptions: + identifier: int # identifier of the tally + plot_type: PlotType # type of plot + quantity: str | None = None # quantity plotted (goes on the y axis of plots) + unit: str | None = None # unit of the quantity + + def __post_init__(self): + # enforce that the plot type is a valid one + try: + self.plot_type = PlotType(self.plot_type) + except ValueError: + raise ValueError(f"Invalid plot type: {self.plot_type}") diff --git a/jade/default_settings/Benchmarks_Configuration/C_Model.xlsx b/jade/default_settings/Benchmarks_Configuration/C_Model.xlsx deleted file mode 100644 index 14637b49e278b3e7067cdec440686b12b1e712cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15711 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 S{pBAK0je+aMdpmZ?*136;)Zqr diff --git a/jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml b/jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml new file mode 100644 index 00000000..02d07418 --- /dev/null +++ b/jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml @@ -0,0 +1,98 @@ +Atlas: + 14: + identifier: 14 + plot_type: Grouped bars + quantity: Gamma Flux + unit: '#/cm^2/s' + 34: + identifier: 34 + plot_type: Grouped bars + quantity: Gamma Flux + unit: '#/cm^2/s' + 44: + identifier: 44 + plot_type: Grouped bars + quantity: Gamma Flux + unit: '#/cm^2/s' + 54: + identifier: 54 + plot_type: Grouped bars + quantity: Gamma Flux + unit: '#/cm^2/s' + 74: + identifier: 74 + plot_type: Grouped bars + quantity: Gamma Flux + unit: '#/cm^2/s' + 124: + identifier: 124 + plot_type: Grouped bars + quantity: Dose Rate + unit: Sv/h + 202: + identifier: 202 + plot_type: Grouped bars + quantity: Neutron Flux + unit: '#/cm^2/s' + 242: + identifier: 242 + plot_type: Grouped bars + quantity: Neutron Flux + unit: '#/cm^2/s' +Excel: + 14: + cut_y: 20 + identifier: 14 + x: Energy + x_name: Energy [MeV] + y: Time + y_name: Cooldown time + 34: + cut_y: 20 + identifier: 34 + x: Energy + x_name: Energy [MeV] + y: Time + y_name: Cooldown time + 44: + cut_y: 20 + identifier: 44 + x: Energy + x_name: Energy [MeV] + y: Time + y_name: Cooldown time + 54: + cut_y: 20 + identifier: 54 + x: Energy + x_name: Energy [MeV] + y: Time + y_name: Cooldown time + 74: + cut_y: 20 + identifier: 74 + x: Cells + x_name: Cell n. + y: Time + y_name: Cooldown time + 124: + cut_y: 20 + identifier: 124 + x: Cells + x_name: Cell n. + y: Time + y_name: Cooldown time + 202: + cut_y: 20 + identifier: 202 + x: Energy + x_name: Energy [MeV] + y: Cells-Segments + y_name: Geometrical bin + 242: + cut_y: 20 + identifier: 242 + x: Cells-Segments + x_name: Geometrical bin + y: tally + y_name: Total Neutron Flux [#/cm^2/s] diff --git a/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.xlsx b/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.xlsx deleted file mode 100644 index 59a51c8fe5bb0191733a7fe2f4669e817c0580e2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13709 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 H{~Y}nY|!jH diff --git a/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml b/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml new file mode 100644 index 00000000..ca509dc3 --- /dev/null +++ b/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml @@ -0,0 +1,120 @@ +Atlas: + 54: + identifier: 54 + plot_type: Ratio graph + 94: + identifier: 94 + plot_type: Ratio graph + 134: + identifier: 134 + plot_type: Ratio graph + 164: + identifier: 164 + plot_type: Ratio graph + 184: + identifier: 184 + plot_type: Ratio graph + 194: + identifier: 194 + plot_type: Ratio graph + 204: + identifier: 204 + plot_type: Ratio graph + 214: + identifier: 214 + plot_type: Ratio graph + quantity: Neutron Heating + unit: MeV/cc/n_s + 224: + identifier: 224 + plot_type: Ratio graph + quantity: Photon Heating + unit: MeV/cc/n_s + 234: + identifier: 234 + plot_type: Ratio graph + quantity: Tritium Production + unit: atom/cc/n_s + 244: + identifier: 244 + plot_type: Ratio graph + quantity: Neutron Flux + unit: '#/cc/n_s' + 254: + identifier: 254 + plot_type: Ratio graph + quantity: Photon Flux + unit: '#/cc/n_s' +Excel: + 54: + identifier: 54 + x: Cells + x_name: Cell + y: tally + y_name: Value + 94: + identifier: 94 + x: Cells + x_name: Cell + y: tally + y_name: Value + 134: + identifier: 134 + x: Cells + x_name: Cell + y: tally + y_name: Value + 164: + identifier: 164 + x: Cells + x_name: Cell + y: tally + y_name: Value + 184: + identifier: 184 + x: Cells + x_name: Cell + y: tally + y_name: Value + 194: + identifier: 194 + x: Cells + x_name: Cell + y: tally + y_name: Value + 204: + identifier: 204 + x: Cells + x_name: Cell + y: tally + y_name: Value + 214: + identifier: 214 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 224: + identifier: 224 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 234: + identifier: 234 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 244: + identifier: 244 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 254: + identifier: 254 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value diff --git a/jade/output.py b/jade/output.py index 60aad213..3fb71dad 100644 --- a/jade/output.py +++ b/jade/output.py @@ -31,6 +31,7 @@ import sys import json import logging +from enum import Enum from typing import TYPE_CHECKING from f4enix.output.mctal import Mctal, Tally from f4enix.output.meshtal import Meshtal, Fmesh1D @@ -60,6 +61,20 @@ CRED = "\033[91m" CEND = "\033[0m" +class BinningType(Enum): + ENERGY = 'Energy' + CELLS = 'Cells' + TIME = 'Time' + TALLY = 'tally' + DIR = 'Dir' + USER = 'User' + SEGMENTS = 'Segments' + MULTIPLIER = 'Multiplier' + COSINE = 'Cosine' + CORA = 'Cor A' + CORB = 'Cor B' + CORC = 'Cor C' + class AbstractOutput(abc.ABC): @abc.abstractmethod diff --git a/jade/plotter.py b/jade/plotter.py index d044028b..82bda902 100644 --- a/jade/plotter.py +++ b/jade/plotter.py @@ -20,9 +20,10 @@ # You should have received a copy of the GNU General Public License # along with JADE. If not, see . - +from __future__ import annotations import math import os +from enum import Enum import matplotlib.pyplot as plt @@ -59,6 +60,15 @@ plt.rc("figure", titlesize=BIGGER_SIZE) # fontsize of the figure title plt.rc("lines", markersize=12) # Marker default size +class PlotType(Enum): + BINNED = 'Binned graph' + RATIO = 'Ratio graph' + EXP = 'Experimental points' + EXP_GROUP = 'Experimental points group' + CE_EXP_GROUP = 'Experimental points group CE' + DISCRETE_EXP = 'Discreete Experimental points' + GROUPED_BARS = 'Grouped bars' + WAVES = 'Waves' # ============================================================================ # Specific data for benchmarks plots # ============================================================================ @@ -214,7 +224,7 @@ def __init__( "#dede00", ] * 50 - def plot(self, plot_type): + def plot(self, plot_type: PlotType): """ Function to be called to actually perform the plot @@ -237,11 +247,11 @@ def plot(self, plot_type): """ # --- Binned Plot --- - if plot_type == "Binned graph": + if plot_type == PlotType.BINNED: outp = self._binned_plot() # --- Ratio Plot --- - elif plot_type == "Ratio graph": + elif plot_type == PlotType.RATIO: if self.testname == "ITER_1D": # Special actions for ITER 1D outp = self._ratio_plot( additional_labels=ADD_LABELS_ITER1D, v_lines=VERT_LINES_ITER1D @@ -266,10 +276,10 @@ def plot(self, plot_type): outp = self._ratio_plot() # --- Experimental Points Plot --- - elif plot_type == "Experimental points": + elif plot_type == PlotType.EXP: outp = self._exp_points_plot(test_name=self.testname) - elif plot_type == "Experimental points group": + elif plot_type == PlotType.EXP_GROUP: if self.testname == "Tiara-BC": # Special actions for Tiara-BC outp = self._exp_points_group_plot( test_name=self.testname, x_scale="linear" @@ -277,7 +287,7 @@ def plot(self, plot_type): else: outp = self._exp_points_group_plot(test_name=self.testname) - elif plot_type == "Experimental points group CE": + elif plot_type == PlotType.CE_EXP_GROUP: if self.testname == "Tiara-BC": # Special actions for Tiara-BC outp = self._exp_points_group_plot_CE( test_name=self.testname, x_scale="linear" @@ -286,11 +296,11 @@ def plot(self, plot_type): outp = self._exp_points_group_plot_CE(test_name=self.testname) # --- Experimental Points Plot --- - elif plot_type == "Discreet Experimental points": + elif plot_type == PlotType.DISCRETE_EXP: outp = self._exp_points_discreet_plot() # --- Grouped bars chart --- - elif plot_type == "Grouped bars": + elif plot_type == PlotType.GROUPED_BARS: if self.testname == "C_Model": log = True xlegend = None @@ -304,7 +314,7 @@ def plot(self, plot_type): outp = self._grouped_bar(log=log, xlegend=xlegend) # --- Waves plot --- - elif plot_type == "Waves": + elif plot_type == PlotType.WAVES: outp = self._waves() # --- Deafault --- diff --git a/tests/configuration_test.py b/tests/configuration_test.py index c03306f5..aa54ad97 100644 --- a/tests/configuration_test.py +++ b/tests/configuration_test.py @@ -22,8 +22,10 @@ import os import sys + import pytest -from jade.configuration import Configuration + +from jade.configuration import ComputationalConfig, Configuration cp = os.path.dirname(os.path.abspath(__file__)) modules_path = os.path.dirname(cp) @@ -40,7 +42,6 @@ def config(): class TestConfiguration: - def test_read(self, config): # TODO # Check that everything is read in a correct way @@ -51,3 +52,34 @@ def test_get_lib_name(self, config): expected_list = ["FENDL 2.1c", "33c", "pincopalle"] for suffix, expected in zip(suffix_list, expected_list): assert config.get_lib_name(suffix) == expected + + +class TestComputationalConfig: + def test_conformity_defaults(self): + """test all yaml configuration files found in the default settings""" + root = os.path.join( + modules_path, "jade", "default_settings", "Benchmarks_Configuration" + ) + for file in os.listdir(root): + if file.endswith(".yaml"): + cfg = ComputationalConfig.from_yaml(os.path.join(root, file)) + assert cfg + + def test_allowables(self): + # additional keyword not supported by the data class + with pytest.raises(TypeError): + cfg = ComputationalConfig.from_yaml( + os.path.join(resources, "wrong_cfg.yaml") + ) + + # unsupported plot type + with pytest.raises(ValueError): + cfg = ComputationalConfig.from_yaml( + os.path.join(resources, "wrong_cfg2.yaml") + ) + + # unsupported Tally bin type + with pytest.raises(ValueError): + cfg = ComputationalConfig.from_yaml( + os.path.join(resources, "wrong_cfg3.yaml") + ) From d02caa74a98ccdee853763f93138f8de15fff9e7 Mon Sep 17 00:00:00 2001 From: Davide Laghi Date: Tue, 5 Nov 2024 12:48:56 +0100 Subject: [PATCH 02/10] add further test --- tests/configuration_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tests/configuration_test.py b/tests/configuration_test.py index aa54ad97..87d5befc 100644 --- a/tests/configuration_test.py +++ b/tests/configuration_test.py @@ -66,6 +66,9 @@ def test_conformity_defaults(self): assert cfg def test_allowables(self): + cfg = ComputationalConfig.from_yaml(os.path.join(resources, "ITER_1D.yaml")) + # ensure that ints are correctly converted + assert cfg.excel_options[44] # additional keyword not supported by the data class with pytest.raises(TypeError): cfg = ComputationalConfig.from_yaml( From 440270329b137c3e7bdfb5cef9c87f2e587ac78a Mon Sep 17 00:00:00 2001 From: Davide Laghi Date: Wed, 6 Nov 2024 12:44:08 +0100 Subject: [PATCH 03/10] fix new configuration yaml --- jade/configuration.py | 17 +- .../Benchmarks_Configuration/C_Model.yaml | 4 - .../Benchmarks_Configuration/HCPB_TBM_1D.yaml | 18 -- .../Benchmarks_Configuration/ITER_1D.yaml | 67 +------ .../ITER_Cyl_SDDR.yaml | 10 +- .../Benchmarks_Configuration/WCLL_TBM_1D.yaml | 21 --- jade/expoutput.py | 2 +- jade/output.py | 123 +++++++------ jade/plotter.py | 27 ++- .../Benchmarks_Configuration/ITER_1D.xlsx | Bin 14631 -> 0 bytes .../Benchmarks_Configuration/ITER_1D.yaml | 173 ++++++++++++++++++ .../Benchmarks_Configuration/WCLL_TBM_1D.xlsx | Bin 13709 -> 0 bytes .../Benchmarks_Configuration/WCLL_TBM_1D.yaml | 99 ++++++++++ tests/plotter_test.py | 14 +- 14 files changed, 388 insertions(+), 187 deletions(-) delete mode 100644 tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.xlsx create mode 100644 tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.yaml delete mode 100644 tests/TestFiles/expoutput/Benchmarks_Configuration/WCLL_TBM_1D.xlsx create mode 100644 tests/TestFiles/expoutput/Benchmarks_Configuration/WCLL_TBM_1D.yaml diff --git a/jade/configuration.py b/jade/configuration.py index 1b247a22..1964fb53 100644 --- a/jade/configuration.py +++ b/jade/configuration.py @@ -29,15 +29,30 @@ import os import sys from dataclasses import dataclass +from enum import Enum import pandas as pd import yaml from jade.exceptions import fatal_exception -from jade.output import BinningType from jade.plotter import PlotType +class BinningType(Enum): + ENERGY = "Energy" + CELLS = "Cells" + TIME = "Time" + TALLY = "tally" + DIR = "Dir" + USER = "User" + SEGMENTS = "Segments" + MULTIPLIER = "Multiplier" + COSINE = "Cosine" + CORA = "Cor A" + CORB = "Cor B" + CORC = "Cor C" + + class Configuration: def __init__(self, conf_file): """ diff --git a/jade/default_settings/Benchmarks_Configuration/C_Model.yaml b/jade/default_settings/Benchmarks_Configuration/C_Model.yaml index e468fc8e..76643f1a 100644 --- a/jade/default_settings/Benchmarks_Configuration/C_Model.yaml +++ b/jade/default_settings/Benchmarks_Configuration/C_Model.yaml @@ -41,7 +41,6 @@ Atlas: unit: '#/cm^2/s' 36: identifier: 36 - plot_type: Grouped bars quantity: Nuclear Heating unit: W 41: @@ -56,7 +55,6 @@ Atlas: unit: '#/cm^2/s' 46: identifier: 46 - plot_type: Grouped bars quantity: Nuclear Heating unit: W 51: @@ -116,7 +114,6 @@ Atlas: unit: '#/cm^2/s' 86: identifier: 86 - plot_type: Grouped bars quantity: Nuclear Heating unit: W 91: @@ -131,7 +128,6 @@ Atlas: unit: '#/cm^2/s' 96: identifier: 96 - plot_type: Grouped bars quantity: Nuclear Heating unit: W 101: diff --git a/jade/default_settings/Benchmarks_Configuration/HCPB_TBM_1D.yaml b/jade/default_settings/Benchmarks_Configuration/HCPB_TBM_1D.yaml index fe791f18..4c80beb7 100644 --- a/jade/default_settings/Benchmarks_Configuration/HCPB_TBM_1D.yaml +++ b/jade/default_settings/Benchmarks_Configuration/HCPB_TBM_1D.yaml @@ -1,22 +1,4 @@ Atlas: - 54: - identifier: 54 - plot_type: Ratio graph - 94: - identifier: 94 - plot_type: Ratio graph - 134: - identifier: 134 - plot_type: Ratio graph - 164: - identifier: 164 - plot_type: Ratio graph - 184: - identifier: 184 - plot_type: Ratio graph - 194: - identifier: 194 - plot_type: Ratio graph 204: identifier: 204 plot_type: Ratio graph diff --git a/jade/default_settings/Benchmarks_Configuration/ITER_1D.yaml b/jade/default_settings/Benchmarks_Configuration/ITER_1D.yaml index 8e18a5ec..77fa6a13 100644 --- a/jade/default_settings/Benchmarks_Configuration/ITER_1D.yaml +++ b/jade/default_settings/Benchmarks_Configuration/ITER_1D.yaml @@ -1,7 +1,7 @@ Atlas: 4: identifier: 4 - plot_type: Ratio graph + plot_type: Binned graph quantity: Neutron Flux unit: '#/cm^2' 6: @@ -11,7 +11,7 @@ Atlas: unit: W/g 14: identifier: 14 - plot_type: Ratio graph + plot_type: Binned graph quantity: Photon Flux unit: '#/cm^2' 16: @@ -19,69 +19,6 @@ Atlas: plot_type: Ratio graph quantity: Neutron Heating unit: W/g - 24: - identifier: 24 - plot_type: Ratio graph - quantity: DPA in Fe - unit: dpa/FPY - 26: - identifier: 26 - plot_type: Ratio graph - quantity: Photon Heating - unit: W/g - 34: - identifier: 34 - plot_type: Ratio graph - quantity: Helium production in SS316 - unit: appm/FPY - 44: - identifier: 44 - plot_type: Ratio graph - quantity: Hydrogen production in SS316 - unit: appm/FPY - 54: - identifier: 54 - plot_type: Ratio graph - quantity: Tritium production in SS316 - unit: appm/FPY - 64: - identifier: 64 - plot_type: Ratio graph - quantity: DPA in Cu - unit: dpa/FPY - 74: - identifier: 74 - plot_type: Ratio graph - 84: - identifier: 84 - plot_type: Ratio graph - 94: - identifier: 94 - plot_type: Ratio graph - 104: - identifier: 104 - plot_type: Ratio graph - 114: - identifier: 114 - plot_type: Ratio graph - 124: - identifier: 124 - plot_type: Ratio graph - 134: - identifier: 134 - plot_type: Ratio graph - 144: - identifier: 144 - plot_type: Ratio graph - 154: - identifier: 154 - plot_type: Ratio graph - 164: - identifier: 164 - plot_type: Ratio graph - 174: - identifier: 174 - plot_type: Ratio graph 204: identifier: 204 plot_type: Ratio graph diff --git a/jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml b/jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml index 02d07418..1cd12589 100644 --- a/jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml +++ b/jade/default_settings/Benchmarks_Configuration/ITER_Cyl_SDDR.yaml @@ -1,22 +1,22 @@ Atlas: 14: identifier: 14 - plot_type: Grouped bars + plot_type: Binned graph quantity: Gamma Flux unit: '#/cm^2/s' 34: identifier: 34 - plot_type: Grouped bars + plot_type: Binned graph quantity: Gamma Flux unit: '#/cm^2/s' 44: identifier: 44 - plot_type: Grouped bars + plot_type: Binned graph quantity: Gamma Flux unit: '#/cm^2/s' 54: identifier: 54 - plot_type: Grouped bars + plot_type: Binned graph quantity: Gamma Flux unit: '#/cm^2/s' 74: @@ -31,7 +31,7 @@ Atlas: unit: Sv/h 202: identifier: 202 - plot_type: Grouped bars + plot_type: Binned graph quantity: Neutron Flux unit: '#/cm^2/s' 242: diff --git a/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml b/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml index ca509dc3..fdb435a8 100644 --- a/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml +++ b/jade/default_settings/Benchmarks_Configuration/WCLL_TBM_1D.yaml @@ -1,25 +1,4 @@ Atlas: - 54: - identifier: 54 - plot_type: Ratio graph - 94: - identifier: 94 - plot_type: Ratio graph - 134: - identifier: 134 - plot_type: Ratio graph - 164: - identifier: 164 - plot_type: Ratio graph - 184: - identifier: 184 - plot_type: Ratio graph - 194: - identifier: 194 - plot_type: Ratio graph - 204: - identifier: 204 - plot_type: Ratio graph 214: identifier: 214 plot_type: Ratio graph diff --git a/jade/expoutput.py b/jade/expoutput.py index 7e1b49fc..18d5d348 100644 --- a/jade/expoutput.py +++ b/jade/expoutput.py @@ -626,7 +626,7 @@ def _build_atlas(self, tmp_path, atlas): plot = Plotter( data, title, tmp_path, outname, quantity, unit, xlabel, self.testname ) - img_path = plot.plot("Discreet Experimental points") + img_path = plot.plot("Discrete Experimental points") # Insert the image in the atlas atlas.insert_img(img_path) diff --git a/jade/output.py b/jade/output.py index acb36972..2a73ee3c 100644 --- a/jade/output.py +++ b/jade/output.py @@ -49,6 +49,7 @@ import jade.plotter as plotter from jade.__openmc__ import OMC_AVAIL from jade.__version__ import __version__ +from jade.configuration import ComputationalConfig from jade.constants import CODES if OMC_AVAIL: @@ -62,21 +63,6 @@ CEND = "\033[0m" -class BinningType(Enum): - ENERGY = "Energy" - CELLS = "Cells" - TIME = "Time" - TALLY = "tally" - DIR = "Dir" - USER = "User" - SEGMENTS = "Segments" - MULTIPLIER = "Multiplier" - COSINE = "Cosine" - CORA = "Cor A" - CORB = "Cor B" - CORC = "Cor C" - - class AbstractBenchmarkOutput(abc.ABC): def __init__(self, lib: str, code: str, testname: str, session: Session) -> None: """ @@ -107,12 +93,21 @@ def __init__(self, lib: str, code: str, testname: str, session: Session) -> None self.path_templates = session.path_templates # Read specific configuration - cnf_path = os.path.join(session.path_cnf, self.testname + ".xlsx") - if os.path.isfile(cnf_path): + # TODO for the moment allow both legacy xlsx and yaml. In the future, + # everything should be moved to yaml + try: + cnf_path = os.path.join(session.path_cnf, self.testname + ".yaml") self.cnf_path = cnf_path - # It can be assumed that there is a folder containing multiple files - else: - self.cnf_path = os.path.join(session.path_cnf, self.testname) + self.cfg = ComputationalConfig.from_yaml(cnf_path) + except FileNotFoundError: + # legacy excel(s) + self.cfg = False + cnf_path = os.path.join(session.path_cnf, self.testname + ".xlsx") + if os.path.isfile(cnf_path): + self.cnf_path = cnf_path + # It can be assumed that there is a folder containing multiple files + else: + self.cnf_path = os.path.join(session.path_cnf, self.testname) # Updated to handle multiple codes # initialize them so that intellisense knows they are available @@ -285,8 +280,16 @@ def single_postprocess(self): os.mkdir(outpath) # Get atlas configuration - atl_cnf = pd.read_excel(self.cnf_path, sheet_name="Atlas") - atl_cnf.set_index("Tally", inplace=True) + if not self.cfg: + raise FileNotFoundError("No yaml configuration file found") + + atl_cnf = self.cfg.atlas_options + # recover the different possible plot types + plot_types = [] + for _, options in atl_cnf.items(): + plot_type = options.plot_type + if plot_type not in plot_types: + plot_types.append(plot_type) # Printing Atlas template = template = os.path.join(self.path_templates, "AtlasTemplate.docx") @@ -294,14 +297,12 @@ def single_postprocess(self): # Iterate over each type of plot (first one is quantity # and second one the measure unit) - for plot_type in list(atl_cnf.columns)[2:]: - print(" Plotting : " + plot_type) - atlas.doc.add_heading("Plot type: " + plot_type, level=1) - # Keep only tallies to plot - atl_cnf_plot = atl_cnf[atl_cnf[plot_type]] - for tally_num in tqdm(atl_cnf_plot.index, desc="Tallies"): + for plot_type in plot_types: + print(" Plotting : " + plot_type.value) + atlas.doc.add_heading("Plot type: " + plot_type.value, level=1) + for tally_num, options in tqdm(atl_cnf.items(), desc="Tallies"): try: - output = self.outputs[self.code][tally_num] + output = self.outputs[tally_num] except KeyError: fatal_exception( "tally n. " @@ -310,8 +311,8 @@ def single_postprocess(self): ) vals_df = output["Value"] err_df = output["Error"] - quantity = str(atl_cnf_plot["Quantity"].loc[tally_num]) - unit = str(atl_cnf_plot["Unit"].loc[tally_num]) + quantity = options.quantity + unit = options.unit xlabel = output["x_label"] title = output["title"] @@ -399,8 +400,17 @@ def compare(self) -> None: os.mkdir(outpath) # Get atlas configuration - atl_cnf = pd.read_excel(self.cnf_path, sheet_name="Atlas") - atl_cnf.set_index("Tally", inplace=True) + # Get atlas configuration + if not self.cfg: + raise FileNotFoundError("No yaml configuration file found") + + atl_cnf = self.cfg.atlas_options + # recover the different possible plot types + plot_types = [] + for _, options in atl_cnf.items(): + plot_type = options.plot_type + if plot_type not in plot_types: + plot_types.append(plot_type) # Printing Atlas template = os.path.join(self.path_templates, "AtlasTemplate.docx") @@ -425,12 +435,11 @@ def compare(self) -> None: # Iterate over each type of plot (first one is quantity # and second one the measure unit) - for plot_type in list(atl_cnf.columns)[2:]: - print(" Plotting : " + plot_type) - atlas.doc.add_heading("Plot type: " + plot_type, level=1) + for plot_type in plot_types: + print(" Plotting : " + plot_type.value) + atlas.doc.add_heading("Plot type: " + plot_type.value, level=1) # Keep only tallies to plot - atl_cnf_plot = atl_cnf[atl_cnf[plot_type]] - for tally_num in tqdm(atl_cnf_plot.index, desc="Tallies"): + for tally_num, options in tqdm(atl_cnf.items(), desc="Tallies"): # The last 'outputs' can be easily used for common data try: output = outputs_dic[lib][tally_num] @@ -442,8 +451,8 @@ def compare(self) -> None: ) vals_df = output["Value"] err_df = output["Error"] - quantity = str(atl_cnf_plot["Quantity"].loc[tally_num]) - unit = str(atl_cnf_plot["Unit"].loc[tally_num]) + quantity = options.quantity + unit = options.unit xlabel = output["x_label"] title = output["title"] @@ -577,8 +586,9 @@ def _generate_single_excel_output(self) -> None: self.results = {} self.errors = {} self.stat_checks = {} - ex_cnf = pd.read_excel(self.cnf_path, sheet_name="Excel") - ex_cnf.set_index("Tally", inplace=True) + if not self.cfg: + raise FileNotFoundError("No yaml configuration file found") + ex_cnf = self.cfg.excel_options # Open the excel file # name = "Generic_single.xlsx" @@ -605,17 +615,17 @@ def _generate_single_excel_output(self) -> None: # keys[num] = key # Memorize tally descriptions tdata = sim_output.tallydata[num].copy() # Full tally data try: - tally_settings = ex_cnf.loc[num] + tally_settings = ex_cnf[num] except KeyError: print(" Warning!: tally n." + str(num) + " is not in configuration") continue # Re-Elaborate tdata Dataframe - x_name = tally_settings["x"] - x_tag = tally_settings["x name"] - y_name = tally_settings["y"] - y_tag = tally_settings["y name"] - ylim = tally_settings["cut Y"] + x_name = tally_settings.x + x_tag = tally_settings.x_name + y_name = tally_settings.y + y_tag = tally_settings.y_name + ylim = tally_settings.cut_y if label == "Value": outputs[num] = {"title": key, "x_label": x_tag} @@ -712,7 +722,7 @@ def _generate_single_excel_output(self) -> None: # header=(key, "Tally n." + str(num)), # ) # memorize data for atlas - self.outputs[self.code] = outputs + self.outputs = outputs # print(outputs) # Dump them for comparisons raw_outpath = os.path.join(self.raw_path, self.lib + ".pickle") @@ -753,8 +763,9 @@ def _generate_comparison_excel_output(self) -> None: self.results = {} self.errors = {} self.stat_checks = {} - ex_cnf = pd.read_excel(self.cnf_path, sheet_name="Excel") - ex_cnf.set_index("Tally", inplace=True) + if not self.cfg: + raise FileNotFoundError("No yaml configuration file found") + ex_cnf = self.cfg.excel_options # Open the excel file # name_tag = "Generic_comparison.xlsx" @@ -793,7 +804,7 @@ def _generate_comparison_excel_output(self) -> None: tdata_ref = sim_outputs[reflib].tallydata[num].copy() tdata_tar = sim_outputs[tarlib].tallydata[num].copy() try: - tally_settings = ex_cnf.loc[num] + tally_settings = ex_cnf[num] except KeyError: print( " Warning!: tally n." @@ -803,9 +814,9 @@ def _generate_comparison_excel_output(self) -> None: continue # Re-Elaborate tdata Dataframe - x_name = tally_settings["x"] - x_tag = tally_settings["x name"] - y_name = tally_settings["y"] + x_name = tally_settings.x + x_tag = tally_settings.x_name + y_name = tally_settings.y # y_tag = tally_settings["y name"] # ylim = tally_settings["cut Y"] # select the index format @@ -960,7 +971,7 @@ def _generate_comparison_excel_output(self) -> None: # ex.copy_sheets(cp) # ex.save() - self.outputs[self.code] = comps + self.outputs = comps exsupp.comp_excel_writer( self, outpath, diff --git a/jade/plotter.py b/jade/plotter.py index 82bda902..d131d66b 100644 --- a/jade/plotter.py +++ b/jade/plotter.py @@ -21,6 +21,7 @@ # You should have received a copy of the GNU General Public License # along with JADE. If not, see . from __future__ import annotations + import math import os from enum import Enum @@ -28,6 +29,8 @@ import matplotlib.pyplot as plt plt.switch_backend("agg") +import warnings + import numpy as np import pandas as pd from matplotlib.lines import Line2D @@ -35,7 +38,6 @@ from matplotlib.patches import Patch, Rectangle from matplotlib.ticker import AutoLocator, AutoMinorLocator, LogLocator, MultipleLocator from scipy.interpolate import interp1d -import warnings warnings.filterwarnings("ignore") @@ -60,15 +62,18 @@ plt.rc("figure", titlesize=BIGGER_SIZE) # fontsize of the figure title plt.rc("lines", markersize=12) # Marker default size + class PlotType(Enum): - BINNED = 'Binned graph' - RATIO = 'Ratio graph' - EXP = 'Experimental points' - EXP_GROUP = 'Experimental points group' - CE_EXP_GROUP = 'Experimental points group CE' - DISCRETE_EXP = 'Discreete Experimental points' - GROUPED_BARS = 'Grouped bars' - WAVES = 'Waves' + BINNED = "Binned graph" + RATIO = "Ratio graph" + EXP = "Experimental points" + EXP_GROUP = "Experimental points group" + CE_EXP_GROUP = "Experimental points group CE" + DISCRETE_EXP = "Discrete Experimental points" + GROUPED_BARS = "Grouped bars" + WAVES = "Waves" + + # ============================================================================ # Specific data for benchmarks plots # ============================================================================ @@ -246,6 +251,9 @@ def plot(self, plot_type: PlotType): path to the saved image. """ + # force the plot type to be a PlotType + if type(plot_type) is str: + plot_type = PlotType(plot_type) # --- Binned Plot --- if plot_type == PlotType.BINNED: outp = self._binned_plot() @@ -863,7 +871,6 @@ def _exp_points_group_plot_CE( axes = np.array([axes]) for key, val in enumerate(list(self.data.values())): - ref = val[0] # Adjounrn ylabel ylabel = "C/E" diff --git a/tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.xlsx b/tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.xlsx deleted file mode 100644 index a2d4e71a90057c6c8a2100fe8d3725ccc65f620d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14631 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 H{~Y}nY|!jH diff --git a/tests/TestFiles/expoutput/Benchmarks_Configuration/WCLL_TBM_1D.yaml b/tests/TestFiles/expoutput/Benchmarks_Configuration/WCLL_TBM_1D.yaml new file mode 100644 index 00000000..fdb435a8 --- /dev/null +++ b/tests/TestFiles/expoutput/Benchmarks_Configuration/WCLL_TBM_1D.yaml @@ -0,0 +1,99 @@ +Atlas: + 214: + identifier: 214 + plot_type: Ratio graph + quantity: Neutron Heating + unit: MeV/cc/n_s + 224: + identifier: 224 + plot_type: Ratio graph + quantity: Photon Heating + unit: MeV/cc/n_s + 234: + identifier: 234 + plot_type: Ratio graph + quantity: Tritium Production + unit: atom/cc/n_s + 244: + identifier: 244 + plot_type: Ratio graph + quantity: Neutron Flux + unit: '#/cc/n_s' + 254: + identifier: 254 + plot_type: Ratio graph + quantity: Photon Flux + unit: '#/cc/n_s' +Excel: + 54: + identifier: 54 + x: Cells + x_name: Cell + y: tally + y_name: Value + 94: + identifier: 94 + x: Cells + x_name: Cell + y: tally + y_name: Value + 134: + identifier: 134 + x: Cells + x_name: Cell + y: tally + y_name: Value + 164: + identifier: 164 + x: Cells + x_name: Cell + y: tally + y_name: Value + 184: + identifier: 184 + x: Cells + x_name: Cell + y: tally + y_name: Value + 194: + identifier: 194 + x: Cells + x_name: Cell + y: tally + y_name: Value + 204: + identifier: 204 + x: Cells + x_name: Cell + y: tally + y_name: Value + 214: + identifier: 214 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 224: + identifier: 224 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 234: + identifier: 234 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 244: + identifier: 244 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value + 254: + identifier: 254 + x: Cor A + x_name: R [cm] + y: tally + y_name: Value diff --git a/tests/plotter_test.py b/tests/plotter_test.py index 38a4a6b6..f36c3671 100644 --- a/tests/plotter_test.py +++ b/tests/plotter_test.py @@ -20,18 +20,20 @@ You should have received a copy of the GNU General Public License along with JADE. If not, see . """ -import sys + import os -import numpy as np import shutil +import sys + +import numpy as np import pytest cp = os.path.dirname(os.path.abspath(__file__)) modules_path = os.path.dirname(cp) sys.path.insert(1, modules_path) -from jade.plotter import Plotter import jade.plotter as plotter +from jade.plotter import Plotter, PlotType OUTPATH = os.path.join(cp, "tmp") outname = "dummy" @@ -74,7 +76,7 @@ "Binned graph", "Ratio graph", "Experimental points", - "Discreet Experimental points", + "Discrete Experimental points", "Grouped bars", ] @@ -109,7 +111,7 @@ def test_plot(self, plot_type): except ValueError: assert True - args = [plot_type] + args = [PlotType(plot_type)] keyargs = {} self._plot(plotterob, args, keyargs) @@ -133,7 +135,7 @@ def test_waves(self): plotterob = Plotter(**keyargs) - args = ["Waves"] + args = [PlotType("Waves")] keyargs = {} self._plot(plotterob, args, keyargs) From 788480e3a75c5e579d054647b714397e4c22f5e1 Mon Sep 17 00:00:00 2001 From: Davide Laghi Date: Wed, 6 Nov 2024 12:50:02 +0100 Subject: [PATCH 04/10] add yaml req --- docs/source/requirements.txt | 3 ++- setup.cfg | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/source/requirements.txt b/docs/source/requirements.txt index 9a91e5f7..76178c54 100644 --- a/docs/source/requirements.txt +++ b/docs/source/requirements.txt @@ -14,4 +14,5 @@ f4enix >= 0.8.1 sphinx esbonio myst-parser -sphinx_rtd_theme \ No newline at end of file +sphinx_rtd_theme +pyyaml \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index 558453e2..199a13c9 100644 --- a/setup.cfg +++ b/setup.cfg @@ -37,6 +37,7 @@ install_requires = requests f4enix >= 0.8.1 # openmc @ git+https://github.com/openmc-dev/openmc.git@v0.14.0#egg=openmc + pyyaml include_package_data = True From 61c7932d1960373ab2c18c1cd026fa0d6fab90e0 Mon Sep 17 00:00:00 2001 From: Davide Laghi Date: Thu, 7 Nov 2024 09:31:04 +0100 Subject: [PATCH 05/10] fix C-model config --- jade/default_settings/Benchmarks_Configuration/C_Model.yaml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/jade/default_settings/Benchmarks_Configuration/C_Model.yaml b/jade/default_settings/Benchmarks_Configuration/C_Model.yaml index 76643f1a..5dccad30 100644 --- a/jade/default_settings/Benchmarks_Configuration/C_Model.yaml +++ b/jade/default_settings/Benchmarks_Configuration/C_Model.yaml @@ -40,6 +40,7 @@ Atlas: quantity: Neutron flux unit: '#/cm^2/s' 36: + plot_type: Grouped bars identifier: 36 quantity: Nuclear Heating unit: W @@ -54,6 +55,7 @@ Atlas: quantity: Neutron flux unit: '#/cm^2/s' 46: + plot_type: Grouped bars identifier: 46 quantity: Nuclear Heating unit: W @@ -114,6 +116,7 @@ Atlas: unit: '#/cm^2/s' 86: identifier: 86 + plot_type: Grouped bars quantity: Nuclear Heating unit: W 91: @@ -128,6 +131,7 @@ Atlas: unit: '#/cm^2/s' 96: identifier: 96 + plot_type: Grouped bars quantity: Nuclear Heating unit: W 101: From ad286059a231cdb8022ae53072c8bafce171cd17 Mon Sep 17 00:00:00 2001 From: Davide Laghi Date: Thu, 7 Nov 2024 15:14:59 +0100 Subject: [PATCH 06/10] fixed tests --- jade/output.py | 6 ++++++ jade/plotter.py | 2 +- .../Benchmarks_Configuration/ITER_1D.yaml | 21 ++++++++++--------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/jade/output.py b/jade/output.py index 0ce8142d..3039319b 100644 --- a/jade/output.py +++ b/jade/output.py @@ -319,6 +319,9 @@ def single_postprocess(self) -> None: print(" Plotting : " + plot_type.value) atlas.doc.add_heading("Plot type: " + plot_type.value, level=1) for tally_num, options in tqdm(atl_cnf.items(), desc="Tallies"): + # Check if the tally needs to be potted + if options.plot_type != plot_type: + continue try: output = self.outputs[tally_num] except KeyError: @@ -458,6 +461,9 @@ def compare(self) -> None: atlas.doc.add_heading("Plot type: " + plot_type.value, level=1) # Keep only tallies to plot for tally_num, options in tqdm(atl_cnf.items(), desc="Tallies"): + # Check if the tally needs to be potted + if options.plot_type != plot_type: + continue # The last 'outputs' can be easily used for common data try: output = outputs_dic[lib][tally_num] diff --git a/jade/plotter.py b/jade/plotter.py index ef8658bf..2c80f9f4 100644 --- a/jade/plotter.py +++ b/jade/plotter.py @@ -229,7 +229,7 @@ def __init__( "#dede00", ] * 50 - def plot(self, plot_type: PlotType): + def plot(self, plot_type: PlotType | str): """ Function to be called to actually perform the plot diff --git a/tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.yaml b/tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.yaml index 77fa6a13..ba2c2ff0 100644 --- a/tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.yaml +++ b/tests/TestFiles/expoutput/Benchmarks_Configuration/ITER_1D.yaml @@ -1,19 +1,20 @@ Atlas: - 4: - identifier: 4 - plot_type: Binned graph - quantity: Neutron Flux - unit: '#/cm^2' + # Commented out 4 and 6 to speed up the testing. + # 4: + # identifier: 4 + # plot_type: Binned graph + # quantity: Neutron Flux + # unit: '#/cm^2' 6: identifier: 6 plot_type: Ratio graph quantity: Total Nuclear Heating unit: W/g - 14: - identifier: 14 - plot_type: Binned graph - quantity: Photon Flux - unit: '#/cm^2' + # 14: + # identifier: 14 + # plot_type: Binned graph + # quantity: Photon Flux + # unit: '#/cm^2' 16: identifier: 16 plot_type: Ratio graph From 3ac6fd337cea461fa82d77d9fb42027effa1dc88 Mon Sep 17 00:00:00 2001 From: Davide Laghi Date: Thu, 7 Nov 2024 16:02:28 +0100 Subject: [PATCH 07/10] add doc on new config and fix test --- .gitignore | 2 - docs/source/usage/configuration.rst | 55 +++-- jade/configuration.py | 46 ++++ tests/TestFiles/configuration/ITER_1D.yaml | 203 ++++++++++++++++++ tests/TestFiles/configuration/wrong_cfg.yaml | 7 + tests/TestFiles/configuration/wrong_cfg2.yaml | 14 ++ tests/TestFiles/configuration/wrong_cfg3.yaml | 6 + 7 files changed, 312 insertions(+), 21 deletions(-) create mode 100644 tests/TestFiles/configuration/ITER_1D.yaml create mode 100644 tests/TestFiles/configuration/wrong_cfg.yaml create mode 100644 tests/TestFiles/configuration/wrong_cfg2.yaml create mode 100644 tests/TestFiles/configuration/wrong_cfg3.yaml diff --git a/.gitignore b/.gitignore index 46dca6d0..61f5ef18 100644 --- a/.gitignore +++ b/.gitignore @@ -3,8 +3,6 @@ *.pyc Untitled.ipynb .coverage -Configuration/ -Experimental_Results/ */test.ipynb # These are generated folders for cache diff --git a/docs/source/usage/configuration.rst b/docs/source/usage/configuration.rst index b116f44f..53def221 100644 --- a/docs/source/usage/configuration.rst +++ b/docs/source/usage/configuration.rst @@ -193,25 +193,35 @@ Computational benchmark post-processing configuration It is possible to control (to some extent) the post-processing of each benchmark via its specific configuration file. These files are located in the ``\Configuration\Benchmarks_Configuration`` folder and their name must be identical to the one used in the ``File Name`` field in the main configuration file -(using the .xlsx extension instead of the .i). These files are available only for computational benchmarks, +(using the .yaml extension instead of the .i). These files are available only for computational benchmarks, since the high degree of customization needed for an experimental benchmark makes quite difficult to standardize them. While computational benchmarks can be added to the JADE suite without the need for additional coding, this is not true also for experimental one. -The files contain two main sheets, that respectively regulate the Excel and the Word/PDF (i.e., Atlas) post-processing output. +The files contain two main sections, that respectively regulate the Excel and the Word/PDF (i.e., Atlas) post-processing output. Excel ----- -.. image:: ../img/conf/excelbench.png - :width: 600 +.. codeblock:: yaml + + # Example of an extract from a benchmark configuration file, Excel section + Excel: + 4.0: + cut_y: 20.0 + identifier: 4 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + -This sheet regulates the Excel output derived from the benchmark. It consists of a table where each row regulates -the output of a single tally present in the MCNP input. +This section regulates the Excel output derived from the benchmark. Each entry +corresponds to a different tally present in the input file (tally number). Hereinafter a description of the available fields is reported. -Tally +identifier tally number according to MCNP input file. x, y select the binnings to be used for the presentation of the excel results of the specific tally. Clearly, @@ -254,10 +264,10 @@ x, y If a 1D FMESH is defined in the MCNP input, JADE will automatically transform it to a "binned" tally and handle it as any other tally using the ``Cor A``, ``Cor B`` or ``Cor C`` field. -x name, y name +x_name, y_name These will be the names associated to the **x** and **y** axis printed in the excel file. -cut Y +cut_y The idea behind JADE is to produce outputs that are easy to investigate simply by scrolling and concentrate on the main results highlighted through colors. Having a high number of bins both in the x and y axis may cause a problem in this sense, forcing the user to scroll on both axis. For this reason, a maximum number of columns can be set to @@ -267,30 +277,37 @@ cut Y Atlas ----- -.. image:: ../img/conf/atlasbench.png - :width: 600 +.. codeblock:: yaml + + # Example of an extract from a benchmark configuration file, Atlas section + Atlas: + 4: + identifier: 4 + plot_type: Binned graph + quantity: Neutron Flux + unit: '#/cm^2' This sheet regulates the Atlas output (Word) derived from the benchmark. It consists of a table where each row regulates the output of a single tally present in the input. Hereinafter a description of the available fields is reported. -Tally +identifier tally number according to input file. -Quantity - Physical quantity that will be plotted on the y-axis of the plot. For the x-axis the one specified in the Excel sheet +quantity + Physical quantity that will be plotted on the y-axis of the plot. For the x-axis the one specified in the excel section under **x** will be considered. The quantity selected for plotting will always be the tallied quantity. .. important:: - when two binnings are specified in the Excel sheet, a different plot for each of the **y** bins will be produced. + when two binnings are specified in the Excel section, a different plot for each of the **y** bins will be produced. For example, let's consider a neutron flux tally binned both in energy (selected as **x**) and cells (selected as **y**). Then, a plot showing the neutron flux as a function of energy will be produced for each cell. On the contrary, if the cell binning is assigned to **x** and the energy one to **y**, a plot showing the neutron flux as a function of the cell would be produced for each energy interval. -Unit +unit Unit associated to the Quantity. - - Different columns can be added where it can be specified if a plot in the style indicated by the column name - should be generated (``true``) or not (``false``). The available plot styles are *Binned graph*, *Ratio Graph*, +plot_type + The type of plot that will be produced. + The available plot styles are *Binned graph*, *Ratio Graph*, *Experimental points* and *Grouped bars*. .. seealso:: diff --git a/jade/configuration.py b/jade/configuration.py index 1964fb53..57e7ab6d 100644 --- a/jade/configuration.py +++ b/jade/configuration.py @@ -277,6 +277,31 @@ def from_yaml(cls, file: str | os.PathLike) -> ComputationalConfig: @dataclass class ExcelOptions: + """Dataclass storing options for the Excel benchmark. + + Attributes + ---------- + identifier : int + Identifier of the tally. + x : BinningType | list[BinningType] + Tally dataframe column name to use for x axis. If a list, two binnings are + combined together to form a single binning. The only valid combination is + Cells-Segments for the moment. + x_name : str + X axis label. + y : BinningType | list[BinningType] + Tally dataframe column name to use for y axis. If a list, two binnings are + combined together to form a single binning. The only valid combination is + Cells-Segments for the moment. + y_name : str + Y axis label. + + Raises + ------ + ValueError + If an invalid BinningType is provided. + """ + identifier: int # identifier of the tally x: BinningType | list[BinningType] # tally dataframe column name to use for x axis x_name: str # x label @@ -315,6 +340,27 @@ def __post_init__(self): @dataclass class AtlasOptions: + """ + AtlasOptions is a configuration data class for specifying options related to plotting + in the Atlas application. + + Attributes + ---------- + identifier : int + Identifier of the tally. + plot_type : PlotType + Type of plot. + quantity : str, optional + Quantity plotted (goes on the y axis of plots). Default is None. + unit : str, optional + Unit of the quantity. Default is None. + + Raises + ------ + ValueError + if an invalid PlotType is provided. + """ + identifier: int # identifier of the tally plot_type: PlotType # type of plot quantity: str | None = None # quantity plotted (goes on the y axis of plots) diff --git a/tests/TestFiles/configuration/ITER_1D.yaml b/tests/TestFiles/configuration/ITER_1D.yaml new file mode 100644 index 00000000..de9dee9c --- /dev/null +++ b/tests/TestFiles/configuration/ITER_1D.yaml @@ -0,0 +1,203 @@ +Atlas: + 4: + identifier: 4 + plot_type: Ratio graph + quantity: Neutron Flux + unit: '#/cm^2' + 6: + identifier: 6 + plot_type: Ratio graph + quantity: Total Nuclear Heating + unit: W/g + 14: + identifier: 14 + plot_type: Ratio graph + quantity: Photon Flux + unit: '#/cm^2' + 16: + identifier: 16 + plot_type: Ratio graph + quantity: Neutron Heating + unit: W/g + 24: + identifier: 24 + plot_type: Ratio graph + quantity: DPA in Fe + unit: dpa/FPY + 26: + identifier: 26 + plot_type: Ratio graph + quantity: Photon Heating + unit: W/g + 34: + identifier: 34 + plot_type: Ratio graph + quantity: Helium production in SS316 + unit: appm/FPY + 44: + identifier: 44 + plot_type: Ratio graph + quantity: Hydrogen production in SS316 + unit: appm/FPY + 54: + identifier: 54 + plot_type: Ratio graph + quantity: Tritium production in SS316 + unit: appm/FPY + 64: + identifier: 64 + plot_type: Ratio graph + quantity: DPA in Cu + unit: dpa/FPY + 204: + identifier: 204 + plot_type: Ratio graph + quantity: Neutron Flux + unit: '#/cm^2' + 214: + identifier: 214 + plot_type: Ratio graph + quantity: Photon Flux + unit: '#/cm^2' +Excel: + 4.0: + cut_y: 20.0 + identifier: 4 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + 6.0: + identifier: 6 + x: Cells + x_name: Cell + y: tally + y_name: Value + 14.0: + cut_y: 20.0 + identifier: 14 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + 16.0: + identifier: 16 + x: Cells + x_name: Cell + y: tally + y_name: Value + 24.0: + identifier: 24 + x: Cells + x_name: Cell + y: tally + y_name: Value + 26.0: + identifier: 26 + x: Cells + x_name: Cell + y: tally + y_name: Value + 34.0: + identifier: 34 + x: Cells + x_name: Cell + y: tally + y_name: Value + 44.0: + identifier: 44 + x: Cells + x_name: Cell + y: tally + y_name: Value + 54.0: + identifier: 54 + x: Cells + x_name: Cell + y: tally + y_name: Value + 64.0: + identifier: 64 + x: Cells + x_name: Cell + y: tally + y_name: Value + 74.0: + identifier: 74 + x: Cells + x_name: Cell + y: tally + y_name: Value + 84.0: + identifier: 84 + x: Cells + x_name: Cell + y: tally + y_name: Value + 94.0: + identifier: 94 + x: Cells + x_name: Cell + y: tally + y_name: Value + 104.0: + identifier: 104 + x: Cells + x_name: Cell + y: tally + y_name: Value + 114.0: + identifier: 114 + x: Cells + x_name: Cell + y: tally + y_name: Value + 124.0: + identifier: 124 + x: Cells + x_name: Cell + y: tally + y_name: Value + 134.0: + identifier: 134 + x: Cells + x_name: Cell + y: tally + y_name: Value + 144.0: + identifier: 144 + x: Cells + x_name: Cell + y: tally + y_name: Value + 154.0: + identifier: 154 + x: Cells + x_name: Cell + y: tally + y_name: Value + 164.0: + identifier: 164 + x: Cells + x_name: Cell + y: tally + y_name: Value + 174.0: + cut_y: 20.0 + identifier: 174 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + 204.0: + identifier: 204 + x: Cells + x_name: Cell + y: tally + y_name: Value + 214.0: + identifier: 214 + x: Cells + x_name: Cell + y: tally + y_name: Value diff --git a/tests/TestFiles/configuration/wrong_cfg.yaml b/tests/TestFiles/configuration/wrong_cfg.yaml new file mode 100644 index 00000000..26264c8e --- /dev/null +++ b/tests/TestFiles/configuration/wrong_cfg.yaml @@ -0,0 +1,7 @@ +Atlas: + 4: + identifier: 4 + plot_type: Ratio graph + quantity: Neutron Flux + unit: '#/cm^2' + dummy: 2 diff --git a/tests/TestFiles/configuration/wrong_cfg2.yaml b/tests/TestFiles/configuration/wrong_cfg2.yaml new file mode 100644 index 00000000..62a7601b --- /dev/null +++ b/tests/TestFiles/configuration/wrong_cfg2.yaml @@ -0,0 +1,14 @@ +Atlas: + 4: + identifier: 4 + plot_type: Ratio graph + quantity: Neutron Flux + unit: '#/cm^2' +Excel: + 4.0: + cut_y: 20.0 + identifier: 4 + x: Energ + x_name: Energy [MeV] + y: Cells + y_name: Cell \ No newline at end of file diff --git a/tests/TestFiles/configuration/wrong_cfg3.yaml b/tests/TestFiles/configuration/wrong_cfg3.yaml new file mode 100644 index 00000000..68a44136 --- /dev/null +++ b/tests/TestFiles/configuration/wrong_cfg3.yaml @@ -0,0 +1,6 @@ +Atlas: + 4: + identifier: 4 + plot_type: Ratio graphs + quantity: Neutron Flux + unit: '#/cm^2' From f2f99305452dd51841faf3212a01b88be8d17ee5 Mon Sep 17 00:00:00 2001 From: Alex Valentine Date: Mon, 18 Nov 2024 15:48:50 +0000 Subject: [PATCH 08/10] add simple tokamak config --- .../Simple_Tokamak.yaml | 112 ++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml diff --git a/jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml b/jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml new file mode 100644 index 00000000..f06845c1 --- /dev/null +++ b/jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml @@ -0,0 +1,112 @@ +Atlas: + 6: + identifier: 6 + plot_type: Ratio graph + quantity: Neutron Heating + unit: W + 16: + identifier: 16 + plot_type: Ratio graph + quantity: Photon Heating + unit: W +Excel: + 24: + identifier: 24 + x: Cells + x_name: Cell + y: tally + y_name: Value + 34: + identifier: 34 + x: Cells + x_name: Cell + y: tally + y_name: Value + 44: + identifier: 44 + x: Cells + x_name: Cell + y: tally + y_name: Value + 54: + identifier: 54 + x: Cells + x_name: Cell + y: tally + y_name: Value + 64: + cut_y: 20.0 + identifier: 64 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + 74: + cut_y: 20.0 + identifier: 74 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + 84: + cut_y: 20.0 + identifier: 84 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + 94: + cut_y: 20.0 + identifier: 94 + x: Energy + x_name: Energy [MeV] + y: Cells + y_name: Cell + 6: + identifier: 6 + x: Cells + x_name: Cell + y: tally + y_name: Value + 16: + identifier: 16 + x: Cells + x_name: Cell + y: tally + y_name: Value + 26: + identifier: 26 + x: Cells + x_name: Cell + y: tally + y_name: Value + 36: + identifier: 36 + x: Cells + x_name: Cell + y: tally + y_name: Value + 46: + identifier: 46 + x: Cells + x_name: Cell + y: tally + y_name: Value + 56: + identifier: 56 + x: Cells + x_name: Cell + y: tally + y_name: Value + 104: + identifier: 104 + x: Cells + x_name: Cell + y: tally + y_name: Value + 114: + identifier: 114 + x: Cells + x_name: Cell + y: tally + y_name: Value From eb9b486e38bb8c78104b6264ce9b34b1ff075b07 Mon Sep 17 00:00:00 2001 From: Steven Bradnam Date: Mon, 18 Nov 2024 16:21:21 +0000 Subject: [PATCH 09/10] Restored spectrum plots in yaml simple tokamak --- .../Simple_Tokamak.yaml | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml b/jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml index f06845c1..fb36e9ed 100644 --- a/jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml +++ b/jade/default_settings/Benchmarks_Configuration/Simple_Tokamak.yaml @@ -1,4 +1,24 @@ Atlas: + 64: + identifier: 64 + plot_type: Binned graph + quantity: Neutron Flux + unit: '#/cm^2' + 74: + identifier: 74 + plot_type: Binned graph + quantity: Photon Flux + unit: '#/cm^2' + 84: + identifier: 84 + plot_type: Binned graph + quantity: Neutron Flux + unit: '#/cm^2' + 94: + identifier: 94 + plot_type: Binned graph + quantity: Photon Flux + unit: '#/cm^2' 6: identifier: 6 plot_type: Ratio graph From f50dd76cca4d9c17a685c259d896310886b7bd38 Mon Sep 17 00:00:00 2001 From: Alex Valentine Date: Mon, 18 Nov 2024 17:11:48 +0000 Subject: [PATCH 10/10] more clarity in docs --- docs/source/usage/configuration.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/source/usage/configuration.rst b/docs/source/usage/configuration.rst index 53def221..d4a2d9f5 100644 --- a/docs/source/usage/configuration.rst +++ b/docs/source/usage/configuration.rst @@ -193,9 +193,10 @@ Computational benchmark post-processing configuration It is possible to control (to some extent) the post-processing of each benchmark via its specific configuration file. These files are located in the ``\Configuration\Benchmarks_Configuration`` folder and their name must be identical to the one used in the ``File Name`` field in the main configuration file -(using the .yaml extension instead of the .i). These files are available only for computational benchmarks, -since the high degree of customization needed for an experimental benchmark makes quite difficult to -standardize them. While computational benchmarks can be added to the JADE suite without the need for additional +(using the .yaml extension instead of the .i). Computational benchmark configuration files must be in YAML format, while +experimental benchmark configuration files are in Excel format due to the high degreee of customisation required. + +While computational benchmarks can be added to the JADE suite without the need for additional coding, this is not true also for experimental one. The files contain two main sections, that respectively regulate the Excel and the Word/PDF (i.e., Atlas) post-processing output.