Source code for csdmpy
# -*- coding: utf-8 -*-
"""CSDM."""
from __future__ import division
from __future__ import print_function
import json
from os import listdir
from os.path import isdir
from os.path import join
from urllib.parse import urlparse
from numpy.fft import fftshift
from csdmpy.csdm import CSDM
from csdmpy.dependent_variables import DependentVariable
from csdmpy.dependent_variables.download import download_file_from_url
from csdmpy.dimensions import Dimension
from csdmpy.helper_functions import _preview
from csdmpy.utils import validate
from csdmpy.version import __version__
__author__ = "Deepansh J. Srivastava"
__email__ = "srivastava.89@osu.edu"
__all__ = ["load", "new", "plot"]
def _import_json(filename):
res = urlparse(filename)
if res[0] not in ["file", ""]:
filename = download_file_from_url(filename)
with open(filename, "rb") as f:
content = f.read()
return json.loads(str(content, encoding="UTF-8"))
[docs]def load(filename=None, application=False):
r"""
Load a .csdf/.csdfe file and return an instance of :ref:`csdm_api` class.
The file must be a JSON serialization of the CSD Model.
Example:
>>> data1 = cp.load('local_address/file.csdf') # doctest: +SKIP
>>> data2 = cp.load('url_address/file.csdf') # doctest: +SKIP
Args:
filename (str): A local or remote address to the `.csdf or `.csdfe` file.
application (bool): If true, the application metadata from application that
last serialized the file will be imported. Default is False.
sort_fft_order (bool): If true, the coordinates and the components
corresponding to the dimension with `complex_fft` as True will be
sorted upon import and the corresponding `complex_fft` key-value
will be set to False. Default is True.
Returns:
A CSDM instance.
"""
if filename is None:
raise Exception("Missing a required data file address.")
if isdir(filename) and filename.endswith((".csdm", ".csdm/")):
csdm_files = [f for f in listdir(filename) if f.endswith((".csdf", ".csdfe"))]
if len(csdm_files) != 1:
raise Exception(
("More that one csdf(e) files encountered in the .csdm folder")
)
csd_file = join(filename, csdm_files[0])
else:
csd_file = filename
csdm_object = _load(csd_file)
# if sort_fft_order:
# axes = []
# for i, dim in enumerate(csdm_object.dimensions):
# if dim.type == "linear":
# if dim.complex_fft:
# n_points = dim.count
# if n_points % 2 == 0:
# temp = n_points * dim.increment / 2.0
# else:
# temp = (n_points - 1) * dim.increment / 2.0
# dim.coordinates_offset = dim.coordinates_offset - temp
# axes.append(-i - 1)
# # dim.complex_fft = False
# for var in csdm_object.dependent_variables:
# var.components = fftshift(var.components, axes=axes)
if application is False:
csdm_object.application = {}
for dim in csdm_object.dimensions:
dim.application = {}
if hasattr(dim, "reciprocal") and dim.type != "label":
dim.reciprocal.application = {}
for dim in csdm_object.dependent_variables:
dim.application = {}
# if hasattr(dim., 'dimension indexes'):
# dim.reciprocal.application = {}
# csdm_objects = []
# for file_ in csdm_files:
# csdm_objects.append(_load(file_, application=application))
return csdm_object
def _load(filename):
try:
dictionary = _import_json(filename)
except Exception as e:
raise Exception(e)
key_list_root = dictionary.keys()
if "CSDM" in key_list_root:
raise KeyError("'CSDM' is not a valid keyword. Did you mean 'csdm'?")
if "csdm" not in key_list_root:
raise KeyError("Missing a required `csdm` key.")
# inside csdm object
optional_keys = [
"read_only",
"timestamp",
"geographic_coordinate",
"application",
"tags",
"description",
]
required_keys = ["version"]
all_keys = optional_keys + required_keys
key_list_csdm = list(dictionary["csdm"].keys())
key_list_csdm_lower_case = [item.lower() for item in key_list_csdm]
for i in range(len(key_list_csdm)):
if key_list_csdm[i] not in all_keys and key_list_csdm_lower_case[i] in all_keys:
raise KeyError(
(
f"{key_list_csdm[i]} is not a valid keyword. "
f"Did you mean '{key_list_csdm_lower_case[i]}'?"
)
)
for item in required_keys:
if item not in key_list_csdm:
raise KeyError(f"Missing a required `{item}` key.")
_version = dictionary["csdm"]["version"]
validate(_version, "version", str)
csdm = CSDM(filename, _version)
if "timestamp" in dictionary["csdm"].keys():
_timestamp = dictionary["csdm"]["timestamp"]
validate(_timestamp, "timestamp", str)
csdm._timestamp = _timestamp
if "dimensions" in key_list_csdm:
for dim in dictionary["csdm"]["dimensions"]:
csdm.add_dimension(dim)
if "dependent_variables" in key_list_csdm:
for dat in dictionary["csdm"]["dependent_variables"]:
csdm.add_dependent_variable(dat)
n_points = [item.count for item in csdm.dimensions]
if n_points != []:
csdm._reshape(n_points[::-1])
for key in optional_keys:
if key in key_list_csdm:
setattr(csdm, "_" + key, dictionary["csdm"][key])
return csdm
[docs]def new(description=""):
r"""
Create a new instance of the :ref:`csdm_api` class containing a 0D{0} dataset.
Args:
description (str): A string describing the the csdm object. This is optional.
Example:
>>> import csdmpy as cp
>>> emptydata = cp.new(description='Testing Testing 1 2 3')
>>> print(emptydata.data_structure)
{
"csdm": {
"version": "1.0",
"description": "Testing Testing 1 2 3",
"dimensions": [],
"dependent_variables": []
}
}
Returns:
A CSDM instance.
"""
return CSDM(description=description)
def plot(data_object, *args, **kwargs):
_preview(data_object, *args, **kwargs)