code: def multi_tensor_odf(odf_verts, mevals, angles, fractions):
      """Simulate a Multi-Tensor ODF.
  
      Parameters
      ----------
      odf_verts : (N,3) ndarray
          Vertices of the reconstruction sphere.
      mevals : sequence of 1D arrays,
          Eigen-values for each tensor.
      angles : sequence of 2d tuples,
          Sequence of principal directions for each tensor in polar angles
          or cartesian unit coordinates.
      fractions : sequence of floats,
          Percentages of the fractions for each tensor.
  
      Returns
      -------
      ODF : (N,) ndarray
          Orientation distribution function.
  
      Examples
      --------
      Simulate a MultiTensor ODF with two peaks and calculate its exact ODF.
  
      >>> import numpy as np
      >>> from dipy.sims.voxel import multi_tensor_odf, all_tensor_evecs
      >>> from dipy.data import default_sphere
      >>> vertices, faces = default_sphere.vertices, default_sphere.faces
      >>> mevals = np.array(([0.0015, 0.0003, 0.0003],[0.0015, 0.0003, 0.0003]))
      >>> angles = [(0, 0), (90, 0)]
      >>> odf = multi_tensor_odf(vertices, mevals, angles, [50, 50])
  
      """
      mf = [f / 100.0 for f in fractions]
  
      sticks = _check_directions(angles)
  
      odf = np.zeros(len(odf_verts))
  
      mevecs = []
      for s in sticks:
          mevecs += [all_tensor_evecs(s)]
  
      for j, f in enumerate(mf):
          odf += f * single_tensor_odf(
              odf_verts, evals=mevals[j], evecs=mevecs[j]
          )
      return odf
  
imports: import numpy
  from numpy import dot
  from dipy.core.geometry import sphere2cart
  from dipy.core.geometry import vec2vec_rotmat
  from dipy.core.gradients import GradientTable
  from dipy.reconst.utils import dki_design_matrix
  from scipy.special import jn
label_desc: Use image node_id 17 for calling a global function with example usage: multi_tensor_odf(odf_verts, mevals, angles, fractions) and returns: odf