From c492e1bdbe1919285cd98283104f136077cc9df8 Mon Sep 17 00:00:00 2001 From: Joachim Moeyens Date: Thu, 19 Sep 2024 16:25:31 -0700 Subject: [PATCH] Add Observatory.from_json and to_json --- src/adam_test_data/main.py | 2 +- src/adam_test_data/noise.py | 2 +- src/adam_test_data/observatories/__init__.py | 13 ++++ .../{ => observatories}/observatory.py | 70 +++++++++++++++++++ .../observatories/tests/__init__.py | 0 .../tests/test_observatory.py | 21 ++++++ src/adam_test_data/tests/test_main.py | 2 +- 7 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 src/adam_test_data/observatories/__init__.py rename src/adam_test_data/{ => observatories}/observatory.py (70%) create mode 100644 src/adam_test_data/observatories/tests/__init__.py rename src/adam_test_data/{ => observatories}/tests/test_observatory.py (87%) diff --git a/src/adam_test_data/main.py b/src/adam_test_data/main.py index 2048b83..79975b5 100644 --- a/src/adam_test_data/main.py +++ b/src/adam_test_data/main.py @@ -18,7 +18,7 @@ from adam_core.time import Timestamp from .noise import generate_noise -from .observatory import Observatory, observatory_to_sorcha_config +from .observatories import Observatory, observatory_to_sorcha_config from .pointings import Pointings from .populations import ( SmallBodies, diff --git a/src/adam_test_data/noise.py b/src/adam_test_data/noise.py index 79403a6..4e1d5d4 100644 --- a/src/adam_test_data/noise.py +++ b/src/adam_test_data/noise.py @@ -20,7 +20,7 @@ from jax import Array from scipy.stats import skewnorm -from .observatory import Observatory +from .observatories import Observatory from .pointings import Pointings diff --git a/src/adam_test_data/observatories/__init__.py b/src/adam_test_data/observatories/__init__.py new file mode 100644 index 0000000..6f1c1b3 --- /dev/null +++ b/src/adam_test_data/observatories/__init__.py @@ -0,0 +1,13 @@ +from .observatory import ( + FieldOfView, + Observatory, + Simulation, + observatory_to_sorcha_config, +) + +__all__ = [ + "FieldOfView", + "Observatory", + "Simulation", + "observatory_to_sorcha_config", +] diff --git a/src/adam_test_data/observatory.py b/src/adam_test_data/observatories/observatory.py similarity index 70% rename from src/adam_test_data/observatory.py rename to src/adam_test_data/observatories/observatory.py index 429a902..f5aeb83 100644 --- a/src/adam_test_data/observatory.py +++ b/src/adam_test_data/observatories/observatory.py @@ -1,3 +1,4 @@ +import json from dataclasses import dataclass from typing import Literal, Optional @@ -69,6 +70,75 @@ class Observatory: fov: FieldOfView simulation: Simulation + @classmethod + def from_json(cls, file: str) -> "Observatory": + """ + Load an observatofy from a JSON file. + + Parameters + ---------- + file : str + The path to the JSON file. + + Returns + ------- + Observatory + The observatory object. + """ + with open(file, "r") as f: + data = json.load(f) + + code = data["code"] + filters = data["filters"] + main_filter = data["main_filter"] + bright_limit = data["bright_limit"] + fov = FieldOfView( + camera_model=data["fov"]["camera_model"], + circle_radius=data["fov"]["circle_radius"], + fill_factor=data["fov"]["fill_factor"], + ) + simulation = Simulation( + ang_fov=data["simulation"]["ang_fov"], + fov_buffer=data["simulation"]["fov_buffer"], + ) + + return Observatory( + code=code, + filters=filters, + main_filter=main_filter, + bright_limit=bright_limit, + fov=fov, + simulation=simulation, + ) + + def to_json(self, file: str) -> None: + """ + Save the observatory to a JSON file. + + Parameters + ---------- + file : str + The path to the JSON file. + """ + data = { + "code": self.code, + "filters": self.filters, + "main_filter": self.main_filter, + "bright_limit": self.bright_limit, + "fov": { + "camera_model": self.fov.camera_model, + "circle_radius": self.fov.circle_radius, + "fill_factor": self.fov.fill_factor, + }, + "simulation": { + "ang_fov": self.simulation.ang_fov, + "fov_buffer": self.simulation.fov_buffer, + }, + } + + with open(file, "w") as f: + json.dump(data, f, indent=4) + def observatory_to_sorcha_config( observatory: Observatory, diff --git a/src/adam_test_data/observatories/tests/__init__.py b/src/adam_test_data/observatories/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/adam_test_data/tests/test_observatory.py b/src/adam_test_data/observatories/tests/test_observatory.py similarity index 87% rename from src/adam_test_data/tests/test_observatory.py rename to src/adam_test_data/observatories/tests/test_observatory.py index af39d35..1e93fcd 100644 --- a/src/adam_test_data/tests/test_observatory.py +++ b/src/adam_test_data/observatories/tests/test_observatory.py @@ -1,3 +1,5 @@ +import tempfile + import pytest from ..observatory import ( @@ -181,3 +183,22 @@ def test_observatory_to_sorcha_config_raises() -> None: main_filter="r", ) observatory_to_sorcha_config(obs) + + +def test_Observatory_to_from_json() -> None: + # Test that we can round trip an Observatory object to and from a JSON file. + with tempfile.NamedTemporaryFile(suffix=".json") as temp_file: + obs = Observatory( + code="X05", + filters=["u", "g", "r", "i", "z", "y"], + bright_limit=[16, 16, 16, 16, 16, 16], + fov=FieldOfView(camera_model="circle", fill_factor=0.9, circle_radius=3), + simulation=Simulation(ang_fov=1.0, fov_buffer=0.1), + main_filter="r", + ) + + obs.to_json(temp_file.name) + + obs2 = Observatory.from_json(temp_file.name) + + assert obs == obs2 diff --git a/src/adam_test_data/tests/test_main.py b/src/adam_test_data/tests/test_main.py index 24029dd..8691d0b 100644 --- a/src/adam_test_data/tests/test_main.py +++ b/src/adam_test_data/tests/test_main.py @@ -12,7 +12,7 @@ from adam_core.time import Timestamp from ..main import generate_test_data, sorcha, write_sorcha_inputs -from ..observatory import FieldOfView, Observatory, Simulation +from ..observatories import FieldOfView, Observatory, Simulation from ..pointings import Pointings from ..populations import PhotometricProperties, SmallBodies