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
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
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
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