Exemple #1
0
def construct_matrix_of_integrals(g, order, delta):

    logging.debug("Constructing matrix of Basis-Monomial Integrals...")

    # Unit vectors [321,3]
    g2 = numpy.loadtxt(get_sphere("symmetric321"))

    # Construct matrix of integrals
    N = g.shape[0]
    Bg = numpy.zeros((N, factorial(2 + order) / (2 * factorial(order))),
                     dtype=numpy.single)
    for k in range(N):
        c = 0
        for i in range(order + 1):
            for j in range(order + 1 - i):
                Bg[k, c] = 0
                for integr in range(321):
                    Bg[k, c] = (
                        Bg[k, c] + numpy.exp(- delta * numpy.dot(
                            g2[integr, :], g[k, :]) ** 2) *
                        (g2[integr, 0] ** i) * (g2[integr, 1] ** j) *
                        (g2[integr, 2] ** (order - i - j)))
                Bg[k, c] = Bg[k, c] / 321
                c = c + 1
    return Bg
Exemple #2
0
def tensor2odf(tensors, b, order):
    """ Compute a Cartesian Tensor ODF from a given Higher-order diffusion
    tensor
    Parameters
    ----------
    tensors: list of array [e,] (mandatory)
        a list with tensor independent coefficients
    b: float (mandatory)
        the diffusion b-value

    Returns
    -------
    odfs list of array [e,]
        a list of tensor independant coefficients

    Reference
        Barmpoutnis
    """
    # Unit vectors [321,3]
    g = numpy.loadtxt(get_sphere("symmetric321"))

    # Construct basis
    G = construct_matrix_of_monomials(g, order)
    C = construct_set_of_polynomials(order).T
    BG = construct_matrix_of_integrals(g, order, 100)
    B = numpy.dot(BG, C)

    # loop over elements
    odfs = []
    for tensor in tensors:
        x = scipy.optimize.nnls(B, numpy.exp(-b * numpy.dot(G, tensor)))[0]
        odfs.append(numpy.dot(C, x))

    return odfs
Exemple #3
0
def tensor2odf(tensors, b, order):
    """ Compute a Cartesian Tensor ODF from a given Higher-order diffusion
    tensor
    Parameters
    ----------
    tensors: list of array [e,] (mandatory)
        a list with tensor independent coefficients
    b: float (mandatory)
        the diffusion b-value

    Returns
    -------
    odfs list of array [e,]
        a list of tensor independant coefficients

    Reference
        Barmpoutnis
    """
    # Unit vectors [321,3]
    g = numpy.loadtxt(get_sphere("symmetric321"))

    # Construct basis
    G = construct_matrix_of_monomials(g, order)
    C = construct_set_of_polynomials(order).T
    BG = construct_matrix_of_integrals(g, order, 100)
    B = numpy.dot(BG, C)

    # loop over elements
    odfs = []
    for tensor in tensors:
        x = scipy.optimize.nnls(B, numpy.exp(-b * numpy.dot(G, tensor)))[0]
        odfs.append(numpy.dot(C, x))

    return odfs
Exemple #4
0
def construct_set_of_polynomials(order):
    """ Construct the coefficients of homogenous polynomials in 3
    variables of a given order, which correspond to squares of lower
    (half) order polynomials.

    Parameters
    ----------
    order: odd int (mandatory)
        reconstruction order

    Returns
    -------
    C: array [M,(2+order)!/2(order)!]
        the computed list of polynomial coefficients
    """
    logging.debug("Constructing matrix of 321 polynomials...")

    # first load the unit vectors [321,3]
    g = numpy.loadtxt(get_sphere("symmetric321"))
    M = 321

    # Get the multiplicity of each independant element
    multiplicity = numpy.zeros((order + 1, order + 1, order + 1),
                               dtype=numpy.single)
    for i in range(order + 1):
        for j in range(order - i + 1):
            multiplicity[i, j, order - i - j] = get_coefficient_multiplicity(
                order, i, j, order - i - j)

    e = factorial(2 + order) / (2 * factorial(order))
    C = numpy.zeros((M, e), dtype=numpy.single)

    for k in range(M):
        c = 0
        for i in range(order + 1):
            for j in range(order - i + 1):
                C[k, c] = (multiplicity[i, j, order - i - j] *
                           (g[k, 0] ** i) * (g[k, 1] ** j) *
                           (g[k, 2] ** (order - i - j)))
                c += 1

    return C
def construct_set_of_polynomials(order):
    """ Construct the coefficients of homogenous polynomials in 3
    variables of a given order, which correspond to squares of lower
    (half) order polynomials.

    Parameters
    ----------
    order: odd int (mandatory)
        reconstruction order

    Returns
    -------
    C: array [M,(2+order)!/2(order)!]
        the computed list of polynomial coefficients
    """
    logging.debug("Constructing matrix of 321 polynomials...")

    # first load the unit vectors [321,3]
    g = numpy.loadtxt(get_sphere("symmetric321"))
    M = 321

    # Get the multiplicity of each independant element
    multiplicity = numpy.zeros((order + 1, order + 1, order + 1),
                               dtype=numpy.single)
    for i in range(order + 1):
        for j in range(order - i + 1):
            multiplicity[i, j, order - i - j] = get_coefficient_multiplicity(
                order, i, j, order - i - j)

    e = factorial(2 + order) / (2 * factorial(order))
    C = numpy.zeros((M, e), dtype=numpy.single)

    for k in range(M):
        c = 0
        for i in range(order + 1):
            for j in range(order - i + 1):
                C[k, c] = (multiplicity[i, j, order - i - j] * (g[k, 0]**i) *
                           (g[k, 1]**j) * (g[k, 2]**(order - i - j)))
                c += 1

    return C
def construct_matrix_of_integrals(g, order, delta):

    logging.debug("Constructing matrix of Basis-Monomial Integrals...")

    # Unit vectors [321,3]
    g2 = numpy.loadtxt(get_sphere("symmetric321"))

    # Construct matrix of integrals
    N = g.shape[0]
    Bg = numpy.zeros((N, factorial(2 + order) / (2 * factorial(order))),
                     dtype=numpy.single)
    for k in range(N):
        c = 0
        for i in range(order + 1):
            for j in range(order + 1 - i):
                Bg[k, c] = 0
                for integr in range(321):
                    Bg[k, c] = (Bg[k, c] + numpy.exp(
                        -delta * numpy.dot(g2[integr, :], g[k, :])**2) *
                                (g2[integr, 0]**i) * (g2[integr, 1]**j) *
                                (g2[integr, 2]**(order - i - j)))
                Bg[k, c] = Bg[k, c] / 321
                c = c + 1
    return Bg