Source code for skippylab.tools

"""
Convenient operations

"""

import numpy as np
import os
import os.path
import scipy.integrate as integrate
from copy import deepcopy as copy

IMPEDANCE = 50

[docs]def average_wf(waveforms): """ Get the average waveform Args: waveforms (iterable of np.ndarrays): Returns: np.ndarray """ wf0 = copy(waveforms[0]) for wf in waveforms[1:]: wf0 += wf return wf0 / float(len(waveforms))
[docs]def integrate_wf(waveform, xs, xstep,\ method=integrate.simps, impedance = IMPEDANCE): """ Integrate a waveform, i.e. a voltage curve. If the desired result shall be indeed a charge, please make sure to give xs in seconds and impedance in Ohm accordingly. xstep needs to be in seconds as well. Args: waveform (np.ndarray): voltage values xs (np.ndarray): timing values xstep (float): timing bin size Keyword Args: method (func): integration method impedance (float): needed to calculate actual charge Returns: float """ integral = method(waveform, xs, dx=xstep) return integral/impedance
[docs]def save_waveform(header, waveform, filename): """ save a waveform together with its header Args: header (dict): Some metainformation about the waveform waveform (np.ndarray): the actual voltage data filename (str): a filename where the data should be saved Returns: None """ np.save(filename, (header, waveform)) return None
[docs]def load_waveform(filename, converter=lambda header, data:data): """ load a waveform from a file Args: filenaame (str): An existing filename Keyword Args: converter (func): If the data is saved in digitizer levels, use the converter function to convert to Volts Returns: tuple (dict, np.ndarray) """ assert os.path.exists(filename), "File {} does not exist!".format(filename) if not filename.endswith(".npy"): filename += ".npy" head, wf = np.load(filename) try: wf = converter(head, wf) except ValueError: #wf is probably a list of waveforms converted = [] for i in wf: converted.append(converter(head, i)) wf = converted return head, wf