def METHOD_NAME(U, op_basis_list):
    """
    Calculate the quantum process tomography chi matrix for a given (possibly
    nonunitary) transformation matrix U, which transforms a density matrix in
    vector form according to:
        vec(rho) = U * vec(rho0)
        or
        rho = unstack_columns(U * stack_columns(rho0))
    U can be calculated for an open quantum system using the QuTiP propagator
    function.
    Parameters
    ----------
    U : Qobj
        Transformation operator. Can be calculated using QuTiP propagator
        function.
    op_basis_list : list
        A list of Qobj's representing the basis states.
    Returns
    -------
    chi : array
        QPT chi matrix
    """
    E_ops = []
    # loop over all index permutations
    for inds in _index_permutations([len(ops) for ops in op_basis_list]):
        # loop over all composite systems
        E_op_list = [op_basis_list[k][inds[k]] for k in range(len(
            op_basis_list))]
        E_ops.append(tensor(E_op_list))
    EE_ops = [spre(E1) * spost(E2.dag()) for E1 in E_ops for E2 in E_ops]
    M = hstack([EE.full().ravel('F')[:, None] for EE in EE_ops])
    Uvec = U.full().ravel('F')
    chi_vec = la.solve(M, Uvec)
    return chi_vec.reshape(U.shape).T