docstr: Constructs fODF at discrete vertices on model sphere for each voxel.
  
  Parameters
  ----------
  sphere : Sphere, optional
      Sphere on which to construct fODF. If specified, must be the same
      sphere used by the `RumbaSDModel` model. Default: None.
  
  Returns
  -------
  odf : ndarray ([x, y, z], M-2)
      fODF computed at each vertex on model sphere.
docstr_tok: ["Constructs","fODF","at","discrete","vertices","on","model","sphere","for","each","voxel",".","Parameters","--","--","--","--","--","sphere",":","Sphere",",","optional","Sphere","on","which","to","construct","fODF",".","If","specified",",","must","be","the","same","sphere","used","by","the","`","RumbaSDModel","`","model",".","Default",":","None",".","Returns","--","--","--","-","odf",":","ndarray","(","[","x",",","y",",","z","]",",","M-2",")","fODF","computed","at","each","vertex","on","model","sphere","."]
code: def odf(self, sphere=None):
      """
      Constructs fODF at discrete vertices on model sphere for each voxel.
  
      Parameters
      ----------
      sphere : Sphere, optional
          Sphere on which to construct fODF. If specified, must be the same
          sphere used by the `RumbaSDModel` model. Default: None.
  
      Returns
      -------
      odf : ndarray ([x, y, z], M-2)
          fODF computed at each vertex on model sphere.
  
      """
      if sphere is not None and sphere != self.model.sphere:
          raise ValueError(
              "Reconstruction sphere must be the same as used"
              + " in the RUMBA-SD model."
          )
  
      odf = self.model_params[..., :-2]
      return odf
  
imports: import logging
  import warnings
  import numpy
  from dipy.core.geometry import vec2vec_rotmat
  from dipy.core.gradients import gradient_table, unique_bvals_tolerance, get_bval_indices
  from dipy.core.onetime import auto_attr
  from dipy.core.sphere import Sphere
  from dipy.data import get_sphere
  from dipy.reconst.shm import lazy_index, normalize_data
  from dipy.reconst.odf import OdfModel, OdfFit
  from dipy.reconst.csdeconv import AxSymShResponse
  from dipy.segment.mask import bounding_box, crop
  from dipy.sims.voxel import single_tensor, all_tensor_evecs
label_desc: Use image node_id 2 for calling the RumbaFit obj's underlying member method code with example usage: obj.odf(sphere) and returns: odf