Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
147 commits
Select commit Hold shift + click to select a range
d227142
Starting repository for quick-fix network test refactor over since I …
pollaro Jan 9, 2024
6d5afcb
Added new tests for Network Tests
pollaro Jan 9, 2024
f00503b
Added result class for new network tests and fixed some of the test c…
pollaro Jan 9, 2024
8757d55
add unit tests for new test classes
pollaro Jan 9, 2024
96ab7d2
lots of edits to NetworkTestResult for methods. I don't think its goi…
pollaro Jan 9, 2024
01cc2dc
remove a class i made to test a few things
pollaro Jan 9, 2024
328cc4c
fixed NetworkTestResult to account for different test methods
pollaro Jan 10, 2024
8cdb3dc
did a better job with NetworkTestResult and tests. now its ready to i…
pollaro Jan 10, 2024
21d46cb
start fixing up testpool and result rank.
pollaro Jan 10, 2024
034e319
added unit tests for NetworkTestResult
pollaro Jan 11, 2024
a1dfcf9
this seems way too easy.
pollaro Jan 11, 2024
9e9315a
copied lots of files needed for permutations and test/result running.…
pollaro Jan 12, 2024
5641bcd
lots of work on network test results and the result app front to get …
pollaro Jan 17, 2024
7dafaf5
first draft of new class for plotting results parameters.
pollaro Jan 18, 2024
02aa48d
first batch of plotting tools made. not very pleased, but what can yo…
pollaro Jan 19, 2024
0eeec92
bug squash to get no permutations to display figures
pollaro Jan 22, 2024
3d109fb
got most of the interfaces and even some of the plotting done. switch…
pollaro Jan 26, 2024
291327d
trying to fix input problems with similar names
pollaro Jan 26, 2024
2468eb3
Revert "trying to fix input problems with similar names"
pollaro Jan 26, 2024
0d6f2dc
had to fix bringing in input options due to them being used for plott…
pollaro Jan 26, 2024
78a7b04
Add cohens d test
pollaro Jan 29, 2024
1502a2c
within net pair plotting
pollaro Jan 30, 2024
1524df7
fix some code to be more concise
pollaro Jan 30, 2024
0436b3a
fix some code to be more concise
pollaro Jan 30, 2024
7d0a434
Merge branch 'NET124_PlotInterface' into NET125_NetPlots
pollaro Jan 30, 2024
7a8737a
changed display name for results
pollaro Feb 1, 2024
5ec19b8
added chord plotter and trying to integrate it into no permutations
pollaro Feb 1, 2024
b018822
fixing some chord plotting and adding in trimatrix
pollaro Feb 2, 2024
0f83fed
fixes for all chords
pollaro Feb 2, 2024
1df44a6
added comments and some rearrange
pollaro Feb 5, 2024
43e2175
added edge tests back that were lost
pollaro Feb 5, 2024
6bb64a4
rewrite network tests tests
pollaro Feb 6, 2024
08fd8d7
Added some unit tests and fixed a few errors
pollaro Feb 7, 2024
09a5fd5
moved a lot of the plotting to seperate functions
pollaro Feb 7, 2024
d52f44f
Merge branch 'NET125_NetPlots' into NET129_chords
pollaro Feb 7, 2024
04283b6
Moved plotting into separate functions for hopefully more readability
pollaro Feb 7, 2024
7d123ec
just a few cleanups
pollaro Feb 8, 2024
a6d55db
added a test for result rank
pollaro Feb 8, 2024
139ca2e
added convergence plotting functions/methods
pollaro Feb 9, 2024
ba05fb6
rename some variables
pollaro Feb 9, 2024
0e5e60b
formatting and comments
pollaro Feb 9, 2024
cb30e78
Merge branch 'NET131_tests' into NET134_net_matrixplot
pollaro Feb 13, 2024
a49ff39
Added MatrixPlot in
pollaro Feb 13, 2024
83d1355
fixed plotting bugs
pollaro Feb 13, 2024
95f211d
Merge branch 'NET125_NetPlots' into NET129_chords
pollaro Feb 13, 2024
ffc3685
Merge branch 'NET129_chords' into NET131_tests
pollaro Feb 13, 2024
f4d33e3
Merge branch 'NET131_tests' into NET134_net_matrixplot
pollaro Feb 13, 2024
abfa0b4
bug fixes
pollaro Feb 13, 2024
93f07d0
cleaned up some code and bug fixes
pollaro Feb 14, 2024
6f82684
Tried to clean up and organize better. Still messy
pollaro Feb 19, 2024
bc6e15e
Added error check to ensure both limit values are input and not none …
pollaro Feb 20, 2024
a748ae8
network level chords working
pollaro Feb 27, 2024
e46de27
remove two unneeded files
pollaro Feb 27, 2024
1463e5e
Attempting to get edge chord plotting working
pollaro Feb 28, 2024
1953374
chordplot used in all chord plotting instead of old function
pollaro Feb 28, 2024
e1b2723
Comments and documentation of chordplot
pollaro Feb 28, 2024
92f816f
just some comment refining
pollaro Feb 29, 2024
0ad987a
Merge branch 'NET53_ChordPlot' into NET138_net_chord
pollaro Mar 1, 2024
ee86317
integrate chordplot class into net refactor
pollaro Mar 1, 2024
f53624b
touch up on formatting
pollaro Mar 1, 2024
d1c7d6c
Create development branch. Add initial error logging function
Mar 7, 2024
68b3e53
added caption to colorbar for trimatrix plots
pollaro Mar 7, 2024
984053f
added caption to colorbar for trimatrix plots
pollaro Mar 7, 2024
07c75f7
fixed export yml and python app
pollaro Mar 25, 2024
82caf56
trying to fix yml
pollaro Mar 25, 2024
e466304
Merge branch 'development' into NET51_customcolor
pollaro Mar 28, 2024
16a3e44
fixed export and action commit
pollaro Apr 1, 2024
6e16b49
[NET-148] Statistical Rank of refactored Network Test Results (#7)
pollaro Apr 11, 2024
644a68f
[NET-59] Better scaling options for TriMatrix plots (#9)
pollaro Apr 16, 2024
563ac73
[NET-157] Enable colormap choice for TriMatrix (#10)
pollaro Apr 16, 2024
a9fc4cf
[NET-159] Unit testing framework (#8)
pollaro Apr 19, 2024
68abf63
[NET-161] remove "Import nla.*" (#16)
pollaro Apr 25, 2024
da3b51e
Development merging in master (#30)
pollaro Jun 4, 2024
99f85ac
Revert "Development merging in master" (#34)
pollaro Jun 7, 2024
abb1a15
Merge master into development and rebase (#37)
pollaro Jun 11, 2024
7b8b547
[NET-192] Diagnostic Plot Fix (#33)
pollaro Jun 11, 2024
e9835d6
[NET-193] New Rankings...and other junk? (#39)
pollaro Jun 26, 2024
09b1a49
[NET-193] Fix denominator calc (#42)
pollaro Jun 26, 2024
b582189
[NET-196] Fix Cohen's D (#44)
pollaro Jul 8, 2024
eaddc82
[NET-197] Fix math in winkler (#46)
pollaro Jul 9, 2024
8a67bbe
merge fix
pollaro Jul 11, 2024
86b5ac5
[NET-142] Paired-T Edge Test (#48)
pollaro Jul 11, 2024
ceba523
[NET-202] Scale fix for MatrixPlot (#50)
pollaro Jul 24, 2024
5b5058c
[NET-203] Network Test selection for figures fix (#52)
pollaro Jul 25, 2024
66e169e
Merge branch 'master' into development
pollaro Aug 20, 2024
cb5c56e
Exported mlapp files
actions-user Aug 20, 2024
517c590
[NET-214] Error plotting Chi-squared and Hypergeometric within networ…
pollaro Aug 28, 2024
b42d756
Rebase development to master (#60)
pollaro Aug 29, 2024
2dc8754
[NET-186] Change TriMatrix to single plot (#61)
pollaro Aug 30, 2024
b9045d9
remove unneeded files. AGAIN
pollaro Aug 30, 2024
329b416
[NET-216] Make commitString.m shell agnostic (#63)
pollaro Sep 6, 2024
789f0ab
Basic functionality of Sandwich Estimator in NLA script (#64)
AndyEck16 Sep 6, 2024
d6174e8
[NET-204] Multi-level permutation selection (#65)
pollaro Oct 9, 2024
00a6c91
[NET-218] Remove sort from Eggebrecht ranking (#67)
pollaro Oct 9, 2024
f0c86d3
fixed error on label
pollaro Oct 9, 2024
1f14144
[NET-221] -Log 10 Scale (#68)
pollaro Oct 11, 2024
44ebb38
[NET-222] Fixes for Westfall-Young and Winkler results (#69)
pollaro Oct 11, 2024
8b4a2eb
[NET-189] Single Plot fixes (#71)
pollaro Oct 22, 2024
71e454e
[NET-187] Diagnostic Plots (#72)
pollaro Oct 23, 2024
4f7d480
[NET-185] Clean up Enums (#73)
pollaro Oct 25, 2024
66e9c5c
[NET-185] enumerations (#74)
pollaro Oct 28, 2024
56e2307
[NET-225] Result P-values (#75)
pollaro Nov 4, 2024
3b9ca0f
[NET-225] Result P-value quick-fix (#76)
pollaro Nov 4, 2024
52d7546
[NET-225] Fix again (#77)
pollaro Nov 4, 2024
48a4609
[NET-225] Once more...with feeling (#78)
pollaro Nov 4, 2024
e2a3dbd
forgotten variables
pollaro Nov 4, 2024
9c66834
Merge branch 'development' of https://github.com/WheelockLab/NetworkL…
pollaro Nov 4, 2024
f897a40
[NET-233] Full Connectome Changes (#79)
pollaro Nov 5, 2024
f15edc8
[NET-229] Both Benjamini corrections causing errors (#80)
pollaro Nov 5, 2024
462dd37
[NET-228] Remove legend (#81)
pollaro Nov 7, 2024
884aa2a
[NET-235] Hygeometric test fix (#82)
pollaro Nov 8, 2024
12f54f5
change matlab version
pollaro Nov 12, 2024
d0bbf36
[NET-217] Unit test fixes (#83)
pollaro Nov 12, 2024
6e7ea01
still trying on tests
pollaro Nov 12, 2024
0cf28ac
more test changes for github
pollaro Nov 12, 2024
f097e5a
change matlab version on git
pollaro Nov 12, 2024
730eeca
trying to make tests work again
pollaro Nov 13, 2024
4ca731e
trying to make tests work again
pollaro Nov 13, 2024
2957d30
trying to make tests work again
pollaro Nov 13, 2024
1c3c308
[NET-242] Hypergeometric results incorrect (#84)
pollaro Nov 26, 2024
84b2c6d
[NET-240] Cohen's D fixes (#85)
pollaro Nov 26, 2024
b2dc0e6
[NET-241] Remove Eggebrecht name and switch to Uncorrected (#86)
pollaro Nov 26, 2024
f1d3b1e
Add fix for CohensD Threshold for nonperm results
Dec 4, 2024
9017f1f
Correct missing tilde in cohen's D nonperm fix
Dec 4, 2024
2f71f08
Revert "Correct missing tilde in cohen's D nonperm fix"
AndyEck16 Dec 4, 2024
196efee
Revert "Add fix for CohensD Threshold for nonperm results"
AndyEck16 Dec 4, 2024
e4480ef
[NET-245] Fix cohens d for nonperm plotting (#87)
AndyEck16 Dec 4, 2024
63276fb
[NET-243] New plot in mlapp file (#89)
pollaro Dec 19, 2024
a5c0d1b
Documentation (#90)
pollaro Dec 19, 2024
16e7f9a
change class name
pollaro Dec 20, 2024
059b021
[NET-255] Small bug changes to plotting app (#92)
pollaro Dec 20, 2024
8ae4585
stupid typo
pollaro Dec 20, 2024
0bd5471
[NET-256] ROI centroids always showing up (#93)
pollaro Jan 7, 2025
814a184
[NET-257] Flip Nesting button raises an error (#94)
pollaro Jan 9, 2025
c316e45
[NET-258] Diagnostic Plots fail to open (#95)
pollaro Jan 9, 2025
43bcd4c
[NET-261] Prior results won't load (#97)
pollaro Jan 27, 2025
28177e1
[NET-265] Add TriMatrix save (#98)
pollaro Feb 7, 2025
4bb200d
[NET-175] Scaling of Glass Brains (#99)
pollaro Feb 10, 2025
6cb574b
[NET-266] TriMatrix options still changing on value change (#100)
pollaro Feb 11, 2025
fc458ba
Chi2 and Hypergeometric test updates
arisegel00 Feb 17, 2025
6672d6c
[NET-130] NLA Result save file changes (#101)
pollaro Feb 18, 2025
3805360
[NET-158] Remove AutoResize (#102)
pollaro Feb 18, 2025
dbb0b93
[NET-217] Various unit test fixes (#103)
pollaro Feb 25, 2025
3ed27ec
[NET-209] Make results backwards compatible (#104)
pollaro Mar 10, 2025
a8d3f4c
Merge branch 'master' into development
pollaro Mar 18, 2025
deb88f2
Add License File
AndyEck16 Mar 18, 2025
1dbffdc
Net267 remove cohens d effect from user view (#106)
AndyEck16 Mar 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions +nla/+edge/+permutationMethods/+tree/PermutationNode.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
classdef PermutationNode < handle
%PERMUTATIONNODE Node which defines one grouping of each permutatino tree
%
% node = permutationNode(level, input_data, permutation_groups)
% node = One grouping of data for each permutation group. Each group contains the data (functional connectivity)
% along with the index (column) the data is located and the original column
% level = The level of the tree. 0 is the root, 1 the first column of permutation groups, 2 the next...
% input_data = The input data. Currently, this is the functional connectivity
% permutation_groups = the columns from the csv file that characterizes the permutation groupings
% Each column of the data is 1 permutation grouping.
% Each row is one subject/data entry
% Values should be positive integers. Groups must be independent in each column


properties
children = [] % Nodes that descend from the current node. The column to the right of the current level in permutation groups
level = 0 % 0 is root, initial_data
parent = false % if false, this is the root of the tree. If not, this is the node that came before
data_with_indexes = {} % The data. 3 cell object. {data (some big array), current index, original index}
permutation_groups = [] % The groups that descend off of this one
end

properties (SetAccess = immutable)
original_data % matrix of size input_data.length x 3 with each row [data_value, current_index, original_index]
end

methods
function obj = PermutationNode(level, input_data, permutation_groups)
% Inputs:
% input_data is the functional connectivity with each subject as a vector. Size: [edges(?) x subjects]
% permutation groups. This will be a matrix with each level of permutation a vector. Size: [subjects x levels of permutations]

if isequal(level, 0)
obj.permutation_groups = permutation_groups;
obj.original_data = {input_data, [1:size(input_data, 2)], [1:size(input_data, 2)]};
obj.data_with_indexes = obj.original_data;
else
size_permutation_groups = size(permutation_groups);
if size_permutation_groups(2) > 1
obj.permutation_groups = permutation_groups(:, 2:end);
end
functional_connectivity = input_data{1};
index_length = size(input_data{2}, 2);
current_index = [1:index_length];
original_index = input_data{3};
obj.original_data = {functional_connectivity, current_index, original_index};
obj.data_with_indexes = obj.original_data;
end
if ~isempty(obj.permutation_groups)
group_numbers = unique(obj.permutation_groups(:, 1));
for group_number = 1:numel(group_numbers)
group_indexes = (obj.permutation_groups(:, 1) == group_numbers(group_number));
temp_permutation_groups = obj.permutation_groups(group_indexes, :);
group_input_data = obj.data_with_indexes{1};
group_current_indexes = obj.data_with_indexes{2};
group_original_indexes = obj.data_with_indexes{3};
group_data = {group_input_data(:, group_indexes), group_current_indexes(group_indexes), group_original_indexes(group_indexes)};
obj.children = [obj.children obj.createNodes(obj.level + 1, temp_permutation_groups, group_data, obj)];
end
end
end

function node = createNodes(obj, level, group_permutations, input_group_data, parent_node)
node = nla.edge.permutationMethods.tree.PermutationNode(level, input_group_data, group_permutations);
node.parent = parent_node;
end
end
end
31 changes: 31 additions & 0 deletions +nla/+edge/+permutationMethods/+tree/PermutationTree.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
classdef PermutationTree < handle
%PERMUTATIONTREE Base class for permutation groups. This just bundles all the permutation nodes
% together for ease.
%
% tree = PermutationTree(input_data, permutation_groups)
% tree = The tree object. Consists of the raw permutation groups along with the raw data along
% starting indexes
%
% input_data = The data that is permuted. This is usually the functional connectivity (right now, that's all it works for)
% permutation_groups = the columns from the csv file that characterizes the permutation groupings
% Each column of the data is 1 permutation grouping.
% Each row is one subject/data entry
% Values should be positive integers. Groups must be independent in each column

properties
permutation_groups % Raw from the behavior table to define permutation grouping
root_node % The first "level 0" node of the tree
end

properties (SetAccess = immutable)
original_data = {} % This is going to be a matrix of input_data.length x 2 [data_value, original_index]
end

methods
function obj = PermutationTree(input_data, permutation_groups)
obj.original_data = {input_data, [1:size(input_data, 2)]'};
obj.permutation_groups = permutation_groups;
obj.root_node = nla.edge.permutationMethods.tree.PermutationNode(0, input_data, permutation_groups);
end
end
end
81 changes: 81 additions & 0 deletions +nla/+edge/+permutationMethods/MultiLevel.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
classdef MultiLevel < nla.edge.permutationMethods.Base
%MULTILEVEL Multilevel permutation method
%
% multi-level strategy = multiLevel()
% multi-level strategy = the object which will be doing the permutations the data. The functional
% connectivity is permuted
%
% needed for methods:
% test_options = this is the options and data for the tests being run. Sometimes called 'input_struct'
%
% How this works: THe object controls the permutations. It can be instantiated without any data
% Before permutations can be run, a permutation tree needs to be created. This needs to be done with the
% "createPermutationTree(test_options)" method. This creates a permutation tree (with the nodes). It
% also will find all the "terminal nodes" - the nodes that have no children. These are the last groupings
% and the actual data to be permuted
%
% After the tree is created (this only is done once), the object is ready to do the permutations.
% This is done by taking each terminal node, getting the current indexes of the data, permuting them,
% and then applying these indexes to the data.

properties
permutation_tree
terminal_nodes = []
end

methods
function obj = MultiLevel()
end

function obj = createPermutationTree(obj, input_struct)
if ~isfield(input_struct, "permutation_groups")
input_struct.permutation_groups = [];
end
obj.permutation_tree = nla.edge.permutationMethods.tree.PermutationTree(...
input_struct.func_conn.v, input_struct.permutation_groups...
);
tree_root = obj.permutation_tree.root_node;
obj = obj.depthFirstSearch(tree_root);
end

function permuted_input_struct = permute(obj, orig_input_struct)
permuted_input_struct = orig_input_struct;
permuted_transposed_functional_connectivity = zeros(size(orig_input_struct.func_conn.v'));

for node_index = 1:numel(obj.terminal_nodes)
node = obj.terminal_nodes(node_index);
current_indexes = node.data_with_indexes{2};
original_indexes = node.data_with_indexes{3};
data = node.data_with_indexes{1}'; % transpose to match dimensions of indexes

permuted_indexes = nla.helpers.permuteVector(current_indexes);
sorted_original_indexes = sort(original_indexes, 2);
original_indexes = original_indexes(permuted_indexes);
data = data(permuted_indexes, :);
node.data_with_indexes = {data', current_indexes, original_indexes};
permuted_transposed_functional_connectivity(sorted_original_indexes, :) = data;
end

permuted_input_struct.func_conn.v = permuted_transposed_functional_connectivity';
end

function obj = depthFirstSearch(obj, node_input)
node_queue = [node_input];
while ~isempty(node_queue)
node = node_queue(1);
if isempty(node.children)
obj.terminal_nodes = [obj.terminal_nodes, node];
else
for child = 1:numel(node.children)
node_queue = [node_queue; node.children(child)];
end
end
if size(node_queue, 1) > 1
node_queue = node_queue(2:end, :);
else
node_queue = [];
end
end
end
end
end
1 change: 1 addition & 0 deletions +nla/+edge/+result/Base.m
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ function output(obj, net_atlas, flags, prob_label)
if ~isfield(flags, 'display_sig')
flags.display_sig = true;
end

if flags.display_sig
if ~exist('prob_label', 'var')
prob_label = [sprintf('Edge-level Significance (P < %g)', obj.prob_max), prob_label_appended];
Expand Down
102 changes: 102 additions & 0 deletions +nla/+edge/+result/SandwichEstimator.m
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
classdef SandwichEstimator < nla.edge.result.Base

properties
% test result specific properties go here (things that are
% specific to a particular data input, ie: results of running the sandwich
% estimator on said data, or covariates which are specific to a
% particular data set)
regressCoeffs % numCovariates x numFcElems

stdError
tVals
pVals
contrasts
contrastCalc
contrastSE
contrastTVal
contrastPVal
end

methods
function obj = SandwichEstimator(size, prob_max)
import nla.* % required due to matlab package system quirks

%MATLAB WEIRDNESS WARNING
%In parallel processing, this constructor is somehow called
%with zero arguments, not in any code I've written. Need to be
%able to get through zero argument case without erroring in
%order to run in parallel mode. Does not happen in non-parallel
%mode.
if nargin ~= 0
%want to call superclass constructor obj@nla.EdgeLevelResult(size, prob_max);
%but can't within any "if block" due to MATLABism
%copying here
obj.coeff = TriMatrix(size);
obj.prob = TriMatrix(size);
obj.prob_sig = TriMatrix(size, 'logical');
obj.prob_max = prob_max;
obj.coeff_name = 'contrast t-vals';

end

end

function output(obj, net_atlas, display_sig)
import nla.* % required due to matlab package system quirks
output@nla.edge.result.Base(obj, net_atlas, display_sig);

end

% merged is a function which merges 2 results from the same test
function merge(obj, results)
import nla.* % required due to matlab package system quirks
merge@nla.edge.result.Base(obj, results);

%% TODO Code to merge multiple SandwichEstimatorResults goes here
% This function is called by TestPool, signature should not
% change. Results is a vector of other
% SandwhichEstimatorResults(one per process). This function is
% called to merge the results of said processes. If you are ex:
% calculating an average value, you should probably do it here:
% ex: sum([results.value]) / obj.perm_count would produce the
% average of 'value'
end

function setContrasts(obj, newContrasts)
%force contrasts to be row vector
if ~any(size(newContrasts)==1)
error('SandwichEstimatorResults: contrasts must be 1D vector');
else
newContrasts = reshape(newContrasts,1,numel(newContrasts));
end

%check that sizes of contrasts matches size of regression
%coefficients if they've already been fit
%if model has already been fit, confirm contrasts is proper
%size of existing results and modify result values to match new
%contrast setting
if ~isempty(obj.regressCoeff)
%confirm contrasts is proper size
if length(newContrasts) ~= size(obj.regressCoeffs,1)
errMsg = sprintf(['SandwichEstimatorResult: ',...
'size of contrasts does not match number of current fitted regression coefficients',...
'%i contrasts vs %i regression coeffs'],...
length(newContrasts),size(obj.regressCoeffs,1));
error(errMsg);
end

%update existing coeff and prob results with new contrasts
obj.coeff.v = (newContrasts * obj.regressCoeffs)';
obj.prob.v = (newContrasts * obj.betaCovarTvals)';
end

obj.contrasts = newContrasts;


end



end
end

1 change: 1 addition & 0 deletions +nla/+edge/+test/PairedT.m
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@
behavior_handle = nla.helpers.firstInstanceOfClass(inputs, 'nla.inputField.Behavior');
behavior_handle.covariates_enabled = nla.inputField.CovariatesEnabled.ONLY_FC;

inputs{end + 1} = nla.inputField.Label("", "");
inputs{end + 1} = nla.inputField.String('group1_name', 'Group 1 name:', 'Group1');
inputs{end + 1} = nla.inputField.Number('group1_val', 'Group 1 behavior value:', -Inf, 1, Inf);
inputs{end + 1} = nla.inputField.String('group2_name', 'Group 2 name:', 'Group2');
Expand Down
Loading
Loading