Source code for simulariumio.file_converter

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import logging
from typing import Any, Dict

from .trajectory_converter import TrajectoryConverter
from .data_objects import TrajectoryData, UnitData, InputFileData, DisplayData
from .constants import CURRENT_VERSION
from .readers import SimulariumBinaryReader

###############################################################################

log = logging.getLogger(__name__)

###############################################################################


[docs] class FileConverter(TrajectoryConverter): def __init__( self, input_file: InputFileData, display_data: Dict[int, DisplayData] = None ): """ This object loads data from the input file in .simularium format. Parameters ---------- input_file: InputFileData A InputFileData object containing .simularium data to load """ if display_data is None: display_data = {} if input_file._is_binary(): print("Reading Simularium binary -------------") buffer_data = SimulariumBinaryReader.load_binary(input_file) else: print("Reading Simularium JSON -------------") buffer_data = json.loads(input_file.get_contents()) if ( int(buffer_data["trajectoryInfo"]["version"]) < CURRENT_VERSION.TRAJECTORY_INFO ): buffer_data = FileConverter.update_trajectory_info_version(buffer_data) self._data = TrajectoryData.from_buffer_data(buffer_data, display_data) @staticmethod def _update_trajectory_info_v1_to_v2(data: Dict[str, Any]) -> Dict[str, Any]: """ Update the trajectory info block from v1 to v2 """ # units if "spatialUnitFactorMeters" in data["trajectoryInfo"]: spatial_units = UnitData( "m", data["trajectoryInfo"]["spatialUnitFactorMeters"] ) data["trajectoryInfo"].pop("spatialUnitFactorMeters") else: spatial_units = UnitData("m") data["trajectoryInfo"]["spatialUnits"] = { "magnitude": spatial_units.magnitude, "name": spatial_units.name, } time_units = UnitData("s", 1.0) data["trajectoryInfo"]["timeUnits"] = { "magnitude": time_units.magnitude, "name": time_units.name, } data["trajectoryInfo"]["version"] = 2 return data @staticmethod def _update_trajectory_info_v2_to_v3(data: Dict[str, Any]) -> Dict[str, Any]: """ Update the trajectory info block from v2 to v3 """ # all the new fields from v2 to v3 are optional data["trajectoryInfo"]["version"] = 3 return data
[docs] @staticmethod def update_trajectory_info_version(data: Dict[str, Any]) -> Dict[str, Any]: """ Update the trajectory info block to match the current version Parameters ---------- data: Dict[str, Any] A .simularium JSON file loaded in memory as a Dict. This object will be mutated, not copied. """ original_version = int(data["trajectoryInfo"]["version"]) if original_version == 1: data = FileConverter._update_trajectory_info_v1_to_v2(data) data = FileConverter._update_trajectory_info_v2_to_v3(data) if original_version == 2: data = FileConverter._update_trajectory_info_v2_to_v3(data) print( f"Updated TrajectoryInfo v{original_version} -> " f"v{CURRENT_VERSION.TRAJECTORY_INFO}" ) return data