'Returns tensor product with ordered free indices replaced by ``indices``
Examples
>>> from sympy import Symbol
>>> from sympy.tensor.tensor import TensorIndexType, tensor_indices, tensorhead
>>> D = Symbol(\'D\')
>>> Lorentz = TensorIndexType(\'Lorentz\', dim=D, dummy_fmt=\'L\')
>>> i0,i1,i2,i3,i4 = tensor_indices(\'i0:5\', Lorentz)
>>> g = Lorentz.metric
>>> p, q = tensorhead(\'p,q\', [Lorentz], [[1]])
>>> t = p(i0)*q(i1)*q(-i1)
>>> t(i1)
p(i1)*q(L_0)*q(-L_0)'

def __call__(self, *indices):

    free_args = self.free_args
    indices = list(indices)
    if ([x.tensor_index_type for x in indices] != [x.tensor_index_type for x in free_args]):
        raise ValueError('incompatible    types')
    if (indices == free_args):
        return self
    t = self.fun_eval(*list(zip(free_args, indices)))
    if (len(set(((i if i.is_up else (- i)) for i in indices))) != len(indices)):
        return t.func(*t.args)
    return t
