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%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%0A%20%20%20%20from%20dipy.data%20import%20default_sphere%2C%20get_fnames%0A%20%20%20%20from%20dipy.io.image%20import%20load_nifti%2C%20load_nifti_data%0A%20%20%20%20from%20dipy.io.stateful_tractogram%20import%20Space%2C%20StatefulTractogram%0A%20%20%20%20from%20dipy.core.gradients%20import%20gradient_table%0A%20%20%20%20from%20dipy.io.gradients%20import%20read_bvals_bvecs%0A%20%20%20%20from%20dipy.direction%20import%20peaks_from_model%0A%20%20%20%20from%20dipy.io.streamline%20import%20save_trk%0A%20%20%20%20from%20dipy.reconst.shm%20import%20CsaOdfModel%0A%20%20%20%20from%20dipy.tracking%20import%20utils%0A%20%20%20%20from%20dipy.tracking.stopping_criterion%20import%20ThresholdStoppingCriterion%0A%20%20%20%20from%20dipy.tracking.streamline%20import%20Streamlines%0A%20%20%20%20from%20dipy.tracking.tracker%20import%20eudx_tracking%0A%20%20%20%20from%20dipy.viz%20import%20actor%2C%20colormap%2C%20has_fury%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%20Streamlines%2C%0A%20%20%20%20%20%20%20%20ThresholdStoppingCriterion%2C%0A%20%20%20%20%20%20%20%20actor%2C%0A%20%20%20%20%20%20%20%20colormap%2C%0A%20%20%20%20%20%20%20%20default_sphere%2C%0A%20%20%20%20%20%20%20%20eudx_tracking%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%20load_nifti_data%2C%0A%20%20%20%20%20%20%20%20mo%2C%0A%20%20%20%20%20%20%20%20peaks_from_model%2C%0A%20%20%20%20%20%20%20%20plt%2C%0A%20%20%20%20%20%20%20%20read_bvals_bvecs%2C%0A%20%20%20%20%20%20%20%20utils%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%20Introduction%20to%20Basic%20Tracking%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_(%0A%20%20%20%20get_fnames%2C%0A%20%20%20%20gradient_table%2C%0A%20%20%20%20load_nifti%2C%0A%20%20%20%20load_nifti_data%2C%0A%20%20%20%20read_bvals_bvecs%2C%0A)%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%20%20%20%20label_fname%20%3D%20get_fnames(name%3D%22stanford_labels%22)%0A%0A%20%20%20%20data%2C%20affine%2C%20hardi_img%20%3D%20load_nifti(hardi_fname%2C%20return_img%3DTrue)%0A%20%20%20%20labels%20%3D%20load_nifti_data(label_fname)%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%20affine%2C%20data%2C%20gtab%2C%20labels%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%20Create%20the%20white%20matter%20filter%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(labels)%3A%0A%20%20%20%20white_matter%20%3D%20(labels%20%3D%3D%201)%20%7C%20(labels%20%3D%3D%202)%0A%20%20%20%20return%20(white_matter%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%20Create%20the%20ODF%20model%20(%C2%A3Constant%20Solid%20Angle)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(CsaOdfModel%2C%20data%2C%20default_sphere%2C%20gtab%2C%20peaks_from_model%2C%20white_matter)%3A%0A%20%20%20%20csa_model%20%3D%20CsaOdfModel(gtab%2C%20sh_order_max%3D6)%0A%20%20%20%20csa_peaks%20%3D%20peaks_from_model(%0A%20%20%20%20%20%20%20%20csa_model%2C%0A%20%20%20%20%20%20%20%20data%2C%0A%20%20%20%20%20%20%20%20default_sphere%2C%0A%20%20%20%20%20%20%20%20relative_peak_threshold%3D0.8%2C%0A%20%20%20%20%20%20%20%20min_separation_angle%3D45%2C%0A%20%20%20%20%20%20%20%20mask%3Dwhite_matter%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(csa_peaks%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%20Render%20the%20ODF%20peak%20directions%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20interactive%20%3D%20False%0A%20%20%20%20return%20(interactive%2C)%0A%0A%0A%40app.cell%0Adef%20_(Image%2C%20actor%2C%20csa_peaks%2C%20window)%3A%0A%20%20%20%20csa_scene%20%3D%20window.Scene()%0A%20%20%20%20csa_scene.add(%0A%20%20%20%20%20%20%20%20actor.peak_slicer(%0A%20%20%20%20%20%20%20%20%20%20%20%20csa_peaks.peak_dirs%2C%20peaks_values%3Dcsa_peaks.peak_values%2C%20colors%3DNone%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Save%20image%0A%20%20%20%20window.record(scene%3Dcsa_scene%2C%20out_path%3D%22res%2Fcsa_direction_field.png%22%2C%20size%3D(900%2C%20900))%0A%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(csa_scene%2C%20size%3D(900%2C%20900))%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%20(csa_scene%2C)%0A%0A%0A%40app.cell%0Adef%20_(csa_scene%2C%20interactive%2C%20window)%3A%0A%20%20%20%20if%20interactive%3A%0A%20%20%20%20%20%20%20%20window.show(csa_scene%2C%20size%3D(900%2C%20900))%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%20Improve%20the%20threshold%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(csa_peaks%2C%20plt)%3A%0A%20%20%20%20sli%20%3D%20csa_peaks.gfa.shape%5B2%5D%20%2F%2F%202%0A%20%20%20%20plt.figure(%22GFA%22)%0A%20%20%20%20plt.subplot(1%2C%202%2C%201).set_axis_off()%0A%20%20%20%20plt.imshow(csa_peaks.gfa%5B%3A%2C%20%3A%2C%20sli%5D.T%2C%20cmap%3D%22gray%22%2C%20origin%3D%22lower%22)%0A%0A%20%20%20%20plt.subplot(1%2C%202%2C%202).set_axis_off()%0A%20%20%20%20plt.imshow((csa_peaks.gfa%5B%3A%2C%20%3A%2C%20sli%5D%20%3E%200.25).T%2C%20cmap%3D%22gray%22%2C%20origin%3D%22lower%22)%0A%0A%20%20%20%20plt.show()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(ThresholdStoppingCriterion%2C%20csa_peaks)%3A%0A%20%20%20%20stopping_criterion%20%3D%20ThresholdStoppingCriterion(csa_peaks.gfa%2C%200.25)%0A%20%20%20%20return%20(stopping_criterion%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%20Define%20the%20seed%20(where%20to%20begin%20tracking)%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(affine%2C%20labels%2C%20utils)%3A%0A%20%20%20%20seed_mask%20%3D%20labels%20%3D%3D%202%0A%20%20%20%20seeds%20%3D%20utils.seeds_from_mask(seed_mask%2C%20affine%2C%20density%3D%5B2%2C%202%2C%202%5D)%0A%20%20%20%20return%20(seeds%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%20Use%20EuDX%20algorithm%20to%20generate%20streamlines%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20Streamlines%2C%0A%20%20%20%20affine%2C%0A%20%20%20%20csa_peaks%2C%0A%20%20%20%20eudx_tracking%2C%0A%20%20%20%20seeds%2C%0A%20%20%20%20stopping_criterion%2C%0A)%3A%0A%20%20%20%20%23%20Initialization%20of%20eudx_tracking.%20The%20computation%20happens%20in%20the%20next%20step.%0A%20%20%20%20streamlines_generator%20%3D%20eudx_tracking(%0A%20%20%20%20%20%20%20%20seeds%2C%20stopping_criterion%2C%20affine%2C%20step_size%3D0.5%2C%20pam%3Dcsa_peaks%0A%20%20%20%20)%0A%20%20%20%20%23%20Generate%20streamlines%20object%0A%20%20%20%20streamlines%20%3D%20Streamlines(streamlines_generator)%0A%20%20%20%20return%20(streamlines%2C)%0A%0A%0A%40app.cell%0Adef%20_(Image%2C%20actor%2C%20colormap%2C%20streamlines%2C%20window)%3A%0A%20%20%20%20%23%20Prepare%20the%20display%20objects.%0A%20%20%20%20color%20%3D%20colormap.line_colors(streamlines)%0A%0A%20%20%20%20streamlines_actor%20%3D%20actor.line(%0A%20%20%20%20%20%20%20%20streamlines%2C%20colors%3Dcolormap.line_colors(streamlines)%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Create%20the%203D%20display.%0A%20%20%20%20streamlines_scene%20%3D%20window.Scene()%0A%20%20%20%20streamlines_scene.add(streamlines_actor)%0A%0A%20%20%20%20%23%20Save%20still%20images%20for%20this%20static%20example.%20Or%20for%20interactivity%20use%0A%20%20%20%20window.record(scene%3Dstreamlines_scene%2C%20out_path%3D%22res%2Ftractogram_EuDX.png%22%2C%20size%3D(800%2C%20800))%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(streamlines_scene%2C%20size%3D(800%2C%20800))%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%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
23408177c5929e87c87eb106247fcfe5