import%20marimo%0A%0A__generated_with%20%3D%20%220.18.0%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20import%20marimo%20as%20mo%0A%0A%20%20%20%20import%20numpy%20as%20np%0A%0A%20%20%20%20from%20dipy.core.gradients%20import%20gradient_table%0A%20%20%20%20from%20dipy.data%20import%20default_sphere%2C%20get_fnames%0A%20%20%20%20from%20dipy.direction%20import%20peaks_from_model%0A%20%20%20%20from%20dipy.io.gradients%20import%20read_bvals_bvecs%0A%20%20%20%20from%20dipy.io.image%20import%20load_nifti%0A%20%20%20%20from%20dipy.reconst.shm%20import%20CsaOdfModel%0A%20%20%20%20from%20dipy.segment.mask%20import%20median_otsu%0A%20%20%20%20from%20dipy.viz%20import%20actor%2C%20window%0A%20%20%20%20from%20PIL%20import%20Image%0A%20%20%20%20return%20(%0A%20%20%20%20%20%20%20%20CsaOdfModel%2C%0A%20%20%20%20%20%20%20%20Image%2C%0A%20%20%20%20%20%20%20%20actor%2C%0A%20%20%20%20%20%20%20%20default_sphere%2C%0A%20%20%20%20%20%20%20%20get_fnames%2C%0A%20%20%20%20%20%20%20%20gradient_table%2C%0A%20%20%20%20%20%20%20%20load_nifti%2C%0A%20%20%20%20%20%20%20%20median_otsu%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20np%2C%0A%20%20%20%20%20%20%20%20peaks_from_model%2C%0A%20%20%20%20%20%20%20%20read_bvals_bvecs%2C%0A%20%20%20%20%20%20%20%20window%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Reconstruct%20with%20Constant%20Solid%20Angle%20(Q-Ball)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Load%20the%20data%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(get_fnames%2C%20gradient_table%2C%20load_nifti%2C%20read_bvals_bvecs)%3A%0A%20%20%20%20hardi_fname%2C%20hardi_bval_fname%2C%20hardi_bvec_fname%20%3D%20get_fnames(name%3D%22stanford_hardi%22)%0A%0A%20%20%20%20data%2C%20affine%20%3D%20load_nifti(hardi_fname)%0A%0A%20%20%20%20bvals%2C%20bvecs%20%3D%20read_bvals_bvecs(hardi_bval_fname%2C%20hardi_bvec_fname)%0A%20%20%20%20gtab%20%3D%20gradient_table(bvals%2C%20bvecs%3Dbvecs)%0A%20%20%20%20return%20bvals%2C%20bvecs%2C%20data%2C%20gtab%0A%0A%0A%40app.cell%0Adef%20_(bvals%2C%20bvecs%2C%20data)%3A%0A%20%20%20%20print(f%22data.shape%20%7Bdata.shape%7D%22)%0A%20%20%20%20print(f%22bvals.shape%20%7Bbvals.shape%7D%22)%0A%20%20%20%20print(f%22bvecs.shape%20%7Bbvecs.shape%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Display%20the%20first%20volume%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(Image%2C%20actor%2C%20bvals%2C%20data%2C%20np%2C%20window)%3A%0A%20%20%20%20%23%20Pick%20b%3D0%20volume%0A%20%20%20%20b0_idx%20%3D%20np.where(bvals%20%3D%3D%200)%5B0%5D%5B0%5D%0A%20%20%20%20vol%20%3D%20data%5B%3A%2C%20%3A%2C%20%3A%2C%20b0_idx%5D.astype(np.float32)%0A%0A%20%20%20%20%23%20Normalize%20for%20visualization%20(2%E2%80%9398%20percentile)%0A%20%20%20%20p2%2C%20p98%20%3D%20np.percentile(vol%2C%20(2%2C%2098))%0A%20%20%20%20vol%20%3D%20np.clip(vol%2C%20p2%2C%20p98)%0A%20%20%20%20vol%20%3D%20(vol%20-%20p2)%20%2F%20(p98%20-%20p2%20%2B%201e-8)%0A%0A%20%20%20%20%23%20Create%20scene%0A%20%20%20%20raw_scene%20%3D%20window.Scene()%0A%0A%20%20%20%20%23%20Use%20slicer%20(shows%203%20orthogonal%20planes)%0A%20%20%20%20slicer_actor%20%3D%20actor.slicer(vol)%0A%20%20%20%20raw_scene.add(slicer_actor)%0A%0A%20%20%20%20%23%20Optional%3A%20position%20the%20slice%20at%20center%0A%20%20%20%20slicer_actor.display(x%3Dvol.shape%5B0%5D%20%2F%2F%202%2C%20y%3Dvol.shape%5B1%5D%20%2F%2F%202%2C%20z%3Dvol.shape%5B2%5D%20%2F%2F%202)%0A%0A%20%20%20%20%23%20Save%20as%20PNG%0A%20%20%20%20print(%22Saving%20raw%20volume%20snapshot%20as%20res%2Fraw_volume.png%22)%0A%20%20%20%20window.record(scene%3Draw_scene%2C%20out_path%3D%22.%2Fres%2Fraw_volume.png%22%2C%20size%3D(600%2C%20600))%0A%0A%20%20%20%20%23%20Render%20to%20NumPy%20array%20%E2%86%92%20PIL%20Image%0A%20%20%20%20img_array%20%3D%20window.snapshot(raw_scene%2C%20size%3D(600%2C%20600))%0A%20%20%20%20img%20%3D%20Image.fromarray(img_array)%0A%20%20%20%20img%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Use%20a%20mask%20to%20remove%20the%20background%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data%2C%20median_otsu)%3A%0A%20%20%20%20maskdata%2C%20mask%20%3D%20median_otsu(%0A%20%20%20%20%20%20%20%20data%2C%20vol_idx%3Drange(10%2C%2050)%2C%20median_radius%3D3%2C%20numpass%3D1%2C%20autocrop%3DTrue%2C%20dilate%3D2%0A%20%20%20%20)%0A%20%20%20%20return%20mask%2C%20maskdata%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Initialize%20the%20CSA%20with%20spherical%20harmonic%20order%20(%24%5Cell%24)%20of%204%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(CsaOdfModel%2C%20gtab)%3A%0A%20%20%20%20csamodel%20%3D%20CsaOdfModel(gtab%2C%204)%0A%20%20%20%20return%20(csamodel%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Get%20the%20CSA%20peaks%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(csamodel%2C%20default_sphere%2C%20mask%2C%20maskdata%2C%20peaks_from_model)%3A%0A%20%20%20%20csapeaks%20%3D%20peaks_from_model(%0A%20%20%20%20%20%20%20%20model%3Dcsamodel%2C%0A%20%20%20%20%20%20%20%20data%3Dmaskdata%2C%0A%20%20%20%20%20%20%20%20sphere%3Ddefault_sphere%2C%0A%20%20%20%20%20%20%20%20relative_peak_threshold%3D0.5%2C%0A%20%20%20%20%20%20%20%20min_separation_angle%3D25%2C%0A%20%20%20%20%20%20%20%20mask%3Dmask%2C%0A%20%20%20%20%20%20%20%20return_odf%3DFalse%2C%0A%20%20%20%20%20%20%20%20normalize_peaks%3DTrue%2C%0A%20%20%20%20)%0A%0A%20%20%20%20GFA%20%3D%20csapeaks.gfa%0A%0A%20%20%20%20print(f%22GFA.shape%20%7BGFA.shape%7D%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Slice%20the%20data%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(maskdata)%3A%0A%20%20%20%20data_small%20%3D%20maskdata%5B13%3A43%2C%2044%3A74%2C%2028%3A29%5D%0A%20%20%20%20return%20(data_small%2C)%0A%0A%0A%40app.cell%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Render%20the%20data%20slice%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(csamodel%2C%20data_small%2C%20default_sphere%2C%20np%2C%20window)%3A%0A%20%20%20%20scene%20%3D%20window.Scene()%0A%0A%20%20%20%20csaodfs%20%3D%20csamodel.fit(data_small).odf(default_sphere)%0A%20%20%20%20csaodfs%20%3D%20np.clip(csaodfs%2C%200%2C%20np.max(csaodfs%2C%20-1)%5B...%2C%20None%5D)%0A%20%20%20%20return%20csaodfs%2C%20scene%0A%0A%0A%40app.cell%0Adef%20_(Image%2C%20actor%2C%20csaodfs%2C%20default_sphere%2C%20scene%2C%20window)%3A%0A%20%20%20%20csa_odfs_actor%20%3D%20actor.odf_slicer(%0A%20%20%20%20%20%20%20%20csaodfs%2C%20sphere%3Ddefault_sphere%2C%20colormap%3D%22plasma%22%2C%20scale%3D0.4%0A%20%20%20%20)%0A%20%20%20%20csa_odfs_actor.display(z%3D0)%0A%0A%20%20%20%20scene.add(csa_odfs_actor)%0A%20%20%20%20print(%22Saving%20illustration%20as%20res%2Fcsa_odfs.png%22)%0A%20%20%20%20window.record(scene%3Dscene%2C%20n_frames%3D1%2C%20out_path%3D%22.%2Fres%2Fcsa_odfs.png%22%2C%20size%3D(600%2C%20600))%0A%0A%20%20%20%20%23%20Render%20scene%20to%20a%20NumPy%20array%20(RGB)%0A%20%20%20%20_img_array%20%3D%20window.snapshot(scene%2C%20size%3D(600%2C%20600))%0A%0A%20%20%20%20%23%20Convert%20to%20PIL%20Image%0A%20%20%20%20_img%20%3D%20Image.fromarray(_img_array)%0A%20%20%20%20_img%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20%23%20Enables%2Fdisables%20interactive%20visualization%0A%20%20%20%20interactive%20%3D%20False%0A%20%20%20%20return%20(interactive%2C)%0A%0A%0A%40app.cell%0Adef%20_(interactive%2C%20scene%2C%20window)%3A%0A%20%20%20%20if%20interactive%3A%0A%20%20%20%20%20%20%20%20window.show(scene)%0A%20%20%20%20return%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
90ef7286e2b502330770316589be8410