From f90045d628006b7814ebf6cbd12b2a70c4daa1fd Mon Sep 17 00:00:00 2001 From: Atharva Arya Date: Mon, 19 Aug 2024 16:38:44 +0530 Subject: [PATCH 1/6] Initial commit --- .../tests/test_tardis_full_formal_integral.py | 130 ++++++++---------- 1 file changed, 58 insertions(+), 72 deletions(-) diff --git a/tardis/tests/test_tardis_full_formal_integral.py b/tardis/tests/test_tardis_full_formal_integral.py index 7e6a01cc12a..fb9fe746a40 100644 --- a/tardis/tests/test_tardis_full_formal_integral.py +++ b/tardis/tests/test_tardis_full_formal_integral.py @@ -7,6 +7,9 @@ from tardis.io.configuration.config_reader import Configuration from tardis.simulation.base import Simulation +from tardis.io.util import HDFWriterMixin +from tardis.tests.fixtures.regression_data import RegressionData + config_line_modes = ["downbranch", "macroatom"] interpolate_shells = [-1, 30] @@ -17,7 +20,6 @@ def base_config(request, example_configuration_dir: Path): config = Configuration.from_yaml( example_configuration_dir / "tardis_configv1_verysimple.yml" ) - config["plasma"]["line_interaction_type"] = request.param config["montecarlo"]["no_of_packets"] = 4.0e4 config["montecarlo"]["last_no_of_packets"] = 1.0e5 @@ -28,81 +30,65 @@ def base_config(request, example_configuration_dir: Path): return config - @pytest.fixture(scope="module", params=interpolate_shells) def config(base_config, request): base_config["spectrum"]["integrated"]["interpolate_shells"] = request.param return base_config +class SimulationContainer(HDFWriterMixin): + hdf_properties = ["spectrum_solver", "transport"] + + def __init__(self, simulation): + self.spectrum_solver = simulation.spectrum_solver + self.transport = simulation.transport class TestTransportSimpleFormalIntegral: - """ - Very simple run with the formal integral spectral synthesis method - """ - - _name = "test_transport_simple_integral" - - @pytest.fixture(scope="class") - def simulation( - self, config, atomic_data_fname, tardis_ref_data, generate_reference - ): - config.atom_data = atomic_data_fname - - self.name = self._name + f"_{config.plasma.line_interaction_type:s}" - if config.spectrum.integrated.interpolate_shells > 0: - self.name += "_interp" - - simulation = Simulation.from_config(config) - simulation.run_convergence() - simulation.run_final() - - if not generate_reference: - return simulation - else: - simulation.spectrum_solver.hdf_properties = [ - "spectrum_real_packets", - "spectrum_integrated", - ] - simulation.spectrum_solver.to_hdf( - tardis_ref_data, "", self.name, overwrite=True - ) - simulation.transport.hdf_properties = ["transport_state"] - simulation.transport.to_hdf( - tardis_ref_data, "", self.name, overwrite=True - ) - pytest.skip("Reference data was generated during this run.") - - @pytest.fixture(scope="class") - def refdata(self, tardis_ref_data): - def get_ref_data(key): - return tardis_ref_data[f"{self.name}/{key}"] - - return get_ref_data - - def test_j_blue_estimators(self, simulation, refdata): - j_blue_estimator = refdata("transport_state/j_blue_estimator").values - - npt.assert_allclose( - simulation.transport.transport_state.radfield_mc_estimators.j_blue_estimator, - j_blue_estimator, - ) - - def test_spectrum(self, simulation, refdata): - luminosity = u.Quantity( - refdata("spectrum_real_packets/luminosity"), "erg /s" - ) - - assert_quantity_allclose( - simulation.spectrum_solver.spectrum_real_packets.luminosity, - luminosity, - ) - - def test_spectrum_integrated(self, simulation, refdata): - luminosity = u.Quantity( - refdata("spectrum_integrated/luminosity"), "erg /s" - ) - - assert_quantity_allclose( - simulation.spectrum_solver.spectrum_integrated.luminosity, - luminosity, - ) + """ + Very simple run with the formal integral spectral synthesis method + """ + + _name = "test_transport_simple_integral" + + @pytest.fixture(scope="class") + def simulation(self, config, atomic_data_fname ): + config.atom_data = atomic_data_fname + + self.name = self._name + f"_{config.plasma.line_interaction_type:s}" + if config.spectrum.integrated.interpolate_shells > 0: + self.name += "_interp" + + simulation = Simulation.from_config(config) + simulation.run_convergence() + simulation.run_final() + simulation.spectrum_solver.hdf_properties = [ + "spectrum_real_packets", + "spectrum_integrated", + ] + simulation.transport.hdf_properties = ["transport_state"] + + return simulation + + def test_simulation(self, simulation, request): + regression_data = RegressionData(request) + container = SimulationContainer(simulation) + regression_data.sync_hdf_store(container) + + def test_j_blue_estimators(self, simulation, request): + regression_data = RegressionData(request) + j_blue_estimator = simulation.transport.transport_state.radfield_mc_estimators.j_blue_estimator + expected = regression_data.sync_ndarray(j_blue_estimator) + npt.assert_allclose(j_blue_estimator, expected) + + def test_spectrum(self, simulation, request): + regression_data = RegressionData(request) + luminosity = simulation.spectrum_solver.spectrum_real_packets.luminosity + expected = regression_data.sync_ndarray(luminosity.cgs.value) + expected = u.Quantity(expected, "erg /s") + assert_quantity_allclose(luminosity, expected) + + def test_spectrum_integrated(self, simulation, request): + regression_data = RegressionData(request) + luminosity = simulation.spectrum_solver.spectrum_integrated.luminosity + expected = regression_data.sync_ndarray(luminosity.cgs.value) + expected = u.Quantity(expected, "erg /s") + assert_quantity_allclose(luminosity, expected) \ No newline at end of file From 8394b102a4ce40c34b0b145ef02376196ee2d8fb Mon Sep 17 00:00:00 2001 From: Atharva Arya Date: Wed, 21 Aug 2024 17:42:05 +0530 Subject: [PATCH 2/6] Rest works --- tardis/tests/test_tardis_full_formal_integral.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/tardis/tests/test_tardis_full_formal_integral.py b/tardis/tests/test_tardis_full_formal_integral.py index fb9fe746a40..985168baf95 100644 --- a/tardis/tests/test_tardis_full_formal_integral.py +++ b/tardis/tests/test_tardis_full_formal_integral.py @@ -86,9 +86,9 @@ def test_spectrum(self, simulation, request): expected = u.Quantity(expected, "erg /s") assert_quantity_allclose(luminosity, expected) - def test_spectrum_integrated(self, simulation, request): - regression_data = RegressionData(request) - luminosity = simulation.spectrum_solver.spectrum_integrated.luminosity - expected = regression_data.sync_ndarray(luminosity.cgs.value) - expected = u.Quantity(expected, "erg /s") - assert_quantity_allclose(luminosity, expected) \ No newline at end of file +# def test_spectrum_integrated(self, simulation, request): +# regression_data = RegressionData(request) +# luminosity = simulation.spectrum_solver.spectrum_integrated.luminosity +# expected = regression_data.sync_ndarray(luminosity.cgs.value) +# expected = u.Quantity(expected, "erg /s") +# assert_quantity_allclose(luminosity, expected) \ No newline at end of file From 7c74786ae0f2b7acc24b9ec4e0cd4f34591a66a3 Mon Sep 17 00:00:00 2001 From: Atharva Arya Date: Wed, 21 Aug 2024 18:15:08 +0530 Subject: [PATCH 3/6] Fix for spectrum integrated issue --- tardis/spectrum/base.py | 6 ++---- tardis/tests/test_tardis_full_formal_integral.py | 12 ++++++------ 2 files changed, 8 insertions(+), 10 deletions(-) diff --git a/tardis/spectrum/base.py b/tardis/spectrum/base.py index 2780e893783..e7b872ff759 100644 --- a/tardis/spectrum/base.py +++ b/tardis/spectrum/base.py @@ -99,14 +99,12 @@ def spectrum_integrated(self): "This RETURNS AN EMPTY SPECTRUM!", UserWarning, ) - return TARDISSpectrum( + self._spectrum_integrated = TARDISSpectrum( np.array([np.nan, np.nan]) * u.Hz, np.array([np.nan]) * u.erg / u.s, ) - else: - self._spectrum_integrated = None return self._spectrum_integrated - + @property def integrator(self): if self._integrator is None: diff --git a/tardis/tests/test_tardis_full_formal_integral.py b/tardis/tests/test_tardis_full_formal_integral.py index 985168baf95..fb9fe746a40 100644 --- a/tardis/tests/test_tardis_full_formal_integral.py +++ b/tardis/tests/test_tardis_full_formal_integral.py @@ -86,9 +86,9 @@ def test_spectrum(self, simulation, request): expected = u.Quantity(expected, "erg /s") assert_quantity_allclose(luminosity, expected) -# def test_spectrum_integrated(self, simulation, request): -# regression_data = RegressionData(request) -# luminosity = simulation.spectrum_solver.spectrum_integrated.luminosity -# expected = regression_data.sync_ndarray(luminosity.cgs.value) -# expected = u.Quantity(expected, "erg /s") -# assert_quantity_allclose(luminosity, expected) \ No newline at end of file + def test_spectrum_integrated(self, simulation, request): + regression_data = RegressionData(request) + luminosity = simulation.spectrum_solver.spectrum_integrated.luminosity + expected = regression_data.sync_ndarray(luminosity.cgs.value) + expected = u.Quantity(expected, "erg /s") + assert_quantity_allclose(luminosity, expected) \ No newline at end of file From 6ec1212cf31527235d6676f52c9d33749d68f0b9 Mon Sep 17 00:00:00 2001 From: Atharva Arya Date: Wed, 21 Aug 2024 18:19:26 +0530 Subject: [PATCH 4/6] Reformat using Ruff and Black --- tardis/spectrum/base.py | 2 +- .../tests/test_tardis_full_formal_integral.py | 116 +++++++++--------- 2 files changed, 61 insertions(+), 57 deletions(-) diff --git a/tardis/spectrum/base.py b/tardis/spectrum/base.py index e7b872ff759..156cc0e1cef 100644 --- a/tardis/spectrum/base.py +++ b/tardis/spectrum/base.py @@ -104,7 +104,7 @@ def spectrum_integrated(self): np.array([np.nan]) * u.erg / u.s, ) return self._spectrum_integrated - + @property def integrator(self): if self._integrator is None: diff --git a/tardis/tests/test_tardis_full_formal_integral.py b/tardis/tests/test_tardis_full_formal_integral.py index fb9fe746a40..c981c46f097 100644 --- a/tardis/tests/test_tardis_full_formal_integral.py +++ b/tardis/tests/test_tardis_full_formal_integral.py @@ -6,11 +6,10 @@ from astropy.tests.helper import assert_quantity_allclose from tardis.io.configuration.config_reader import Configuration -from tardis.simulation.base import Simulation from tardis.io.util import HDFWriterMixin +from tardis.simulation.base import Simulation from tardis.tests.fixtures.regression_data import RegressionData - config_line_modes = ["downbranch", "macroatom"] interpolate_shells = [-1, 30] @@ -30,65 +29,70 @@ def base_config(request, example_configuration_dir: Path): return config + @pytest.fixture(scope="module", params=interpolate_shells) def config(base_config, request): base_config["spectrum"]["integrated"]["interpolate_shells"] = request.param return base_config + class SimulationContainer(HDFWriterMixin): - hdf_properties = ["spectrum_solver", "transport"] - - def __init__(self, simulation): - self.spectrum_solver = simulation.spectrum_solver - self.transport = simulation.transport + hdf_properties = ["spectrum_solver", "transport"] + + def __init__(self, simulation): + self.spectrum_solver = simulation.spectrum_solver + self.transport = simulation.transport + class TestTransportSimpleFormalIntegral: - """ - Very simple run with the formal integral spectral synthesis method - """ - - _name = "test_transport_simple_integral" - - @pytest.fixture(scope="class") - def simulation(self, config, atomic_data_fname ): - config.atom_data = atomic_data_fname - - self.name = self._name + f"_{config.plasma.line_interaction_type:s}" - if config.spectrum.integrated.interpolate_shells > 0: - self.name += "_interp" - - simulation = Simulation.from_config(config) - simulation.run_convergence() - simulation.run_final() - simulation.spectrum_solver.hdf_properties = [ - "spectrum_real_packets", - "spectrum_integrated", - ] - simulation.transport.hdf_properties = ["transport_state"] - - return simulation - - def test_simulation(self, simulation, request): - regression_data = RegressionData(request) - container = SimulationContainer(simulation) - regression_data.sync_hdf_store(container) - - def test_j_blue_estimators(self, simulation, request): - regression_data = RegressionData(request) - j_blue_estimator = simulation.transport.transport_state.radfield_mc_estimators.j_blue_estimator - expected = regression_data.sync_ndarray(j_blue_estimator) - npt.assert_allclose(j_blue_estimator, expected) - - def test_spectrum(self, simulation, request): - regression_data = RegressionData(request) - luminosity = simulation.spectrum_solver.spectrum_real_packets.luminosity - expected = regression_data.sync_ndarray(luminosity.cgs.value) - expected = u.Quantity(expected, "erg /s") - assert_quantity_allclose(luminosity, expected) - - def test_spectrum_integrated(self, simulation, request): - regression_data = RegressionData(request) - luminosity = simulation.spectrum_solver.spectrum_integrated.luminosity - expected = regression_data.sync_ndarray(luminosity.cgs.value) - expected = u.Quantity(expected, "erg /s") - assert_quantity_allclose(luminosity, expected) \ No newline at end of file + """ + Very simple run with the formal integral spectral synthesis method + """ + + _name = "test_transport_simple_integral" + + @pytest.fixture(scope="class") + def simulation(self, config, atomic_data_fname): + config.atom_data = atomic_data_fname + + self.name = self._name + f"_{config.plasma.line_interaction_type:s}" + if config.spectrum.integrated.interpolate_shells > 0: + self.name += "_interp" + + simulation = Simulation.from_config(config) + simulation.run_convergence() + simulation.run_final() + simulation.spectrum_solver.hdf_properties = [ + "spectrum_real_packets", + "spectrum_integrated", + ] + simulation.transport.hdf_properties = ["transport_state"] + + return simulation + + def test_simulation(self, simulation, request): + regression_data = RegressionData(request) + container = SimulationContainer(simulation) + regression_data.sync_hdf_store(container) + + def test_j_blue_estimators(self, simulation, request): + regression_data = RegressionData(request) + j_blue_estimator = ( + simulation.transport.transport_state.radfield_mc_estimators.j_blue_estimator + ) + expected = regression_data.sync_ndarray(j_blue_estimator) + npt.assert_allclose(j_blue_estimator, expected) + + def test_spectrum(self, simulation, request): + regression_data = RegressionData(request) + luminosity = simulation.spectrum_solver.spectrum_real_packets.luminosity + expected = regression_data.sync_ndarray(luminosity.cgs.value) + expected = u.Quantity(expected, "erg /s") + assert_quantity_allclose(luminosity, expected) + + def test_spectrum_integrated(self, simulation, request): + regression_data = RegressionData(request) + luminosity = simulation.spectrum_solver.spectrum_integrated.luminosity + expected = regression_data.sync_ndarray(luminosity.cgs.value) + expected = u.Quantity(expected, "erg /s") + assert_quantity_allclose(luminosity, expected) From 4bdacd9bd22fadb21b989a1d06c467a9b6cbda6c Mon Sep 17 00:00:00 2001 From: Atharva Arya Date: Wed, 21 Aug 2024 18:40:14 +0530 Subject: [PATCH 5/6] Remove tardis_ref_data fixture --- tardis/conftest.py | 11 ----------- tardis/gui/tests/test_gui.py | 2 +- 2 files changed, 1 insertion(+), 12 deletions(-) diff --git a/tardis/conftest.py b/tardis/conftest.py index e5af08a5cdf..cba3edfd830 100644 --- a/tardis/conftest.py +++ b/tardis/conftest.py @@ -165,17 +165,6 @@ def tardis_snapshot_path(request): os.path.expandvars(os.path.expanduser(tardis_snapshot_path)) ) - -@pytest.yield_fixture(scope="session") -def tardis_ref_data(tardis_ref_path, generate_reference): - if generate_reference: - mode = "w" - else: - mode = "r" - with pd.HDFStore(tardis_ref_path / "unit_test_data.h5", mode=mode) as store: - yield store - - @pytest.fixture(scope="function") def tardis_config_verysimple(): return yaml_load_file( diff --git a/tardis/gui/tests/test_gui.py b/tardis/gui/tests/test_gui.py index 2cc05187376..99a685bebcc 100644 --- a/tardis/gui/tests/test_gui.py +++ b/tardis/gui/tests/test_gui.py @@ -19,7 +19,7 @@ def config(): @pytest.fixture(scope="module") def simulation_one_loop( - atomic_data_fname, config, tardis_ref_data, generate_reference + atomic_data_fname, config ): config.atom_data = atomic_data_fname config.montecarlo.iterations = 2 From 1a816915afc703da2a2c73bd6050833d0c7502bf Mon Sep 17 00:00:00 2001 From: Atharva Arya Date: Wed, 21 Aug 2024 18:46:05 +0530 Subject: [PATCH 6/6] Reformat using Ruff and Black --- tardis/conftest.py | 4 ++-- tardis/gui/tests/test_gui.py | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/tardis/conftest.py b/tardis/conftest.py index cba3edfd830..8d5f6ad78b7 100644 --- a/tardis/conftest.py +++ b/tardis/conftest.py @@ -1,16 +1,15 @@ import os from pathlib import Path -import pandas as pd import pytest from astropy.version import version as astropy_version +from tardis import run_tardis from tardis.io.configuration.config_reader import Configuration from tardis.io.util import YAMLLoader, yaml_load_file from tardis.simulation import Simulation from tardis.tests.fixtures.atom_data import * from tardis.tests.fixtures.regression_data import regression_data -from tardis import run_tardis # ensuring that regression_data is not removed by ruff assert regression_data is not None @@ -165,6 +164,7 @@ def tardis_snapshot_path(request): os.path.expandvars(os.path.expanduser(tardis_snapshot_path)) ) + @pytest.fixture(scope="function") def tardis_config_verysimple(): return yaml_load_file( diff --git a/tardis/gui/tests/test_gui.py b/tardis/gui/tests/test_gui.py index 99a685bebcc..80cec6e5ee4 100644 --- a/tardis/gui/tests/test_gui.py +++ b/tardis/gui/tests/test_gui.py @@ -1,13 +1,15 @@ import os + import pytest + from tardis.io.configuration.config_reader import Configuration from tardis.simulation import Simulation -import astropy.units as u if "QT_API" in os.environ: from PyQt5 import QtWidgets - from tardis.gui.widgets import Tardis + from tardis.gui.datahandler import SimpleTableModel + from tardis.gui.widgets import Tardis @pytest.fixture(scope="module") @@ -18,9 +20,7 @@ def config(): @pytest.fixture(scope="module") -def simulation_one_loop( - atomic_data_fname, config -): +def simulation_one_loop(atomic_data_fname, config): config.atom_data = atomic_data_fname config.montecarlo.iterations = 2 config.montecarlo.no_of_packets = int(4e4)