code: def multi_tensor_pdf(
      pdf_points, mevals, angles, fractions, tau=1 / (4 * np.pi**2)
  ):
      """Simulate a Multi-Tensor ODF.
  
      Parameters
      ----------
      pdf_points : (N, 3) ndarray
          Points to evaluate the PDF.
      mevals : sequence of 1D arrays,
          Eigen-values for each tensor.  By default, values typical for prolate
          white matter are used.
      angles : sequence,
          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.
      tau : float,
          diffusion time. By default the value that makes q=sqrt(b).
  
      Returns
      -------
      pdf : (N,) ndarray,
          Probability density function of the water displacement.
  
      References
      ----------
      .. [1] Cheng J., "Estimation and Processing of Ensemble Average Propagator
             and its Features in Diffusion MRI", PhD Thesis, 2012.
  
      """
      mf = [f / 100.0 for f in fractions]
  
      sticks = _check_directions(angles)
  
      pdf = np.zeros(len(pdf_points))
  
      mevecs = []
      for s in sticks:
          mevecs += [all_tensor_evecs(s)]
  
      for j, f in enumerate(mf):
          pdf += f * single_tensor_pdf(
              pdf_points, evals=mevals[j], evecs=mevecs[j], tau=tau
          )
      return pdf
  
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 21 for calling a global function with example usage: multi_tensor_pdf(pdf_points, mevals, angles, fractions, tau) and returns: pdf