Source code for aesop.utils
import os
import functools
import json
from json import encoder
encoder.FLOAT_REPR = lambda o: format(o, '.8f')
from glob import glob
import numpy as np
from .activity import Measurement, SIndex, StarProps
__all__ = ['glob_spectra_paths', 'stars_to_json', 'json_to_stars']
[docs]def glob_spectra_paths(data_dir, target_names):
"""
Collect paths to spectrum FITS files.
Parameters
----------
data_dir : str or list
Paths to the directories containing spectrum FITS files
target_names : list
String patterns that match the beginning of files with targets to
collect.
Returns
-------
spectra_paths : list
List of paths to spectrum FITS files
"""
if type(data_dir) != list:
data_dir = [data_dir]
all_spectra_paths = []
for d_dir in data_dir:
# Collect files for each target:
spectra_paths_lists = [glob(os.path.join(d_dir,
'{0}*.wfrmcpc.fits'.format(name)))
for name in target_names]
# Reduce to one list:
spectra_paths = functools.reduce(list.__add__, spectra_paths_lists)
all_spectra_paths.extend(spectra_paths)
return all_spectra_paths
def combine_measurements(measurement_list):
mean = np.mean([m.value for m in measurement_list])
err = np.sqrt(np.sum(np.array([m.err for m in measurement_list])**2))
return Measurement(value=mean, err=err, meta=len(measurement_list))
def floats_to_strings(d):
dictionary = d.copy()
for key in dictionary:
dictionary[key] = str(dictionary[key])
return dictionary
[docs]def stars_to_json(star_list, output_path='star_data.json'):
"""
Save list of stellar properties to a JSON file.
Parameters
----------
star_list : list of `StarProps`
Star properties to save to json
output_path : str
File path to output
"""
stars_attrs = star_list[0].__dict__.keys()
all_data = dict()
for star in star_list:
star_data = dict()
for attr in stars_attrs:
value = getattr(star, attr)
if isinstance(value, Measurement):
value = floats_to_strings(value.__dict__)
elif isinstance(value, SIndex):
value = value.to_dict()
else:
value = str(value)
star_data[attr] = value
all_data[star.name + '; ' + str(star.time.datetime)] = star_data
with open(output_path, 'w') as w:
json.dump(all_data, w, indent=4, sort_keys=True)
[docs]def json_to_stars(json_path):
"""
Loads JSON archive into list of `StarProps` objects.
Parameters
----------
json_path : str
Path to saved stellar properties
Returns
-------
stars : list of `StarProps`
List of stellar properties.
"""
with open(json_path, 'r') as w:
dictionary = json.load(w)
stars = [StarProps.from_dict(dictionary[star]) for star in dictionary]
return stars