def _tid_to_slice_ix(tid, train_ids, stop=False):
    """Convert a train ID to an integer index for slicing the dataset

    Throws ValueError if the slice won't overlap the trains in the data.
    The *stop* parameter tells it which end of the slice it is making.
    """
    if tid is None:
        return None
    try:
        return train_ids.index(tid)
    except ValueError:
        pass
    if tid < train_ids[0]:
        if stop:
            raise ValueError('Train ID {} is before this run (starts at {})'
                .format(tid, train_ids[0]))
        else:
            return None
    elif tid > train_ids[-1]:
        if stop:
            return None
        else:
            raise ValueError('Train ID {} is after this run (ends at {})'.
                format(tid, train_ids[-1]))
    else:
        return (train_ids > tid).nonzero()[0][0]
