diff --git a/+nla/+qualityControl/checkHeadMotion.m b/+nla/+qualityControl/checkHeadMotion.m index a09d25c1..c937609a 100755 --- a/+nla/+qualityControl/checkHeadMotion.m +++ b/+nla/+qualityControl/checkHeadMotion.m @@ -1,14 +1,24 @@ -function checkHeadMotion(fig, input_struct, motion) +function checkHeadMotion(fig, input_struct, motion, remove_index) + network_atlas = input_struct.net_atlas; + functional_connectivity = input_struct.func_conn; + if remove_index ~= 0 + [new_netatlas, functional_connectivity] = nla.removeNetworks(input_struct.net_atlas, input_struct.net_atlas.nets(remove_index).name, strcat(input_struct.net_atlas.name, '_-', input_struct.net_atlas.nets(remove_index).name), input_struct.func_conn); + network_atlas = nla.NetworkAtlas(new_netatlas); + if ~isa(functional_connectivity, 'nla.TriMatrix') + functional_connectivity = nla.TriMatrix(functional_connectivity); + end + end + prog = uiprogressdlg(fig, 'Title', 'Generating figures', 'Message', 'Generating head motion figures'); prog.Value = 0.02; - distances = nla.helpers.euclidianDistanceROIs(input_struct.net_atlas); + distances = nla.helpers.euclidianDistanceROIs(network_atlas); prog.Value = 0.75; - [r_vec, p_vec] = corr(motion, input_struct.func_conn.v', 'type', 'Pearson'); + [r_vec, p_vec] = corr(motion, functional_connectivity.v', 'type', 'Pearson'); - prob = nla.TriMatrix(input_struct.net_atlas.numROIs()); - r = nla.TriMatrix(input_struct.net_atlas.numROIs()); - h = nla.TriMatrix(input_struct.net_atlas.numROIs(), 'logical'); + prob = nla.TriMatrix(network_atlas.numROIs()); + r = nla.TriMatrix(network_atlas.numROIs()); + h = nla.TriMatrix(network_atlas.numROIs(), 'logical'); prob.v = p_vec'; r.v = r_vec'; h.v = nla.lib.fdr_bh(prob.v); @@ -25,7 +35,7 @@ function checkHeadMotion(fig, input_struct, motion) ulimit = 0.3; fig = nla.gfx.createFigure(1800, 900); - matrix_plot = nla.gfx.plots.MatrixPlot(fig, "FC-motion correlation (Pearson's r)", r, input_struct.net_atlas.nets,... + matrix_plot = nla.gfx.plots.MatrixPlot(fig, "FC-motion correlation (Pearson's r)", r, network_atlas.nets,... nla.gfx.FigSize.LARGE, 'lower_limit', llimit, 'upper_limit', ulimit); matrix_plot.displayImage(); width = matrix_plot.image_dimensions("image_width"); @@ -35,14 +45,14 @@ function checkHeadMotion(fig, input_struct, motion) ax = subplot('Position', [0.780, 0.540, 0.20, 0.40]); nla.gfx.setTitle(ax, sprintf("FC-motion correlation (Pearson's r) (q < 0.05)\n")); - nla.gfx.drawROIsOnCortex(ax, input_struct.net_atlas, ctx, mesh_alpha, ROI_radius, nla.gfx.ViewPos.DORSAL, false,... + nla.gfx.drawROIsOnCortex(ax, network_atlas, ctx, mesh_alpha, ROI_radius, nla.gfx.ViewPos.DORSAL, false,... nla.gfx.BrainColorMode.NONE); - for col = 1:input_struct.net_atlas.numROIs() - for row = (col + 1):input_struct.net_atlas.numROIs() + for col = 1:network_atlas.numROIs() + for row = (col + 1):network_atlas.numROIs() if h.get(row, col) - pos1 = input_struct.net_atlas.ROIs(row).pos; - pos2 = input_struct.net_atlas.ROIs(col).pos; + pos1 = network_atlas.ROIs(row).pos; + pos2 = network_atlas.ROIs(col).pos; edge_color = nla.gfx.valToColor(r.get(row, col), llimit, ulimit, color_map); diff --git a/+nla/+qualityControl/checkNormalityWithKS.m b/+nla/+qualityControl/checkNormalityWithKS.m index 19ec0634..3bb8eacb 100644 --- a/+nla/+qualityControl/checkNormalityWithKS.m +++ b/+nla/+qualityControl/checkNormalityWithKS.m @@ -1,4 +1,4 @@ -function checkNormalityWithKS(fig, input_struct, test_pool) +function checkNormalityWithKS(fig, input_struct, test_pool, remove_index) prog = uiprogressdlg(... fig, 'Title', 'Checking Normaility', 'Message', 'Running Kolmogorov-Smirnov Test'... @@ -9,25 +9,31 @@ function checkNormalityWithKS(fig, input_struct, test_pool) edge_test_result = test_pool.runEdgeTest(input_struct); prog.Value = 0.5; - ks_result = runKolmogorovSmirnovTest(input_struct, edge_test_result); + ks_result = runKolmogorovSmirnovTest(input_struct, edge_test_result, remove_index); prog.Value = 0.75; - qcKSOutput(ks_result.p, input_struct) + qcKSOutput(ks_result.p, input_struct, remove_index) end -function ks_result = runKolmogorovSmirnovTest(input_struct, edge_result) +function ks_result = runKolmogorovSmirnovTest(input_struct, edge_result, remove_index) import nla.TriMatrix nla.TriMatrixDiag + network_atlas = input_struct.net_atlas; + if remove_index ~= 0 + [new_netatlas] = nla.removeNetworks(input_struct.net_atlas, input_struct.net_atlas.nets(remove_index).name, strcat(input_struct.net_atlas.name, '_-', input_struct.net_atlas.nets(remove_index).name)); + network_atlas = nla.NetworkAtlas(new_netatlas); + end + ks_result = struct(); - number_of_networks = input_struct.net_atlas.numNets(); + number_of_networks = network_atlas.numNets(); ks_result.p = TriMatrix(number_of_networks, TriMatrixDiag.KEEP_DIAGONAL); ks_result.ks = TriMatrix(number_of_networks, TriMatrixDiag.KEEP_DIAGONAL); for network1 = 1:number_of_networks for network2 = 1:network1 - network_rho = edge_result.coeff.get(input_struct.net_atlas.nets(network1).indexes,... - input_struct.net_atlas.nets(network2).indexes); + network_rho = edge_result.coeff.get(network_atlas.nets(network1).indexes,... + network_atlas.nets(network2).indexes); [~, p, ks] = kstest(network_rho); ks_result.p.set(network1, network2, p); ks_result.ks.set(network1, network2, ks); @@ -35,7 +41,7 @@ function checkNormalityWithKS(fig, input_struct, test_pool) end end -function qcKSOutput(ks_result_p_value, edge_test_options) +function qcKSOutput(ks_result_p_value, edge_test_options, remove_index) % This will open the qc figure for the KS test network_test_options = nla.net.genBaseInputs(); @@ -45,15 +51,20 @@ function qcKSOutput(ks_result_p_value, edge_test_options) edge_test_options.prob_max = 0.05; default_discrete_colors = 1000; - [~, p_value_max] = network_test_options.fdr_correction.correct(edge_test_options.net_atlas,... - edge_test_options, ks_result_p_value); + network_atlas = edge_test_options.net_atlas; + if remove_index ~= 0 + [new_netatlas] = nla.removeNetworks(edge_test_options.net_atlas, edge_test_options.net_atlas.nets(remove_index).name, strcat(edge_test_options.net_atlas.name, '-', edge_test_options.net_atlas.nets(remove_index).name)); + network_atlas = nla.NetworkAtlas(new_netatlas); + end + + [~, p_value_max] = network_test_options.fdr_correction.correct(network_atlas, edge_test_options, ks_result_p_value); color_map = nla.net.result.NetworkResultPlotParameter.getColormap(default_discrete_colors,... p_value_max); fig = nla.gfx.createFigure(); % Also remember to move this in read the docs - matrix_plot = nla.gfx.plots.MatrixPlot(fig, sprintf("Non-permuted Kolmogorov-Smirnov Test p-value\nSmaller values are less normal"), ks_result_p_value, edge_test_options.net_atlas.nets, nla.gfx.FigSize.LARGE,... + matrix_plot = nla.gfx.plots.MatrixPlot(fig, sprintf("Non-permuted Kolmogorov-Smirnov Test p-value\nSmaller values are less normal"), ks_result_p_value, network_atlas.nets, nla.gfx.FigSize.LARGE,... 'lower_limit', 0.00, 'upper_limit', p_value_max, 'color_map', color_map); matrix_plot.displayImage(); width = matrix_plot.image_dimensions('image_width'); diff --git a/+nla/NetworkAtlas.m b/+nla/NetworkAtlas.m index d47740de..b1023c31 100755 --- a/+nla/NetworkAtlas.m +++ b/+nla/NetworkAtlas.m @@ -12,10 +12,13 @@ % :param space: (Optional) The mesh that the atlas` ROI locations/parcels are in. Two options - ``Talairach (TT)`` or ``Montreal Neurological Institute (MNI)`` properties (SetAccess = private) - nets % This is the net_names - + nets + net_names ROIs + ROI_key + ROI_pos ROI_order + net_colors name space anat = false; @@ -37,7 +40,8 @@ end net_names = net_struct.net_names; - + obj.net_names = net_names; + net_count = numel(net_names); ROI_count = size(net_struct.ROI_key, 1); @@ -45,6 +49,7 @@ if isfield(net_struct, 'net_colors') net_colors = net_struct.net_colors; end + obj.net_colors = net_colors; ROI_positions = zeros(ROI_count, 3); if isfield(net_struct, 'ROI_pos') @@ -60,6 +65,9 @@ net_struct.ROI_order = net_struct.ROI_order(sort_idx); ROI_positions = ROI_positions(sort_idx, :); end + obj.ROI_pos = ROI_positions; + obj.ROI_key = net_struct.ROI_key; + obj.ROI_order = net_struct.ROI_order; %% Network atlas name obj.name = net_struct.name; diff --git a/+nla/removeNetworks.m b/+nla/removeNetworks.m index e8de1295..f16c1c3d 100755 --- a/+nla/removeNetworks.m +++ b/+nla/removeNetworks.m @@ -78,7 +78,8 @@ %% Functional connectivity (optional) if exist('fc_in', 'var') - fc_ordered = fc_in(atlas_in.ROI_order, atlas_in.ROI_order, :); + fc_in_matrix = fc_in.asMatrix(); + fc_ordered = fc_in_matrix(atlas_in.ROI_order, atlas_in.ROI_order, :); fc_reduced = fc_ordered(ROI_mask, ROI_mask, :); ROI_order_inverse(atlas_out.ROI_order) = [1:numel(atlas_out.ROI_order)]'; fc_out = fc_reduced(ROI_order_inverse, ROI_order_inverse, :); diff --git a/NLAQualityControl.mlapp b/NLAQualityControl.mlapp index 97ded08b..cfb56c2c 100644 Binary files a/NLAQualityControl.mlapp and b/NLAQualityControl.mlapp differ