import%20marimo%0A%0A__generated_with%20%3D%20%220.23.8%22%0Aapp%20%3D%20marimo.App(width%3D%22medium%22)%0A%0Awith%20app.setup%3A%0A%20%20%20%20import%20re%0A%20%20%20%20import%20warnings%0A%20%20%20%20import%20json%0A%0A%20%20%20%20import%20marimo%20as%20mo%0A%20%20%20%20import%20numpy%20as%20np%0A%20%20%20%20from%20nilearn%20import%20signal%0A%20%20%20%20from%20pathlib%20import%20Path%0A%20%20%20%20from%20collections%20import%20defaultdict%0A%20%20%20%20import%20polars%20as%20pl%0A%0A%20%20%20%20from%20nilearn.maskers%20import%20NiftiLabelsMasker%0A%20%20%20%20from%20nilearn.connectome%20import%20ConnectivityMeasure%0A%20%20%20%20from%20nilearn%20import%20signal%0A%0A%20%20%20%20from%20joblib%20import%20Parallel%2C%20delayed%0A%0A%20%20%20%20import%20nibabel%20as%20nib%0A%20%20%20%20import%20matplotlib.pyplot%20as%20plt%0A%20%20%20%20from%20nilearn%20import%20plotting%0A%0A%20%20%20%20from%20fuzzy_fmriprep_graph_metrics_analysis%20import%20(%0A%20%20%20%20%20%20%20%20get_run_paths_from_data_path%2C%0A%20%20%20%20%20%20%20%20get_subject_paths_from_run_paths%2C%0A%20%20%20%20%20%20%20%20get_confounds%2C%0A%20%20%20%20%20%20%20%20get_masker%2C%0A%20%20%20%20%20%20%20%20save_fc_matrix%2C%0A%20%20%20%20%20%20%20%20FuzzyFmriprepAnalysis%2C%0A%20%20%20%20%20%20%20%20get_output_paths_from_parent_path%2C%0A%20%20%20%20%20%20%20%20create_fmriprep_subjects%2C%0A%20%20%20%20)%0A%0A%20%20%20%20from%20nilearn.datasets%20import%20fetch_atlas_schaefer_2018%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%20Fuzzy%20fMRIPrep%20FC%20Matrices%20Analysis%0A%0A%20%20%20%20This%20notebook%20analyses%20functional%20connectivity%20(FC)%20matrices%20obtained%20from%20fuzzy-fMRIPrep%20preprocessing.%0A%0A%20%20%20%20**Pipeline%20overview**%0A%20%20%20%201.%20Load%20preprocessed%20CIFTI%20BOLD%20data%20and%20confound%20regressors.%0A%20%20%20%202.%20Generate%20FC%20matrices%20with%20all%20confounds%20and%20with%20a%20filtered%20confound%20set.%0A%20%20%20%203.%20Compute%20edge-wise%20NPVR%20on%20existing%20FC%20matrices%20to%20quantify%20numerical%20variability%20per%20connection.%0A%20%20%20%204.%20Compare%20NPVR%20between%20confound%20strategies%20and%20map%20edge-wise%20NPVR%20back%20onto%20the%20brain.%0A%0A%20%20%20%20%3E%20**Note%3A**%20The%20top-level%20results%20showcase%20and%20the%20wording%20of%20the%20markdown%20cells%20were%20generated%20by%20Opencode%20Kimi%20K2.7%20Code.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Results%0A%0A%20%20%20%20The%20main%20outputs%20of%20the%20analysis%20are%20shown%20here.%20They%20are%20generated%20by%20the%20pipeline%20cells%20below%20and%20updated%20automatically%20when%20inputs%20change.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20edge_npvr_delta_heatmap_path%2C%0A%20%20%20%20edge_npvr_delta_histogram_path%2C%0A%20%20%20%20edge_npvr_delta_scatter_path%2C%0A%20%20%20%20edge_npvr_delta_table_path%2C%0A%20%20%20%20edge_npvr_heatmap_path%2C%0A%20%20%20%20edge_npvr_histogram_path%2C%0A%20%20%20%20edge_npvr_regional_mean_map_path%2C%0A%20%20%20%20edge_npvr_regional_median_map_path%2C%0A%20%20%20%20edge_npvr_scatter_path%2C%0A%20%20%20%20edge_npvr_table_path%2C%0A)%3A%0A%20%20%20%20def%20show_image(path%2C%20caption%3D%22%22)%3A%0A%20%20%20%20%20%20%20%20return%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.md(f%22**%7Bcaption%7D**%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20mo.image(str(path)%2C%20width%3D%22100%25%22)%2C%0A%20%20%20%20%20%20%20%20%5D)%0A%0A%20%20%20%20gallery%20%3D%20mo.vstack(%5B%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Edge-wise%20NPVR%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22NPVR%20computed%20for%20every%20FC%20matrix%20edge.%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_heatmap_path%2C%20%22Heatmap%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_scatter_path%2C%20%22Scatter%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20widths%3D%22equal%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_table_path%2C%20%22Top%2FBottom%20Table%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_histogram_path%2C%20%22Histogram%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20widths%3D%22equal%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Edge-wise%20Delta%20NPVR%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22Difference%20in%20NPVR%20between%20the%20all-confounds%20and%20filtered-confounds%20strategies.%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_delta_heatmap_path%2C%20%22Delta%20Heatmap%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_delta_scatter_path%2C%20%22Delta%20Scatter%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20widths%3D%22equal%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_delta_table_path%2C%20%22Delta%20Top%2FBottom%20Table%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_delta_histogram_path%2C%20%22Delta%20Histogram%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20widths%3D%22equal%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22---%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22%23%23%23%20Regional%20NPVR%20Maps%22)%2C%0A%20%20%20%20%20%20%20%20mo.md(%22Edge-wise%20NPVR%20aggregated%20per%20brain%20region%20and%20mapped%20onto%20the%20Schaefer%202018%20atlas.%22)%2C%0A%20%20%20%20%20%20%20%20mo.hstack(%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_regional_mean_map_path%2C%20%22Mean%20Aggregation%22)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20show_image(edge_npvr_regional_median_map_path%2C%20%22Median%20Aggregation%22)%2C%0A%20%20%20%20%20%20%20%20%5D%2C%20widths%3D%22equal%22)%2C%0A%20%20%20%20%5D)%0A%0A%20%20%20%20gallery%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Generate%20the%20different%20FC%20matrices%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Input%20and%20output%20paths%0A%0A%20%20%20%20Define%20where%20the%20preprocessed%20data%20lives%20and%20where%20the%20generated%20FC%20matrices%20and%20figures%20will%20be%20saved.%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%20data_path%20%3D%20Path(%22%2Fhome%2Fcbi-biomark%2Folivier.amacker%2Fderivatives%2Ffmriprep%2Fv3%22)%0A%20%20%20%20return%20(data_path%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20output_path%20%3D%20Path(%22.%2Fres%2Ffuzzy-fmriprep-analysis%2Ffc-matrices-analysis%2F%22)%0A%0A%20%20%20%20version%20%3D%20%22v1%22%0A%0A%20%20%20%20voxel_metrics_output_path%20%3D%20output_path%20%2F%20version%20%2F%20%22voxel-metrics%22%0A%20%20%20%20fc_matrices_output_path%20%3D%20output_path%20%2F%20version%20%2F%20%22fc-matrices%22%0A%20%20%20%20figures_output_path%20%3D%20output_path%20%2F%20version%20%2F%20%22figures%22%0A%20%20%20%20graph_metrics_output_path%20%3D%20output_path%20%2F%20version%20%2F%20%22graph-metrics%22%0A%0A%20%20%20%20voxel_metrics_output_path.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20fc_matrices_output_path.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20figures_output_path.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20graph_metrics_output_path.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20(%0A%20%20%20%20%20%20%20%20fc_matrices_output_path%2C%0A%20%20%20%20%20%20%20%20figures_output_path%2C%0A%20%20%20%20%20%20%20%20figures_output_path%2C%0A%20%20%20%20%20%20%20%20graph_metrics_output_path%2C%0A%20%20%20%20)%0A%20%20%20%20return%20fc_matrices_output_path%2C%20output_path%2C%20version%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Reused%20helpers%0A%0A%20%20%20%20This%20notebook%20reuses%20path-loading%20and%20FC-generation%20utilities%20from%20%5B%60fuzzy_fmriprep_graph_metrics_analysis%60%5D(https%3A%2F%2Folivier.amacker.dev%2Fbachelor-thesis%2Fsite%2Fnotebooks%2Ffuzzy-fmriprep-graph-metrics-analysis.html).%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Subject%20class%0A%0A%20%20%20%20%60FuzzyFmriprepFCMatricesSub%60%20discovers%20CIFTI%20BOLD%20dtseries%20files%20and%20their%20matching%20JSON%2Fconfound%20files%20for%20each%20subject.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%3E%20This%20pipeline%20should%20be%20validated%20once%20the%20fuzzy-fMRIPrep%20runs%20are%20complete.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.class_definition%0Aclass%20FuzzyFmriprepFCMatricesSub%3A%0A%20%20%20%20def%20__init__(%0A%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20path%3A%20Path%2C%0A%20%20%20%20%20%20%20%20figures_path%3A%20Path%2C%0A%20%20%20%20%20%20%20%20anat_paths%3A%20list%5BPath%5D%2C%0A%20%20%20%20%20%20%20%20fmap_paths%3A%20list%5BPath%5D%2C%0A%20%20%20%20%20%20%20%20func_paths%3A%20list%5BPath%5D%2C%0A%20%20%20%20)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20self.path%20%3D%20path%0A%20%20%20%20%20%20%20%20self.figures_path%20%3D%20figures_path%0A%20%20%20%20%20%20%20%20self.anat_paths%20%3D%20anat_paths%0A%20%20%20%20%20%20%20%20self.fmap_paths%20%3D%20fmap_paths%0A%20%20%20%20%20%20%20%20self.func_paths%20%3D%20func_paths%0A%0A%20%20%20%20%20%20%20%20self.set_id()%0A%20%20%20%20%20%20%20%20self.set_run()%0A%20%20%20%20%20%20%20%20self.set_preproc_bold_paths()%0A%0A%20%20%20%20def%20set_id(self)%3A%0A%20%20%20%20%20%20%20%20self.id%20%3D%20self.path.name%0A%0A%20%20%20%20def%20set_run(self)%3A%0A%20%20%20%20%20%20%20%20self.run%20%3D%20self.path.parent.name%0A%0A%20%20%20%20def%20set_preproc_bold_paths(self)%3A%0A%20%20%20%20%20%20%20%20res%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20for%20func_path%20in%20self.func_paths%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20dtseries_paths%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20json_paths%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20confounds_paths%20%3D%20%5B%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20file_path%20in%20func_path.iterdir()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20file_name%20%3D%20file_path.name%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20CIFTI%20dtseries%20files%20(91k%20density)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20%22space-fsLR_den-91k_bold.dtseries.nii%22%20in%20file_name%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22dir-ap%22%20in%20file_name.lower()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20or%20%22-ap_%22%20in%20file_name.lower()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20or%20%22dir-%22%20not%20in%20file_name.lower()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20dtseries_paths.append(file_path)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20corresponding%20CIFTI%20JSON%20files%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20%22space-fsLR_den-91k_bold.json%22%20in%20file_name%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22dir-ap%22%20in%20file_name.lower()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20or%20%22-ap_%22%20in%20file_name.lower()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20or%20%22dir-%22%20not%20in%20file_name.lower()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20json_paths.append(file_path)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Find%20confounds%20files%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20%22desc-confounds_timeseries.tsv%22%20in%20file_name%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20confounds_paths.append(file_path)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20dtseries_path%20in%20dtseries_paths%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20file_name%20%3D%20dtseries_path.name%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Derive%20matching%20JSON%20name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matching_json_name%20%3D%20file_name.replace(%22dtseries.nii%22%2C%20%22json%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%23%20Derive%20matching%20confound%20name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matching_confound_name%20%3D%20re.sub(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20r%22_space-fsLR_den-%5Cd%2Bk_bold%5C.dtseries%5C.nii%24%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22_desc-confounds_timeseries.tsv%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20file_name%2C%0A%20%20%20%20%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%20%20%20%20%23%20Extract%20run%20and%20session%20for%20metadata%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20run_match%20%3D%20re.search(r%22_run-(%5Cd%2B)%22%2C%20file_name)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20run_name%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22run-%7Brun_match.group(1)%7D%22%20if%20run_match%20else%20%22run-single%22%0A%20%20%20%20%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%20%20%20%20%23%20Kept%20your%20specific%20session%20regex%2C%20but%20made%20it%20slightly%20more%20robust%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20session_match%20%3D%20re.search(r%22_ses-(SFHARP00%5Cd)%22%2C%20file_name)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20session_name%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20session_match.group(1)%20if%20session_match%20else%20%22ses-1%22%0A%20%20%20%20%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%20%20%20%20%23%20Find%20matching%20paths%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matching_json_path%20%3D%20next(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(p%20for%20p%20in%20json_paths%20if%20p.name%20%3D%3D%20matching_json_name)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20None%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matching_confound_path%20%3D%20next(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20p%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20p%20in%20confounds_paths%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20p.name%20%3D%3D%20matching_confound_name%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20None%2C%0A%20%20%20%20%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%20%20%20%20if%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20matching_json_path%20is%20not%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20and%20matching_confound_path%20is%20not%20None%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20res.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22session_name%22%3A%20session_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22run_name%22%3A%20run_name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22bold.dtseries.nii%22%3A%20dtseries_path%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22bold.json%22%3A%20matching_json_path%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22confounds_timeseries.tsv%22%3A%20matching_confound_path%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%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%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Warning%3A%20Could%20not%20find%20matching%20json%20or%20confounds%20for%20%7Bfile_name%7D%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20Looked%20for%20JSON%3A%20%7Bmatching_json_name%7D%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20print(f%22%20%20Looked%20for%20Confounds%3A%20%7Bmatching_confound_name%7D%22)%0A%0A%20%20%20%20%20%20%20%20self.preproc_bold_paths%20%3D%20res%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Build%20subject%20list%0A%0A%20%20%20%20Locate%20all%20runs%20and%20subjects%20under%20the%20input%20path%20and%20instantiate%20the%20subject%20objects.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(data_path)%3A%0A%20%20%20%20run_paths%20%3D%20get_run_paths_from_data_path(data_path)%0A%20%20%20%20subject_paths%20%3D%20get_subject_paths_from_run_paths(run_paths)%0A%20%20%20%20fmriprep_subjects%20%3D%20create_fmriprep_subjects(%0A%20%20%20%20%20%20%20%20FuzzyFmriprepFCMatricesSub%2C%20subject_paths%0A%20%20%20%20)%0A%20%20%20%20return%20(fmriprep_subjects%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20FC%20generation%20for%20one%20BOLD%20run%0A%0A%20%20%20%20Process%20a%20single%20preprocessed%20BOLD%20run%20in%20parallel%3A%20generate%20the%20FC%20matrix%20using%20all%20confounds%20and%20using%20the%20filtered%20confound%20set.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20process_single_bold(%0A%20%20%20%20connectivity_measure%3A%20ConnectivityMeasure%2C%0A%20%20%20%20preproc_bold%3A%20dict%2C%0A%20%20%20%20subject_id%3A%20str%2C%0A%20%20%20%20subject_run%3A%20str%2C%0A%20%20%20%20brain_maps%2C%0A%20%20%20%20confound_columns%3A%20list%2C%0A%20%20%20%20confounds_to_filter_out%3A%20list%2C%0A%20%20%20%20output_dir%3A%20Path%2C%0A)%20-%3E%20dict%3A%0A%0A%20%20%20%20%23%20Disable%20the%20future%20release%20warning%0A%20%20%20%20warnings.filterwarnings(%0A%20%20%20%20%20%20%20%20%22ignore%22%2C%0A%20%20%20%20%20%20%20%20message%3D%22.*From%20release%200.14.0%2C%20confounds%20will%20be%20standardized.*%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20session_name%20%3D%20preproc_bold%5B%22session_name%22%5D%0A%20%20%20%20run_name%20%3D%20preproc_bold%5B%22run_name%22%5D%0A%20%20%20%20bold_nii_gz_path%20%3D%20preproc_bold%5B%22bold.nii.gz%22%5D%0A%20%20%20%20bold_json_path%20%3D%20preproc_bold%5B%22bold.json%22%5D%0A%20%20%20%20confounds_path%20%3D%20preproc_bold%5B%22confounds_timeseries.tsv%22%5D%0A%0A%20%20%20%20all_confounds%20%3D%20get_confounds(confounds_path%2C%20confound_columns).to_pandas()%0A%0A%20%20%20%20filtered_confounds_columns%20%3D%20%5B%0A%20%20%20%20%20%20%20%20col%20for%20col%20in%20confound_columns%20if%20col%20not%20in%20confounds_to_filter_out%0A%20%20%20%20%5D%0A%0A%20%20%20%20filtered_confounds%20%3D%20get_confounds(%0A%20%20%20%20%20%20%20%20confounds_path%2C%20filtered_confounds_columns%0A%20%20%20%20).to_pandas()%0A%0A%20%20%20%20repetition_time%20%3D%20None%0A%0A%20%20%20%20with%20open(bold_json_path%2C%20%22r%22)%20as%20f%3A%0A%20%20%20%20%20%20%20%20repetition_time%20%3D%20json.load(f)%5B%22RepetitionTime%22%5D%0A%0A%20%20%20%20%23%20Generate%20the%20FC%20matrices%20all%20the%20confounds%0A%0A%20%20%20%20raw_masker%20%3D%20get_masker(repetition_time%2C%20brain_maps)%0A%20%20%20%20raw_ts%20%3D%20raw_masker.fit_transform(str(bold_nii_gz_path))%0A%0A%20%20%20%20with_all_confounds_ts%20%3D%20signal.clean(%0A%20%20%20%20%20%20%20%20raw_ts%2C%0A%20%20%20%20%20%20%20%20confounds%3Dall_confounds%2C%0A%20%20%20%20%20%20%20%20standardize%3D%22zscore_sample%22%2C%0A%20%20%20%20%20%20%20%20standardize_confounds%3DTrue%2C%0A%20%20%20%20)%0A%0A%20%20%20%20with_all_confounds_correlation%20%3D%20connectivity_measure.fit_transform(%0A%20%20%20%20%20%20%20%20%5Bwith_all_confounds_ts%5D%0A%20%20%20%20)%5B0%5D%0A%0A%20%20%20%20save_fc_matrix(%0A%20%20%20%20%20%20%20%20with_all_confounds_correlation%2C%0A%20%20%20%20%20%20%20%20subject_id%2C%0A%20%20%20%20%20%20%20%20subject_run%2C%0A%20%20%20%20%20%20%20%20session_name%2C%0A%20%20%20%20%20%20%20%20run_name%2C%0A%20%20%20%20%20%20%20%20%22with-all-confounds%22%2C%0A%20%20%20%20%20%20%20%20output_dir%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Generate%20for%20only%20the%20filtered%20confounds%0A%0A%20%20%20%20filtered_confounds_ts%20%3D%20signal.clean(%0A%20%20%20%20%20%20%20%20raw_ts%2C%0A%20%20%20%20%20%20%20%20confounds%3Dfiltered_confounds%2C%0A%20%20%20%20%20%20%20%20standardize%3D%22zscore_sample%22%2C%0A%20%20%20%20%20%20%20%20standardize_confounds%3DTrue%2C%0A%20%20%20%20)%0A%0A%20%20%20%20filtered_confounds_correlation%20%3D%20connectivity_measure.fit_transform(%0A%20%20%20%20%20%20%20%20%5Bfiltered_confounds_ts%5D%0A%20%20%20%20)%5B0%5D%0A%0A%20%20%20%20save_fc_matrix(%0A%20%20%20%20%20%20%20%20filtered_confounds_correlation%2C%0A%20%20%20%20%20%20%20%20subject_id%2C%0A%20%20%20%20%20%20%20%20subject_run%2C%0A%20%20%20%20%20%20%20%20session_name%2C%0A%20%20%20%20%20%20%20%20run_name%2C%0A%20%20%20%20%20%20%20%20%22with-filtered-confounds%22%2C%0A%20%20%20%20%20%20%20%20output_dir%2C%0A%20%20%20%20)%0A%0A%20%20%20%20return%20%7B%0A%20%20%20%20%20%20%20%20%22subject_id%22%3A%20subject_id%2C%0A%20%20%20%20%20%20%20%20%22subject_run%22%3A%20subject_run%2C%0A%20%20%20%20%20%20%20%20%22session_name%22%3A%20session_name%2C%0A%20%20%20%20%20%20%20%20%22run_name%22%3A%20run_name%2C%0A%20%20%20%20%20%20%20%20%22with_all_confounds%22%3A%20with_all_confounds_correlation%2C%0A%20%20%20%20%20%20%20%20%22with_filtered_confounds%22%3A%20filtered_confounds_correlation%2C%0A%20%20%20%20%7D%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Analysis%20class%0A%0A%20%20%20%20%60FuzzyFmriprepFCMatricesAnalysis%60%20orchestrates%20FC%20matrix%20generation%20and%20NPVR%20computation%20for%20the%20edge-wise%20analysis.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(confound_to_filter_out)%3A%0A%20%20%20%20class%20FuzzyFmriprepFCMatricesAnalysis(FuzzyFmriprepAnalysis)%3A%0A%20%20%20%20%20%20%20%20def%20__init__(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20subjects%3A%20list%5BFuzzyFmriprepFCMatricesSub%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20confound_columns%3A%20list%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20confound_to_filter_out%3A%20list%2C%0A%20%20%20%20%20%20%20%20)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20super().__init__(subjects)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.confound_columns%20%3D%20confound_columns%0A%20%20%20%20%20%20%20%20%20%20%20%20self.confound_to_filter_out%20%3D%20confound_to_filter_out%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20%20%20%20%20self.atlas%20%3D%20fetch_atlas_schaefer_2018(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_rois%3D100%2C%20yeo_networks%3D7%2C%20resolution_mm%3D2%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%20self.brain_maps%20%3D%20self.atlas%5B%22maps%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.roi_labels%20%3D%20self.atlas%5B%22labels%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20self.connectivity_measures%20%3D%20ConnectivityMeasure(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20kind%3D%22correlation%22%2C%20standardize%3D%22zscore_sample%22%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%20%22%22%22%0A%0A%20%20%20%20%20%20%20%20def%20save_metadata(%0A%20%20%20%20%20%20%20%20%20%20%20%20self%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20confound_columns%3A%20list%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20confound_to_filter_out%3A%20list%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20output_dir%3A%20Path%2C%0A%20%20%20%20%20%20%20%20)%20-%3E%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20output_dir.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20metadata%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22confound_columns%22%3A%20confound_columns%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22filtered_out_confound_columns%22%3A%20confound_to_filter_out%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20metadata_path%20%3D%20output_dir%20%2F%20%22metadata.json%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20with%20open(metadata_path%2C%20%22w%22)%20as%20f%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20json.dump(metadata%2C%20f%2C%20indent%3D4)%0A%0A%20%20%20%20%20%20%20%20def%20generate_fc_matrices(self%2C%20output_dir%3A%20Path%2C%20max_workers%3DNone)%20-%3E%20dict%3A%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20self.save_metadata(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.confound_columns%2C%20confound_to_filter_out%2C%20output_dir%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%20res%20%3D%20defaultdict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambda%3A%20defaultdict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambda%3A%20defaultdict(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20lambda%3A%20defaultdict(lambda%3A%20defaultdict(dict))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%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%20tasks%20%3D%20%5B%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20subject%20in%20self.subjects%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20preproc_bold%20in%20subject.preproc_bold_paths%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20tasks.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.connectivity_measures%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20preproc_bold%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20subject.id%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20subject.run%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.brain_maps%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.confound_columns%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20self.confound_to_filter_out%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20output_dir%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%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%20if%20max_workers%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20max_workers%20%3D%20len(tasks)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(tasks)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Starting%20parallel%20processing%20of%20%7Blen(tasks)%7D%20tasks%20with%20%7Bmax_workers%7D%20workers.%22%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%20results%20%3D%20Parallel(n_jobs%3Dmax_workers%2C%20backend%3D%22loky%22)(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20delayed(process_single_bold)(*task)%20for%20task%20in%20tasks%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%20for%20result%20in%20results%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with_all_confounds_entry%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22metadata%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22subject%22%3A%20result%5B%22subject_id%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22run%22%3A%20result%5B%22subject_run%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22session%22%3A%20result%5B%22session_name%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22sub_run%22%3A%20result%5B%22run_name%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22type%22%3A%20%22with_all_confounds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22matrix%22%3A%20result%5B%22with_all_confounds%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20res.append(with_all_confounds_entry)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20with_filtered_confounds_entry%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22metadata%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22subject%22%3A%20result%5B%22subject_id%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22run%22%3A%20result%5B%22subject_run%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22session%22%3A%20result%5B%22session_name%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22sub_run%22%3A%20result%5B%22run_name%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22type%22%3A%20%22with_filtered_confounds%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22matrix%22%3A%20result%5B%22with_filtered_confounds%22%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20res.append(with_filtered_confounds_entry)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20res%0A%0A%20%20%20%20%20%20%20%20def%20compute_fc_matrices_npvr(self%2C%20fc_matrices%3A%20dict)%20-%3E%20dict%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20pass%0A%0A%20%20%20%20return%20(FuzzyFmriprepFCMatricesAnalysis%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20confound_columns%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%22trans_x%22%2C%0A%20%20%20%20%20%20%20%20%22trans_y%22%2C%0A%20%20%20%20%20%20%20%20%22trans_z%22%2C%0A%20%20%20%20%20%20%20%20%22rot_x%22%2C%0A%20%20%20%20%20%20%20%20%22rot_y%22%2C%0A%20%20%20%20%20%20%20%20%22rot_z%22%2C%0A%20%20%20%20%20%20%20%20%22global_signal%22%2C%0A%20%20%20%20%20%20%20%20%22csf%22%2C%0A%20%20%20%20%20%20%20%20%22white_matter%22%2C%0A%20%20%20%20%20%20%20%20%22a_comp_cor_00%22%2C%0A%20%20%20%20%20%20%20%20%22a_comp_cor_01%22%2C%0A%20%20%20%20%20%20%20%20%22a_comp_cor_02%22%2C%0A%20%20%20%20%20%20%20%20%22a_comp_cor_03%22%2C%0A%20%20%20%20%20%20%20%20%22a_comp_cor_04%22%2C%0A%20%20%20%20%20%20%20%20%22a_comp_cor_05%22%2C%0A%20%20%20%20%5D%0A%0A%20%20%20%20confound_to_filter_out%20%3D%20%5B%22global_signal%22%5D%0A%20%20%20%20return%20confound_columns%2C%20confound_to_filter_out%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%20Edge-wise%20NPVR%20analysis%20of%20existing%20FC%20matrices%0A%0A%20%20%20%20Load%20FC%20matrices%20produced%20by%20the%20graph-metrics%20analysis%20and%20compute%20edge-wise%20NPVR%20to%20study%20numerical%20variability%20at%20the%20connection%20level.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Figure%20output%20path%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell%0Adef%20_(output_path%2C%20version)%3A%0A%20%20%20%20previous_matrices_figures_output_path%20%3D%20(%0A%20%20%20%20%20%20%20%20output_path%20%2F%20version%20%2F%20%22figures%22%20%2F%20%22global-signal%22%0A%20%20%20%20)%0A%0A%20%20%20%20previous_matrices_figures_output_path.mkdir(parents%3DTrue%2C%20exist_ok%3DTrue)%0A%20%20%20%20return%20(previous_matrices_figures_output_path%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Load%20and%20reformat%20matrices%0A%0A%20%20%20%20Load%20FC%20matrices%20from%20%60graph-metrics-analysis%2Fv3%2Ffc-matrices%60%20and%20rename%20the%20conditions%20to%20match%20this%20notebook%20(%60with_all_confounds%60%20%2F%20%60with_filtered_confounds%60).%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%20temp_fc_matrices_output_path%20%3D%20(%0A%20%20%20%20%20%20%20%20Path(%22.%2Fres%2Ffuzzy-fmriprep-analysis%2Fgraph-metrics-analysis%2F%22)%0A%20%20%20%20%20%20%20%20%2F%20%22global-signal%22%0A%20%20%20%20%20%20%20%20%2F%20%22fc-matrices%22%0A%20%20%20%20)%0A%20%20%20%20temp_fc_matrices_output_path%0A%20%20%20%20return%20(temp_fc_matrices_output_path%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20FuzzyFmriprepFCMatricesAnalysis%2C%0A%20%20%20%20confound_columns%2C%0A%20%20%20%20confound_to_filter_out%2C%0A%20%20%20%20fmriprep_subjects%2C%0A)%3A%0A%20%20%20%20fuzzy_fmriprep_analysis%20%3D%20FuzzyFmriprepFCMatricesAnalysis(%0A%20%20%20%20%20%20%20%20fmriprep_subjects%2C%20confound_columns%2C%20confound_to_filter_out%0A%20%20%20%20)%0A%20%20%20%20return%20(fuzzy_fmriprep_analysis%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20fc_matrices_output_path%2C%0A%20%20%20%20fuzzy_fmriprep_analysis%2C%0A%20%20%20%20temp_fc_matrices_output_path%2C%0A)%3A%0A%20%20%20%20fc_matrices%20%3D%20fuzzy_fmriprep_analysis.load_fc_matrices(%0A%20%20%20%20%20%20%20%20temp_fc_matrices_output_path%0A%20%20%20%20)%0A%0A%0A%20%20%20%20if%20not%20fc_matrices%3A%0A%20%20%20%20%20%20%20%20fc_matrices%20%3D%20fuzzy_fmriprep_analysis.generate_fc_matrices(%0A%20%20%20%20%20%20%20%20%20%20%20%20fc_matrices_output_path%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20return%20(fc_matrices%2C)%0A%0A%0A%40app.cell%0Adef%20_(fc_matrices)%3A%0A%20%20%20%20cleaned_fc_matrices%20%3D%20%5B%5D%0A%0A%20%20%20%20for%20subject%2C%20run_values%20in%20fc_matrices.items()%3A%0A%20%20%20%20%20%20%20%20for%20run%2C%20session_values%20in%20run_values.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20session%2C%20sub_run_values%20in%20session_values.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20sub_run%2C%20type_values%20in%20sub_run_values.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20type%2C%20fc_matrix%20in%20type_values.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20type%20%3D%3D%20%22with-confound%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%20%3D%20%22with_all_confounds%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20elif%20type%20%3D%3D%20%22without-confound%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20type%20%3D%20%22with_filtered_confounds%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20entry%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22matrix%22%3A%20fc_matrix%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22metadata%22%3A%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22subject%22%3A%20subject%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22run%22%3A%20run%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22session%22%3A%20session%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22sub_run%22%3A%20sub_run%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%22type%22%3A%20type%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cleaned_fc_matrices.append(entry)%0A%20%20%20%20return%20(cleaned_fc_matrices%2C)%0A%0A%0A%40app.cell%0Adef%20_(cleaned_fc_matrices)%3A%0A%20%20%20%20cleaned_fc_matrices%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Edge-wise%20NPVR%20visualisation%0A%0A%20%20%20%20Explore%20how%20numerical%20variability%20is%20distributed%20across%20FC%20edges.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Please%20note%20that%20all%20the%20following%20code%20was%20generated%20by%20Qwen3.7-Plus%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20calculate_npvr_per_edge(fc_matrices%2C%20session_filter%3DNone)%3A%0A%20%20%20%20results%20%3D%20%7B%7D%0A%0A%20%20%20%20%23%20We%20will%20now%20key%20this%20dictionary%20by%20edge_id%20(e.g.%2C%20%22edge_0_1%22)%0A%20%20%20%20edge_config_subject_data%20%3D%20defaultdict(%0A%20%20%20%20%20%20%20%20lambda%3A%20defaultdict(lambda%3A%20defaultdict(dict))%0A%20%20%20%20)%0A%0A%20%20%20%20for%20entry%20in%20fc_matrices%3A%0A%20%20%20%20%20%20%20%20metadata%20%3D%20entry.get(%22metadata%22%2C%20%7B%7D)%0A%20%20%20%20%20%20%20%20subject_id%20%3D%20metadata.get(%22subject%22)%0A%20%20%20%20%20%20%20%20mca_run%20%3D%20metadata.get(%22run%22)%0A%20%20%20%20%20%20%20%20session%20%3D%20metadata.get(%22session%22)%0A%20%20%20%20%20%20%20%20sub_run%20%3D%20metadata.get(%22sub_run%22)%0A%20%20%20%20%20%20%20%20data_type%20%3D%20metadata.get(%22type%22)%0A%0A%20%20%20%20%20%20%20%20if%20session_filter%20is%20not%20None%20and%20session%20!%3D%20session_filter%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20matrix%20%3D%20entry.get(%22matrix%22)%0A%20%20%20%20%20%20%20%20if%20matrix%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20matrix%20%3D%20np.array(matrix)%0A%20%20%20%20%20%20%20%20if%20matrix.ndim%20!%3D%202%20or%20matrix.shape%5B0%5D%20!%3D%20matrix.shape%5B1%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20n%20%3D%20matrix.shape%5B0%5D%0A%0A%20%20%20%20%20%20%20%20row_idx%2C%20col_idx%20%3D%20np.triu_indices(n%2C%20k%3D1)%0A%20%20%20%20%20%20%20%20edge_values%20%3D%20matrix%5Brow_idx%2C%20col_idx%5D%0A%0A%20%20%20%20%20%20%20%20config_key%20%3D%20(session%2C%20sub_run%2C%20data_type)%0A%0A%20%20%20%20%20%20%20%20edge_ids%20%3D%20%5Bf%22edge_%7Bi%7D_%7Bj%7D%22%20for%20i%2C%20j%20in%20zip(row_idx%2C%20col_idx)%5D%0A%0A%20%20%20%20%20%20%20%20for%20edge_id%2C%20value%20in%20zip(edge_ids%2C%20edge_values)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.isnan(value)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20edge_config_subject_data%5Bedge_id%5D%5Bconfig_key%5D%5Bsubject_id%5D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mca_run%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%20%3D%20value%0A%0A%20%20%20%20for%20edge_id%2C%20config_data%20in%20edge_config_subject_data.items()%3A%0A%20%20%20%20%20%20%20%20ss_num%2C%20df_num%20%3D%200.0%2C%200.0%0A%20%20%20%20%20%20%20%20ss_pop%2C%20df_pop%20%3D%200.0%2C%200.0%0A%0A%20%20%20%20%20%20%20%20for%20config_key%2C%20subject_data%20in%20config_data.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20all_subjects%20%3D%20sorted(list(subject_data.keys()))%0A%20%20%20%20%20%20%20%20%20%20%20%20m%20%3D%20len(all_subjects)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20m%20%3C%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20all_mca_runs%20%3D%20set()%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20subj_data%20in%20subject_data.values()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_mca_runs.update(subj_data.keys())%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20all_mca_runs%20%3D%20sorted(list(all_mca_runs))%0A%20%20%20%20%20%20%20%20%20%20%20%20n_mca_runs%20%3D%20len(all_mca_runs)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20n_mca_runs%20%3C%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20X%20%3D%20np.full((n_mca_runs%2C%20m)%2C%20np.nan)%0A%20%20%20%20%20%20%20%20%20%20%20%20run_to_idx%20%3D%20%7Brun%3A%20i%20for%20i%2C%20run%20in%20enumerate(all_mca_runs)%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%2C%20subj%20in%20enumerate(all_subjects)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20subj_mca_values%20%3D%20subject_data%5Bsubj%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20run%2C%20mca_val%20in%20subj_mca_values.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%5Brun_to_idx%5Brun%5D%2C%20j%5D%20%3D%20mca_val%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Calculate%20subject-wise%20variance%20(within-subject%2C%20numerator)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(m)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_vals%20%3D%20X%5B%3A%2C%20j%5D%5B~np.isnan(X%5B%3A%2C%20j%5D)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_vals)%20%3E%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var_j%20%3D%20np.var(valid_vals%2C%20ddof%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_j%20%3D%20len(valid_vals)%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ss_num%20%2B%3D%20var_j%20*%20df_j%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_num%20%2B%3D%20df_j%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Calculate%20run-wise%20variance%20(between-subject%2C%20denominator)%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20i%20in%20range(n_mca_runs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_vals%20%3D%20X%5Bi%2C%20%3A%5D%5B~np.isnan(X%5Bi%2C%20%3A%5D)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_vals)%20%3E%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20var_i%20%3D%20np.var(valid_vals%2C%20ddof%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_i%20%3D%20len(valid_vals)%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ss_pop%20%2B%3D%20var_i%20*%20df_i%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_pop%20%2B%3D%20df_i%0A%0A%20%20%20%20%20%20%20%20pooled_sigma_num%20%3D%20np.sqrt(ss_num%20%2F%20df_num)%20if%20df_num%20%3E%200%20else%200.0%0A%20%20%20%20%20%20%20%20pooled_sigma_pop%20%3D%20np.sqrt(ss_pop%20%2F%20df_pop)%20if%20df_pop%20%3E%200%20else%200.0%0A%0A%20%20%20%20%20%20%20%20npvr%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20pooled_sigma_num%20%2F%20pooled_sigma_pop%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20pooled_sigma_pop%20!%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20np.nan%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20results%5Bedge_id%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22pooled_sigma_num%22%3A%20pooled_sigma_num%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22pooled_sigma_pop%22%3A%20pooled_sigma_pop%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22npvr%22%3A%20npvr%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20results%0A%0A%0A%40app.cell%0Adef%20_(cleaned_fc_matrices)%3A%0A%20%20%20%20with_all_confounds_matrices%20%3D%20%5B%0A%20%20%20%20%20%20%20%20entry%20for%20entry%20in%20cleaned_fc_matrices%0A%20%20%20%20%20%20%20%20if%20entry%5B%22metadata%22%5D%5B%22type%22%5D%20%3D%3D%20%22with_all_confounds%22%0A%20%20%20%20%5D%0A%20%20%20%20npvr_per_edge%20%3D%20calculate_npvr_per_edge(with_all_confounds_matrices)%0A%20%20%20%20return%20(npvr_per_edge%2C)%0A%0A%0A%40app.cell%0Adef%20_()%3A%0A%20%20%20%20def%20edge_dict_to_matrix(edge_npvr_dict%2C%20n_nodes%3D100)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Converts%20the%20edge%20dictionary%20back%20into%20a%20full%20100x100%20symmetric%20matrix.%22%22%22%0A%20%20%20%20%20%20%20%20adj_matrix%20%3D%20np.zeros((n_nodes%2C%20n_nodes))%0A%20%20%20%20%20%20%20%20row_idx%2C%20col_idx%20%3D%20np.triu_indices(n_nodes%2C%20k%3D1)%0A%0A%20%20%20%20%20%20%20%20%23%20Extract%20values%20in%20the%20exact%20same%20order%20they%20were%20created%0A%20%20%20%20%20%20%20%20edge_ids%20%3D%20%5Bf%22edge_%7Bi%7D_%7Bj%7D%22%20for%20i%2C%20j%20in%20zip(row_idx%2C%20col_idx)%5D%0A%20%20%20%20%20%20%20%20values%20%3D%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20edge_npvr_dict%5Beid%5D%5B%22npvr%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20eid%20in%20edge_ids%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20eid%20in%20edge_npvr_dict%0A%20%20%20%20%20%20%20%20%5D%0A%0A%20%20%20%20%20%20%20%20%23%20Fill%20upper%20triangle%0A%20%20%20%20%20%20%20%20adj_matrix%5Brow_idx%5B%3A%20len(values)%5D%2C%20col_idx%5B%3A%20len(values)%5D%5D%20%3D%20values%0A%20%20%20%20%20%20%20%20%23%20Mirror%20to%20lower%20triangle%20to%20make%20it%20symmetric%0A%20%20%20%20%20%20%20%20adj_matrix%20%3D%20adj_matrix%20%2B%20adj_matrix.T%0A%0A%20%20%20%20%20%20%20%20return%20adj_matrix%0A%0A%0A%20%20%20%20def%20plot_edge_npvr_matrix(edge_npvr_dict%2C%20output_path%3A%20Path%2C%20n_nodes%3D100)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Creates%20a%202D%20connectivity%20matrix%20heatmap%20showing%20edge-wise%20NPVR.%22%22%22%0A%20%20%20%20%20%20%20%20adj_matrix%20%3D%20edge_dict_to_matrix(edge_npvr_dict%2C%20n_nodes)%0A%0A%20%20%20%20%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(12%2C%2010))%0A%0A%20%20%20%20%20%20%20%20%23%20plot_matrix%20is%20perfect%20for%20edge-wise%20data.%0A%20%20%20%20%20%20%20%20plotting.plot_matrix(%0A%20%20%20%20%20%20%20%20%20%20%20%20adj_matrix%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20cmap%3D%22RdYlGn_r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vmin%3D0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20vmax%3Dnp.nanmax(adj_matrix)%2C%20%20%23%20Auto-scale%20to%20max%20NPVR%0A%20%20%20%20%20%20%20%20%20%20%20%20figure%3Dfig%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20title%3D%22Edge-wise%20NPVR%20Connectivity%20Matrix%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20reorder%3DFalse%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20fig.savefig(output_path)%0A%20%20%20%20%20%20%20%20return%20fig%0A%0A%20%20%20%20return%20(plot_edge_npvr_matrix%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20npvr_per_edge%2C%0A%20%20%20%20plot_edge_npvr_matrix%2C%0A%20%20%20%20previous_matrices_figures_output_path%2C%0A)%3A%0A%20%20%20%20edge_npvr_heatmap_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_heatmap.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_npvr_matrix(npvr_per_edge%2C%20edge_npvr_heatmap_path)%0A%20%20%20%20return%20(edge_npvr_heatmap_path%2C)%0A%0A%0A%40app.function%0Adef%20plot_edge_npvr_scatter(edge_npvr_dict%2C%20output_path%3A%20Path)%3A%0A%20%20%20%20%22%22%22Creates%20a%20clean%20scatter%20plot%20of%20all%20edges.%22%22%22%0A%20%20%20%20%23%201.%20Extract%20and%20sort%20data%0A%20%20%20%20valid_data%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(edge%2C%20data%5B%22npvr%22%5D)%0A%20%20%20%20%20%20%20%20for%20edge%2C%20data%20in%20edge_npvr_dict.items()%0A%20%20%20%20%20%20%20%20if%20not%20np.isnan(data%5B%22npvr%22%5D)%0A%20%20%20%20%5D%0A%20%20%20%20valid_data.sort(key%3Dlambda%20x%3A%20x%5B1%5D%2C%20reverse%3DTrue)%0A%20%20%20%20edges%20%3D%20%5Bitem%5B0%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20npvr_values%20%3D%20%5Bitem%5B1%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20n_edges%20%3D%20len(edges)%0A%0A%20%20%20%20%23%202.%20Create%20figure%0A%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(14%2C%2010))%0A%20%20%20%20ax_scatter%20%3D%20fig.add_subplot(111)%0A%20%20%20%20y_pos%20%3D%20np.arange(n_edges)%0A%0A%20%20%20%20%23%20Color%20gradient%0A%20%20%20%20norm%20%3D%20plt.Normalize(min(npvr_values)%2C%20max(npvr_values))%0A%20%20%20%20cmap%20%3D%20plt.cm.RdYlGn_r%0A%20%20%20%20colors%20%3D%20cmap(norm(npvr_values))%0A%0A%20%20%20%20%23%20Plot%20points%0A%20%20%20%20ax_scatter.scatter(%0A%20%20%20%20%20%20%20%20npvr_values%2C%20y_pos%2C%20c%3Dcolors%2C%20s%3D15%2C%20alpha%3D0.6%2C%20edgecolors%3D%22none%22%0A%20%20%20%20)%0A%20%20%20%20ax_scatter.invert_yaxis()%0A%0A%20%20%20%20ax_scatter.set_xlabel(%22NPVR%20Value%22%2C%20fontsize%3D14)%0A%20%20%20%20ax_scatter.set_ylabel(%22Edge%20Rank%22%2C%20fontsize%3D14)%0A%20%20%20%20ax_scatter.set_title(%0A%20%20%20%20%20%20%20%20f%22Distribution%20of%20all%20%7Bn_edges%7D%20Edges%22%2C%20fontsize%3D16%2C%20fontweight%3D%22bold%22%0A%20%20%20%20)%0A%20%20%20%20ax_scatter.grid(axis%3D%22x%22%2C%20linestyle%3D%22--%22%2C%20alpha%3D0.6)%0A%0A%20%20%20%20%23%20Add%20median%20line%0A%20%20%20%20median_val%20%3D%20np.median(npvr_values)%0A%20%20%20%20ax_scatter.axvline(%0A%20%20%20%20%20%20%20%20x%3Dmedian_val%2C%20color%3D%22black%22%2C%20linestyle%3D%22-%22%2C%20linewidth%3D2%2C%20alpha%3D0.7%0A%20%20%20%20)%0A%20%20%20%20ax_scatter.text(%0A%20%20%20%20%20%20%20%20median_val%2C%0A%20%20%20%20%20%20%20%20n_edges%20*%200.05%2C%0A%20%20%20%20%20%20%20%20f%22Median%20(%7Bmedian_val%3A.3f%7D)%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D12%2C%0A%20%20%20%20%20%20%20%20va%3D%22bottom%22%2C%0A%20%20%20%20%20%20%20%20ha%3D%22left%22%2C%0A%20%20%20%20%20%20%20%20bbox%3Ddict(facecolor%3D%22white%22%2C%20edgecolor%3D%22black%22%2C%20alpha%3D0.8)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig.savefig(output_path)%0A%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell%0Adef%20_(npvr_per_edge%2C%20previous_matrices_figures_output_path)%3A%0A%20%20%20%20edge_npvr_scatter_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_scatter.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_npvr_scatter(npvr_per_edge%2C%20edge_npvr_scatter_path)%0A%20%20%20%20return%20(edge_npvr_scatter_path%2C)%0A%0A%0A%40app.function%0Adef%20plot_edge_npvr_table(edge_npvr_dict%2C%20output_path%3A%20Path%2C%20n_extremes%3D20)%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Creates%20a%20standalone%20table%20listing%20the%20most%20and%20least%20reliable%20edges.%0A%20%20%20%20Minimized%20padding%20for%20a%20compact%20layout.%0A%20%20%20%20%22%22%22%0A%20%20%20%20%23%201.%20Extract%20and%20sort%20data%0A%20%20%20%20valid_data%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(edge%2C%20data%5B%22npvr%22%5D)%0A%20%20%20%20%20%20%20%20for%20edge%2C%20data%20in%20edge_npvr_dict.items()%0A%20%20%20%20%20%20%20%20if%20not%20np.isnan(data%5B%22npvr%22%5D)%0A%20%20%20%20%5D%0A%20%20%20%20valid_data.sort(key%3Dlambda%20x%3A%20x%5B1%5D%2C%20reverse%3DTrue)%0A%20%20%20%20edges%20%3D%20%5Bitem%5B0%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20npvr_values%20%3D%20%5Bitem%5B1%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20n_edges%20%3D%20len(edges)%0A%0A%20%20%20%20%23%20Safeguard%0A%20%20%20%20n_extremes%20%3D%20min(n_extremes%2C%20n_edges%20%2F%2F%202)%0A%0A%20%20%20%20%23%202.%20TIGHTER%20FIGURE%20SIZING%0A%20%20%20%20%23%20Reduced%20height%20per%20row%20from%200.35%20to%200.28%0A%20%20%20%20total_table_rows%20%3D%20(n_extremes%20*%202)%20%2B%202%0A%20%20%20%20fig_height%20%3D%20max(6%2C%20total_table_rows%20*%200.28)%0A%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(10%2C%20fig_height))%0A%0A%20%20%20%20ax_table%20%3D%20fig.add_subplot(111)%0A%20%20%20%20ax_table.axis(%22off%22)%0A%0A%20%20%20%20%23%203.%20Prepare%20table%20data%0A%20%20%20%20table_data%20%3D%20%5B%5D%0A%20%20%20%20for%20i%20in%20range(n_extremes)%3A%0A%20%20%20%20%20%20%20%20table_data.append(%5Bf%22Top%20%7Bi%20%2B%201%7D%22%2C%20edges%5Bi%5D%2C%20f%22%7Bnpvr_values%5Bi%5D%3A.4f%7D%22%5D)%0A%0A%20%20%20%20table_data.append(%5B%22%22%2C%20%22...%22%2C%20%22%22%5D)%20%20%23%20Spacer%0A%0A%20%20%20%20for%20i%20in%20range(n_edges%20-%20n_extremes%2C%20n_edges)%3A%0A%20%20%20%20%20%20%20%20rank_from_bottom%20%3D%20n_edges%20-%20i%0A%20%20%20%20%20%20%20%20table_data.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5Bf%22Bottom%20%7Brank_from_bottom%7D%22%2C%20edges%5Bi%5D%2C%20f%22%7Bnpvr_values%5Bi%5D%3A.4f%7D%22%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%23%204.%20Create%20and%20format%20the%20table%0A%20%20%20%20table%20%3D%20ax_table.table(%0A%20%20%20%20%20%20%20%20cellText%3Dtable_data%2C%0A%20%20%20%20%20%20%20%20colLabels%3D%5B%22Rank%22%2C%20%22Edge%20ID%22%2C%20%22NPVR%22%5D%2C%0A%20%20%20%20%20%20%20%20loc%3D%22center%22%2C%0A%20%20%20%20%20%20%20%20cellLoc%3D%22center%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20table.auto_set_font_size(False)%0A%20%20%20%20table.set_fontsize(10)%20%20%23%20Slightly%20smaller%20font%20to%20fit%20better%0A%20%20%20%20table.scale(1%2C%201.3)%20%20%23%20Reduced%20from%201.4%20to%201.3%0A%0A%20%20%20%20%23%20Helper%20for%20text%20contrast%0A%20%20%20%20def%20get_text_color(bg_color)%3A%0A%20%20%20%20%20%20%20%20r%2C%20g%2C%20b%20%3D%20bg_color%5B%3A3%5D%0A%20%20%20%20%20%20%20%20luminance%20%3D%200.299%20*%20r%20%2B%200.587%20*%20g%20%2B%200.114%20*%20b%0A%20%20%20%20%20%20%20%20return%20%22white%22%20if%20luminance%20%3C%200.5%20else%20%22black%22%0A%0A%20%20%20%20%23%20Apply%20colors%0A%20%20%20%20norm%20%3D%20plt.Normalize(min(npvr_values)%2C%20max(npvr_values))%0A%20%20%20%20cmap%20%3D%20plt.cm.RdYlGn_r%0A%0A%20%20%20%20for%20(row%2C%20col)%2C%20cell%20in%20table.get_celld().items()%3A%0A%20%20%20%20%20%20%20%20if%20row%20%3D%3D%200%3A%20%20%23%20Header%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(%22%23404040%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_text_props(color%3D%22white%22%2C%20fontweight%3D%22bold%22%2C%20fontsize%3D11)%0A%20%20%20%20%20%20%20%20elif%201%20%3C%3D%20row%20%3C%3D%20n_extremes%3A%20%20%23%20Top%20rows%0A%20%20%20%20%20%20%20%20%20%20%20%20bg_color%20%3D%20cmap(norm(npvr_values%5Brow%20-%201%5D))%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(bg_color)%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_text_props(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3Dget_text_color(bg_color)%2C%20fontweight%3D%22bold%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20elif%20row%20%3D%3D%20n_extremes%20%2B%201%3A%20%20%23%20Spacer%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(%22white%22)%0A%20%20%20%20%20%20%20%20elif%20row%20%3E%20n_extremes%20%2B%201%3A%20%20%23%20Bottom%20rows%0A%20%20%20%20%20%20%20%20%20%20%20%20original_idx%20%3D%20n_edges%20-%201%20-%20(row%20-%20(n_extremes%20%2B%202))%0A%20%20%20%20%20%20%20%20%20%20%20%20bg_color%20%3D%20cmap(norm(npvr_values%5Boriginal_idx%5D))%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(bg_color)%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_text_props(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3Dget_text_color(bg_color)%2C%20fontweight%3D%22bold%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%23%20Reduced%20title%20padding%20from%2030%20to%2010%0A%20%20%20%20ax_table.set_title(%0A%20%20%20%20%20%20%20%20f%22Top%20%26%20Bottom%20%7Bn_extremes%7D%20Edges%20by%20NPVR%22%2C%0A%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D14%2C%0A%20%20%20%20%20%20%20%20pad%3D10%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%20Tight%20layout%20to%20minimize%20whitespace%0A%20%20%20%20plt.tight_layout()%0A%0A%20%20%20%20fig.savefig(output_path)%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell%0Adef%20_(npvr_per_edge%2C%20previous_matrices_figures_output_path)%3A%0A%20%20%20%20edge_npvr_table_path%20%3D%20previous_matrices_figures_output_path%20%2F%20%22npvr_table.png%22%0A%20%20%20%20plot_edge_npvr_table(npvr_per_edge%2C%20edge_npvr_table_path%2C%20n_extremes%3D20)%0A%20%20%20%20return%20(edge_npvr_table_path%2C)%0A%0A%0A%40app.function%0Adef%20plot_edge_npvr_histogram(edge_npvr_dict%2C%20output_path%3A%20Path)%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Creates%20a%20histogram%20of%20edge-wise%20NPVR%20values.%0A%20%20%20%20Bars%20are%20colored%20by%20their%20NPVR%20value%20(Red%20%3D%20High%2C%20Green%20%3D%20Low).%0A%20%20%20%20%22%22%22%0A%20%20%20%20%23%201.%20Extract%20valid%20NPVR%20values%0A%20%20%20%20npvr_values%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20data%5B%22npvr%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20data%20in%20edge_npvr_dict.values()%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.isnan(data%5B%22npvr%22%5D)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20if%20len(npvr_values)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError(%22No%20valid%20NPVR%20values%20found%20in%20the%20dictionary.%22)%0A%0A%20%20%20%20%23%202.%20Create%20figure%0A%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(12%2C%207))%0A%0A%20%20%20%20%23%203.%20Plot%20histogram%0A%20%20%20%20n_bins%20%3D%2050%0A%20%20%20%20counts%2C%20bins%2C%20patches%20%3D%20ax.hist(%0A%20%20%20%20%20%20%20%20npvr_values%2C%20bins%3Dn_bins%2C%20edgecolor%3D%22black%22%2C%20alpha%3D0.9%0A%20%20%20%20)%0A%0A%20%20%20%20%23%204.%20Color%20each%20bar%20based%20on%20its%20bin%20center%20(matching%20the%20scatter%20plot)%0A%20%20%20%20cmap%20%3D%20plt.cm.RdYlGn_r%0A%20%20%20%20norm%20%3D%20plt.Normalize(npvr_values.min()%2C%20npvr_values.max())%0A%0A%20%20%20%20for%20patch%2C%20left_edge%20in%20zip(patches%2C%20bins%5B%3A-1%5D)%3A%0A%20%20%20%20%20%20%20%20center%20%3D%20left_edge%20%2B%20(bins%5B1%5D%20-%20bins%5B0%5D)%20%2F%202%0A%20%20%20%20%20%20%20%20color%20%3D%20cmap(norm(center))%0A%20%20%20%20%20%20%20%20patch.set_facecolor(color)%0A%0A%20%20%20%20%23%205.%20Add%20statistical%20lines%20(Mean%20and%20Median)%0A%20%20%20%20mean_val%20%3D%20np.mean(npvr_values)%0A%20%20%20%20median_val%20%3D%20np.median(npvr_values)%0A%0A%20%20%20%20ax.axvline(%0A%20%20%20%20%20%20%20%20x%3Dmean_val%2C%0A%20%20%20%20%20%20%20%20color%3D%22blue%22%2C%0A%20%20%20%20%20%20%20%20linestyle%3D%22--%22%2C%0A%20%20%20%20%20%20%20%20linewidth%3D2%2C%0A%20%20%20%20%20%20%20%20alpha%3D0.8%2C%0A%20%20%20%20%20%20%20%20label%3Df%22Mean%20(%7Bmean_val%3A.3f%7D)%22%2C%0A%20%20%20%20)%0A%20%20%20%20ax.axvline(%0A%20%20%20%20%20%20%20%20x%3Dmedian_val%2C%0A%20%20%20%20%20%20%20%20color%3D%22purple%22%2C%0A%20%20%20%20%20%20%20%20linestyle%3D%22%3A%22%2C%0A%20%20%20%20%20%20%20%20linewidth%3D2%2C%0A%20%20%20%20%20%20%20%20alpha%3D0.8%2C%0A%20%20%20%20%20%20%20%20label%3Df%22Median%20(%7Bmedian_val%3A.3f%7D)%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20%23%206.%20Formatting%0A%20%20%20%20ax.set_xlabel(%22NPVR%20Value%22%2C%20fontsize%3D14)%0A%20%20%20%20ax.set_ylabel(%22Number%20of%20Edges%22%2C%20fontsize%3D14)%0A%20%20%20%20ax.set_title(%0A%20%20%20%20%20%20%20%20f%22Distribution%20of%20Edge-wise%20NPVR%20(N%20%3D%20%7Blen(npvr_values)%3A%2C%7D%20Edges)%20%5Cn%20Min%3A%20%7Bnpvr_values.min()%3A.4f%7D%20%7C%20Max%3A%20%7Bnpvr_values.max()%3A.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D16%2C%0A%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20%20%20%20%20pad%3D15%2C%0A%20%20%20%20)%0A%0A%20%20%20%20ax.legend(fontsize%3D11%2C%20loc%3D%22upper%20right%22)%0A%20%20%20%20ax.grid(axis%3D%22y%22%2C%20linestyle%3D%22--%22%2C%20alpha%3D0.6)%0A%0A%20%20%20%20plt.tight_layout()%0A%0A%20%20%20%20fig.savefig(output_path)%0A%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell%0Adef%20_(npvr_per_edge%2C%20previous_matrices_figures_output_path)%3A%0A%20%20%20%20edge_npvr_histogram_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_histogram.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_npvr_histogram(npvr_per_edge%2C%20edge_npvr_histogram_path)%0A%20%20%20%20return%20(edge_npvr_histogram_path%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Edge-wise%20Delta%20NPVR%20visualisation%0A%0A%20%20%20%20Compare%20NPVR%20between%20the%20all-confounds%20and%20filtered-confounds%20strategies%20to%20see%20how%20confound%20selection%20changes%20numerical%20variability%20per%20edge.%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20Please%20note%20that%20all%20the%20following%20code%20was%20generated%20by%20Qwen3.7-Plus%0A%20%20%20%20%22%22%22)%0A%20%20%20%20return%0A%0A%0A%40app.function%0Adef%20calculate_delta_npvr_per_edge(fc_matrices%2C%20session_filter%3DNone)%3A%0A%20%20%20%20%22%22%22%0A%20%20%20%20Calculates%20NPVR%20separately%20for%20'with_all_confounds'%20and%20'with_filtered_confounds'%2C%0A%20%20%20%20then%20returns%20the%20difference%20(Delta%20%3D%20Filtered%20-%20All)%20for%20each%20edge.%0A%20%20%20%20%22%22%22%0A%20%20%20%20results%20%3D%20%7B%7D%0A%0A%20%20%20%20%23%20Group%20data%20by%20data_type%20first%20to%20calculate%20variance%20independently%0A%20%20%20%20%23%20Structure%3A%20data_type%20-%3E%20edge_id%20-%3E%20config_key%20-%3E%20subject_id%20-%3E%20mca_run%0A%20%20%20%20edge_data%20%3D%20defaultdict(%0A%20%20%20%20%20%20%20%20lambda%3A%20defaultdict(lambda%3A%20defaultdict(lambda%3A%20defaultdict(dict)))%0A%20%20%20%20)%0A%0A%20%20%20%20for%20entry%20in%20fc_matrices%3A%0A%20%20%20%20%20%20%20%20metadata%20%3D%20entry.get(%22metadata%22%2C%20%7B%7D)%0A%20%20%20%20%20%20%20%20subject_id%20%3D%20metadata.get(%22subject%22)%0A%20%20%20%20%20%20%20%20mca_run%20%3D%20metadata.get(%22run%22)%0A%20%20%20%20%20%20%20%20session%20%3D%20metadata.get(%22session%22)%0A%20%20%20%20%20%20%20%20sub_run%20%3D%20metadata.get(%22sub_run%22)%0A%20%20%20%20%20%20%20%20data_type%20%3D%20metadata.get(%22type%22)%0A%0A%20%20%20%20%20%20%20%20if%20data_type%20not%20in%20%5B%22with_all_confounds%22%2C%20%22with_filtered_confounds%22%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20if%20session_filter%20is%20not%20None%20and%20session%20!%3D%20session_filter%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20matrix%20%3D%20entry.get(%22matrix%22)%0A%20%20%20%20%20%20%20%20if%20matrix%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20matrix%20%3D%20np.array(matrix)%0A%20%20%20%20%20%20%20%20if%20matrix.ndim%20!%3D%202%20or%20matrix.shape%5B0%5D%20!%3D%20matrix.shape%5B1%5D%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20n%20%3D%20matrix.shape%5B0%5D%0A%20%20%20%20%20%20%20%20row_idx%2C%20col_idx%20%3D%20np.triu_indices(n%2C%20k%3D1)%0A%20%20%20%20%20%20%20%20edge_values%20%3D%20matrix%5Brow_idx%2C%20col_idx%5D%0A%0A%20%20%20%20%20%20%20%20%23%20config_key%20no%20longer%20includes%20data_type%2C%20as%20we%20separated%20it%20in%20the%20outer%20loop%0A%20%20%20%20%20%20%20%20config_key%20%3D%20(session%2C%20sub_run)%0A%20%20%20%20%20%20%20%20edge_ids%20%3D%20%5Bf%22edge_%7Bi%7D_%7Bj%7D%22%20for%20i%2C%20j%20in%20zip(row_idx%2C%20col_idx)%5D%0A%0A%20%20%20%20%20%20%20%20for%20edge_id%2C%20value%20in%20zip(edge_ids%2C%20edge_values)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.isnan(value)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20edge_data%5Bdata_type%5D%5Bedge_id%5D%5Bconfig_key%5D%5Bsubject_id%5D%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20mca_run%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%5D%20%3D%20value%0A%0A%20%20%20%20%23%20Calculate%20NPVR%20independently%20for%20each%20confound%20strategy%0A%20%20%20%20npvr_by_type%20%3D%20%7B%22with_all_confounds%22%3A%20%7B%7D%2C%20%22with_filtered_confounds%22%3A%20%7B%7D%7D%0A%0A%20%20%20%20for%20data_type%20in%20%5B%22with_all_confounds%22%2C%20%22with_filtered_confounds%22%5D%3A%0A%20%20%20%20%20%20%20%20type_data%20%3D%20edge_data%5Bdata_type%5D%0A%20%20%20%20%20%20%20%20for%20edge_id%2C%20config_data%20in%20type_data.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20ss_num%2C%20df_num%20%3D%200.0%2C%200.0%0A%20%20%20%20%20%20%20%20%20%20%20%20ss_pop%2C%20df_pop%20%3D%200.0%2C%200.0%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20config_key%2C%20subject_data%20in%20config_data.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_subjects%20%3D%20sorted(list(subject_data.keys()))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20m%20%3D%20len(all_subjects)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20m%20%3C%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_mca_runs%20%3D%20set()%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20subj_data%20in%20subject_data.values()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_mca_runs.update(subj_data.keys())%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20all_mca_runs%20%3D%20sorted(list(all_mca_runs))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20n_mca_runs%20%3D%20len(all_mca_runs)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20n_mca_runs%20%3C%202%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%20%3D%20np.full((n_mca_runs%2C%20m)%2C%20np.nan)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20run_to_idx%20%3D%20%7Brun%3A%20i%20for%20i%2C%20run%20in%20enumerate(all_mca_runs)%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20j%2C%20subj%20in%20enumerate(all_subjects)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20run%2C%20mca_val%20in%20subject_data%5Bsubj%5D.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20X%5Brun_to_idx%5Brun%5D%2C%20j%5D%20%3D%20mca_val%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20j%20in%20range(m)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_vals%20%3D%20X%5B%3A%2C%20j%5D%5B~np.isnan(X%5B%3A%2C%20j%5D)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_vals)%20%3E%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ss_num%20%2B%3D%20np.var(valid_vals%2C%20ddof%3D1)%20*%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20len(valid_vals)%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_num%20%2B%3D%20len(valid_vals)%20-%201%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20i%20in%20range(n_mca_runs)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20valid_vals%20%3D%20X%5Bi%2C%20%3A%5D%5B~np.isnan(X%5Bi%2C%20%3A%5D)%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20len(valid_vals)%20%3E%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ss_pop%20%2B%3D%20np.var(valid_vals%2C%20ddof%3D1)%20*%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20len(valid_vals)%20-%201%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20df_pop%20%2B%3D%20len(valid_vals)%20-%201%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20pooled_sigma_num%20%3D%20np.sqrt(ss_num%20%2F%20df_num)%20if%20df_num%20%3E%200%20else%200.0%0A%20%20%20%20%20%20%20%20%20%20%20%20pooled_sigma_pop%20%3D%20np.sqrt(ss_pop%20%2F%20df_pop)%20if%20df_pop%20%3E%200%20else%200.0%0A%20%20%20%20%20%20%20%20%20%20%20%20npvr%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20pooled_sigma_num%20%2F%20pooled_sigma_pop%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20pooled_sigma_pop%20!%3D%200%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20np.nan%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%20npvr_by_type%5Bdata_type%5D%5Bedge_id%5D%20%3D%20npvr%0A%0A%20%20%20%20%23%20Calculate%20the%20difference%20(Delta%20NPVR)%0A%20%20%20%20all_edges%20%3D%20set(npvr_by_type%5B%22with_all_confounds%22%5D.keys()).union(%0A%20%20%20%20%20%20%20%20set(npvr_by_type%5B%22with_filtered_confounds%22%5D.keys())%0A%20%20%20%20)%0A%0A%20%20%20%20for%20edge_id%20in%20all_edges%3A%0A%20%20%20%20%20%20%20%20npvr_all%20%3D%20npvr_by_type%5B%22with_all_confounds%22%5D.get(edge_id%2C%20np.nan)%0A%20%20%20%20%20%20%20%20npvr_filt%20%3D%20npvr_by_type%5B%22with_filtered_confounds%22%5D.get(%0A%20%20%20%20%20%20%20%20%20%20%20%20edge_id%2C%20np.nan%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20%23%20Delta%20%3D%20All%20-%20Filtered%0A%20%20%20%20%20%20%20%20delta_npvr%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20npvr_all%20-%20npvr_filt%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20(np.isnan(npvr_filt)%20or%20np.isnan(npvr_all))%0A%20%20%20%20%20%20%20%20%20%20%20%20else%20np.nan%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20results%5Bedge_id%5D%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%22delta_npvr%22%3A%20delta_npvr%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22npvr_all%22%3A%20npvr_all%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%22npvr_filtered%22%3A%20npvr_filt%2C%0A%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20return%20results%0A%0A%0A%40app.cell%0Adef%20_(cleaned_fc_matrices)%3A%0A%20%20%20%20delta_npvr_per_edge%20%3D%20calculate_delta_npvr_per_edge(cleaned_fc_matrices)%0A%20%20%20%20return%20(delta_npvr_per_edge%2C)%0A%0A%0A%40app.function%0Adef%20delta_edge_dict_to_matrix(edge_delta_npvr_dict%2C%20n_nodes%3D100)%3A%0A%20%20%20%20%22%22%22Converts%20the%20delta%20dictionary%20back%20into%20a%20full%20100x100%20symmetric%20matrix.%22%22%22%0A%20%20%20%20adj_matrix%20%3D%20np.zeros((n_nodes%2C%20n_nodes))%0A%20%20%20%20row_idx%2C%20col_idx%20%3D%20np.triu_indices(n_nodes%2C%20k%3D1)%0A%0A%20%20%20%20edge_ids%20%3D%20%5Bf%22edge_%7Bi%7D_%7Bj%7D%22%20for%20i%2C%20j%20in%20zip(row_idx%2C%20col_idx)%5D%0A%20%20%20%20%23%20Extract%20the%20delta_npvr%20values%0A%20%20%20%20values%20%3D%20%5B%0A%20%20%20%20%20%20%20%20edge_delta_npvr_dict%5Beid%5D%5B%22delta_npvr%22%5D%0A%20%20%20%20%20%20%20%20for%20eid%20in%20edge_ids%0A%20%20%20%20%20%20%20%20if%20eid%20in%20edge_delta_npvr_dict%0A%20%20%20%20%5D%0A%0A%20%20%20%20adj_matrix%5Brow_idx%5B%3A%20len(values)%5D%2C%20col_idx%5B%3A%20len(values)%5D%5D%20%3D%20values%0A%20%20%20%20adj_matrix%20%3D%20adj_matrix%20%2B%20adj_matrix.T%0A%0A%20%20%20%20return%20adj_matrix%0A%0A%0A%40app.function%0Adef%20plot_edge_delta_npvr_matrix(edge_delta_npvr_dict%2C%20output_path%3A%20Path%2C%20n_nodes%3D100)%3A%0A%20%20%20%20%22%22%22Creates%20a%202D%20connectivity%20matrix%20heatmap%20showing%20edge-wise%20Delta%20NPVR.%22%22%22%0A%20%20%20%20adj_matrix%20%3D%20delta_edge_dict_to_matrix(edge_delta_npvr_dict%2C%20n_nodes)%0A%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(12%2C%2010))%0A%0A%20%20%20%20%23%20Symmetric%20color%20limits%20around%200%20for%20diverging%20colormap%0A%20%20%20%20max_abs_val%20%3D%20np.nanmax(np.abs(adj_matrix))%0A%20%20%20%20if%20np.isnan(max_abs_val)%20or%20max_abs_val%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20max_abs_val%20%3D%201.0%0A%0A%20%20%20%20plotting.plot_matrix(%0A%20%20%20%20%20%20%20%20adj_matrix%2C%0A%20%20%20%20%20%20%20%20cmap%3D%22RdYlGn_r%22%2C%0A%20%20%20%20%20%20%20%20vmin%3D-max_abs_val%2C%0A%20%20%20%20%20%20%20%20vmax%3Dmax_abs_val%2C%0A%20%20%20%20%20%20%20%20figure%3Dfig%2C%0A%20%20%20%20%20%20%20%20title%3D%22Edge-wise%20Delta%20NPVR%20Connectivity%20Matrix%5Cn(Red%20%3D%20NPVR%20Increased%2FWorse%20%7C%20Green%20%3D%20NPVR%20Decreased%2FBetter)%22%2C%0A%20%20%20%20%20%20%20%20reorder%3DFalse%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig.savefig(output_path)%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell%0Adef%20_(delta_npvr_per_edge%2C%20previous_matrices_figures_output_path)%3A%0A%20%20%20%20edge_npvr_delta_heatmap_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_delta_heatmap.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_delta_npvr_matrix(delta_npvr_per_edge%2C%20edge_npvr_delta_heatmap_path)%0A%20%20%20%20return%20(edge_npvr_delta_heatmap_path%2C)%0A%0A%0A%40app.function%0Adef%20plot_edge_delta_npvr_scatter(edge_delta_npvr_dict%2C%20output_path%3A%20Path)%3A%0A%20%20%20%20%22%22%22Creates%20a%20clean%20scatter%20plot%20of%20all%20edges%20by%20Delta%20NPVR.%22%22%22%0A%20%20%20%20valid_data%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(edge%2C%20data%5B%22delta_npvr%22%5D)%0A%20%20%20%20%20%20%20%20for%20edge%2C%20data%20in%20edge_delta_npvr_dict.items()%0A%20%20%20%20%20%20%20%20if%20not%20np.isnan(data%5B%22delta_npvr%22%5D)%0A%20%20%20%20%5D%0A%20%20%20%20valid_data.sort(key%3Dlambda%20x%3A%20x%5B1%5D%2C%20reverse%3DTrue)%0A%20%20%20%20edges%20%3D%20%5Bitem%5B0%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20npvr_values%20%3D%20%5Bitem%5B1%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20n_edges%20%3D%20len(edges)%0A%0A%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(14%2C%2010))%0A%20%20%20%20ax_scatter%20%3D%20fig.add_subplot(111)%0A%20%20%20%20y_pos%20%3D%20np.arange(n_edges)%0A%0A%20%20%20%20%23%20Symmetric%20normalization%20around%200%0A%20%20%20%20max_abs%20%3D%20max(abs(min(npvr_values))%2C%20abs(max(npvr_values)))%0A%20%20%20%20if%20max_abs%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20max_abs%20%3D%201.0%0A%20%20%20%20norm%20%3D%20plt.Normalize(-max_abs%2C%20max_abs)%0A%20%20%20%20colors%20%3D%20plt.cm.RdYlGn_r(norm(npvr_values))%0A%0A%20%20%20%20ax_scatter.scatter(%0A%20%20%20%20%20%20%20%20npvr_values%2C%20y_pos%2C%20c%3Dcolors%2C%20s%3D15%2C%20alpha%3D0.6%2C%20edgecolors%3D%22none%22%0A%20%20%20%20)%0A%20%20%20%20ax_scatter.invert_yaxis()%0A%0A%20%20%20%20ax_scatter.set_xlabel(%22Delta%20NPVR%20Value%20(All%20Confounds%20-%20Without%20Global-signal%20Confound)%22%2C%20fontsize%3D14)%0A%20%20%20%20ax_scatter.set_ylabel(%22Edge%20Rank%22%2C%20fontsize%3D14)%0A%20%20%20%20ax_scatter.set_title(%0A%20%20%20%20%20%20%20%20f%22Distribution%20of%20all%20%7Bn_edges%7D%20Edges%20by%20Delta%20NPVR%5Cn(Red%20%3D%20NPVR%20Increased%20%7C%20Blue%20%3D%20NPVR%20Decreased)%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D16%2C%0A%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20)%0A%20%20%20%20ax_scatter.grid(axis%3D%22x%22%2C%20linestyle%3D%22--%22%2C%20alpha%3D0.6)%0A%0A%20%20%20%20%23%20Add%20zero%20line%20and%20median%20line%0A%20%20%20%20ax_scatter.axvline(%0A%20%20%20%20%20%20%20%20x%3D0%2C%20color%3D%22black%22%2C%20linestyle%3D%22-%22%2C%20linewidth%3D2%2C%20alpha%3D0.7%0A%20%20%20%20)%0A%20%20%20%20median_val%20%3D%20np.median(npvr_values)%0A%20%20%20%20ax_scatter.axvline(%0A%20%20%20%20%20%20%20%20x%3Dmedian_val%2C%20color%3D%22gray%22%2C%20linestyle%3D%22--%22%2C%20linewidth%3D1.5%2C%20alpha%3D0.7%0A%20%20%20%20)%0A%20%20%20%20ax_scatter.text(%0A%20%20%20%20%20%20%20%20median_val%2C%0A%20%20%20%20%20%20%20%20n_edges%20*%200.05%2C%0A%20%20%20%20%20%20%20%20f%22Median%20(%7Bmedian_val%3A%2B.3f%7D)%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D12%2C%0A%20%20%20%20%20%20%20%20va%3D%22bottom%22%2C%0A%20%20%20%20%20%20%20%20ha%3D%22left%22%2C%0A%20%20%20%20%20%20%20%20bbox%3Ddict(facecolor%3D%22white%22%2C%20edgecolor%3D%22black%22%2C%20alpha%3D0.8)%2C%0A%20%20%20%20)%0A%0A%20%20%20%20fig.savefig(output_path)%0A%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell%0Adef%20_(delta_npvr_per_edge%2C%20previous_matrices_figures_output_path)%3A%0A%20%20%20%20edge_npvr_delta_scatter_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_delta_scatter.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_delta_npvr_scatter(delta_npvr_per_edge%2C%20edge_npvr_delta_scatter_path)%0A%20%20%20%20return%20(edge_npvr_delta_scatter_path%2C)%0A%0A%0A%40app.function%0Adef%20plot_edge_delta_npvr_table(edge_delta_npvr_dict%2C%20output_path%3A%20Path%2C%20n_extremes%3D20)%3A%0A%20%20%20%20%22%22%22Creates%20a%20standalone%20table%20listing%20the%20edges%20with%20the%20largest%20increase%2Fdecrease%20in%20NPVR.%22%22%22%0A%20%20%20%20valid_data%20%3D%20%5B%0A%20%20%20%20%20%20%20%20(edge%2C%20data%5B%22delta_npvr%22%5D)%0A%20%20%20%20%20%20%20%20for%20edge%2C%20data%20in%20edge_delta_npvr_dict.items()%0A%20%20%20%20%20%20%20%20if%20not%20np.isnan(data%5B%22delta_npvr%22%5D)%0A%20%20%20%20%5D%0A%20%20%20%20valid_data.sort(key%3Dlambda%20x%3A%20x%5B1%5D%2C%20reverse%3DTrue)%0A%20%20%20%20edges%20%3D%20%5Bitem%5B0%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20npvr_values%20%3D%20%5Bitem%5B1%5D%20for%20item%20in%20valid_data%5D%0A%20%20%20%20n_edges%20%3D%20len(edges)%0A%0A%20%20%20%20n_extremes%20%3D%20min(n_extremes%2C%20n_edges%20%2F%2F%202)%0A%20%20%20%20fig_height%20%3D%20max(6%2C%20((n_extremes%20*%202)%20%2B%202)%20*%200.28)%0A%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(10%2C%20fig_height))%0A%0A%20%20%20%20ax_table%20%3D%20fig.add_subplot(111)%0A%20%20%20%20ax_table.axis(%22off%22)%0A%0A%20%20%20%20table_data%20%3D%20%5B%5D%0A%20%20%20%20for%20i%20in%20range(n_extremes)%3A%0A%20%20%20%20%20%20%20%20table_data.append(%5Bf%22Top%20%7Bi%20%2B%201%7D%22%2C%20edges%5Bi%5D%2C%20f%22%7Bnpvr_values%5Bi%5D%3A%2B.4f%7D%22%5D)%0A%0A%20%20%20%20table_data.append(%5B%22%22%2C%20%22...%22%2C%20%22%22%5D)%0A%0A%20%20%20%20for%20i%20in%20range(n_edges%20-%20n_extremes%2C%20n_edges)%3A%0A%20%20%20%20%20%20%20%20rank_from_bottom%20%3D%20n_edges%20-%20i%0A%20%20%20%20%20%20%20%20table_data.append(%0A%20%20%20%20%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Bottom%20%7Brank_from_bottom%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20edges%5Bi%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Bnpvr_values%5Bi%5D%3A%2B.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20table%20%3D%20ax_table.table(%0A%20%20%20%20%20%20%20%20cellText%3Dtable_data%2C%0A%20%20%20%20%20%20%20%20colLabels%3D%5B%22Rank%22%2C%20%22Edge%20ID%22%2C%20%22Delta%20NPVR%22%5D%2C%0A%20%20%20%20%20%20%20%20loc%3D%22center%22%2C%0A%20%20%20%20%20%20%20%20cellLoc%3D%22center%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20table.auto_set_font_size(False)%0A%20%20%20%20table.set_fontsize(10)%0A%20%20%20%20table.scale(1%2C%201.3)%0A%0A%20%20%20%20def%20get_text_color(bg_color)%3A%0A%20%20%20%20%20%20%20%20r%2C%20g%2C%20b%20%3D%20bg_color%5B%3A3%5D%0A%20%20%20%20%20%20%20%20luminance%20%3D%200.299%20*%20r%20%2B%200.587%20*%20g%20%2B%200.114%20*%20b%0A%20%20%20%20%20%20%20%20return%20%22white%22%20if%20luminance%20%3C%200.5%20else%20%22black%22%0A%0A%20%20%20%20max_abs%20%3D%20max(abs(min(npvr_values))%2C%20abs(max(npvr_values)))%0A%20%20%20%20if%20max_abs%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20max_abs%20%3D%201.0%0A%20%20%20%20norm%20%3D%20plt.Normalize(-max_abs%2C%20max_abs)%0A%20%20%20%20cmap%20%3D%20plt.cm.RdYlGn_r%0A%0A%20%20%20%20for%20(row%2C%20col)%2C%20cell%20in%20table.get_celld().items()%3A%0A%20%20%20%20%20%20%20%20if%20row%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(%22%23404040%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_text_props(color%3D%22white%22%2C%20fontweight%3D%22bold%22%2C%20fontsize%3D11)%0A%20%20%20%20%20%20%20%20elif%201%20%3C%3D%20row%20%3C%3D%20n_extremes%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20bg_color%20%3D%20cmap(norm(npvr_values%5Brow%20-%201%5D))%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(bg_color)%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_text_props(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3Dget_text_color(bg_color)%2C%20fontweight%3D%22bold%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20elif%20row%20%3D%3D%20n_extremes%20%2B%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(%22white%22)%0A%20%20%20%20%20%20%20%20elif%20row%20%3E%20n_extremes%20%2B%201%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20original_idx%20%3D%20n_edges%20-%201%20-%20(row%20-%20(n_extremes%20%2B%202))%0A%20%20%20%20%20%20%20%20%20%20%20%20bg_color%20%3D%20cmap(norm(npvr_values%5Boriginal_idx%5D))%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_facecolor(bg_color)%0A%20%20%20%20%20%20%20%20%20%20%20%20cell.set_text_props(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20color%3Dget_text_color(bg_color)%2C%20fontweight%3D%22bold%22%0A%20%20%20%20%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20ax_table.set_title(%0A%20%20%20%20%20%20%20%20f%22Top%20%26%20Bottom%20%7Bn_extremes%7D%20Edges%20by%20Delta%20NPVR%5Cn(All%20Confounds%20-%20Without%20Global-signal%20Confound)%22%2C%0A%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D14%2C%0A%20%20%20%20%20%20%20%20pad%3D10%2C%0A%20%20%20%20)%0A%20%20%20%20plt.tight_layout()%0A%0A%20%20%20%20fig.savefig(output_path)%0A%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell%0Adef%20_(delta_npvr_per_edge%2C%20previous_matrices_figures_output_path)%3A%0A%20%20%20%20edge_npvr_delta_table_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_delta_table.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_delta_npvr_table(delta_npvr_per_edge%2C%20edge_npvr_delta_table_path)%0A%20%20%20%20return%20(edge_npvr_delta_table_path%2C)%0A%0A%0A%40app.function%0Adef%20plot_edge_delta_npvr_histogram(edge_delta_npvr_dict%2C%20output_path%3A%20Path)%3A%0A%20%20%20%20%22%22%22Creates%20a%20histogram%20of%20edge-wise%20Delta%20NPVR%20values.%22%22%22%0A%20%20%20%20npvr_values%20%3D%20np.array(%0A%20%20%20%20%20%20%20%20%5B%0A%20%20%20%20%20%20%20%20%20%20%20%20data%5B%22delta_npvr%22%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20data%20in%20edge_delta_npvr_dict.values()%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.isnan(data%5B%22delta_npvr%22%5D)%0A%20%20%20%20%20%20%20%20%5D%0A%20%20%20%20)%0A%0A%20%20%20%20if%20len(npvr_values)%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20raise%20ValueError(%22No%20valid%20Delta%20NPVR%20values%20found%20in%20the%20dictionary.%22)%0A%0A%20%20%20%20fig%2C%20ax%20%3D%20plt.subplots(figsize%3D(12%2C%207))%0A%0A%20%20%20%20n_bins%20%3D%2050%0A%20%20%20%20counts%2C%20bins%2C%20patches%20%3D%20ax.hist(%0A%20%20%20%20%20%20%20%20npvr_values%2C%20bins%3Dn_bins%2C%20edgecolor%3D%22black%22%2C%20alpha%3D0.9%0A%20%20%20%20)%0A%0A%20%20%20%20max_abs%20%3D%20max(abs(npvr_values.min())%2C%20abs(npvr_values.max()))%0A%20%20%20%20if%20max_abs%20%3D%3D%200%3A%0A%20%20%20%20%20%20%20%20max_abs%20%3D%201.0%0A%20%20%20%20norm%20%3D%20plt.Normalize(-max_abs%2C%20max_abs)%0A%20%20%20%20cmap%20%3D%20plt.cm.RdYlGn_r%0A%0A%20%20%20%20for%20patch%2C%20left_edge%20in%20zip(patches%2C%20bins%5B%3A-1%5D)%3A%0A%20%20%20%20%20%20%20%20center%20%3D%20left_edge%20%2B%20(bins%5B1%5D%20-%20bins%5B0%5D)%20%2F%202%0A%20%20%20%20%20%20%20%20color%20%3D%20cmap(norm(center))%0A%20%20%20%20%20%20%20%20patch.set_facecolor(color)%0A%0A%20%20%20%20mean_val%20%3D%20np.mean(npvr_values)%0A%20%20%20%20median_val%20%3D%20np.median(npvr_values)%0A%0A%20%20%20%20ax.axvline(%0A%20%20%20%20%20%20%20%20x%3Dmean_val%2C%0A%20%20%20%20%20%20%20%20color%3D%22blue%22%2C%0A%20%20%20%20%20%20%20%20linestyle%3D%22--%22%2C%0A%20%20%20%20%20%20%20%20linewidth%3D2%2C%0A%20%20%20%20%20%20%20%20alpha%3D0.8%2C%0A%20%20%20%20%20%20%20%20label%3Df%22Mean%20(%7Bmean_val%3A%2B.3f%7D)%22%2C%0A%20%20%20%20)%0A%20%20%20%20ax.axvline(%0A%20%20%20%20%20%20%20%20x%3Dmedian_val%2C%0A%20%20%20%20%20%20%20%20color%3D%22purple%22%2C%0A%20%20%20%20%20%20%20%20linestyle%3D%22%3A%22%2C%0A%20%20%20%20%20%20%20%20linewidth%3D2%2C%0A%20%20%20%20%20%20%20%20alpha%3D0.8%2C%0A%20%20%20%20%20%20%20%20label%3Df%22Median%20(%7Bmedian_val%3A%2B.3f%7D)%22%2C%0A%20%20%20%20)%0A%0A%20%20%20%20ax.set_xlabel(%22Delta%20NPVR%20Value%20(All%20Confounds%20-%20Without%20Global-signal%20Confound)%22%2C%20fontsize%3D14)%0A%20%20%20%20ax.set_ylabel(%22Number%20of%20Edges%22%2C%20fontsize%3D14)%0A%20%20%20%20ax.set_title(%0A%20%20%20%20%20%20%20%20f%22Distribution%20of%20Edge-wise%20Delta%20NPVR%20(N%20%3D%20%7Blen(npvr_values)%3A%2C%7D%20Edges)%20%5Cn%20Min%3A%20%7Bnpvr_values.min()%3A%2B.4f%7D%20%7C%20Max%3A%20%7Bnpvr_values.max()%3A%2B.4f%7D%22%2C%0A%20%20%20%20%20%20%20%20fontsize%3D16%2C%0A%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20%20%20%20%20pad%3D15%2C%0A%20%20%20%20)%0A%0A%20%20%20%20ax.legend(fontsize%3D11%2C%20loc%3D%22upper%20right%22)%0A%20%20%20%20ax.grid(axis%3D%22y%22%2C%20linestyle%3D%22--%22%2C%20alpha%3D0.6)%0A%0A%20%20%20%20plt.tight_layout()%0A%0A%20%20%20%20fig.savefig(output_path)%0A%0A%20%20%20%20return%20fig%0A%0A%0A%40app.cell%0Adef%20_(delta_npvr_per_edge%2C%20previous_matrices_figures_output_path)%3A%0A%20%20%20%20edge_npvr_delta_histogram_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_delta_histogram.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_delta_npvr_histogram(delta_npvr_per_edge%2C%20edge_npvr_delta_histogram_path)%0A%20%20%20%20return%20(edge_npvr_delta_histogram_path%2C)%0A%0A%0A%40app.cell(hide_code%3DTrue)%0Adef%20_()%3A%0A%20%20%20%20mo.md(r%22%22%22%0A%20%20%20%20%23%23%23%20Regional%20NPVR%20maps%0A%0A%20%20%20%20Aggregate%20edge-wise%20NPVR%20to%20brain%20regions%20and%20map%20the%20result%20onto%20the%20Schaefer%202018%20atlas.%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%20def%20create_npvr_nifti(npvr_dict%2C%20atlas_img)%3A%0A%20%20%20%20%20%20%20%20%22%22%22Maps%20regional%20NPVR%20values%20to%20the%20Schaefer%20atlas.%22%22%22%0A%20%20%20%20%20%20%20%20atlas_data%20%3D%20atlas_img.get_fdata()%0A%20%20%20%20%20%20%20%20npvr_map_data%20%3D%20np.zeros_like(atlas_data)%0A%0A%20%20%20%20%20%20%20%20for%20region_str%2C%20data%20in%20npvr_dict.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20region_str%20%3D%3D%20%22global%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20continue%0A%20%20%20%20%20%20%20%20%20%20%20%20region_id%20%3D%20int(region_str)%20%2B%201%0A%20%20%20%20%20%20%20%20%20%20%20%20if%201%20%3C%3D%20region_id%20%3C%3D%20100%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20npvr_map_data%5Batlas_data%20%3D%3D%20region_id%5D%20%3D%20data%5B%22npvr%22%5D%0A%0A%20%20%20%20%20%20%20%20return%20nib.Nifti1Image(npvr_map_data%2C%20atlas_img.affine)%0A%0A%0A%20%20%20%20def%20plot_edge_npvr_as_regional_map(%0A%20%20%20%20%20%20%20%20edge_npvr_data%2C%20atlas_img%2C%20output_path%3A%20Path%2C%20agg_method%3D%22sum%22%2C%20vmin%3D0.0%2C%20vmax%3DNone%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%20Aggregates%20edge-wise%20NPVR%20to%20nodes%20(by%20summing%2Faveraging%20rows%2Fcolumns)%0A%20%20%20%20%20%20%20%20and%20plots%20it%20as%20a%20regional%20brain%20map%20using%20your%20working%20create_npvr_nifti%20function.%0A%0A%20%20%20%20%20%20%20%20Parameters%3A%0A%20%20%20%20%20%20%20%20-%20edge_npvr_data%3A%20dict%20of%20edge%20NPVR%20values.%0A%20%20%20%20%20%20%20%20-%20atlas_img%3A%20Nifti1Image%20(e.g.%2C%20Schaefer%20atlas).%0A%20%20%20%20%20%20%20%20-%20agg_method%3A%20'sum'%20(Node%20Strength)%20or%20'mean'%20(Average%20Edge%20NPVR).%0A%20%20%20%20%20%20%20%20-%20vmin%2C%20vmax%3A%20Colorbar%20limits.%20If%20vmax%20is%20None%2C%20it%20auto-scales%20to%20the%20highest%20node%20value.%0A%20%20%20%20%20%20%20%20%22%22%22%0A%20%20%20%20%20%20%20%20if%20not%20edge_npvr_data%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20print(%22No%20data%20to%20plot.%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20None%0A%0A%20%20%20%20%20%20%20%20%23%20Check%20if%20data%20is%20nested%20(thresholds)%20or%20flat%0A%20%20%20%20%20%20%20%20first_key%20%3D%20next(iter(edge_npvr_data))%0A%20%20%20%20%20%20%20%20is_nested%20%3D%20%22npvr%22%20not%20in%20edge_npvr_data%5Bfirst_key%5D%0A%0A%20%20%20%20%20%20%20%20if%20is_nested%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20thresholds_list%20%3D%20sorted(edge_npvr_data.keys())%0A%20%20%20%20%20%20%20%20else%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20thresholds_list%20%3D%20%5BNone%5D%0A%20%20%20%20%20%20%20%20%20%20%20%20edge_npvr_data%20%3D%20%7BNone%3A%20edge_npvr_data%7D%0A%0A%20%20%20%20%20%20%20%20%23%20Get%20number%20of%20nodes%20from%20atlas%0A%20%20%20%20%20%20%20%20coords%20%3D%20plotting.find_parcellation_cut_coords(atlas_img)%0A%20%20%20%20%20%20%20%20n_nodes%20%3D%20len(coords)%0A%20%20%20%20%20%20%20%20n_thresholds%20%3D%20len(thresholds_list)%0A%0A%20%20%20%20%20%20%20%20%23%20Auto-scale%20vmax%20if%20not%20provided%0A%20%20%20%20%20%20%20%20if%20vmax%20is%20None%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20global_max%20%3D%200.0%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20thresh%2C%20edge_dict%20in%20edge_npvr_data.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adj_matrix%20%3D%20np.zeros((n_nodes%2C%20n_nodes))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20for%20edge_id%2C%20data%20in%20edge_dict.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20re.match(r%22edge_(%5Cd%2B)_(%5Cd%2B)%22%2C%20edge_id)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20match%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20u%2C%20v%20%3D%20int(match.group(1))%2C%20int(match.group(2))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20val%20%3D%20data.get(%22npvr%22%2C%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.isnan(val)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adj_matrix%5Bu%2C%20v%5D%20%3D%20val%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adj_matrix%5Bv%2C%20u%5D%20%3D%20val%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20node_vals%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20np.sum(adj_matrix%2C%20axis%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20agg_method%20%3D%3D%20%22sum%22%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20else%20np.mean(adj_matrix%2C%20axis%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20current_max%20%3D%20np.nanmax(node_vals)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20current_max%20%3E%20global_max%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20global_max%20%3D%20current_max%0A%20%20%20%20%20%20%20%20%20%20%20%20vmax%20%3D%20global_max%20if%20global_max%20%3E%200%20else%201.0%0A%0A%20%20%20%20%20%20%20%20%23%20Create%20figure%20(Using%204%20columns%20to%20fix%20the%20text%20overlap%20bug%20from%20your%20original%20code)%0A%20%20%20%20%20%20%20%20fig%20%3D%20plt.figure(figsize%3D(15%2C%205%20*%20n_thresholds))%0A%20%20%20%20%20%20%20%20gs%20%3D%20fig.add_gridspec(%0A%20%20%20%20%20%20%20%20%20%20%20%20n_thresholds%2C%204%2C%20width_ratios%3D%5B0.5%2C%201%2C%201%2C%201%5D%2C%20wspace%3D0.05%2C%20hspace%3D0.3%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20for%20i%2C%20thresh%20in%20enumerate(thresholds_list)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20edge_dict%20%3D%20edge_npvr_data%5Bthresh%5D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%201.%20Rebuild%20the%20full%20N%20x%20N%20adjacency%20matrix%0A%20%20%20%20%20%20%20%20%20%20%20%20adj_matrix%20%3D%20np.zeros((n_nodes%2C%20n_nodes))%0A%20%20%20%20%20%20%20%20%20%20%20%20for%20edge_id%2C%20data%20in%20edge_dict.items()%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20match%20%3D%20re.match(r%22edge_(%5Cd%2B)_(%5Cd%2B)%22%2C%20edge_id)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20match%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20u%2C%20v%20%3D%20int(match.group(1))%2C%20int(match.group(2))%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20npvr_val%20%3D%20data.get(%22npvr%22%2C%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20if%20not%20np.isnan(npvr_val)%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adj_matrix%5Bu%2C%20v%5D%20%3D%20npvr_val%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20adj_matrix%5Bv%2C%20u%5D%20%3D%20npvr_val%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%202.%20Collapse%20matrix%20to%20nodes%20using%20%22line%20or%20column%22%20(Row%20sum%2Fmean)%0A%20%20%20%20%20%20%20%20%20%20%20%20if%20agg_method%20%3D%3D%20%22sum%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20node_npvr_values%20%3D%20np.sum(adj_matrix%2C%20axis%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20agg_label%20%3D%20%22Sum%20(Node%20Strength)%22%0A%20%20%20%20%20%20%20%20%20%20%20%20elif%20agg_method%20%3D%3D%20%22mean%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20node_npvr_values%20%3D%20np.mean(adj_matrix%2C%20axis%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20agg_label%20%3D%20%22Mean%22%0A%20%20%20%20%20%20%20%20%20%20%20%20elif%20agg_method%20%3D%3D%20%22median%22%3A%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20node_npvr_values%20%3D%20np.median(adj_matrix%2C%20axis%3D1)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20agg_label%20%3D%20%22Median%22%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%203.%20Convert%20the%201D%20array%20into%20the%20dictionary%20format%20expected%20by%20create_npvr_nifti%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20create_npvr_nifti%20expects%20keys%20like%20%220%22%2C%20%221%22%2C%20...%20and%20values%20like%20%7B%22npvr%22%3A%200.5%7D%0A%20%20%20%20%20%20%20%20%20%20%20%20node_dict%20%3D%20%7B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20str(idx)%3A%20%7B%22npvr%22%3A%20val%7D%20for%20idx%2C%20val%20in%20enumerate(node_npvr_values)%0A%20%20%20%20%20%20%20%20%20%20%20%20%7D%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%204.%20Use%20your%20working%20function%20to%20create%20the%20Nifti%20image!%0A%20%20%20%20%20%20%20%20%20%20%20%20npvr_img%20%3D%20create_npvr_nifti(node_dict%2C%20atlas_img)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20---%20PLOTTING%20(Identical%20style%20to%20your%20original%20plot)%20---%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Column%200%3A%20Row%20Label%0A%20%20%20%20%20%20%20%20%20%20%20%20ax_label%20%3D%20fig.add_subplot(gs%5Bi%2C%200%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20label_text%20%3D%20(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22Threshold%20%3D%20%7Bthresh%7D%22%20if%20thresh%20is%20not%20None%20else%20%22Edge%20NPVR%22%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%20ax_label.text(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%201.0%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%200.5%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20f%22%7Blabel_text%7D%5Cn(%7Bagg_label%7D)%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ha%3D%22right%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20va%3D%22center%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fontsize%3D16%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20transform%3Dax_label.transAxes%2C%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%20ax_label.axis(%22off%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Column%201%3A%20Sagittal%20slice%0A%20%20%20%20%20%20%20%20%20%20%20%20ax_sag%20%3D%20fig.add_subplot(gs%5Bi%2C%201%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20plotting.plot_stat_map(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20npvr_img%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display_mode%3D%22x%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cut_coords%3D%5B2%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20axes%3Dax_sag%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20colorbar%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmap%3D%22RdYlGn_r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vmin%3Dvmin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vmax%3Dvmax%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20black_bg%3DFalse%2C%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%20ax_sag.set_title(%22%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Column%202%3A%20Coronal%20slice%0A%20%20%20%20%20%20%20%20%20%20%20%20ax_cor%20%3D%20fig.add_subplot(gs%5Bi%2C%202%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20plotting.plot_stat_map(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20npvr_img%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display_mode%3D%22y%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cut_coords%3D%5B0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20axes%3Dax_cor%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20colorbar%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmap%3D%22RdYlGn_r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vmin%3Dvmin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vmax%3Dvmax%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20black_bg%3DFalse%2C%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%20ax_cor.set_title(%22%22)%0A%0A%20%20%20%20%20%20%20%20%20%20%20%20%23%20Column%203%3A%20Axial%20slice%0A%20%20%20%20%20%20%20%20%20%20%20%20ax_axi%20%3D%20fig.add_subplot(gs%5Bi%2C%203%5D)%0A%20%20%20%20%20%20%20%20%20%20%20%20plotting.plot_stat_map(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20npvr_img%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20display_mode%3D%22z%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cut_coords%3D%5B0%5D%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20axes%3Dax_axi%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20colorbar%3DFalse%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cmap%3D%22RdYlGn_r%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vmin%3Dvmin%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20vmax%3Dvmax%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20black_bg%3DFalse%2C%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%20ax_axi.set_title(%22%22)%0A%0A%20%20%20%20%20%20%20%20%23%20Adjust%20layout%20and%20add%20titles%2Fcolorbar%0A%20%20%20%20%20%20%20%20fig.subplots_adjust(left%3D0.05%2C%20right%3D0.90%2C%20top%3D0.92%2C%20bottom%3D0.05)%0A%20%20%20%20%20%20%20%20fig.suptitle(%0A%20%20%20%20%20%20%20%20%20%20%20%20%22Edge-wise%20NPVR%20mapped%20to%20Regions%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fontsize%3D24%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20fontweight%3D%22bold%22%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20y%3D0.98%2C%0A%20%20%20%20%20%20%20%20)%0A%0A%20%20%20%20%20%20%20%20cax%20%3D%20fig.add_axes(%5B0.92%2C%200.1%2C%200.02%2C%200.8%5D)%0A%20%20%20%20%20%20%20%20sm%20%3D%20plt.cm.ScalarMappable(%0A%20%20%20%20%20%20%20%20%20%20%20%20cmap%3D%22RdYlGn_r%22%2C%20norm%3Dplt.Normalize(vmin%3Dvmin%2C%20vmax%3Dvmax)%0A%20%20%20%20%20%20%20%20)%0A%20%20%20%20%20%20%20%20sm.set_array(%5B%5D)%0A%20%20%20%20%20%20%20%20fig.colorbar(sm%2C%20cax%3Dcax%2C%20label%3D%22Aggregated%20NPVR%22)%0A%0A%20%20%20%20%20%20%20%20fig.savefig(output_path)%0A%0A%20%20%20%20%20%20%20%20return%20fig%0A%0A%20%20%20%20return%20(plot_edge_npvr_as_regional_map%2C)%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20npvr_per_edge%2C%0A%20%20%20%20plot_edge_npvr_as_regional_map%2C%0A%20%20%20%20previous_matrices_figures_output_path%2C%0A)%3A%0A%20%20%20%20atlas%20%3D%20fetch_atlas_schaefer_2018(n_rois%3D100%2C%20yeo_networks%3D7%2C%20resolution_mm%3D2)%0A%20%20%20%20brain_maps%20%3D%20atlas%5B%22maps%22%5D%0A%0A%20%20%20%20brain_maps_img%20%3D%20nib.load(brain_maps)%0A%0A%20%20%20%20edge_npvr_regional_mean_map_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_regional_mean_map.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_npvr_as_regional_map(%0A%20%20%20%20%20%20%20%20npvr_per_edge%2C%0A%20%20%20%20%20%20%20%20brain_maps_img%2C%0A%20%20%20%20%20%20%20%20edge_npvr_regional_mean_map_path%2C%0A%20%20%20%20%20%20%20%20agg_method%3D%22mean%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20brain_maps_img%2C%20edge_npvr_regional_mean_map_path%0A%0A%0A%40app.cell%0Adef%20_(%0A%20%20%20%20brain_maps_img%2C%0A%20%20%20%20npvr_per_edge%2C%0A%20%20%20%20plot_edge_npvr_as_regional_map%2C%0A%20%20%20%20previous_matrices_figures_output_path%2C%0A)%3A%0A%20%20%20%20edge_npvr_regional_median_map_path%20%3D%20(%0A%20%20%20%20%20%20%20%20previous_matrices_figures_output_path%20%2F%20%22npvr_regional_median_map.png%22%0A%20%20%20%20)%0A%20%20%20%20plot_edge_npvr_as_regional_map(%0A%20%20%20%20%20%20%20%20npvr_per_edge%2C%0A%20%20%20%20%20%20%20%20brain_maps_img%2C%0A%20%20%20%20%20%20%20%20edge_npvr_regional_median_map_path%2C%0A%20%20%20%20%20%20%20%20agg_method%3D%22median%22%2C%0A%20%20%20%20)%0A%20%20%20%20return%20(edge_npvr_regional_median_map_path%2C)%0A%0A%0Aif%20__name__%20%3D%3D%20%22__main__%22%3A%0A%20%20%20%20app.run()%0A
a3a37be33c69efe3160570b21d7b16ed