From 370f0603513e4a29414fd38d96e8d074f8b426df Mon Sep 17 00:00:00 2001 From: Jim Pollaro Date: Wed, 22 May 2024 09:52:48 -0500 Subject: [PATCH 1/5] moved diagnostic plots to there own class --- +nla/+gfx/+plots/MatrixMenu.m | 3 +++ .../+result/+plot/PermutationTestPlotter.m | 26 +++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 +nla/+gfx/+plots/MatrixMenu.m diff --git a/+nla/+gfx/+plots/MatrixMenu.m b/+nla/+gfx/+plots/MatrixMenu.m new file mode 100644 index 00000000..88bd7cb5 --- /dev/null +++ b/+nla/+gfx/+plots/MatrixMenu.m @@ -0,0 +1,3 @@ +classdef MatrixMenu < handle + +end \ No newline at end of file diff --git a/+nla/+net/+result/+plot/PermutationTestPlotter.m b/+nla/+net/+result/+plot/PermutationTestPlotter.m index a21ec8ff..6f9efe0a 100644 --- a/+nla/+net/+result/+plot/PermutationTestPlotter.m +++ b/+nla/+net/+result/+plot/PermutationTestPlotter.m @@ -85,5 +85,31 @@ function plotProbabilityHistogram(obj, axes, histogram_data, statistic_input, no xlabel(axes, "Asymptotic"); ylabel(axes, "Permutation-based P-value"); end + + function plotProbabilityHistogram(obj, axes, histogram_data, statistic_input, no_permutations_network_result, test_method,... + probability_max) + import nla.HistBin + + empirical_fdr = cumsum(double(histogram_data) ./ sum(histogram_data)); + + [~, minimum_index] = min(abs(probability_max - empirical_fdr)); + + statistic_max = HistBin.EDGES(minimum_index); + + if (empirical_fdr(minimum_index) > probability_max) && minimum_index > 1 + statistic_max = HistBin.EDGES(minimum_index - 1); + end + loglog(axes, HistBin.EDGES(2:end), empirical_fdr, "k"); + hold("on"); + loglog(axes, no_permutations_network_result, statistic_input, "ok"); + axis([min(no_permutations_network_result), 1, min(statistic_input), 1]); + loglog(axes, axes.XLim, [probability_max, probability_max], "b"); + loglog(axes, [statistic_max, statistic_max], axes.YLim, "r"); + + name_label = sprintf("%s P-values", test_method); + nla.gfx.setTitle(axes, name_label); + xlabel(axes, "Asymptotic"); + ylabel(axes, "Permutation-based P-value"); + end end end \ No newline at end of file From 29d1df767d0b008fab759214b1d4e3a5eb200814 Mon Sep 17 00:00:00 2001 From: Jim Pollaro Date: Wed, 22 May 2024 09:52:48 -0500 Subject: [PATCH 2/5] moved diagnostic plots to there own class --- .../+result/+plot/FullConnectomePlotter.m | 17 ++++ .../+net/+result/+plot/NoPermutationPlotter.m | 85 +++++++++++++++++++ 2 files changed, 102 insertions(+) create mode 100644 +nla/+net/+result/+plot/FullConnectomePlotter.m create mode 100644 +nla/+net/+result/+plot/NoPermutationPlotter.m diff --git a/+nla/+net/+result/+plot/FullConnectomePlotter.m b/+nla/+net/+result/+plot/FullConnectomePlotter.m new file mode 100644 index 00000000..fbc95a77 --- /dev/null +++ b/+nla/+net/+result/+plot/FullConnectomePlotter.m @@ -0,0 +1,17 @@ +classdef FullConnectomePlotter < nla.net.result.plot.NoPermutationPlotter + + methods + function obj = FullConnectomePlotter(network_atlas) + obj = obj@nla.net.result.plot.NoPermutationPlotter(); + if nargin > 0 + obj.network_atlas = network_atlas; + end + end + + function [w, h] = plotProbability(obj, plot_figure, parameters, x_coordinate, y_coordinate) + % I know I don't need to define this here. I don't like it when the superclass methods just start showing up + % Matlab's class organization is so hacked together, I just like to really show everything + [w, h] = plotProbability@nla.net.result.plot.NoPermutationPlotter(obj, plot_figure, parameters, x_coordinate, y_coordinate); + end + end +end \ No newline at end of file diff --git a/+nla/+net/+result/+plot/NoPermutationPlotter.m b/+nla/+net/+result/+plot/NoPermutationPlotter.m new file mode 100644 index 00000000..c9db45d2 --- /dev/null +++ b/+nla/+net/+result/+plot/NoPermutationPlotter.m @@ -0,0 +1,85 @@ +classdef NoPermutationPlotter < handle + + properties + network_atlas + end + + methods + function obj = NoPermutationPlotter(network_atlas) + if nargin > 0 + obj.network_atlas = network_atlas; + end + end + + function [w, h] = plotProbability(obj, plot_figure, parameters, x_coordinate, y_coordinate) + color_map = parameters.color_map; + statistic_matrix = parameters.statistic_plot_matrix; + p_value_max = parameters.p_value_plot_max; + plot_label = parameters.name_label; + significance_plot = parameters.significance_plot; + clickCallback = parameters.callback; + plot_scale = parameters.plot_scale; + + matrix_plot = nla.gfx.plots.MatrixPlot(plot_figure, plot_label, statistic_matrix, obj.network_atlas.nets,... + nla.gfx.FigSize.SMALL, 'x_position', x_coordinate, 'y_position', y_coordinate, 'lower_limit', 0,... + 'upper_limit', p_value_max, 'color_map', color_map, 'network_clicked_callback', clickCallback,... + 'marked_networks', significance_plot, 'plot_scale', plot_scale); + matrix_plot.displayImage(); + w = matrix_plot.image_dimensions("image_width"); + h = matrix_plot.image_dimensions("image_height"); + end + + function plotProbabilityVsNetworkSize(obj, parameters, axes, plot_title) + import nla.gfx.setTitle + + network_size = parameters.network_size; + least_squares_line_coefficients = parameters.least_squares_line_coefficients; + negative_log10_statistics = parameters.negative_log10_statistics; + rho = parameters.rho; + p_values = parameters.p_values; + + % p_values vs network-pair size + plot(network_size.v, negative_log10_statistics, "ok"); + + % least-squares regression line + least_squares_line_x = linspace(axes.XLim(1), axes.XLim(2), 2); + least_squares_line_y = polyval(least_squares_line_coefficients, least_squares_line_x); + hold("on"); + plot(least_squares_line_x, least_squares_line_y, "r"); + + xlabel(axes, sprintf("Number of ROI pairs\nwithin network pair")); + ylabel(axes, "-log_1_0(Asymptotic P-value)"); + setTitle(axes, plot_title); + second_title = sprintf('Check if P-values correlate with\nnet-pair size (corr: p = %.2f, r = %.2f)', p_values, rho); + setTitle(axes, second_title, true); + lims = ylim(axes); + ylim(axes, [0 lims(2)]); + end + + function plotProbabilityHistogram(obj, axes, histogram_data, statistic_input, no_permutations_network_result, test_method,... + probability_max) + import nla.HistBin + + empirical_fdr = cumsum(double(histogram_data) ./ sum(histogram_data)); + + [~, minimum_index] = min(abs(probability_max - empirical_fdr)); + + statistic_max = HistBin.EDGES(minimum_index); + + if (empirical_fdr(minimum_index) > probability_max) && minimum_index > 1 + statistic_max = HistBin.EDGES(minimum_index - 1); + end + loglog(axes, HistBin.EDGES(2:end), empirical_fdr, "k"); + hold("on"); + loglog(axes, no_permutations_network_result, statistic_input, "ok"); + axis([min(no_permutations_network_result), 1, min(statistic_input), 1]); + loglog(axes, axes.XLim, [probability_max, probability_max], "b"); + loglog(axes, [statistic_max, statistic_max], axes.YLim, "r"); + + name_label = sprintf("%s P-values", test_method); + nla.gfx.setTitle(axes, name_label); + xlabel(axes, "Asymptotic"); + ylabel(axes, "Permutation-based P-value"); + end + end +end \ No newline at end of file From d39c1f64462eea6590d5c9d545eb2193d5a923e3 Mon Sep 17 00:00:00 2001 From: Jim Pollaro Date: Wed, 23 Oct 2024 14:43:58 -0500 Subject: [PATCH 3/5] delete some unneeded files. Update diagnostic plotting --- +nla/+gfx/+plots/DiagnosticPlot.m | 39 ++++++++----- +nla/+gfx/+plots/MatrixMenu.m | 3 - .../+result/+plot/PermutationTestPlotter.m | 26 --------- +nla/+net/genBaseInputs.m | 2 +- +nla/RankingMethod.m | 6 -- +nla/rankingTestScript.m | 55 ------------------ NLAResult.mlapp | Bin 32158 -> 32372 bytes 7 files changed, 24 insertions(+), 107 deletions(-) delete mode 100644 +nla/+gfx/+plots/MatrixMenu.m delete mode 100755 +nla/RankingMethod.m delete mode 100644 +nla/rankingTestScript.m diff --git a/+nla/+gfx/+plots/DiagnosticPlot.m b/+nla/+gfx/+plots/DiagnosticPlot.m index 44093a06..5f052f5b 100644 --- a/+nla/+gfx/+plots/DiagnosticPlot.m +++ b/+nla/+gfx/+plots/DiagnosticPlot.m @@ -24,30 +24,37 @@ end end - function displayPlots(obj, test_method) + function displayPlots(obj, ranking_algorithm) - p_value = obj.choosePlottingStatistic(test_method); - - obj.network_test_options.ranking_method = "Eggebrecht"; - plot_parameters = nla.net.result.NetworkResultPlotParameter(obj.networkTestResult, obj.network_atlas, obj.network_test_options); - vs_network_size_parameters = plot_parameters.plotProbabilityVsNetworkSize(test_method, p_value); - no_permutations_vs_network_parameters = plot_parameters.plotProbabilityVsNetworkSize("no_permutations", p_value); + p_value = obj.choosePlottingStatistic(ranking_algorithm); + + plot_parameters = nla.net.result.NetworkResultPlotParameter(... + obj.networkTestResult, obj.network_atlas, obj.network_test_options... + ); + vs_network_size_parameters = plot_parameters.plotProbabilityVsNetworkSize(ranking_algorithm, p_value); + no_permutations_vs_network_parameters = plot_parameters.plotProbabilityVsNetworkSize(... + "no_permutations", p_value... + ); p_value_histogram = obj.networkTestResult.createHistogram(p_value); non_permuted_title = sprintf("Non-permuted P-values vs.\nNetwork-Pair Size"); permuted_title = sprintf("Permuted P-values vs Network-Pair Size"); plotter = nla.net.result.plot.PermutationTestPlotter(obj.network_atlas); - if test_method == "no_permutations" - nla.gfx.createFigure(500, 500); - plotter.plotProbabilityVsNetworkSize(vs_network_size_parameters, subplot(1, 1, 1), non_permuted_title); - else - nla.gfx.createFigure(1200, 500); - p_value_histogram = obj.networkTestResult.createHistogram(p_value); - plotter.plotProbabilityHistogram(subplot(1, 3, 1), p_value_histogram, obj.networkTestResult.full_connectome.p_value.v, obj.networkTestResult.permutation_results.p_value_permutations.v(:, 1), obj.networkTestResult.test_display_name, obj.network_test_options.prob_max); - plotter.plotProbabilityVsNetworkSize(no_permutations_vs_network_parameters, subplot(1, 3, 2), non_permuted_title); - plotter.plotProbabilityVsNetworkSize(vs_network_size_parameters, subplot(1, 3, 3), permuted_title); + if isequal(ranking_algorithm, "no_permutations") + nla.gfx.createFigure(500, 500); + plotter.plotProbabilityVsNetworkSize(vs_network_size_parameters, subplot(1, 1, 1), non_permuted_title); + return end + nla.gfx.createFigure(1200, 500); + p_value_histogram = obj.networkTestResult.createHistogram(p_value); + plotter.plotProbabilityHistogram(... + subplot(1, 3, 1), p_value_histogram, obj.networkTestResult.full_connectome.p_value.v,... + obj.networkTestResult.permutation_results.p_value_permutations.v(:, 1),... + obj.networkTestResult.test_display_name, obj.network_test_options.prob_max... + ); + plotter.plotProbabilityVsNetworkSize(no_permutations_vs_network_parameters, subplot(1, 3, 2), non_permuted_title); + plotter.plotProbabilityVsNetworkSize(vs_network_size_parameters, subplot(1, 3, 3), permuted_title); end end diff --git a/+nla/+gfx/+plots/MatrixMenu.m b/+nla/+gfx/+plots/MatrixMenu.m deleted file mode 100644 index 88bd7cb5..00000000 --- a/+nla/+gfx/+plots/MatrixMenu.m +++ /dev/null @@ -1,3 +0,0 @@ -classdef MatrixMenu < handle - -end \ No newline at end of file diff --git a/+nla/+net/+result/+plot/PermutationTestPlotter.m b/+nla/+net/+result/+plot/PermutationTestPlotter.m index 6f9efe0a..a21ec8ff 100644 --- a/+nla/+net/+result/+plot/PermutationTestPlotter.m +++ b/+nla/+net/+result/+plot/PermutationTestPlotter.m @@ -85,31 +85,5 @@ function plotProbabilityHistogram(obj, axes, histogram_data, statistic_input, no xlabel(axes, "Asymptotic"); ylabel(axes, "Permutation-based P-value"); end - - function plotProbabilityHistogram(obj, axes, histogram_data, statistic_input, no_permutations_network_result, test_method,... - probability_max) - import nla.HistBin - - empirical_fdr = cumsum(double(histogram_data) ./ sum(histogram_data)); - - [~, minimum_index] = min(abs(probability_max - empirical_fdr)); - - statistic_max = HistBin.EDGES(minimum_index); - - if (empirical_fdr(minimum_index) > probability_max) && minimum_index > 1 - statistic_max = HistBin.EDGES(minimum_index - 1); - end - loglog(axes, HistBin.EDGES(2:end), empirical_fdr, "k"); - hold("on"); - loglog(axes, no_permutations_network_result, statistic_input, "ok"); - axis([min(no_permutations_network_result), 1, min(statistic_input), 1]); - loglog(axes, axes.XLim, [probability_max, probability_max], "b"); - loglog(axes, [statistic_max, statistic_max], axes.YLim, "r"); - - name_label = sprintf("%s P-values", test_method); - nla.gfx.setTitle(axes, name_label); - xlabel(axes, "Asymptotic"); - ylabel(axes, "Permutation-based P-value"); - end end end \ No newline at end of file diff --git a/+nla/+net/genBaseInputs.m b/+nla/+net/genBaseInputs.m index dcf594fc..bd7c0058 100644 --- a/+nla/+net/genBaseInputs.m +++ b/+nla/+net/genBaseInputs.m @@ -6,7 +6,7 @@ 'full_connectome', true,... 'within_network_pair', true,... 'prob_plot_method',nla.gfx.ProbPlotMethod.DEFAULT,... - 'ranking_method', nla.RankingMethod.P_VALUE,... + 'ranking_method', "Eggebrecht",... 'edge_chord_plot_method', nla.gfx.EdgeChordPlotMethod.PROB,... 'fdr_correction', nla.net.mcc.Bonferroni(),... 'd_thresh_chord_plot', true... diff --git a/+nla/RankingMethod.m b/+nla/RankingMethod.m deleted file mode 100755 index e4d2c79a..00000000 --- a/+nla/RankingMethod.m +++ /dev/null @@ -1,6 +0,0 @@ -classdef RankingMethod - enumeration - P_VALUE, TEST_STATISTIC - end -end - diff --git a/+nla/rankingTestScript.m b/+nla/rankingTestScript.m deleted file mode 100644 index b4aae69f..00000000 --- a/+nla/rankingTestScript.m +++ /dev/null @@ -1,55 +0,0 @@ -import nla.TriMatrix - -root_path = nla.findRootPath(); - -tests = nla.TestPool(); -tests.net_tests = nla.genTests('net.test'); -tests.net_tests = tests.net_tests(6:7); - -fc_path = [root_path 'examples/fc_and_behavior/sample_func_conn.mat']; -fc_struct = load(fc_path); -fc_unordered = fc_struct.fc; -functional_connectivity_unordered = double(fc_unordered); - -network_atlas_path = [root_path 'support_files/Wheelock_2020_CerebralCortex_16nets_288ROI_on_MNI.mat']; -network_atlas = load(network_atlas_path); -network_to_remove = ["US"]; - -[new_network_atlas] = nla.removeNetworks(network_atlas, network_to_remove, 'Wheelock_2020-CerebralCortex_16nets_288ROI_on_MNI'); -network_atlas = nla.NetworkAtlas(new_network_atlas); - -if all(abs(functional_connectivity_unordered(:)) <= 1) - functional_connectivity_unordered = nla.fisherR2Z(functional_connectivity_unordered); -end - -input_struct.func_conn = TriMatrix(functional_connectivity_unordered(network_atlas.ROI_order, network_atlas.ROI_order, :)); - -behavior_path = [root_path 'examples/fc_and_behavior/sample_behavior.mat']; -behavior_struct = load(behavior_path); -behavior = behavior_struct.Bx; -input_struct.behavior = behavior(:, 10).Variables; - -input_struct.net_atlas = network_atlas; -input_struct.prob_max = 0.05; -input_struct.permute_method = nla.edge.permutationMethods.BehaviorVec(); - -network_input_struct = nla.net.genBaseInputs(); -network_input_struct.prob_max = 0.05; -network_input_struct.behavior_count = 1; -network_input_struct.d_max = 0.5; -network_input_struct.prob_plot_method = nla.gfx.ProbPlotMethod.DEFAULT; - -clear fc_unordered fc_struct behavior - -edge_test_results = tests.runEdgeTest(input_struct); -network_test_results = tests.runNetTests(network_input_struct, edge_test_results, network_atlas); - -permutation_seed = 1; -number_of_permutations = 100; -permutation_edge_results = tests.runEdgeTestPerm(input_struct, number_of_permutations, permutation_seed); -permutation_network_results = tests.runNetTestsPerm(network_input_struct, network_atlas, permutation_edge_results); - -% These results will be ranked with the new way -ranked_permuted_network_results = tests.rankResults(input_struct, network_test_results, permutation_network_results, network_atlas.numNetPairs()); - - diff --git a/NLAResult.mlapp b/NLAResult.mlapp index 722f89949adbf6026ea1638e596ff741db4d4cf2..91f4a162166236123b89b2d1de391ffb4960df0a 100644 GIT binary patch delta 25508 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 delta 25294 zcmV(rK<>Zv`~jZ(0T@tA0|XQR000O8wSt>e$XeRtcUk}ds9KR2A%9RDOcO2&2^!pk zI|L8z4#73J26uON3vR(7SO^~6T^0zixVtTGi!KX$@}BSfx&LmDPfbr(P0e)obUiAP zTFR1ARJ`n;sZ=Dj*sSdwtyrnl9nCzgUEH07sN|GY^(6UtSgEAlt;{^FEU8?ag{ZV_ zy{II;Y^b;dsW^FrIDh$sK66rWedgk!`u|BwtZ@G$cm)-#e~tIQ;+wy3@$H*0{IH|M zB>b>4I(GkuLv9)~b}H3rAln#FX^Mp@y3)dICvqao+HQpu|R)WiORh zK8|YB=O>{T7#d1Q)zm#M)6lm{C5OUT&`hyrmj#bqYG5I<6^Dw^)b+J+68lHv#~}e;fDuSkIK6 z#88VkYP!ie>VJ|k#JGR_74;_TwTTa)2o$0wFi(HT;dOK{p*m3=Yt3PKPvN!0TP;20 z8q;|d^{~-e7N@*_TXDYi1;4^Qo+0#;K35Q<si>e72{ja#WjDe^=x+yPadA0^ z%#2r2bjf7BPe&pYai${+9%*Z*%#Sw%=Gp2+1vkJHXV)rI3FAfXX8UB3>am zD6&_cAg>D1iuOdtZ@;q3!f~UbJHxw2Zx10i?GAf#p?WL%Ye$7Qx)4?H*xH~8q#Ql; zh}-tZ4EySV*$dbD!?JJa0s2kkD9_K>w0UnR^_^_Kl=ZgQO62MchMw6dTlH}iKM%BK|I^k*4_A4H_Ii5zKp4b%t>7hn70vih6Stj)Lr8C~q}<*juB5TQi?F0QyIER-Ctvb|XC(wMBBez+NX1An z7y9fuc*o5HPNpix+7wPn7c=N>ywA@;^Ohgiy(2b67AV`hG#P zyM9~A>T@WwB&9FBv@>;!qx%A}w|}@J88PemRBjb1*+j#omnl^<`7uPd8H`~nZg2Gq z)NL~_ZOxC!UML7Y+}kgQQPASVZx%lvx9j#9Ynwo^q+BcCZ)g6VF1T+CREocdP{U7d zJhag~(XV5*+;aZ}{rS)=)I)Xmv)duf+d}9}WBhq~3>EVp>q$7a@9RK)E`LCZ!NF~4 z+hEh`HVYgJ3qBP(hY?ut5y z0UdJIwCTR2+7Kq#M_jS5x#s-FvZp$k7R=mKkdduOZqOR(p}znu1yCAH^wYGAmyQ^{ z2TwT7YC)SE34*_pAy@gH-+vtRq?6ka^5lQ}%GPF^5LucM9eH7Ef* zk{vJp{Q6w%r~%45t;&kMI{YY>vB12TH$v6cxO?{wC+4m{&XzI_Du4aXkoOExkRa zJA5uhJpl3Q-a(7@Ei_&sm6ya`AzKr59Je6g!X^;5xa|0r&@YROBBzmzbD}{=KZnPq z8n`N4;-1W<_6oyE#_C3y7Z{oCcERYb4)tk?)-~k>;fg9gzh-|^Sn`!1du^AL!JVMA zkm~&1RG=v7Ab&IMKuq3NboR9P(*o~!#c_snhqFX+tj7iMl^zef;++f!&CRD&Jx#Ic zC^{+sXQIyIUc;l2GLYa5xLZ;!HxFMNm{gl<;XenwX(`l25@nG9P9TU@scxxDV&ahr z5gQuEdCtPcgtrsJlEOkLu7PShYRgQ+(#4u-nZLg-g@09IQM@k%@QH{v0Ft}i66^xM z8@Z(ikG|xEJ<{(4+3g@E{#-B3Ba-4UJ_`N*X}DfATCR#SsVTWLXDgkDyt2+KqApKj zc?z`?1#Q9~vK1OYzGLFjznIPEs|&xiNYY)^dxh@X1m{AygQMNa7u1CA`oqCf< z8EUp8j(-4+!SHJZ>!$NqG22uFYat1CMW~M-RV^yCKo7j{=`Q&_E6~$fz%t_DzxM0{BA*u{d%y8SxnMYjZLI5oXLAu>*QMsQ zRez}ZI_Pzb-b}_UFJ0a1)T_y`6;jUFp09r+hYb zG5ZwvPFwwqld`V5YE_FgZ-&-~sK*VhK%CfDD751J?T>;HX|b|icNF81)Dp0_+quDW zzj0_to0oUN{Fc0VvLY^#P3)c<=H{82gMTV8sA1Tos%^aaeNf@&oPE2uK6L06JnV(! zjb@1^qDPwsfdbblKtnl)OrRh!l5-+D7D1YeGObAAH>(B)tCXfGRRuX~^Lwp=V`D24 zS_*;1vCd!pMqqwckX~NL*CH<`@Dt`v&r82Z6}GrHiTL;<7GzE!gv2!oe%cLVx_`1| zWzeidcMm!)(}Otg1F?b%BWd)pNs5grTSx(bt*x8i9^3O(6GjL2x7T3NEk$ejBTUs^T&14fgVic=0Gb z==!JV6XQBY90|#?TY}ul57W!XUw=Wj#5;aSw_oINlIhKhIeWT7T!bx6YYA ziqP5zmDjvQJ>*?L^0xRz5CpK`Ro|oldr>vU(AG{Lbb()f?Q`xYji{SmZi6Wsv{EfU zaoHWA4@f&5@V@TXa>q|)F7qyJ@LNuy{BIcH^t77YO4v)imf)9fm8*ccj_s+U_@df5 zN-TMauO3ip#R?$++mYTpWPfd`jVY-D4#d>Y%##Rcv^ZF`{a@}K|BF~>(8_Jux0qI)-Tfq}ga05`Dkdq&5hShJV_pC_)^ zHI8FEENJ?2+Nrd`j^ojtGAt{gV>z%YC{ol0kn}PV?Az<`+pML2P%XC?-#&{%hEsA<+;+zKUU)k(lzpQK3twVEVtd5!Smc;JDlnBAo(qI?)OlpBIdyXN zfp;#tC=6IMBfQBn;D4lfML%T1t*+Qd_Pq<)G}oOsf0bcswA?R91D<(D?#*8_g%
Un6@tC=(8<4IMe_i2@A1rBI!jql8w21d3795egz+h`}LLqrtq>7Had{xi^R4! zcVG3m7}LSSG$2|!P${k;=sP3vy+<`2i31DUex0{LG^~Fxgn!`1w7?=+(qRusO1OcB z^7wAhYOp@i19LZ@W#?mpa-j>WfDO*{>bq$G#EFB@7|&~Xg$De6K~0LGnd``nuDK_RMoc32D&Z`?7G6wv+i>Ysk069;raxmp|a3_PkrxHs%%#M*8=c}3-=oWdM zY`tRA=@Zq+au5fn)womJ9G_ftB>SX^z1FBj?F20SRv+AB zFh2b@XzkiT?M!7bqP=n<^jnwTdO-J^(jL9AGH<0Fe=!PeT>|xGFYSx7y7x%C_q?mZ*z^=V9Cb)PJt*PsiPbT3Zc-){|mEvIY%O;jQ<(TL)Vrm@4)!G|0_ z?q6(QgUy1(Ox*|WlM)6k`4mSLKYC`*U6|n`vI`c_Rv7fCnZGp`$ZdXsw&C>MbP(l} zySxOo0+RIpWXj~UvEjO~C^OyXUlI3KG=F3dX(j@sMJSdWlFOuJoq=?+c`g&wXJ-f2 zq9XGF{sRQ!J(WWHK!&RigZfOfFmC_hBjTUa&sz-jQ>NJ;DKUP%OOD`4U1EYL8Q;Fy z5BMdy7SiS?m6ZsuloogvdX0x7N;70GgVxTzn2k+Qqtk(YabM{dwmEq`yr%<3;C}{y z8VX_$$s6&UMt_NX{wShGGsK;4SgjNEW;gI0>MBM>X4?dza-5t(9?!Uq5M$0rl&*V^ zly3JvTs>RLmamy4n>-H_zN+lV7!2jCiQ)M`30~zhY%G)iDq~J?jx(D3tU6RsN&Uyj zLib5|sB5OdUdLVRp#dBxNKZ8DwtvOHWQAqevnC~ANdJ~$``!@;x#CrRbg+Gm8ak6N zgkR}LS`ib}eY#6%;8QJA*Aet3`1@DWA`KnT2cDMv`Ke&QyjAMmfEX3UEOrB3 zH1>d^1oehDQ`Yx*opVB8?tk<$vVi;xNWva^Chd zj_JzXE~W+^eJV{eEHk+}cqD~(5kd(f`@*lolmtvxtca%xB0WafZJaZ`pY7+*1SW#s z-4yh@%SlEzxeWNlx>C^O*ZtIRd5ZK7ey1C)JAV$O`#^%Syu2vxNM?Ud8B6 zAo_{u`NotmKPa-vG=J~L;yeKxy&5UFi^%{`uM{3RbHI% zfcSTh-nrvhOrZ@hrTqoTA0nNSjZD?-htR(Aij(#@OBOQw;Jm#oB^GA9vx?i?X4ZEg z#7)vnOCkjrF|DV5b3l92&nWYkZF(xgwaIrY(IXpAN-x@!4u50hGIj$Yw5>R4+T$d(_j=>b_L5nzUuvfkN@Q2 zi&(e|n;L}S-hcFY8a+N_>(r0VZ8Ms8ELIGeP#TJRBJJi&3VeB_QBZ+4er*iVc3<1G z#n`QxN(CcE^eFVM$!C5qeRz%a7POtcugV0^JD?TCJar2O8hR4_n9&*qizI$lDLNH_ zaf*O&fY0S39NCslGTL>I^@RBV6p$MRAg&?uvdBHoYJW@l6g~{_e%_83r2RaYDhlk` z>O2LHh5r}nkrD{|8KBXf#d{t@tgDMNtsPkkZYtH-yq#j+Gn5UqFwOW`Xy?g|lAYpS zXkqk1o0tEeeMWRw_1Ndp>>UbD5_#qpl;qyyluj zlV3_t7JtFn3ict)r$qtDqXI^piDtk=ionPD-!`M!h~sWq?k+SHwWhsEzIC)+wQ0^t zDhnyhxbO&&OeE<3a^UI#otN(B12?`*Va1^7tCKDNTK4aPt=20IKhR$AD9%zALon-(fWug zQtcCbs0yMp9ltzp_?p7 zbUYg@>1Qtm)qI&V061Za#<{A|Y?xzuO%v6fS;xoU&%~|Hl4XS^!uWy9d zB#r+7n-8{SVQp;3x1TrV4gERj@DhAnldQn)8-244NG7N1{swPC7$f`PbMB-HydUAG zzB6X#B$ut+4Db-$W!2InCE8XIeSi1=)bymj+J8|K)2d%Gp^9|aQlkA5dP}5EDh3E; z2C|B%Otmtl7^uHvbn@a}y_XYx&izLvs!{G&&^DgodLBnxD2pjeDN9`(uj(Fmrvwt? z{#cH9TL<^?U%@8X7wlWaZ>$k@5x5>Q$%mN}GDn7H9uUO5%D3zvjZy z(03<5T(6YvLC3#l*!bYYBjwkmVTq}o7WG1X8a=Dic8rqwTk;v+AH-QoiQ z6j#X(C%jobMT0Nq54xsks{ykRdtwvYenWcSYVPa7Psi(O9hC14tth%i${tDea06ZO z+l_nJjpm5>LZ2nNl&GMUsFdko{MEc_k82N?$$-Ut6?~-_8 z$FISQG$cK7nhNzP+$mu6C8Xmwb^dFbL{GEKRP3CVm~GdDDS0cIEOAv8q%44P0& zf2Jgu1in0zaZOrX*<5cONdK<2IG{8$mUROQ5I$OzznhIagwyOGWLI@n#mQe^ZJYHG zeTxcvq}~nE%WJLYM}Loy=iK!Oh+CXB?;AEjVE5qMtqjHRO53)e_IdE5%!X<+f8-Li zHf4Z@kUp8>yy-@o$}vE`o}VD!5uHF@%UDI9G1E=RB;$F#MGoIXwB8dih|Jn(ntjNa z@Mx~!?FHz6G75(KQ2`9{MG_fll_{%?f zh$MmHk)CILv2I(d!UZpX9RYAg(5mRo@$g!QhZ6QG`B|A;CMUQ|b$?^r`Kw}bX(i`_fIOtD6`#@Ws}B6;krLI#E7*~(~zOanBLu#cdf^` z(nKZLFMVf&wZF2-N!_tO>g>Hv9mThha|yw|KFMnr{C^z>D+hAVN8d=2ndHouEQM(Y z1kf6~V1dA?|A&$V%@ghN{9j@g5j&3fYiIDfWL?PedGVfj6U{4eF-@{d@!`9kLe-gn zmwixR1@D51R=b#9PP2zq-G31}D#2_Pu(EIONp=lc8kMkgTL%ilc+H#}c%AA5hSg>y zlTW{0n}5^ja%~o|QVt4t-geUpUy&R*rTI-sy?pyJp^4cVnr@k~&$+tGzT06~mR0F& zHo=^pRkHNmLI3z`QVoM~%j;LVpYu8mI?e1C0t4Ae$N#LUj~y4LsB0 zNcsE-peb}gMz=cwzteBn1rpbELgP+|iZ9~|MY`JE$x!?9y&zy6JV1-FIcF3^_z*o4 zaMBI@ai~utq7-v0a$okyu94|4=v){ogV%ncLjU8$kIY{%L)fS0ROAkKphL#B5sXlM z`hR-o_M+$HGTD%)m+huxS^oX+sP17~5Kr2RM?#Q_ebv7skhUXdDhm7!T9WnpmM0zo zg)bd_ew{oAj{xl{x1P938~Z-z;MS#HA~fW{y_ zg4aDgO2ICjMUKkWV44zvw7n*+71=qE}BWW~otddt}c#iwz z@!-<$;MD|ix5~&s|M?t`mfM$n*nHm`^8Z5Oo6i4~yXsn~K_#MAiXu)%hyFk1K7WZs zt;t(yX9JF;!qgkGSBCdHNF# zkzQjXMRMO2bV|^M!Gn9;3;vR0r!eZJ`i{dycg}{-ZTE@39Txp!4%sw9N>XrD4hMUF z6E2y4SNBlVKu@?TS>`Gqpk1(RTz^;Pr4vMBdGP7i$orO4hmUJV$l>Mt4xh;@qHZjp z8nuEMR~2N>b$I{fb9iaDl|1?-iS7{h>n+^wHUzACs=Hbl-6wcWrTGRP3IxbBB-crn zdZl!&NxOu=);@qxDI;B=5!KWc&2)mQS(JAsIz0o(EPzN~H!$f1#8-^0yMJ(t0&9On z{j5UlJ@6O(xfn#rhjZnIxkV7}L;oJjtq`=cfT}9`o)H7#kkpM%bY$nd)2$;Jk=6JM z7jlKHs{yeljdVPT(#?q*@~Ojc~R2a}F`8QEN&wSue8PAK1GeeCcwUs9C%DL|jK$?oWAPJcYm%RT!g~AX&27^n=@3}f5UlXJj}c0#ZLv0pM=e(&;XaTxe>yoVGp4lPfx_DV z{!6aEsJ!_+ntJMeVB)b);xT`XsC08_ZCo<0bFjXUVc08vwoSCs; zn{YJqcYL_WG6v|DJ|9=J&c76a}YQ+1<7`s~C^B6W_$ z%)J@g0!Dr}jenSlO`L^LU>71sGA8xF2UsZWBAv!!+j*NoRz_dFT7tjzKB#Y-Iq5e#aSp_2gytW{1C#0Llpi{16)UTKt!nwn4cbI$ z>#9q8>VJ5BD}Bs9maios-!Cq$-A;dT$wvlOwYioF*sU)hOy1Pm*Q$4KFp4~)tu43t z+ExcGUsilky@$}oxWr#OWjcToYrVk>uP$yc?88Xxn!q0@KuyjU|G{wf7YR#}PI-|l z+^tRbiw(OLj6W?6E4Dv8#9|-VOO`PQR+)6`FMqb&U4pvWdNn=!40T>1g*!W7`?&;yJ3r}?mMgOjCPvhnLg-3AWesGq;hzw%$$(k~ytu$KM zQLN>gg=NuS^$7}Gp-c;hgE>Kt`T*NkH|((VaQlmuf%OArJwY@#L)Y6p)UJGn!b&lP zB7b-T-n-Er>wn*Bu)m2<#LfnlfXM-gqI}eP=4d4OHfTpNoCUS6nXU9nj-re=Y5mWv z-xzYzpeHuc9>qIy5f{j;2^nuGhueNJY{T9waq<4}LC40=Vo!t$D6S8q6tqUZ99_Sv z0OpoMK=aT2&*GF%l>ZCFZ2$A{vBj9buYY|fr1SmBj1@2ADb`MsMk66AtLTv>fgo36 zMA9OZ(qwb>tn65SW^9^9!%Xp_N09CGu9 zSjA|f_ozt`R{m%*68MfEgZU(WB&#K@vo~A~p~&O<8C}dqY4zUjEf7g;8w9I9Gk@gn+hr^|&xY@UEIp?sZV5?C}Z|!k& zs~wJlB&FELIeZgBp&`FNB?Dcd*X&dxQQ8O~kwL*^SEPqK9)U;fY0*dvkAEV-XCTdA z56ppbX3{fz^k@>!WD+RVB-A*sdQ;rawT?R90R?boKA$yi{uZ1nQb`3>JlSl=Lha`; z-i}Ye#LCgg(M$FeBE$y1+cWF^Hs8!jkZ@%j8KPTSx@l4~*k{wCJR3%&NEpE&|AMy& z-aI)jj#Cc5#=qMTBp2mNE`N!8s!6!#)1sam{x?mUiJNweyo@n#{EI_E~ z)o~dj8;UZ?iKnnvZrTlQl*jZy$Io?J;tMM`aH}_PClBGVfV4<4UY8WanHQzKkx6Py z9*MMciK%&#g}r$iB@+yjjLF9dec5nw~p`U9pCpFk)FT5Pd^%hv9gEQ zKCQ?0iB`1hIV2)G%!hyVhdnjh7PX{N{k)mQymZ$v($z15R{+K*Yz6dSrYm1AJVec&8G0Hb z7G(3hYhe_OjeqZ-qS;#<&`qMQ*-$>}dROOk;|QVWuJof-YF$ZV{^@vToZ>xJlL}V< zeR&Gu@R~XcROsNz!yCl^gq+x#>tC5%s69HJbz}v5sloeb(_O)2Z#w&W|8mZu?c_HJ znbiGz_zj$Q8FVH}(&G%XkSs1QQ;KJ zTs3t^>fsRJ;iV=1$m4x7O@8~zFz4*CbYZ=Rb{g{Cx3Dn#4RW*wfqcH~^lObhH(;$R z`Z#mztA9=nc)hNOu8(*UVmw2xZn^ihuyO1W)d=zYeSNiN zpcW7e|Msb5URL0e>6i>5q|i%Q*QW2kyWP`Z404-vY=ISO^d-QK0pc7%f%gt-L#DD& z?O}0~J_cyS=?`|(ENmd|(z9w^UE{T2)X~Dr1Alc}06Ae-L?m0I`1Y5;_406V``Pdh zQLW0iiIFnml~%!Kn{P=Pf}{TBF9Cyh_x1-7MXSLyqDKKcku(s)*m_>^SLv?_4X;<< zM+-~N=2t%EFBJqQQT9I?S5XM>jkoiM-7}m@ni= z_kRG+U$uh;dPSHD*8w7c*=Ikz)$&3Z;(wN*C*#6?{WE@aL0W>wM6S|I(XMaVC1RvR zYouq`Tt@$c4Z3c_g5K~Ck)WB&ZFZY1{c+0pfX)$$1XRr3*n^-g4-)_iIp)5bJxZea zL<@exCmvY=pmb(z%#{EAS?*2kZ~~}u#(%zW#up|j5?$nGe>@zp@3&Q2tJ`X_ej0E{ ztQ7=Y0-Vklm@V=<;w!6qS>k+=Q&hq`8?>NbsRMB_X~ec!mZE7yT{C@*vZ%OxevnviO_oCZ1^IH^rF}{iqozr6v1qMxfVgEBdu?UE#wzLS=a{q1QO&$S zVsOOt9~cN~pV&8k^})5i|4r`)S|yH}+Y@GwY+5k4vSxT}u{>IaS-~FLgj+X2`1^uS zxn1;z&qLMxhD~S)($hVe51SB?1b=8S;F&DYfNgbJo}@F>ap!I7KA^dHqHL|mceAjK zX-7HPO{Zb!2l%kitr16R+q@v*-ND(g<@#rkFw9}<)ij_JK`86Qy60o2LT@bf@UNGSG*+CxeD%M9$mGVgZgH)+o6wiUIF~($1s3a00cR)qj6qaE}9H zvC$&G7yoiikFP8=<$)QPKjbHHk`VysX|%oSaNor!b&5Om|HbvL!2J)`8;*|Mk1~8N zk*}w|lctx3a`68^yTkWXdrXxhIVXOVvi>=K^p&!Haf1FMm9jZ;f;rl8^f}Ld{u1>5 zN$MBqffAw=@(-$S7}v#uLo{y6p|SwU;r?>R)mx)h)Rt5eU3bi;d<^CssFLuKaFX zDFTSAhGxVVVfiH#3{`GmDI6{)KMS59k&t1NIbG3<~6UbPxsftghP zDZLiKyg=aYqaD`$`AT>|Fqjoll;W!dZLQ%4b;8-I34y#qY4zQo2QNJ%I}Vdv1Dyq3_kB+>j3vt zSb@~v`q=iyKLDE(Y$f*T2y3$FQVDP{N_e{x9jwuo8TNa}{55CcFq8ArhMAR0oBIQBCP*Tq4t+Cb||<)`G0SAPI;U1_2Qr>r&_+C6d=$5 z&2#ct)-qkotoe^W!?#fVNIlGgRqWJHGTfN5qGCLTlQCQJd4EhUkZv8&tjBbGU4yde z(*Er#d(6aYqe%BJ_Y@BH^CcZSmsh6itHkflG;GGuM z|BSAmynl=waj8-nuAv*Y0AUZ$w$b2ZiIQI96W2DRSMH4dq^g~oMz{)P z`DHtb&5}iGR2olo*ZhFcI}vTvU2ar6A=iK|rhh?o(K27kDNcJaj){%@eY|Lf*hlud zDzrH4*-|(^An&=N{6Zvtwchy!N{rgyd|m?&Z!O?xkPv)n1_^M3pyrOmf%Vqco;vQF z=zl0S)q%On_@YZ+S$|#j&~fdJ@*G(ZAA4+a_1GDF*7f6oSCx~NK9FQ+VfwkNjs)mj zu`0HQ*BT;I#aH5$Vcx^$M*N^xCxG3m*l04kZ&Y&r9bFO`qvo+;+CIb^)NUX?jxXVe z!EX2vdwGrSV(x?qcwa-AW~#FKV`q7{kbiN<8ylqy)9`imBLk+%iL`N1fz-|xPXy%0 zMc>Co+MHkNR6dn5I#DP4Nta;{zuMpFqvt-ffl(%bPVd8p3> z*#-aZh{&{byhLf;*}KnN6192f^V7iIlk)YEU(EUfY4qza;XG)s6QzOgVh8N1M1T9i z{!e`8BgLQiBPdI_FlbGN{(8Ff>iS5in%^HM+W6}Fqg1QqmD9&FT80=860YiM%C%C@ z)sumj%taneoVtN;9f)~2y1yfLswOkzX_r3m+Ur{yboB0JAXzpo8gbAx@F{O4_YAxQieWK-Ms zVEPiKnDj~F2&Yz*s`as!n~629(e_i-IsBy0ID_%Q)tp^^^j>K8sb~OMmeu=(;H8;rmd%)JyKN%~Ww;(snReFrEQ$7kMUfD1>s2 z&83^t7yKMI6asf)LjfxWz&7%>ImjW)Gr@-^uxU~ltqZiz7rIUMRy6ardkqVFaA|!S zy0Y#233ABvd%IUuK!y~sHGqX!djGC&TMu?)a-JW2hJS~W)rAjs~Mo!nRFK?i<3l(g>^7ncqS6vj%O zYy*Gh-JYgh0JMQWjekR5Mb)O-z#s2#E<{whLd4Y6!51P5{}!sHP8I>@7XpR*58vo&7Gk&sv z7Lo*cdQzeT?>}4F_lB@*fL|lT`g4P_VrU;maG~1vy#*ZVV1Kvf8xro0(>LrF-2XN1 zapc3jn&B2~^-Z#{pO>Wc0_LV{131;0JF&H&ztV0{nosvRcq(_o&IDydmL8B}NAm?h z$0G7POJOl&P_sEe?pY z*(1SIh(i=Rs(%-pdQ7RKOlBxtFXYYMNVDX0-fPI&;0WAKF6cEL+=>v_MFli{``hpw zAP2+3e3g>}sbRjwMZj{-VJL6V%wx)-qCR2BmGGTff#5e2GH*-1?dyE;qn%3_uA0D; zg1?Ey2yq;gNoPY^Rrra^OnyDrD}&%U&Z84h3>3K2kALaSI$sgkz7k40_aK*ZX-cv{ zZpJjkauu(REH>sx`n!h-@Yuh!^56SNDzpEQ59x;en*}z&-QpUm4EJt{^r zL0@lUQFw6gG?~>MmWY_f-<-+XYUZbPmrAaB_v4)L{fUo zerjZ~cr&W7wKnQIzP^%8RfcHW&hT0|chFZd=xqlteO)%`4T{#kVSlTtV0aUSn(9_?{4*&e>133`_LpA zv4552Oc~NAg3)c->F}rTe^nvs76(wu|1!&l)}OqOymHx67`vB2n8+x-0C@{GE!XV@ zMcjd$OS!6eL>UpnyaJcy1#{}@Go76nL(KZXTg%Grx!g$7f|%m5QnAbu!!;Lpb(oEc#0 z&mw??cydH=A>6A-+})Gk2Y*TN#niRQc@%yytL>5C%p^GWk?iT+6WJ4u?GgRV;JR{$MIgSCZ`>!9(Uv(%d5$QyHKCZBCC-&s~l_mBGjJbu`k{W`abB$>zAMyEy$rv??=+P^G1& zaHZoh-4H?nKCdLBHh+477O$uK@8Wd(XjM#ZPtDC41&qTo>)d=Y=aPDEx$FgNd)aJ3 z%^X3+9Kp^|YpB=JM`>}djGWF1Wl_A~f=ZX;im=;x^=G>>D34BX?kDja#OryjXS*K< z72at@M-ysjhZW_w^NP=Qwa{jb;5BCPi@Ae}ptPbjc@c}}ZGW4tyEAKCAOZW8GcFK| z{mSeKIx|mKNMN+}m#(nVXltFWu+(S^Kv$S*B-Vf3bI|`zj~w63E4EQcOP^dvqIzvq zbx}_E1~Y~whBjj;bz=9^p=-0d!061n-l0>z?>hCmvDJDX>@uZ!lhdy2>zp^J?1G)) z#+i2dCAODgD}Nv}m;u_O7y^cERUi8a2-s01>4IIub7SxpMe@szb}f0aDt`NAmmlpe z@JtQaDS&5Qx4IUtIt&j3EQ?O;-&lEfJs6fF`<8*i{Tr?!moWEwA&}UrOEhYdLtitH zXV)UXd{jW#Ji&uzRNxWLVgd7r2^pLjfjA-A>Yh?c#(%1XNyvm8KY#E|A?>}fO>dP) zPL)STl}A*SM|qV;W|c=vm4}LE0qp-GgUU-@9=?>qzWAbDh|h%l)ZAt%7Q0;` z4`8Qod4C9;en!CR$@I3d4g%-pyymymeo{2B%jAyqLAk=+q75v#wm}WSe8#WGDBHd{ z5_z_cT}HnJ`jSgh1XI#OmdE&)Q@4lDFrcqe%qHFOv5$oH@hd(#{7Pe{yNO9qtnO!$ zXG%XX#;vZO#nXfDSLrv#t?V&VP@?SUkdDce$bSa*QP}7+cN~}@4vZNGW{(3?#DT@) z!0>TkGfKB#kXUdkHsjqCbx-DLh6~y)M>v$l1xe6Y@|n}6kQNrn-$x6};18jKk=B*o z6RMM99&gW-zUlGIJGizY-MOG0Z{y7LasPyEhQ8f|zHMr%?K6e;sik0{xcA13)ieQp z3xCe%lM^F?CEzO}SzX&;GvNzdEl4a>L^0@h7{hJ6Qnv@+yRDzODHTEXqu%y} z^pAgrm^jV85aqSUpkC&^yG+?38gpq|>6<&?FH##d#a*5NMPWktlS1}29rwk5HUo-A z1wY+*WbY&v8*#E`37(@L6G`34AqJ&@zJDK>MHYvN#;gXT)MjNgraLq9N zy(9bkIh)(cwobTyafSKv1RLfa9zwOu1Dqjr_Y$qhqwr9k8q?NMIlw%L_ljw8YCS(E z#w@(ztnut!M?2ack7VE}Mpdzu!h^ty&EM$$;=Oibd^o_k@UdaUoZ`3go5n2X27kgo zXHQMq85{DjEzh&i58ZA=cmbOxH8+jT7kQt}IQ)n+^ZamTDHVK{)jZf2D@@3qZ>UB| zh)j@Jb`tTrGeSW`LcyEoHgpgCcrPDL9&e7@CzeoyvJ%|JznS{=bmK*5Oy48AM@d39 z)`e-6`(~{+hVQA8@+P+k2Pnq=P=78wM62fsONBG8SG-5SdSI%FIP_tE^$2_(DU%QI z<4;6+3k%F9wjuUWrgeLGQBCCH_;t9zLksEFd>y+w5Zxxsy$c9rEHbgxINX2R+NN&b zd`LF6?N;Ag1GpgUjE`=HP`(6*icA>=&9a{H0lgwZ-Riir<_Q)~8&Ptc8+|k%WA3N^dXfwSlDXO@$UgLT%gPzW*4aSgIffdFA!(r zHyFZ25Xk=QkWi@P9ScJoz#PkU0yUpjR$9z+gGV}Yz8Yx1YSo^hO?@1_S=PK6o(#+h z1o!5)Jc|}?W)cC_ayIn`E^8K?la7CoW0)BpX-U&$Ey1a@*-u>CB-`cK!g%2Ys2v4d4!*&z4t0@^y`n|+?vxPOR?N~ZT>!RUSm+>DgE@k`GSr89!mh^Kex&D{&ri6G0T-7O0?Nh=Ou3W)cqt6=)FwZ3tVSh>1Wo#E=*Q+jasA+nvpJ z7h2Ghdhr*aCw_uQj{F3VUQ9e{ObkE4ncW%K4%=>7mSRjNnY_O4y!X8~@6Ei|ZA1`+ zRy>;pd$dqKgy#)P$>^Z`yas<&u%OGclA+5*kXDdkJ->$M44x4xA92ywn6araES{&{SQUTSaQaIIpFe-?oLq}g9w)M{ z)BgB9?9h9uf@8s+t{1hz6tLlQBhiM&YP&Z^)VEU^0#pibi<|MUb$^8r;%Y|L! zoPM=n&DSV@56?-IgL6_I+E1VA$kd+Y=-Nq?*N_TTgDg6Q-?uow2~W=T(Xl3{dcrge zq-kl^RQdwa0oAHTECQAo}8ab%_V13%Tf-E0aMOc*7wk- z>Ez4Q+=64x0}$2B!dkR9L2!#6xG4@d<%-*H?^qh^g}LdhitUJ2*j0N?G(r7d@xUM8 z@CV%S)2JXDG9tjQhaNrx@xc)g9~uUOgG-5;aAF)z%pGR|77c&q99IgWiF%(qHr(>h zubiLzS~D|>oDE+7boJ_RoR_cVzTwZIbKly+)#bzZQ|OFx)$aWWCr9{h`=fR5vu9W7 zUIeADoyrh>JwoMsj1A}h1yRRX+-u1vrjv{g%Ios#nh}uvY3rVWG`sFq**E82Ge4dE zh#Ssr&Q8LwnlgWQ159;8MO*4}Mwis=+LM?)nBEl+z4tl2gx6ugR1Bc$C}(D24rEGI zVSM+$pFffDYn-Qz{x^XB7tlU+_nl3_woQexv-Q6odK>+3dH?&ZslNTM=was-&Tqm` zSV#J~l!3~T9=~yP_WS(3$JZaSe$B()5e|p&75ZLJGQFpT^4q4+2md`$cGJrA694rkpRhxY3`(Q36an!u5(z2-&VCXVCV==U$S z-}ha|4ix}X}!MvYZfj0e7qI^jV>i5BQN{PNjp?du9 z3gz)9d@{Fg77Qt)K%hcn3+Wqu3fzPW&?Fs~I|J(0aX4H5gY%<|{x9)m{g+7NE71Py z%XVP#W$(Vv`}drm-{(Qw)5x#-=NGGqjr-fhuR1l{-(5lg``^fa-}`@4XypGz=0E!n z=sey#_&-k-2F<&`_0l*6v7h9-%fi3)-lbT>|BinFvx`N=2Y)`QVl*Zu3knMcNHIc6 zDq+i)l2~k@7!zY)X$RP(-EF$N1o5JYCr=(da`aE&=+UG90EvHs7ZZ=p?98Oo=`LHg z3zUROUT0r--|v0QoA+k72LKR9)Pd+aqG$_nMmyyr9O2PIuX+%D=j3`ptz0iB*Nteu z3Wp5Fx6!#n;D6bCgU&0!0C@nxGWyM;c^_ElI*0z%!MyWp(SOru)`3msdIIxez5>wHyHUW8R0 z6t8wr8?QccdCcb!+gCyIfXVUs%<#POISNQVJLAV2#ebO(Kaly?7czhQtYF-P4=!&{ z6!7u7)1dsY5>`G=()ldbi}#N`*r?Z^An{dz_rAn9 zQ4TLg`4_OT2Q4k9ayX6VAusP{M+d031M|93E~K1;8^IP$;vs3UJ^Q+Lb3s$xaVFf4XI&Mb1 z>jsMvUpIDr?41(yU|ubi#?}1B{HukS6^?DIH^#VZ=cgd{G)uoYx&-~Al2;X+pmpHq3H^fQ;u-aeBGhf) ze&MGtA?QoE>KjiZU29Iefcd2yF6*+mJLP0O{b^9pH|VY}mCGS*Wz{muSeGfYzTt=8 zFW~pP<7eT%#hh@k+4@}drHk!LVY~-UQ-9m8>a=&A{vA2rI_;NNeEp139-ldI;b~+) z`~%+gna>&a{CU^skn0%^*;PGjqI$Luyz9qJP+LD1$fZ+1xKv!xsT`pA_>t$ zK;H320QsJlpwGC)uNmrJknc9H*YWr}>-_n#Q^`8~U4`&BL;K$P4AHFy>~tUf#D7jO z6q=ngh;D=C>L-WieC`j@Pu7>0v>m(b`yR`NTRl2D<#~V8$IiH*2lF2NWZN-*SbnXU z+7>GFqmpcFZ_6Xe@bpxDx0#5?B}|FQgfuld{jRR_y)5XF-Syz*#{DXt%Dzm^NvTo^ zb**~v2L${9cl=e9;s=ff9HL}pJqWJ);o0}Y{{W+6Q3?d)@}1_hW?M}G1b+=SGn2Pm zDSuIK!XOaGze>Yx|l5C;g0{G9|w2o z@*u0=2aFZ9$`FZS6oBG&DbzMY@5L&dqrf_*N>Djcp4^mMM9`w)5%wg|D11ueN0@N zyj9PMk4v!J2B{Le6i&_Ricc&Asg8X@XAH0Iy zSFXFa-)x8DG*Y>rs1#r1U2;7+`7fg?UIq#`_m?Jb7XSd`fs-_3D}Qg<%0|}1QLSw0 zBsr-ot%^0A0ZG`y!R$OlDUS2ow;Px@fZ>pm?D+1OicAiGMx(pY-Dos0um5o~^~g01 zBgXxml}&47g;3w&F7wAbD<3Wn*IulUD7Jmq_P9@XR(!rf{_)f6*|y7_WJ>**002MQ zp6#qm;yBn|Uyqy#oqyVq#RKX?*@%ZzJBFX(czwo0Hwd{yqX^(nz4fh)jc4mqoB1mU za>(6V{5KGPPDAm}d3@_pGTXkky`2?6jIONz^m;un7k}cPUjNtS-u~{z?xo||QRLDQ zd4IfnMx(@w$!h`#c=ph;gCMeYgW!!F(I0*w@L46NA>bLtjDJQXp4c&Qco@vT+hpqJC0b5@yLNd7DG#(Rb8O z8rwMBkAYk?w6JR4_T0XvZ<09X{^D&Vl`cZ6VykP56$_j_7QClX4BV`DUu_$5&yqFr zwg>K*9@A^;9e>+H>NWI>ZAG2D>935=^5)f!=XU#^#)e+!c6*li1|rYz7CCgDOs95u zdtnbfx=7ny_hSNc5LyB9r*>#hqf^@#*y}hX%JRlWi+b}*&!gu74!`YS5H5TMi!H7(ia0l2(L6=p`&`gfI#Q+`eNk}w3VeZfx! z_J7CRv9SyZTE(F916UcJa%9q&#@(?q0;J(L!={}Y1(b%rF*lwd`y`O=<5~lJ{tIQ} zNnEP*qzNh@`y2CJK9e}XPb)K5R)$tX^VO^li73p6A&03uB_18cgpbHb!0D4=5|bI2 zZ5tc}DJaea3@ojJig_SgcA*aSBea;p3V&k(K=bJ=g-BRLuuBK!r&}d9crWqEXawk_ zBuMG8RvGFXqPVUYl?+ew^DB_}vT!KQ8rX+zJGIugOoH z@U3B1QK^Hd(Ga9i%te)gY@~8hK?W)zB6W*w`FsG@eVW8Vi$+@Fgq+8zma1B?(zrm9 z-*bOW!lG_nr)D1ww^OT*sKMIg(|b? z&%Pb__7u4ASr+wWcV7(n=)_g`thE@863-ieE9p}QOcA|{7##vAQh-`Ql7C79J-8pK zng_8_!hmLfvIw-N?R8Ve)yUPCZmAh5G2qscme-cjmUlK+*6{Nn@`fLse3_o#Nfu`; zp0I*Xfz86Z$m4GU9Ijc{5Y+!ldDM{XVP&%DP;~bFN+vBYC-Z^cla*^Hp)JgxN*@C` z^l04K(6;nG%+B+-F|$>d=6^266+a76re-0?-~XP8`oxY3m2MmlVm){e-O(1^@7?Ap zjtKC-MAbX!l_o-JG_j7D->8k%*r z&b%%%Cg|?3Hl#MbZDn}B+FpW#TO2=Pt3Tb^?qH z%SmtYl+(BfHZjz2Jbxb1>Rg&n$M#cuOnqD3&QT-C_Z0xEMRLFm8z&-O1L8^@W`mWn zYhn&OV3F94=<4_fY7{6l98B$-0T0=j`L?GC!0TC`HcSF;cHAv|d6 zG9fP~fzTJ-dK9oumyEW`_7e0Wz#rl-pplz6v@1JoijE7pLHAv@CbhjP{M=MQAMd_7 zI3B#+JtaSqtt#X+&~2G^HLWA?dcrI;t%U9CbTy7ur8M?@OV+e_s&o8u)+dvzlB6m< zAZy&vo^@~f7IE?J{s==SHa?HH0xJ#t4+=&)=0(O{& zQl2v%(I=&u&^f^G1Q$Yzl#p(M*;FJ5={4g?gj;QB;K8k2#HnrP8{T5{t00&wLR|^H{N56 zX3cm4qVZ8E!59qpIHb3rn>ko-z=3%hIM6_v&DQC zABKD?>_fU-&QpE*q$+TV273_0hUC$ts#yoVAb*V3K!^ZqmS@&j6SrQ45y(d=Bu}`g zJ+hPK4Vi)e$|7cju5&4iEW<{`YH(6#NH$CvBcnwP&4xwRnrtzl9;_Q9Ys_NH;nOKY z9{{rndQD|LmAKWk!y?-#qoGIw!=DzKkOmZSc_?z4@C!KWk?W0XGoo|BVh@9NjbRQf zPk*Bb@KuQ-tVX0;-V?@XfeBq8M(4hoE1l8{wRhby{-c5+yDh$xo);vNPntqs?ShN;i^4S8$;hg#W0)HQtDgORbpL2TK1$Bi&8GB#d;!tce>f|&h~GA#layd-(XBbdmwh``y_zpgZMUhAU{`Q81zB$CM~zf0x@@@ z-%_83b}Scuo$^5St3-4C8fu6{zMH#YZPa#U<}V2&>VaQK-GRsgPc3jMx%@mW$9#*( zH0?!BS{0HuFFwr^oCfi2t$LUB@^d|g%(cvmF*p3YX~;7Y$At2KL=|)UEkk?lLqU2? zo;9#F55KSYp)%ACQzz=zeZ^uaGo|5}ru#Al6)V$L zcX*+hXqmh+vQ7-5^Xi9HU2}nG)0wRWcl8xKmsq$f%fNBMGM4ugl~X#nnXM#p$$^IC z50IFD`Khq~A;qVE3{b@?KU=v<_FyGA1T~oY1{2$NL2u_roe8)I*@5SVvxa#O01!|3 z30U-oItd6cu}7FTRKOIO8LV_hv^X3T+hLpphmQZ3h}+H$d2~uq4%HpcYaclra{w<# z%y-W?2kQ|}x;@f~C&_eZ1^&3xbhb<^qwH>p79AX!?DiCY9%!5jU1-Qa%r;*0-D2v^ z=D#F6>A~P2i6+3UOe(gE^VX`wWT-w&KG!u(w?$bTz7@lQv9${jRR~X zHjv4mx>S~h9CGLveXn%nhJ1^(5=MajN1}B z@NK|q^&5VcShgu!1FG6ns(dBwC#Q^hW7D770@ZR#=w*mn)fnf0 zg0am-h0<{En<|)wieE`M_1i=#e>-`+90Uf7FW{?nc=Yze*#XK_CUs_au8BI@o9*=U z(N>*9q5t1%X|dI!`!pbl3*;Iv7IH0H2fT`LEpc$LB!5|mJ{KodzD{9D_YUb4@?f9O ze6hmYgLUutD@?!ZbUBH%fCYqb>~Ye6p!waQDOUg}Me%(M{1IumEa_ zGauU_izid&+&|*SCvO))daX6qJ{^NKxuy?`{`-Ts0~o?!bEC!b>kj>#U+i9g9Gzbr z?X`AqTg<8A%Z3TJj8tGJf@<=m4>)L=xCUx>li3$&rg;8(0STY6ocnBj32F%Tpd-w1eJZkbK z>W)PX4onF((velcK()t$?vVRbJy9=>r~+@R5#HtHW*`2$dL<#xKv~j%5MW=m1O9js z;C2!xQ@=g%CyM}gco1kY_g!LU0GeG?&Lw;J&JOM+fLjs!eleTU*{yNW^U*CF))%$z zwBTO75Vu84J!mIFa1nv}c(NYPUx;8hZhXyn7!|kXEbo3yc1gy|SnQn~93HlRMuT)g%Q2Xi4~ov< z{Pg&!Rq!Q6N}OhVXr$iko*yh5mAFHfT4LO3dLHhd?csZk#IJ8QEh|{Gn~ra&|Ir3b z%GQ42&SVHqWm}eyTs)|g^(Ie`TT{oea*!EBo);jvR`w@L_Jm{9$MVO6bn);R)k6{HC3#`Hq*kFj+E4skpT1 zKqp07@`!sx0a~ROrRTf&qI-No{b)a)fT^Bv&lPijacZ~&2_atu&x6{U1R3O#R>E|{ z^l9^HfjoyFGs2nevEPeK{+8zh#I=mYi_vUYN!H%1Rw1W znq}t+-tAr-@4g|sLC|!b;EZDQr8r%ur$+W3IR#Gsf;k-H6uwlPV9n^V2HEkGj>y?D z^{Yv9%K(*sUQbu)JL^Excj=ro*2tothYo^Bg(IDm`LU6o>)CW#=eq_SrPjj`HOCy# zPNZQ#sdh#Qd}O3V5w%r76-6X_9o9T9lw!c|;0u$%H|>GVTJ^F}z66mZPc~nWr_Z*o zjG|-A+{r~kdEp-pL!Q#Duc>g!s+%+l46DquW)2&F5{Hb8R{JUwqqx~#>M4Cce_G+Niil(8D&M+UyZmpho0+ct81MR7|V4S?dAzZuA4audHh}b&7|qF*y*Tvnu9)))8^wKpk>;B+%l*vrE%E;*TQrrqMEKNP&zZdXjMcH z@!Pz4XS^9f1Q-$Tq6YCRvkDI?O)+w)b3u%76v&STdc#{Qh1!cP28KA-smdAfUhLw-81vUoMdpYfh;mke*s z)xVgSH7^-6!_f4y-o^EU0n!3$qA@Sjs3%PQRvGmabj5SB`Q({iUzmVoY6HuQ)D5vU zW7He-Gd;__>fd&}9Qn1d7Gyv};%Os)3-o>0neg%j@W9{-nW0p;P*f3Yh*UnDPxwsi zl%_9%l{X43v8*p0POGk(G{KHteCK<5Re^{oh(m}C(T?=p@8w_z_tRV000}j=fxE&x z#S7}Y*PzeCG4or+H#9*L{IrUfoY67(Z9qb#DPkcml*R$?(+G4ft-h=-OshkG1u0h* zGf)S9An$z;u+s}2)Nq*qoA~Fo3m<+K=+>`+$msHU`%ACZ9bS9{Wq6&j_NH6;*4Hxi z%iOMTJY$)1f5niF#I5W=o{9)mcv-w?RUt@v#5L#MY(gdPS(G-b3T)|}tp$OaTA@g#rKo8vp Date: Wed, 23 Oct 2024 14:48:36 -0500 Subject: [PATCH 4/5] remove unneeded files --- .../+result/+plot/FullConnectomePlotter.m | 17 ---- .../+net/+result/+plot/NoPermutationPlotter.m | 85 ------------------- 2 files changed, 102 deletions(-) delete mode 100644 +nla/+net/+result/+plot/FullConnectomePlotter.m delete mode 100644 +nla/+net/+result/+plot/NoPermutationPlotter.m diff --git a/+nla/+net/+result/+plot/FullConnectomePlotter.m b/+nla/+net/+result/+plot/FullConnectomePlotter.m deleted file mode 100644 index fbc95a77..00000000 --- a/+nla/+net/+result/+plot/FullConnectomePlotter.m +++ /dev/null @@ -1,17 +0,0 @@ -classdef FullConnectomePlotter < nla.net.result.plot.NoPermutationPlotter - - methods - function obj = FullConnectomePlotter(network_atlas) - obj = obj@nla.net.result.plot.NoPermutationPlotter(); - if nargin > 0 - obj.network_atlas = network_atlas; - end - end - - function [w, h] = plotProbability(obj, plot_figure, parameters, x_coordinate, y_coordinate) - % I know I don't need to define this here. I don't like it when the superclass methods just start showing up - % Matlab's class organization is so hacked together, I just like to really show everything - [w, h] = plotProbability@nla.net.result.plot.NoPermutationPlotter(obj, plot_figure, parameters, x_coordinate, y_coordinate); - end - end -end \ No newline at end of file diff --git a/+nla/+net/+result/+plot/NoPermutationPlotter.m b/+nla/+net/+result/+plot/NoPermutationPlotter.m deleted file mode 100644 index c9db45d2..00000000 --- a/+nla/+net/+result/+plot/NoPermutationPlotter.m +++ /dev/null @@ -1,85 +0,0 @@ -classdef NoPermutationPlotter < handle - - properties - network_atlas - end - - methods - function obj = NoPermutationPlotter(network_atlas) - if nargin > 0 - obj.network_atlas = network_atlas; - end - end - - function [w, h] = plotProbability(obj, plot_figure, parameters, x_coordinate, y_coordinate) - color_map = parameters.color_map; - statistic_matrix = parameters.statistic_plot_matrix; - p_value_max = parameters.p_value_plot_max; - plot_label = parameters.name_label; - significance_plot = parameters.significance_plot; - clickCallback = parameters.callback; - plot_scale = parameters.plot_scale; - - matrix_plot = nla.gfx.plots.MatrixPlot(plot_figure, plot_label, statistic_matrix, obj.network_atlas.nets,... - nla.gfx.FigSize.SMALL, 'x_position', x_coordinate, 'y_position', y_coordinate, 'lower_limit', 0,... - 'upper_limit', p_value_max, 'color_map', color_map, 'network_clicked_callback', clickCallback,... - 'marked_networks', significance_plot, 'plot_scale', plot_scale); - matrix_plot.displayImage(); - w = matrix_plot.image_dimensions("image_width"); - h = matrix_plot.image_dimensions("image_height"); - end - - function plotProbabilityVsNetworkSize(obj, parameters, axes, plot_title) - import nla.gfx.setTitle - - network_size = parameters.network_size; - least_squares_line_coefficients = parameters.least_squares_line_coefficients; - negative_log10_statistics = parameters.negative_log10_statistics; - rho = parameters.rho; - p_values = parameters.p_values; - - % p_values vs network-pair size - plot(network_size.v, negative_log10_statistics, "ok"); - - % least-squares regression line - least_squares_line_x = linspace(axes.XLim(1), axes.XLim(2), 2); - least_squares_line_y = polyval(least_squares_line_coefficients, least_squares_line_x); - hold("on"); - plot(least_squares_line_x, least_squares_line_y, "r"); - - xlabel(axes, sprintf("Number of ROI pairs\nwithin network pair")); - ylabel(axes, "-log_1_0(Asymptotic P-value)"); - setTitle(axes, plot_title); - second_title = sprintf('Check if P-values correlate with\nnet-pair size (corr: p = %.2f, r = %.2f)', p_values, rho); - setTitle(axes, second_title, true); - lims = ylim(axes); - ylim(axes, [0 lims(2)]); - end - - function plotProbabilityHistogram(obj, axes, histogram_data, statistic_input, no_permutations_network_result, test_method,... - probability_max) - import nla.HistBin - - empirical_fdr = cumsum(double(histogram_data) ./ sum(histogram_data)); - - [~, minimum_index] = min(abs(probability_max - empirical_fdr)); - - statistic_max = HistBin.EDGES(minimum_index); - - if (empirical_fdr(minimum_index) > probability_max) && minimum_index > 1 - statistic_max = HistBin.EDGES(minimum_index - 1); - end - loglog(axes, HistBin.EDGES(2:end), empirical_fdr, "k"); - hold("on"); - loglog(axes, no_permutations_network_result, statistic_input, "ok"); - axis([min(no_permutations_network_result), 1, min(statistic_input), 1]); - loglog(axes, axes.XLim, [probability_max, probability_max], "b"); - loglog(axes, [statistic_max, statistic_max], axes.YLim, "r"); - - name_label = sprintf("%s P-values", test_method); - nla.gfx.setTitle(axes, name_label); - xlabel(axes, "Asymptotic"); - ylabel(axes, "Permutation-based P-value"); - end - end -end \ No newline at end of file From f4d0fcf417f84e2c9ceed00b6bac059c12f72439 Mon Sep 17 00:00:00 2001 From: Github Action Date: Wed, 23 Oct 2024 19:49:03 +0000 Subject: [PATCH 5/5] Exported mlapp files --- NLAResult_exported.m | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/NLAResult_exported.m b/NLAResult_exported.m index 3d39b017..09ad084b 100644 --- a/NLAResult_exported.m +++ b/NLAResult_exported.m @@ -482,6 +482,10 @@ function OpenTriMatrixPlotButtonPushed(app, event) % Button pushed function: OpenDiagnosticPlotsButton function OpenDiagnosticPlotsButtonPushed(app, event) + prog = uiprogressdlg(app.UIFigure, 'Title', sprintf('Generating Diagnostic Plots'), 'Message', sprintf('Generating Diagnostic Plots')); + prog.Value = 0.02; + drawnow; + selected_nodes = app.ResultTree.SelectedNodes; for i = 1:size(selected_nodes, 1) if ~isempty(selected_nodes(i).NodeData) @@ -489,8 +493,10 @@ function OpenDiagnosticPlotsButtonPushed(app, event) node_flags = selected_nodes(i).NodeData{2}; result.runDiagnosticPlots(app.input_struct, app.net_input_struct, app.edge_result, app.input_struct.net_atlas, node_flags); + prog.Value = i / size(selected_nodes, 1); end end + close(prog) end % Callback function