docstr: Estimate Multi Shell response function for multiple tissues and
  multiple shells.
  
  The method `multi_shell_fiber_response` allows to create a multi-shell
  fiber response with the right format, for a three compartments model.
  It can be referred to in order to understand the inputs of this class.
  
  Parameters
  ----------
  response : ndarray
      Multi-shell fiber response. The ordering of the responses should
      follow the same logic as S0.
  sh_order : int
      Maximal spherical harmonics order.
  shells : int
      Number of shells in the data
  S0 : array (3,)
      Signal with no diffusion weighting for each tissue compartments, in
      the same tissue order as `response`. This S0 can be used for
      predicting from a fit model later on.
code: def __init__(self, response, sh_order, shells, S0=None):
      """Estimate Multi Shell response function for multiple tissues and
      multiple shells.
  
      The method `multi_shell_fiber_response` allows to create a multi-shell
      fiber response with the right format, for a three compartments model.
      It can be referred to in order to understand the inputs of this class.
  
      Parameters
      ----------
      response : ndarray
          Multi-shell fiber response. The ordering of the responses should
          follow the same logic as S0.
      sh_order : int
          Maximal spherical harmonics order.
      shells : int
          Number of shells in the data
      S0 : array (3,)
          Signal with no diffusion weighting for each tissue compartments, in
          the same tissue order as `response`. This S0 can be used for
          predicting from a fit model later on.
      """
      self.S0 = S0
      self.response = response
      self.sh_order = sh_order
      self.n = np.arange(0, sh_order + 1, 2)
      self.m = np.zeros_like(self.n)
      self.shells = shells
      if self.iso < 1:
          raise ValueError(
              "sh_order and shape of response do not agree"
          )
  
imports: from packaging.version import Version
  import numbers
  import warnings
  import numpy
  from dipy.core import geometry
  from dipy.core.gradients import GradientTable, gradient_table, unique_bvals_tolerance, get_bval_indices
  from dipy.data import default_sphere
  from dipy.reconst import shm
  from dipy.reconst.csdeconv import response_from_mask_ssst
  from dipy.reconst.dti import TensorModel, fractional_anisotropy, mean_diffusivity
  from dipy.reconst.multi_voxel import multi_voxel_fit
  from dipy.reconst.utils import _roi_in_volume, _mask_from_roi
  from dipy.sims.voxel import single_tensor
  from dipy.utils.optpkg import optional_package
label_desc: Use image node_id 1 to create a new MultiShellResponse object  with example: obj = MultiShellResponse(response, sh_order, shells, S0)