Source code for neutronbraggedge.utilities
import numpy as np
[docs]class Utilities(object):
"""Utilities class"""
list_of_time_units = ['s', 'ms', 'micros', 'ns']
@staticmethod
[docs] def convert_time_units(data=None, from_units='micros', to_units='s'):
"""convert the time units
Parameters:
* vdata: single data or array of value to convert
* from_units: default 'micros'. Must be either ['s','micros','ns']
* to_units: default 's'. Must be either ['s', 'micros', 'ns']
"""
if data is None:
raise ValueError("Please provide data to convert")
list_of_time_units = Utilities.list_of_time_units
if ( not (from_units in list_of_time_units) or
not (to_units in list_of_time_units)):
raise ValueError("Units convertion not supported")
coeff = Utilities.get_time_conversion_coeff(from_units = from_units,
to_units = to_units)
if (type(data) is list):
data = np.array(data)
return data * coeff
@staticmethod
[docs] def get_time_conversion_coeff(from_units='micros', to_units='s'):
"""return the coefficient to use to convert from first units to second units
Arguments:
* from_units: default 'micros'. Must be in the list of list_of_time_units
* to_units: default 's'. Must be in the list of list_of_time_units
Returns:
* coefficient to apply to data to convert from first units to second units provided
Raises:
* ValueError: if any of the units is not supported
"""
if (not (from_units in Utilities.list_of_time_units) or
not(to_units in Utilities.list_of_time_units)):
raise ValueError("Units not supported")
if from_units == to_units:
return 1
if from_units == 's':
if to_units == 'ms': return 1.e3
if to_units == 'micros': return 1.e6
if to_units == 'ns': return 1.e9
if from_units == 'ms':
if to_units == 's': return 1.e-3
if to_units == 'micros': return 1.e3
if to_units == 'ns': return 1.e6
if from_units == 'micros':
if to_units == 's': return 1.e-6
if to_units == 'ms': return 1.e-3
if to_units == 'ns': return 1.e3
if from_units == 'ns':
if to_units == 's': return 1.e-9
if to_units == 'ms': return 1.e-6
if to_units == 'micros': return 1.e-3
@staticmethod
[docs] def array_multiply_coeff(data=None, coeff=1):
"""multiply each element of the array by the coeff
Parameters:
* data: array to apply coefficient on
* coeff: default value is 1. Coefficient to apply
Returns:
* data * coefficient
"""
if data is None:
raise ValueError("Give me at least something to multiply!")
final_data = np.array([])
for _item in data:
_value = float(_item) * float(coeff)
final_data = np.append(final_data, _value)
return final_data
@staticmethod
[docs] def array_add_coeff(data=None, coeff=1.):
"""Add coefficient to each element of the array
Parameters:
* data: array to apply coefficient on
* coeff: default value is 1. Coefficient to apply
Returns:
* data + coefficient
"""
if data is None:
raise ValueError("Give ma at least something to add!")
final_data = np.array([])
for index in range(len(data)):
_item = data[index]
_value = _item + coeff
final_data = np.append(final_data, _value)
return final_data
@staticmethod
[docs] def array_divide_array(numerator=None, denominator=None):
"""Divide two arrays of the same size
Parameters:
* numerator: numpy array
* denominator: numpy array
Returns:
* numerator / denominator
Raises:
* ValueError if array do not have the same size
"""
if len(numerator) != len(denominator):
raise ValueError("Arrays do not have the same size!")
return numerator / denominator
@staticmethod
[docs] def array_minus_array(array1=None, array2=None):
"""Substract second array from first array provided
Parameters:
* array1: left side of the '-' operator
* array2: right side of the '-' operator
Returns:
* Array1 - Array2
Raises:
* ValueError if arrays do not have the same size
"""
if len(array1) != len(array2):
raise ValueError("Arrays do not have the same size!")
return array1 - array2
@staticmethod
[docs] def load_csv(filename=None):
"""Load a csv file and return its content
Parameters:
* filename: name of the csv file to load
Returns:
contents of the file as an array item for each line
Raise:
ValueError if format is wrong
"""
_input_file = filename
try:
f = open(_input_file, 'r')
_tof = []
for _line in f:
if '#' in _line:
continue
_value = float(_line.strip())
_tof.append(_value)
return _tof
except:
raise ValueError("Bad file format")
@staticmethod
[docs] def load_ascii(filename=None, sep=''):
"""Load an ascii file using the separator provided to separete the value in the same row
Parameters:
* filename: ascii full file name of file to load
* sep: default ' '. Separator to use to separate values in the same row
Returns:
Array of values
Raise:
ValueError if file does not exist or format is wrong
"""
_input_file = filename
try:
_final_array = np.genfromtxt(_input_file, delimiter = sep)
return _final_array
except:
raise ValueError("Bad file format!")
@staticmethod
[docs] def save_csv(filename=None, metadata=None, data=None):
"""Create comma separated file (CSV)
Arguments:
* filename: name of output file
* metadata: metadata string array (will be placed at the top of the file with '#' in front)
* data: data float array"""
sep = ", "
f = open(filename, "w")
for _meta in metadata:
f.write("# " + _meta + "\n")
for _row in data:
if (type(_row) is np.ndarray) or (type(_row) is list):
_row_string = [str(x) for x in _row]
_row_format = sep.join(_row_string)
else:
_row_format = str(_row)
f.write(_row_format + "\n")
f.close()