Source code for cellpack.autopack.loaders.config_loader
# -*- coding: utf-8 -*-
import json
import os
from json import encoder
import cellpack.autopack as autopack
from cellpack.autopack.DBRecipeHandler import DBRecipeLoader
from cellpack.autopack.interface_objects.database_ids import DATABASE_IDS
from cellpack.autopack.interface_objects.meta_enum import MetaEnum
encoder.FLOAT_REPR = lambda o: format(o, ".8g")
[docs]
class Place_Methods(MetaEnum):
    JITTER = "jitter"
    SPHERES_SST = "spheresSST" 
[docs]
class Inner_Grid_Methods(MetaEnum):
    # Working inner grid methods
    RAYTRACE = "raytrace"
    SCANLINE = "scanline"
    TRIMESH = "trimesh" 
[docs]
class ConfigLoader(object):
    default_values = {
        "clean_grid_cache": False,
        "format": "simularium",
        "load_from_grid_file": True,
        "inner_grid_method": "trimesh",
        "live_packing": False,
        "number_of_packings": 1,
        "name": "default",
        "ordered_packing": False,
        "out": "out/",
        "overwrite_place_method": False,
        "open_results_in_browser": True,
        "parallel": False,
        "place_method": "spheresSST",
        "randomness_seed": None,
        "save_analyze_result": False,
        "save_converted_recipe": False,
        "save_gradient_data_as_image": False,
        "save_plot_figures": True,
        "show_grid_plot": False,
        "show_sphere_trees": False,
        "show_progress_bar": True,
        "spacing": None,
        "upload_results": True,
        "use_periodicity": False,
        "version": 1.0,
    }
    def __init__(self, input_file_path=None, use_docker=False):
        if input_file_path is not None:
            _, file_extension = os.path.splitext(input_file_path)
            self.file_path = input_file_path
            self.file_extension = file_extension
        else:
            self.file_path = None
        self.latest_version = 1.0
        self.config = self._read(use_docker=use_docker)
    @staticmethod
    def _test_types(config):
        if not Place_Methods.is_member(config["place_method"]):
            raise TypeError(
                (
                    f"place_method must be one of {Place_Methods.values()}, not {config['place_method']}"
                )
            )
        if not Inner_Grid_Methods.is_member(config["inner_grid_method"]):
            raise TypeError(
                (
                    f"inner_grid_method must be one of {Inner_Grid_Methods.values()}, not {config['inner_grid_method']}"
                )
            )
        bools = [
            "live_packing",
            "ordered_packing",
            "overwrite_place_method",
            "save_analyze_result",
            "show_grid_plot",
            "use_periodicity",
            "show_sphere_trees",
        ]
        for should_be_bool in bools:
            if not isinstance(config[should_be_bool], bool):
                raise TypeError(
                    (
                        f"{should_be_bool} should be a boolean, not {config[should_be_bool]}"
                    )
                )
    @staticmethod
    def _migrate_version(config):
        return config
    def _read(self, use_docker=False):
        """
        Read in a Json Config file.
        """
        if self.file_path is None:
            config = ConfigLoader.default_values.copy()
        else:
            if autopack.is_remote_path(self.file_path):
                database_name, _ = self.file_path.split(":")
                db = DATABASE_IDS.handlers().get(database_name)
                initialize_db = db(default_db="staging") if use_docker else db()
                db_handler = DBRecipeLoader(initialize_db)
                config = db_handler.read_config(self.file_path)
            else:
                new_values = json.load(open(self.file_path, "r"))
                config = ConfigLoader.default_values.copy()
                config.update(new_values)
        if config["version"] != self.latest_version:
            config = ConfigLoader._migrate_version(config)
        ConfigLoader._test_types(config)
        return config