import%20marimo%0A%0A__generated_with%20%3D%20%220.18.1%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%20from%20dipy.data%20import%20get_fnames%0A%20%20%20%20from%20dipy.io.image%20import%20load_nifti%0A%20%20%20%20from%20dipy.io.gradients%20import%20read_bvals_bvecs%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20dipy.core.gradients%20import%20gradient_table%0A%0A%20%20%20%20%23%20Brain%20mask%20packages%0A%20%20%20%20from%20dipy.segment.mask%20import%20median_otsu%0A%20%20%20%20from%20dipy.core.histeq%20import%20histeq%0A%20%20%20%20return%20(%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%20read_bvals_bvecs%2C%0A%20%20%20%20)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Predict%20unseen%20data%20notebook%20example%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%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)%3A%0A%20%20%20%20fraw%2C%20fbval%2C%20fbvec%20%3D%20get_fnames(name%3D%22taiwan_ntu_dsi%22)%0A%20%20%20%20%23fraw%2C%20fbval%2C%20fbvec%20%3D%20get_fnames(name%3D%22stanford_hardi%22)%0A%20%20%20%20return%20fbval%2C%20fbvec%2C%20fraw%0A%0A%0A%40app.cell%0Adef%20_(fbval%2C%20fbvec%2C%20fraw%2C%20gradient_table%2C%20load_nifti%2C%20np%2C%20read_bvals_bvecs)%3A%0A%20%20%20%20data%2C%20affine%2C%20voxel_size%20%3D%20load_nifti(fraw%2C%20return_voxsize%3DTrue)%0A%20%20%20%20bvals%2C%20bvecs%20%3D%20read_bvals_bvecs(fbval%2C%20fbvec)%0A%20%20%20%20bvecs%5B1%3A%5D%20%3D%20bvecs%5B1%3A%5D%20%2F%20np.sqrt(np.sum(bvecs%5B1%3A%5D%20*%20bvecs%5B1%3A%5D%2C%20axis%3D1))%5B%3A%2C%20None%5D%0A%20%20%20%20gtab%20%3D%20gradient_table(bvals%3Dbvals%2C%20bvecs%3Dbvecs)%0A%20%20%20%20print(f%22data.shape%20%7Bdata.shape%7D%22)%0A%20%20%20%20return%20bvals%2C%20bvecs%2C%20data%2C%20gtab%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Visualize%20the%20data%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%20import%20matplotlib.pyplot%20as%20plt%0A%0A%20%20%20%20def%20plot_slice(data%2C%20bval%2C%20bvec%2C%20volume_idx%2C%20z_slice%3DNone)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Plot%20a%20single%20axial%20slice%20from%20a%203D%20diffusion%20MRI%20volume.%0A%0A%20%20%20%20%20%20%20%20Parameters%3A%0A%20%20%20%20%20%20%20%20-%20data%3A%203D%20array%20of%20the%20volume%20(X%2C%20Y%2C%20Z)%0A%20%20%20%20%20%20%20%20-%20bval%3A%20b-value%20(in%20s%2Fmm%C2%B2)%20of%20the%20volume%2C%20shown%20in%20the%20title%0A%20%20%20%20%20%20%20%20-%20bvec%3A%203-element%20b-vector%20(diffusion%20gradient%20direction)%2C%20shown%20in%20the%20title%0A%20%20%20%20%20%20%20%20-%20volume_idx%3A%20index%20of%20the%20volume%20in%20the%20original%204D%20dataset%20(used%20for%20labeling)%0A%20%20%20%20%20%20%20%20-%20z_slice%3A%20axial%20slice%20index%20along%20the%20Z%20dimension%3B%20if%20None%2C%20uses%20the%20central%20slice%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20if%20z_slice%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20z_slice%20%3D%20data.shape%5B2%5D%20%2F%2F%202%0A%0A%20%20%20%20%20%20%20%20vol%20%3D%20data%5B%3A%2C%20%3A%2C%20z_slice%5D%0A%0A%20%20%20%20%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(10%2C%2010))%0A%0A%20%20%20%20%20%20%20%20im%20%3D%20ax.imshow(vol%2C%20cmap%3D'gray'%2C%20origin%3D'lower')%0A%20%20%20%20%20%20%20%20ax.set_title(f'Volume%20%7Bvolume_idx%7D%20%7C%20bval%20%3D%7Bbval%7D%20s%2Fmm%5E2%20%7C%20bvec%20%3D%20%7Bbvec%7D')%0A%20%20%20%20%20%20%20%20ax.axis('off')%0A%20%20%20%20%20%20%20%20fig.colorbar(im%2C%20ax%3Dax%2C%20fraction%3D0.046%2C%20pad%3D0.04)%0A%0A%20%20%20%20%20%20%20%20plt.tight_layout()%0A%20%20%20%20%20%20%20%20plt.show()%0A%20%20%20%20return%20plot_slice%2C%20plt%0A%0A%0A%40app.cell%0Adef%20_(bvals%2C%20bvecs%2C%20data%2C%20np%2C%20plot_slice)%3A%0A%20%20%20%20%23%20Plot%205%20random%20slices%0A%20%20%20%20np.random.seed(42)%0A%20%20%20%20random_slices%3D%20np.random.choice(data.shape%5B-1%5D%2C%20size%3D5%2C%20replace%3DFalse)%0A%0A%20%20%20%20for%20random_idx%20in%20random_slices%3A%0A%20%20%20%20%20%20%20%20plot_slice(data%5B...%2Crandom_idx%5D%2C%20bvals%5Brandom_idx%5D%2C%20bvecs%5Brandom_idx%5D%2C%20random_idx)%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%20Split%20the%20data%20and%20gtab%20into%20train%20and%20test%20sets%0A%20%20%20%20%20-%20Note%20that%20B0%20volumes%20are%20excluded%20from%20train%20and%20test%20sets%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(gtab%2C%20np)%3A%0A%20%20%20%20b0_indices%20%3D%20np.where(gtab.b0s_mask)%5B0%5D%0A%20%20%20%20non_b0_indices%20%3D%20np.where(~gtab.b0s_mask)%5B0%5D%0A%0A%20%20%20%20n_test%20%3D%202%0A%20%20%20%20n_train%20%3D%20len(non_b0_indices)%20-%20n_test%0A%0A%20%20%20%20%23%20Shuffle%20only%20the%20non-b0%20indices%0A%20%20%20%20permuted_non_b0%20%3D%20np.random.permutation(non_b0_indices)%0A%20%20%20%20train_idx%20%3D%20permuted_non_b0%5B%3An_train%5D%0A%20%20%20%20test_idx%20%3D%20permuted_non_b0%5Bn_train%3A%5D%0A%0A%20%20%20%20print(f%22Number%20of%20train%20gradients%3A%20%7Blen(train_idx)%7D%22)%0A%20%20%20%20print(f%22Number%20of%20test%20gradients%3A%20%7Blen(test_idx)%7D%22)%0A%20%20%20%20print(f%22Number%20of%20b%3D0%20volumes%3A%20%7Blen(b0_indices)%7D%22)%0A%20%20%20%20return%20test_idx%2C%20train_idx%0A%0A%0A%40app.cell%0Adef%20_(bvals%2C%20bvecs%2C%20data%2C%20gradient_table%2C%20test_idx%2C%20train_idx)%3A%0A%20%20%20%20%23%20Split%20the%204D%20data%20(along%20last%20axis)%0A%20%20%20%20train_data%20%3D%20data%5B...%2C%20train_idx%5D%0A%20%20%20%20test_data%20%20%3D%20data%5B...%2C%20test_idx%5D%0A%0A%20%20%20%20%23%20Split%20bvals%20and%20bvecs%0A%20%20%20%20train_bvals%20%3D%20bvals%5Btrain_idx%5D%0A%20%20%20%20train_bvecs%20%3D%20bvecs%5Btrain_idx%5D%0A%0A%20%20%20%20test_bvals%20%3D%20bvals%5Btest_idx%5D%0A%20%20%20%20test_bvecs%20%3D%20bvecs%5Btest_idx%5D%0A%0A%20%20%20%20train_gtab%20%3D%20gradient_table(bvals%3Dtrain_bvals%2C%20bvecs%3Dtrain_bvecs)%0A%20%20%20%20test_gtab%20%3D%20gradient_table(bvals%3Dtest_bvals%2C%20bvecs%3Dtest_bvecs)%0A%0A%20%20%20%20print(f%22Train%20data%20shape%20%7Btrain_data.shape%7D%22)%0A%20%20%20%20print(f%22Test%20data%20shape%20%7Btest_data.shape%7D%22)%0A%0A%20%20%20%20print(f%22Number%20of%20train%20voxels%3A%20%7Btrain_data.size%7D%22)%0A%20%20%20%20print(f%22Number%20of%20test%20voxels%3A%20%7Btest_data.size%7D%22)%0A%20%20%20%20return%20test_bvals%2C%20test_bvecs%2C%20test_data%2C%20test_gtab%2C%20train_data%2C%20train_gtab%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Compute%20a%20brain%20mask%20to%20make%20fit%20computation%20faster%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%20masked_data%2C%20mask%20%3D%20median_otsu(data%2C%20vol_idx%3D%5B0%5D)%0A%20%20%20%20return%20(mask%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%20For%20each%20of%20the%20GQI%20method%20(standard%2C%20gqi2)%3A%0A%20%20%20%20-%20Create%20the%20gqi%20model%0A%20%20%20%20-%20Fit%20the%20train%20data%20to%20the%20model%0A%20%20%20%20-%20Predict%20the%20unseen%20test%20data%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(mask%2C%20test_gtab%2C%20train_data%2C%20train_gtab)%3A%0A%20%20%20%20import%20dipy.reconst.gqi%20as%20gqi%0A%20%20%20%20import%20time%0A%0A%20%20%20%20methods%20%3D%20%5B%22standard%22%2C%20%22gqi2%22%5D%0A%20%20%20%20method_predicted_data%20%3D%20%7Bmethod%3A%20%7B%7D%20for%20method%20in%20methods%7D%0A%0A%20%20%20%20for%20method%20in%20methods%3A%0A%20%20%20%20%20%20%20%20model%20%3D%20gqi.GeneralizedQSamplingModel(train_gtab%2C%20method%3Dmethod%2C%20sampling_length%3D0.9)%0A%20%20%20%20%20%20%20%20fit%20%3D%20model.fit(train_data%2C%20mask%3Dmask)%0A%0A%20%20%20%20%20%20%20%20predicted_data%20%3D%20fit.predict(test_gtab)%0A%0A%20%20%20%20%20%20%20%20method_predicted_data%5Bmethod%5D%5B%22predicted_data%22%5D%20%3D%20predicted_data%0A%20%20%20%20return%20gqi%2C%20method_predicted_data%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Plot%20the%20predicted%20results%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(np)%3A%0A%20%20%20%20from%20scipy.stats%20import%20pearsonr%0A%20%20%20%20from%20scipy.ndimage%20import%20generic_filter%0A%0A%20%20%20%20def%20local_correlation(real%2C%20pred%2C%20window_size%3D9)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Compute%20a%20local%20Pearson%20correlation%20map%20between%20%60real%60%20and%20%60pred%60.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20if%20window_size%20%25%202%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20raise%20ValueError(%22window_size%20must%20be%20odd.%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Ensure%20float%20dtype%20to%20support%20NaN%0A%20%20%20%20%20%20%20%20real%20%3D%20real.astype(np.float32)%0A%20%20%20%20%20%20%20%20pred%20%3D%20pred.astype(np.float32)%0A%0A%20%20%20%20%20%20%20%20pad%20%3D%20window_size%20%2F%2F%202%0A%20%20%20%20%20%20%20%20real_padded%20%3D%20np.pad(real%2C%20pad%2C%20mode%3D'constant'%2C%20constant_values%3Dnp.nan)%0A%20%20%20%20%20%20%20%20pred_padded%20%3D%20np.pad(pred%2C%20pad%2C%20mode%3D'constant'%2C%20constant_values%3Dnp.nan)%0A%0A%20%20%20%20%20%20%20%20corr_map%20%3D%20np.full_like(real%2C%20np.nan%2C%20dtype%3Dnp.float32)%0A%20%20%20%20%20%20%20%20h%2C%20w%20%3D%20real.shape%0A%0A%20%20%20%20%20%20%20%20for%20i%20in%20range(h)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(w)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20real_patch%20%3D%20real_padded%5Bi%3Ai%2Bwindow_size%2C%20j%3Aj%2Bwindow_size%5D.flatten()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pred_patch%20%3D%20pred_padded%5Bi%3Ai%2Bwindow_size%2C%20j%3Aj%2Bwindow_size%5D.flatten()%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid%20%3D%20~(np.isnan(real_patch)%20%7C%20np.isnan(pred_patch))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20valid.sum()%20%3C%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20corr_map%5Bi%2C%20j%5D%20%3D%20np.nan%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%2C%20_%20%3D%20pearsonr(real_patch%5Bvalid%5D%2C%20pred_patch%5Bvalid%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20corr_map%5Bi%2C%20j%5D%20%3D%20r%0A%20%20%20%20%20%20%20%20return%20corr_map%0A%20%20%20%20return%20(local_correlation%2C)%0A%0A%0A%40app.cell%0Adef%20_(local_correlation%2C%20plt)%3A%0A%20%20%20%20def%20plot_all_methods_comparison(%0A%20%20%20%20%20%20%20%20test_data%2C%20method_predicted_data%2C%20vol_idx%2C%20test_bval%2C%20test_bvec%2C%20z_slice%3DNone%2C%20window_size%3D9%0A%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20Plot%20real%20data%2C%20predictions%20from%20all%20methods%2C%20and%20local%20Pearson%20correlation%20maps.%0A%20%20%20%20%20%20%20%20Each%20method%20gets%20its%20own%20row%20with%20three%20panels%3A%20%5BReal%20%7C%20Predicted%20%7C%20Local%20Correlation%5D.%0A%0A%20%20%20%20%20%20%20%20Parameters%3A%0A%20%20%20%20%20%20%20%20-%20test_data%3A%203D%20array%20of%20ground-truth%20test%20volume%20(X%2C%20Y%2C%20Z)%0A%20%20%20%20%20%20%20%20-%20method_predicted_data%3A%20%0A%20%20%20%20%20%20%20%20%20%20%20%20dict%20mapping%20method%20names%20to%20prediction%20containers%3B%0A%20%20%20%20%20%20%20%20%20%20%20%20each%20value%20must%20contain%20a%20key%20%22predicted_data%22%20with%20a%204D%20array%20(X%2C%20Y%2C%20Z%2C%20N_vols)%0A%20%20%20%20%20%20%20%20-%20vol_idx%3A%20index%20of%20the%20test%20volume%20to%20visualize%20(selects%20the%204th%20dimension%20of%20predictions)%0A%20%20%20%20%20%20%20%20-%20test_bval%3A%20b-value%20(in%20s%2Fmm%C2%B2)%20of%20the%20selected%20volume%2C%20shown%20in%20the%20plot%20title%0A%20%20%20%20%20%20%20%20-%20test_bvec%3A%203-element%20b-vector%20(gradient%20direction)%20of%20the%20selected%20volume%2C%20shown%20in%20the%20title%0A%20%20%20%20%20%20%20%20-%20z_slice%3A%20axial%20slice%20index%20along%20the%20Z%20dimension%3B%20if%20None%2C%20uses%20the%20central%20slice%0A%20%20%20%20%20%20%20%20-%20window_size%3A%20size%20of%20the%20square%20window%20for%20local%20correlation%20(must%20be%20odd%3B%20default%3A%209)%0A%20%20%20%20%20%20%20%20%22%22%22%0A%0A%20%20%20%20%20%20%20%20if%20z_slice%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20z_slice%20%3D%20test_data.shape%5B2%5D%20%2F%2F%202%0A%0A%20%20%20%20%20%20%20%20real_vol%20%3D%20test_data%5B%3A%2C%20%3A%2C%20z_slice%5D%0A%20%20%20%20%20%20%20%20methods%20%3D%20list(method_predicted_data.keys())%0A%20%20%20%20%20%20%20%20n_methods%20%3D%20len(methods)%0A%0A%20%20%20%20%20%20%20%20fig%2C%20axes%20%3D%20plt.subplots(n_methods%2C%203%2C%20figsize%3D(13%2C%203.8%20*%20n_methods))%0A%0A%20%20%20%20%20%20%20%20if%20n_methods%20%3D%3D%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20axes%20%3D%20axes%5BNone%2C%20%3A%5D%0A%0A%20%20%20%20%20%20%20%20for%20i%2C%20method%20in%20enumerate(methods)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pred_vol%20%3D%20method_predicted_data%5Bmethod%5D%5B%22predicted_data%22%5D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%3A%2C%20%3A%2C%20z_slice%2C%20vol_idx%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Compute%20local%20correlation%20map%0A%20%20%20%20%20%20%20%20%20%20%20%20real_pred_corr_map%20%3D%20local_correlation(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20real_vol%2C%20pred_vol%2C%20window_size%3Dwindow_size%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Real%0A%20%20%20%20%20%20%20%20%20%20%20%20im_real%20%3D%20axes%5Bi%2C%200%5D.imshow(real_vol%2C%20cmap%3D%22gray%22%2C%20origin%3D%22lower%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20i%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20axes%5Bi%2C%200%5D.set_title(%22Real%20data%22%2C%20fontsize%3D12)%0A%20%20%20%20%20%20%20%20%20%20%20%20axes%5Bi%2C%200%5D.axis(%22off%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20fig.colorbar(im_real%2C%20ax%3Daxes%5Bi%2C%200%5D%2C%20fraction%3D0.046%2C%20pad%3D0.04)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Predicted%0A%20%20%20%20%20%20%20%20%20%20%20%20im_pred%20%3D%20axes%5Bi%2C%201%5D.imshow(pred_vol%2C%20cmap%3D%22gray%22%2C%20origin%3D%22lower%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20axes%5Bi%2C%201%5D.set_title(f%22%7Bmethod.upper()%7D%20prediction%22%2C%20fontsize%3D12)%0A%20%20%20%20%20%20%20%20%20%20%20%20axes%5Bi%2C%201%5D.axis(%22off%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20fig.colorbar(im_pred%2C%20ax%3Daxes%5Bi%2C%201%5D%2C%20fraction%3D0.046%2C%20pad%3D0.04)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Local%20Correlation%20(real%20vs%20prediction)%0A%20%20%20%20%20%20%20%20%20%20%20%20im_corr%20%3D%20axes%5Bi%2C%202%5D.imshow(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20real_pred_corr_map%2C%20cmap%3D%22RdBu_r%22%2C%20origin%3D%22lower%22%2C%20vmin%3D-1%2C%20vmax%3D1%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20axes%5Bi%2C%202%5D.set_title(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22Local%20Pearson%20Correlation%5Cn(real%20vs%20prediction)%22%2C%20fontsize%3D12%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20axes%5Bi%2C%202%5D.axis(%22off%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20fig.colorbar(im_corr%2C%20ax%3Daxes%5Bi%2C%202%5D%2C%20fraction%3D0.046%2C%20pad%3D0.04)%0A%0A%20%20%20%20%20%20%20%20%23%20Main%20title%20(bold%2C%20ends%20with%20colon%2C%20centered%20by%20default)%0A%20%20%20%20%20%20%20%20fig.suptitle(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Real%20vs.%20Predicted%20Signal%20and%20Local%20Correlation%3A%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fontsize%3D14%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20weight%3D'bold'%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Subtitle%20with%20parameters%20(regular%20weight%2C%20explicitly%20centered)%0A%20%20%20%20%20%20%20%20bvec_str%20%3D%20f%22%5B%7Btest_bvec%5B0%5D%3A.2f%7D%2C%20%7Btest_bvec%5B1%5D%3A.2f%7D%2C%20%7Btest_bvec%5B2%5D%3A.2f%7D%5D%22%0A%20%20%20%20%20%20%20%20subtitle%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22Test%20vol%20%7Bvol_idx%7D%20%7C%20Z%20slice%20%3D%20%7Bz_slice%7D%20%7C%20correlation%20window%20size%20%3D%20%7Bwindow_size%7D%20%7C%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%20f%22bval%20%3D%20%7Btest_bval%3A.0f%7D%20s%2Fmm%C2%B2%20%7C%20bvec%20%3D%20%7Bbvec_str%7D%22%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20fig.text(%0A%20%20%20%20%20%20%20%20%20%20%20%200.5%2C%200.94%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20x%3D0.5%20%E2%86%92%20horizontal%20center%0A%20%20%20%20%20%20%20%20%20%20%20%20subtitle%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20ha%3D'center'%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20horizontal%20alignment%3A%20center%0A%20%20%20%20%20%20%20%20%20%20%20%20va%3D'top'%2C%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20vertical%20alignment%0A%20%20%20%20%20%20%20%20%20%20%20%20fontsize%3D11%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20weight%3D'normal'%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Adjust%20layout%20to%20prevent%20overlap%20with%20titles%0A%20%20%20%20%20%20%20%20plt.tight_layout(rect%3D%5B0%2C%200%2C%201%2C%200.91%5D)%0A%20%20%20%20%20%20%20%20plt.show()%0A%20%20%20%20return%20(plot_all_methods_comparison%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20method_predicted_data%2C%0A%20%20%20%20plot_all_methods_comparison%2C%0A%20%20%20%20test_bvals%2C%0A%20%20%20%20test_bvecs%2C%0A%20%20%20%20test_data%2C%0A%20%20%20%20test_idx%2C%0A)%3A%0A%20%20%20%20for%20i%20in%20range(len(test_idx))%3A%0A%20%20%20%20%20%20%20%20plot_all_methods_comparison(test_data%5B...%2C%20i%5D%2C%20method_predicted_data%2C%20i%2C%20test_bvals%5Bi%5D%2C%20test_bvecs%5Bi%5D%2C%20window_size%3D9)%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%23Perform%20k%20fold%20cross%20validations%20with%20already%20existing%20models%20(see%20%5Bexisting%20tutorial%5D(https%3A%2F%2Fdocs.dipy.org%2Fstable%2Fexamples_built%2Freconstruction%2Fkfold_xval.html))%0A%20%20%20%20-%20DTI%0A%20%20%20%20-%20CSD%0A%20%20%20%20-%20GQI%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Select%20a%20couple%20of%20voxels%20to%20perform%20comparisons%20on.%0A%0A%20%20%20%20One%20lies%20in%20the%20corpus%20callosum%20(cc)%2C%20while%20the%20other%20is%20in%20the%20centrum%20semiovale%20(cso)%2C%20a%20part%20of%20the%20brain%20known%20to%20contain%20multiple%20crossing%20white%20matter%20fiber%20populations.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data)%3A%0A%20%20%20%20cc_vox%20%3D%20data%5B40%2C%2070%2C%2038%5D%0A%20%20%20%20cso_vox%20%3D%20data%5B30%2C%2076%2C%2038%5D%0A%20%20%20%20return%20cc_vox%2C%20cso_vox%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_(mo)%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Initialize%20each%20model%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data%2C%20gqi%2C%20gtab)%3A%0A%20%20%20%20import%20dipy.reconst.csdeconv%20as%20csd%0A%20%20%20%20import%20dipy.reconst.dti%20as%20dti%20%0A%0A%20%20%20%20dti_model%20%3D%20dti.TensorModel(gtab)%0A%20%20%20%20response%2C%20ratio%20%3D%20csd.auto_response_ssst(gtab%2C%20data%2C%20roi_radii%3D10%2C%20fa_thr%3D0.7)%0A%20%20%20%20csd_model%20%3D%20csd.ConstrainedSphericalDeconvModel(gtab%2C%20response)%0A%20%20%20%20gqi_model%20%3D%20gqi.GeneralizedQSamplingModel(gtab%2C%20method%3D%22standard%22%2C%20sampling_length%3D0.9)%0A%20%20%20%20return%20csd_model%2C%20dti_model%2C%20gqi_model%2C%20response%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%20Perform%20cross-validation%20for%20each%20kind%20of%20model%0A%0A%20%20%20%20Note%20that%20we%20use%202-fold%20cross-validation%2C%20which%20means%20that%20in%20each%20iteration%2C%20the%20model%20will%20be%20fit%20to%20half%20of%20the%20data%2C%20and%20used%20to%20predict%20the%20other%20half.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(cc_vox%2C%20csd_model%2C%20cso_vox%2C%20dti_model%2C%20gqi_model%2C%20np%2C%20response)%3A%0A%20%20%20%20import%20dipy.reconst.cross_validation%20as%20xval%0A%0A%20%20%20%20rng%20%3D%20np.random.default_rng(2014)%0A%0A%20%20%20%20dti_cc%20%3D%20xval.kfold_xval(dti_model%2C%20cc_vox%2C%202%2C%20rng%3Drng)%0A%20%20%20%20csd_cc%20%3D%20xval.kfold_xval(csd_model%2C%20cc_vox%2C%202%2C%20response%2C%20rng%3Drng)%0A%20%20%20%20gqi_cc%20%3D%20xval.kfold_xval(gqi_model%2C%20cc_vox%2C%202%2C%20rng%3Drng)%0A%0A%20%20%20%20dti_cso%20%3D%20xval.kfold_xval(dti_model%2C%20cso_vox%2C%202%2C%20rng%3Drng)%0A%20%20%20%20csd_cso%20%3D%20xval.kfold_xval(csd_model%2C%20cso_vox%2C%202%2C%20response%2C%20rng%3Drng)%0A%20%20%20%20gqi_cso%20%3D%20xval.kfold_xval(gqi_model%2C%20cso_vox%2C%202%2C%20rng%3Drng)%0A%20%20%20%20return%20csd_cc%2C%20csd_cso%2C%20dti_cc%2C%20dti_cso%2C%20gqi_cc%2C%20gqi_cso%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%20Plot%20results%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20cc_vox%2C%0A%20%20%20%20csd_cc%2C%0A%20%20%20%20csd_cso%2C%0A%20%20%20%20cso_vox%2C%0A%20%20%20%20dti_cc%2C%0A%20%20%20%20dti_cso%2C%0A%20%20%20%20gqi_cc%2C%0A%20%20%20%20gqi_cso%2C%0A%20%20%20%20gtab%2C%0A%20%20%20%20plt%2C%0A)%3A%0A%20%20%20%20def%20_()%3A%0A%20%20%20%20%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(1%2C%203)%0A%20%20%20%20%20%20%20%20fig.set_size_inches(%5B12%2C%206%5D)%0A%20%20%20%20%20%20%20%20ax%5B0%5D.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20cc_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20dti_cc%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22b%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22DTI%20in%20CC%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax%5B0%5D.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20cc_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20csd_cc%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22CSD%20in%20CC%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax%5B1%5D.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20cso_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20dti_cso%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22b%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22DTI%20in%20CSO%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax%5B1%5D.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20cso_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20csd_cso%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22CSD%20in%20CSO%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax%5B2%5D.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cc_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20gqi_cc%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22b%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22GQI%20in%20CC%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax%5B2%5D.plot(%0A%20%20%20%20%20%20%20%20%20%20%20%20cc_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20gqi_cso%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22o%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20color%3D%22r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20label%3D%22GQI%20in%20CSO%22%2C%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20ax%5B0%5D.legend(loc%3D%22upper%20left%22)%0A%20%20%20%20%20%20%20%20ax%5B1%5D.legend(loc%3D%22upper%20left%22)%0A%20%20%20%20%20%20%20%20ax%5B2%5D.legend(loc%3D%22upper%20left%22)%0A%20%20%20%20%20%20%20%20for%20this_ax%20in%20ax%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20this_ax.set_xlabel(%22Data%20(relative%20to%20S0)%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20this_ax.set_ylabel(%22Model%20prediction%20(relative%20to%20S0)%22)%0A%20%20%20%20%20%20%20%20plt.show()%0A%0A%0A%20%20%20%20_()%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20cc_vox%2C%0A%20%20%20%20csd_cc%2C%0A%20%20%20%20csd_cso%2C%0A%20%20%20%20cso_vox%2C%0A%20%20%20%20dti_cc%2C%0A%20%20%20%20dti_cso%2C%0A%20%20%20%20gqi_cc%2C%0A%20%20%20%20gqi_cso%2C%0A%20%20%20%20gtab%2C%0A)%3A%0A%20%20%20%20import%20scipy.stats%20as%20stats%0A%0A%20%20%20%20cc_dti_r2%20%3D%20(%0A%20%20%20%20%20%20%20%20stats.pearsonr(cc_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%20dti_cc%5Bgtab.b0s_mask%20%3D%3D%200%5D)%5B0%5D%20**%202%0A%20%20%20%20)%0A%20%20%20%20cc_csd_r2%20%3D%20(%0A%20%20%20%20%20%20%20%20stats.pearsonr(cc_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%20csd_cc%5Bgtab.b0s_mask%20%3D%3D%200%5D)%5B0%5D%20**%202%0A%20%20%20%20)%0A%20%20%20%20cc_gqi_r2%20%3D%20(%0A%20%20%20%20%20%20%20%20stats.pearsonr(cc_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%20gqi_cc%5Bgtab.b0s_mask%20%3D%3D%200%5D)%5B0%5D%20**%202%0A%0A%20%20%20%20)%0A%20%20%20%20cso_dti_r2%20%3D%20(%0A%20%20%20%20%20%20%20%20stats.pearsonr(cso_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%20dti_cso%5Bgtab.b0s_mask%20%3D%3D%200%5D)%5B0%5D%20**%202%0A%20%20%20%20)%0A%20%20%20%20cso_csd_r2%20%3D%20(%0A%20%20%20%20%20%20%20%20stats.pearsonr(cso_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%20csd_cso%5Bgtab.b0s_mask%20%3D%3D%200%5D)%5B0%5D%20**%202%0A%20%20%20%20)%0A%20%20%20%20cso_gqi_r2%20%3D%20(%0A%20%20%20%20%20%20%20%20stats.pearsonr(cso_vox%5Bgtab.b0s_mask%20%3D%3D%200%5D%2C%20gqi_cso%5Bgtab.b0s_mask%20%3D%3D%200%5D)%5B0%5D%20**%202%0A%20%20%20%20)%0A%0A%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%22Corpus%20callosum%5Cn%22%0A%20%20%20%20%20%20%20%20f%22DTI%20R2%20%3A%20%7Bcc_dti_r2%7D%5Cn%22%0A%20%20%20%20%20%20%20%20f%22CSD%20R2%20%3A%20%7Bcc_csd_r2%7D%5Cn%22%0A%20%20%20%20%20%20%20%20f%22GQI%20R2%20%3A%20%7Bcc_gqi_r2%7D%5Cn%22%0A%0A%20%20%20%20%20%20%20%20%22%5Cn%22%0A%20%20%20%20%20%20%20%20%22Centrum%20Semiovale%5Cn%22%0A%20%20%20%20%20%20%20%20f%22DTI%20R2%20%3A%20%7Bcso_dti_r2%7D%5Cn%22%0A%20%20%20%20%20%20%20%20f%22CSD%20R2%20%3A%20%7Bcso_csd_r2%7D%5Cn%22%0A%20%20%20%20%20%20%20%20f%22GQI%20R2%20%3A%20%7Bcso_gqi_r2%7D%5Cn%22%0A%0A%20%20%20%20)%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
8d4ed48c1aeb20f49ae91552ac3df081