def data_aligned(container):
    """
    Check if all signals are aligned at the same time line, regarding
    (start, stop).

    Parameters
    ----------
    container : list, tuple, iterable, dict, neo container
        The container for the neo objects.

    tuple: list of AnalogSignal objects and list of SpikeTrain objects
        A tuple consisting of two list with AnalogSignal and SpikeTrain
        objects.

    Returns
    -------
    sigs, sts: `neo.core.AnalogSignal` and `neo.core.SpikeTrain` objects
        All time aligned objects regarding the same start and stop time
        are returned.
    """
    as_time_list = []
    st_time_list = []
    sts = []
    sigs = []
    try:
        sts = nt.get_all_spiketrains(container)
        sigs = nt.get_all_analogsignals(container)
    except TypeError:
        if sts:
            sigs = []
            sts = nt.get_all_spiketrains(container)
        else:
            sts = []
            sigs = nt.get_all_analogsignals(container)
    # Empty signals
    if not (sts or sigs):
        return []
    for st in sts:
        st_time_list.append((st.t_start, st.t_stop))
    for sig in sigs:
        as_time_list.append((sig.t_start, sig.t_stop))
    # Check if start and stop times are equal
    if len(as_time_list) == 0:
        if st_time_list.count(st_time_list[0]) != len(
                st_time_list):
            return []
    elif len(st_time_list) == 0:
        if as_time_list.count(as_time_list[0]) != len(
                as_time_list):
            return []
    else:
        if np.equal(st_time_list, as_time_list).all() is False:
            return []
    if sigs:
        sigs.extend(sts)
        return sigs
    else:
        return sts
def contains_each_unit(container):
    """
    Each `neo.core.SpikeTrain` object of given input has a link to each
    `neo.core.Unit`.

    Parameters
    ----------
    container : list, tuple, iterable, dict, neo container
        The container for the neo objects.

    Returns
    -------
    sts : list of neo.core.SpikeTrain objects
        List of `neo.core.SpikeTrain` objects with a link to each neo.core.Unit
    """
    units = nt.get_all_units(container)
    sts = nt.get_all_spiketrains(container)
    return [spk for spk in
            filter(lambda st: st.unit in units, sts)]
def each_train_exact_n_spikes(container, n):
    """
    Each SpikeTrain of the trial must have `n` spikes.

    Parameters
    ----------
    container : list, tuple, iterable, dict, neo container
        The container for the neo objects.
    n: int
        Number of spikes each SpikeTrain object must have.

    Returns
    -------

    """
    if n < 1:
        raise ValueError("Please provide a number greater than %d, "
                         "when setting the condition for an exact number "
                         "of Spikes in each SpikeTrain." % n)
    sts = nt.get_all_spiketrains(container)
    return [st for st in filter(lambda st: np.size(st) == n, sts)]
def at_least_n_trains(container, n):
    """
    Given input is checked if it has at least `n` **neo.core.SpikeTrain**
    objects.

    Parameters
    ----------
    container : list, tuple, iterable, dict, neo container
        The container for the neo objects.
    n: int
        Number of SpikeTrain objects given input must have at least.

    Returns
    -------
    list : list of `neo.core.SpikeTrain` objects.

    """
    if n < 1:
        raise ValueError(
            "Please provide a number greater than %d, when setting "
            "the condition for a minimal number of SpikeTrains." % n)
    sts = nt.get_all_spiketrains(container)
    return sts if len(sts) >= n else []