Source code for exosim.utils.iterators
from collections import OrderedDict
import numpy as np
from tqdm.auto import tqdm
[docs]def iterate_over_opticalElements(input, key, last_key, val):
"""
It iterates over the optical element of a given class and returns the edited dictionary
Parameters
----------
input: dict
input dictionaru
key:
optical element class
last_key:
optical element key to edit
val:
value to edit
Returns
-------
dict
"""
if key in input.keys():
if "optical_path" in input[key].keys():
_nested(input[key]["optical_path"], last_key, val)
elif isinstance(input[key], OrderedDict):
for ch in input[key].keys():
if "optical_path" in input[key][ch].keys():
_nested(input[key][ch]["optical_path"], last_key, val)
else:
_nested(input[key][ch], last_key, val)
else:
_nested(input[key], last_key, val)
return input
def _nested(input, key, val):
if isinstance(input["opticalElement"], OrderedDict):
for opt in input["opticalElement"].keys():
input["opticalElement"][opt][key] = val
else:
input["opticalElement"][key] = val
[docs]def iterate_over_chunks(dataset, **kwargs):
"""
Iterates over the dataset chunks using tqdm to produce an adaptive progress bass
Parameters
----------
dataset: :class:`h5py.Dataset`
h5py chunked dataset used to store the data
Returns
-------
:class:`tqdm.tqdm`
"""
total = int(np.ceil(dataset.shape[0] / dataset.chunks[0]))
return tqdm(dataset.iter_chunks(), total=total, unit="chunk", **kwargs)
# from https://stackoverflow.com/a/20780569 on StackOverflow
# by cyborg (https://stackoverflow.com/users/907578/cyborg)
# this is compliant to StackOverflow's CC BY-SA 3.0
# and its attribution requirement
# (https://stackoverflow.blog/2009/06/25/attribution-required/)
[docs]def searchsorted(known_array, test_array):
index_sorted = np.argsort(known_array)
known_array_sorted = known_array[index_sorted]
known_array_middles = (
known_array_sorted[1:] - np.diff(known_array_sorted.astype("f")) / 2
)
idx1 = np.searchsorted(known_array_middles, test_array)
indices = index_sorted[idx1]
return indices