def is_analysis_descendent(exclude_functions=None):
    """
    Check whether any call in the traceback comes from a function part of a
    :meth:`ngs_toolkit.Analysis` object.

    Parameters
    ----------
    exclude_functions : :obj:`list`
        List of function names to exclude from.

    Returns
    ----------
    tuple
        If is descentent, returns tuple of (Analysis instance, function name),
        othewise returns :obj:`False`.
    """
    import inspect
    from ngs_toolkit import Analysis
    if exclude_functions is None:
        exclude_functions = list()
    for s in inspect.stack():
        if s.function in exclude_functions:
            return False
        if 'self' not in s.frame.f_locals:
            continue
        if isinstance(s.frame.f_locals['self'], Analysis):
            return s.frame.f_locals['self'], s.function
    return False
