code: def test_convert_sh_flow():
      with TemporaryDirectory() as out_dir:
          filepath_in = os.path.join(out_dir, "sh_coeff_img.nii.gz")
          filename_out = "sh_coeff_img_converted.nii.gz"
          filepath_out = os.path.join(out_dir, filename_out)
  
          # Create an input image
          dim0, dim1, dim2 = 2, 3, 3  # spatial dimensions of array
          num_sh_coeffs = 15  # 15 sh coeffs means l_max is 4
          img_in = np.arange(
              dim0 * dim1 * dim2 * num_sh_coeffs, dtype=float
          ).reshape(dim0, dim1, dim2, num_sh_coeffs)
          save_nifti(filepath_in, img_in, np.eye(4))
  
          # Compute expected result to compare against later
          expected_img_out = convert_sh_descoteaux_tournier(img_in)
  
          # Run the workflow and load the output
          workflow = ConvertSHFlow()
          workflow.run(
              filepath_in,
              out_dir=out_dir,
              out_file=filename_out,
          )
          img_out, _ = load_nifti(filepath_out)
  
          # Compare
          npt.assert_array_almost_equal(img_out, expected_img_out)
  
file_path: dipy/dipy/workflows/tests/test_io.py
imports: import logging
  import os
  from tempfile import mkstemp, TemporaryDirectory
  import numpy
  import numpy.testing
  from dipy.data import get_fnames
  from dipy.data.fetcher import dipy_home
  from dipy.io.image import load_nifti, save_nifti
  from dipy.io.streamline import load_tractogram
  from dipy.testing import assert_true
  from dipy.reconst.shm import convert_sh_descoteaux_tournier
  from dipy.workflows.io import IoInfoFlow, FetchFlow, SplitFlow, ConcatenateTractogramFlow, ConvertSHFlow, ConvertTractogramFlow
label_desc: Use image node_id 6 for calling a global function with example usage: test_convert_sh_flow() without return types