diff --git a/src/pg_rad/simulator/engine.py b/src/pg_rad/simulator/engine.py index f22305c..559fb32 100644 --- a/src/pg_rad/simulator/engine.py +++ b/src/pg_rad/simulator/engine.py @@ -3,6 +3,7 @@ from typing import List from pg_rad.landscape.landscape import Landscape from pg_rad.simulator.outputs import ( CountRateOutput, + DetectorOutput, SimulationOutput, SourceOutput ) @@ -31,11 +32,13 @@ class SimulationEngine: count_rate_results = self._calculate_count_rate_along_path() source_results = self._calculate_point_source_distance_to_path() + detector_results = self._generate_detector_output() return SimulationOutput( name=self.landscape.name, size=self.landscape.size, count_rate=count_rate_results, + detector=detector_results, sources=source_results ) @@ -80,3 +83,13 @@ class SimulationEngine: ) return source_output + + def _generate_detector_output(self) -> DetectorOutput: + return DetectorOutput( + name=self.detector.name, + type=self.detector.type, + is_isotropic=self.detector.is_isotropic, + field_eff=self.detector.get_efficiency( + self.landscape.point_sources[0].isotope.E + ) + ) diff --git a/src/pg_rad/simulator/outputs.py b/src/pg_rad/simulator/outputs.py index 404e742..7ec364b 100644 --- a/src/pg_rad/simulator/outputs.py +++ b/src/pg_rad/simulator/outputs.py @@ -24,9 +24,18 @@ class SourceOutput: dist_from_path: float +@dataclass +class DetectorOutput: + name: str + type: str + is_isotropic: bool + field_eff: float + + @dataclass class SimulationOutput: name: str size: tuple + detector: DetectorOutput count_rate: CountRateOutput sources: List[SourceOutput] diff --git a/src/pg_rad/utils/export.py b/src/pg_rad/utils/export.py index a4c38ca..3a7be62 100644 --- a/src/pg_rad/utils/export.py +++ b/src/pg_rad/utils/export.py @@ -5,7 +5,7 @@ import os import logging import re -from numpy import array, full_like, ndarray +from numpy import array, full_like, ndarray, bool_ from pandas import DataFrame from pg_rad.simulator.outputs import SimulationOutput @@ -18,6 +18,8 @@ class NumpyEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, ndarray): return obj.tolist() + elif isinstance(obj, bool_): + return bool(obj) return super().default(obj) @@ -44,8 +46,10 @@ def save_results(sim: SimulationOutput, folder_name: str) -> None: df = generate_df(sim) csv_name = generate_csv_name(sim) df.to_csv(f"{folder_name}/{csv_name}.csv", index=False) + param_dict = generate_sim_param_dict(sim) + print(type(param_dict['detector']['is_isotropic'])) with open(f"{folder_name}/parameters.json", 'w') as f: - json.dump(generate_sim_param_dict(sim), f, cls=NumpyEncoder) + json.dump(param_dict, f, cls=NumpyEncoder) logger.info(f"Simulation output saved to {folder_name}!")