code: def test_odfdeconv():
      SNR = 100
      S0 = 1
  
      _, fbvals, fbvecs = get_fnames("small_64D")
      bvals, bvecs = read_bvals_bvecs(fbvals, fbvecs)
      gtab = gradient_table(bvals, bvecs)
      mevals = np.array(
          ([0.0015, 0.0003, 0.0003], [0.0015, 0.0003, 0.0003])
      )
  
      angles = [(0, 0), (90, 0)]
      S, _ = multi_tensor(
          gtab, mevals, S0, angles=angles, fractions=[50, 50], snr=SNR
      )
  
      sphere = get_sphere("symmetric362")
  
      odf_gt = multi_tensor_odf(
          sphere.vertices, mevals, angles, [50, 50]
      )
  
      e1 = 15.0
      e2 = 3.0
      ratio = e2 / e1
  
      with warnings.catch_warnings():
          warnings.filterwarnings(
              "ignore",
              message=descoteaux07_legacy_msg,
              category=PendingDeprecationWarning,
          )
          csd = ConstrainedSDTModel(gtab, ratio, None)
  
      csd_fit = csd.fit(S)
      with warnings.catch_warnings():
          warnings.filterwarnings(
              "ignore",
              message=descoteaux07_legacy_msg,
              category=PendingDeprecationWarning,
          )
          fodf = csd_fit.odf(sphere)
  
      directions, _, _ = peak_directions(odf_gt, sphere)
      directions2, _, _ = peak_directions(fodf, sphere)
  
      ang_sim = angular_similarity(directions, directions2)
  
      assert_equal(ang_sim > 1.9, True)
  
      assert_equal(directions.shape[0], 2)
      assert_equal(directions2.shape[0], 2)
  
      with warnings.catch_warnings(record=True) as w:
          warnings.simplefilter(
              "always", category=PendingDeprecationWarning
          )
  
          ConstrainedSDTModel(gtab, ratio, sh_order=10)
          w_count = len(w)
          # A warning is expected from the ConstrainedSDTModel constructor
          # and additional warnings should be raised where legacy SH bases
          # are used
          assert_equal(w_count > 1, True)
  
      with warnings.catch_warnings(record=True) as w:
          warnings.simplefilter(
              "always", category=PendingDeprecationWarning
          )
  
          ConstrainedSDTModel(gtab, ratio, sh_order=8)
          # Test that the warning from ConstrainedSDTModel
          # constructor is no more raised
          assert_equal(len(w) == w_count - 1, True)
  
      csd_fit = csd.fit(np.zeros_like(S))
      fodf = csd_fit.odf(sphere)
      assert_array_equal(fodf, np.zeros_like(fodf))
  
      odf_sh = np.zeros_like(fodf)
      odf_sh[1] = np.nan
  
      fodf, _ = odf_deconv(odf_sh, csd.R, csd.B_reg)
      assert_array_equal(fodf, np.zeros_like(fodf))
  
imports: import warnings
  import numpy
  import numpy.testing
  from numpy.testing import assert_, assert_equal, assert_almost_equal, assert_array_almost_equal, assert_array_equal
  from dipy.testing import assert_greater, assert_greater_equal
  from dipy.data import get_sphere, get_fnames, default_sphere, small_sphere
  from dipy.sims.voxel import multi_tensor, single_tensor, multi_tensor_odf, all_tensor_evecs, single_tensor_odf
  from dipy.core.gradients import gradient_table
  from dipy.core.sphere import Sphere, HemiSphere
  from dipy.core.sphere_stats import angular_similarity
  from dipy.reconst.csdeconv import ConstrainedSphericalDeconvModel, ConstrainedSDTModel, forward_sdeconv_mat, odf_deconv, odf_sh_to_sharp, mask_for_response_ssst, response_from_mask_ssst, response_from_mask, auto_response_ssst, auto_response, recursive_response
  from dipy.direction.peaks import peak_directions
  from dipy.reconst.dti import TensorModel, fractional_anisotropy
  from dipy.reconst.shm import descoteaux07_legacy_msg, QballModel, sf_to_sh, sh_to_sf, real_sh_descoteaux, sph_harm_ind_list
  from dipy.reconst.shm import lazy_index
  from dipy.utils.deprecator import ExpiredDeprecationError
  from dipy.io.gradients import read_bvals_bvecs
  from dipy.testing.decorators import set_random_number_generator
label_desc: Use image node_id 10 for calling a global function with example usage: test_odfdeconv() without return types