def f_find_idx(self, name_list, predicate):
if self._is_run and not self.v_full_copy:<EOL><INDENT>raise TypeError('<STR_LIT>'<EOL>'<STR_LIT>')<EOL><DEDENT>if isinstance(name_list, str):<EOL><INDENT>name_list = [name_list]<EOL><DEDENT>iter_list = []<EOL>for name in name_list:<EOL><INDENT>param = self.f_get(name)<EOL>if not param.v_is_parameter:<EOL><INDENT>raise TypeError('<STR_LIT>' %<EOL>(name, str(type(param))))<EOL><DEDENT>if param.f_has_range():<EOL><INDENT>iter_list.append(iter(param.f_get_range(copy=False)))<EOL><DEDENT>else:<EOL><INDENT>iter_list.append(itools.repeat(param.f_get(), len(self)))<EOL><DEDENT><DEDENT>logic_iter = map(predicate, *iter_list)<EOL>for idx, item in enumerate(logic_iter):<EOL><INDENT>if item:<EOL><INDENT>yield idx<EOL><DEDENT><DEDENT>
Finds a single run index given a particular condition on parameters.

        ONLY useful for a single run if ``v_full_copy` was set to ``True``.
        Otherwise a TypeError is thrown.

        :param name_list:

            A list of parameter names the predicate applies to, if you have only a single
            parameter name you can omit the list brackets.

        :param predicate:

            A lambda predicate for filtering that evaluates to either ``True`` or  ``False``

        :return: A generator yielding the matching single run indices

        Example:

        >>> predicate = lambda param1, param2: param1==4 and param2 in [1.0, 2.0]
        >>> iterator = traj.f_find_idx(['groupA.param1', 'groupA.param2'], predicate)
        >>> [x for x in iterator]
        [0, 2, 17, 36]