Skip to content

Commit 6fab1f3

Browse files
Merge pull request #686 from softmatterlab/develop
Braph 2.0.1a
2 parents 4bb4e46 + ed17d06 commit 6fab1f3

830 files changed

Lines changed: 2795144 additions & 0 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
*.asv

braph/analysis/Analysis.m

Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
classdef Analysis < handle & matlab.mixin.Copyable
2+
properties (GetAccess = protected, SetAccess = protected)
3+
cohort % cohort
4+
measurement_idict % indexed dictionary with measurements
5+
randomcomparison_idict % indexed dictionary with random comparison
6+
comparison_idict % indexed dictionary with comparison
7+
settings % settings structure for analysis
8+
end
9+
methods (Access = protected)
10+
function analysis = Analysis(cohort, measurements, randomcomparisons, comparisons, varargin)
11+
12+
assert(isa(cohort, 'Cohort') && isequal(cohort.getSubjectClass(), analysis.getSubjectClass()), ...
13+
['BRAPH:Analysis:SubjectClassErr'], ...
14+
['The first argument must be a Cohort with subjects of class ' analysis.getSubjectClass()]) %#ok<NBRAK>
15+
analysis.cohort = cohort;
16+
17+
analysis.measurement_idict = IndexedDictionary(analysis.getMeasurementClass());
18+
assert(iscell(measurements), ...
19+
['BRAPH:Analysis:Constructor'], ...
20+
['Input is not a cell of Measurement objects']) %#ok<NBRAK>
21+
for i = 1:1:length(measurements)
22+
measurement = measurements{i};
23+
assert(isequal(measurement.getClass(), analysis.getMeasurementClass()), ...
24+
['BRAPH:Analysis:Constructor'], ...
25+
['Input is not of class Measurement']) %#ok<NBRAK>
26+
analysis.measurement_idict.add(measurement.getID(), measurement);
27+
end
28+
29+
analysis.randomcomparison_idict = IndexedDictionary(analysis.getRandomComparisonClass());
30+
assert(iscell(randomcomparisons), ...
31+
['BRAPH:Analysis:Constructor'], ...
32+
['Input is not a cell of RandomComparisons objects']) %#ok<NBRAK>
33+
for i = 1:1:length(randomcomparisons)
34+
randomcomparison = randomcomparisons{i};
35+
assert(isequal(randomcomparison.getClass(), analysis.getRandomComparisonClass()), ...
36+
['BRAPH:Analysis:Constructor'], ...
37+
['Input is not of class Randomcomparison']) %#ok<NBRAK>
38+
analysis.randomcomparison_idict.add(randomcomparison.getID(), randomcomparison);
39+
end
40+
41+
analysis.comparison_idict = IndexedDictionary(analysis.getComparisonClass());
42+
assert(iscell(comparisons), ...
43+
['BRAPH:Analysis:Constructor'], ...
44+
['Input is not a cell of RandomComparisons objects']) %#ok<NBRAK>
45+
for i = 1:1:length(comparisons)
46+
comparison = comparisons{i};
47+
assert(isequal(comparison.getClass(), analysis.getComparisonClass()), ...
48+
['BRAPH:Analysis:Constructor'], ...
49+
['Input is not of class Comparison']) %#ok<NBRAK>
50+
analysis.comparison_idict.add(comparison.getID(), comparison);
51+
end
52+
53+
available_settings = Analysis.getAvailableSettings(class(analysis));
54+
settings = cell(length(available_settings), length(available_settings{1, 1}) - 2);
55+
for i = 1:1:length(available_settings)
56+
a_s = available_settings{i};
57+
available_setting_code = a_s{1, 1};
58+
available_setting_default = a_s{1, 3};
59+
settings{i, 1} = available_setting_code;
60+
settings{i, 2} = get_from_varargin(available_setting_default, available_setting_code, varargin{:});
61+
end
62+
analysis.settings = settings;
63+
end
64+
function analysis_copy = copyElement(analysis)
65+
% shallow copy of Analysis
66+
analysis_copy = copyElement@matlab.mixin.Copyable(analysis);
67+
68+
% deep copy of cohort
69+
analysis_copy.cohort = analysis.getCohort().copy();
70+
71+
% deep copy of measurement
72+
analysis_copy.measurement_idict = IndexedDictionary(analysis_copy.getMeasurementClass());
73+
for measurement_i = 1:1:analysis.getMeasurements().length()
74+
measurement = analysis.getMeasurements().getValue(measurement_i);
75+
measurement_copy = measurement.copy();
76+
measurement_copy.setBrainAtlases(analysis_copy.cohort.getBrainAtlases());
77+
group = measurement.getGroup();
78+
group_copy = analysis_copy.cohort.getGroups().getValue(group.getName());
79+
measurement_copy.setGroup(group_copy);
80+
analysis_copy.measurement_idict.add(tostring(measurement_copy.getID()), measurement_copy, measurement_i);
81+
end
82+
83+
% deep copy of randomcomparison
84+
analysis_copy.randomcomparison_idict = IndexedDictionary(analysis_copy.getRandomComparisonClass());
85+
for randomcomparisons_i = 1:1:analysis.getRandomComparisons().length()
86+
randomcomparison = analysis.getRandomComparisons().getValue(randomcomparisons_i);
87+
randomcomparison_copy = randomcomparison.copy();
88+
randomcomparison_copy.setBrainAtlases(analysis_copy.cohort.getBrainAtlases());
89+
group = randomcomparison.getGroup();
90+
group_copy = analysis_copy.cohort.getGroups().getValue(group.getName());
91+
randomcomparison_copy.setGroup(group_copy);
92+
analysis_copy.randomcomparison_idict.add(tostring(randomcomparison_copy.getID()), randomcomparison_copy, randomcomparisons_i);
93+
end
94+
95+
% deep copy of comparisons
96+
analysis_copy.comparison_idict = IndexedDictionary(analysis_copy.getComparisonClass());
97+
for comparisons_i = 1:1:analysis.getComparisons().length()
98+
comparison = analysis.getComparisons().getValue(comparisons_i);
99+
comparison_copy = comparison.copy();
100+
comparison_copy.setBrainAtlases(analysis_copy.cohort.getBrainAtlases());
101+
groups = comparison.getGroups();
102+
for j = 1:1:numel(groups)
103+
group = groups{j};
104+
groups_copy{j} = analysis_copy.cohort.getGroups().getValue(group.getName()); %#ok<AGROW>
105+
end
106+
comparison_copy.setGroups(groups_copy);
107+
analysis_copy.comparison_idict.add(tostring(comparison_copy.getID()), comparison_copy, comparisons_i);
108+
end
109+
end
110+
end
111+
methods (Abstract)
112+
getMeasurementID(analysis, measure_code, group, varargin)
113+
getRandomComparisonID(analysis, measure_code, group, varargin)
114+
getComparisonID(analysis, measure_code, groups, varargin)
115+
end
116+
methods (Abstract, Access = protected)
117+
calculate_measurement(analysis, measure_code, group, varargin)
118+
calculate_random_comparison(analysis, measure_code, group, varargin)
119+
calculate_comparison(analysis, measure_code, groups, varargin)
120+
end
121+
methods
122+
function cohort = getCohort(analysis)
123+
cohort = analysis.cohort;
124+
end
125+
function measurement_idict = getMeasurements(analysis)
126+
measurement_idict = analysis.measurement_idict;
127+
end
128+
function randomparison_idict = getRandomComparisons(analysis)
129+
randomparison_idict = analysis.randomcomparison_idict;
130+
end
131+
function comparison_idict = getComparisons(analysis)
132+
comparison_idict = analysis.comparison_idict;
133+
end
134+
function measurement = calculateMeasurement(analysis, measure_code, group, varargin)
135+
id = analysis.getMeasurementID(measure_code, group, varargin{:});
136+
if ~analysis.getMeasurements().contains(id)
137+
measurement = calculate_measurement(analysis, measure_code, group, varargin{:});
138+
analysis.getMeasurements().add(id, measurement)
139+
end
140+
measurement = analysis.getMeasurements().getValue(id);
141+
end
142+
function random_comparison = calculateRandomComparison(analysis, measure_code, group, varargin)
143+
id = analysis.getRandomComparisonID(measure_code, group, varargin{:});
144+
if ~analysis.getRandomComparisons().contains(id)
145+
random_comparison = calculate_random_comparison(analysis, measure_code, group, varargin{:});
146+
analysis.getRandomComparisons().add(id, random_comparison)
147+
end
148+
random_comparison = analysis.getRandomComparisons().getValue(id);
149+
end
150+
function comparison = calculateComparison(analysis, measure_code, groups, varargin)
151+
id = analysis.getComparisonID(measure_code, groups, varargin{:});
152+
if ~analysis.getComparisons().contains(id)
153+
comparison = calculate_comparison(analysis, measure_code, groups, varargin{:});
154+
analysis.getComparisons().add(id, comparison)
155+
end
156+
comparison = analysis.getComparisons().getValue(id);
157+
end
158+
function res = getSettings(analysis, setting_code)
159+
if nargin<2
160+
res = analysis.settings;
161+
else
162+
for i = 1:1:length(analysis.settings)
163+
if isequal(analysis.settings{i, 1}, setting_code)
164+
res = get_from_varargin([], setting_code, analysis.settings{i, :});
165+
end
166+
end
167+
end
168+
end
169+
end
170+
methods (Static)
171+
function analysis_list = getList()
172+
analysis_list = subclasses('Analysis');
173+
end
174+
function analysis_class = getClass(analysis)
175+
% analysis class (same as the analysis object name)
176+
177+
if isa(analysis, 'Analysis')
178+
analysis_class = class(analysis);
179+
else % analysis should be a string with the analysis class
180+
analysis_class = analysis;
181+
end
182+
end
183+
function name = getName(analysis)
184+
% analysis name
185+
name = eval([Analysis.getClass(analysis) '.getName()']);
186+
end
187+
function subject_class = getSubjectClass(analysis)
188+
% cohort class
189+
subject_class = eval([Analysis.getClass(analysis) '.getSubjectClass()']);
190+
end
191+
function description = getDescription(analysis)
192+
% analysis description
193+
description = eval([Analysis.getClass(analysis) '.getDescription()']);
194+
end
195+
function measurmentList = getMeasurementClass(analysis)
196+
measurmentList = eval([Analysis.getClass(analysis) '.getMeasurementClass()']);
197+
end
198+
function randomcomparisonList = getRandomComparisonClass(analysis)
199+
randomcomparisonList = eval([Analysis.getClass(analysis) '.getRandomComparisonClass()']);
200+
end
201+
function comparisonList = getComparisonClass(analysis)
202+
comparisonList = eval([Analysis.getClass(analysis) '.getComparisonClass()']);
203+
end
204+
function available_settings = getAvailableSettings(analysis)
205+
available_settings = eval([Analysis.getClass(analysis) '.getAvailableSettings()']);
206+
end
207+
function analysis = getAnalysis(analysis_class, cohort, varargin) %#ok<INUSD>
208+
analysis = eval([analysis_class '(cohort, varargin{:})']);
209+
end
210+
end
211+
end

braph/analysis/Comparison.m

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
classdef Comparison < handle & matlab.mixin.Copyable
2+
properties (GetAccess=protected, SetAccess=protected)
3+
id % unique identifier
4+
atlases % cell array with brain atlases
5+
groups % cell array with two groups
6+
settings % settings of the measurement
7+
end
8+
methods (Access = protected)
9+
function c = Comparison(id, atlases, groups, varargin)
10+
c.id = tostring(id);
11+
12+
if ~iscell(atlases)
13+
atlases = {atlases};
14+
end
15+
assert(iscell(atlases) && all(cellfun(@(x) isa(x, 'BrainAtlas'), atlases)), ...
16+
['BRAPH:Comparison:AtlasErr'], ...
17+
['The input must be a cell containing BrainAtlas objects']) %#ok<NBRAK>
18+
c.atlases = atlases;
19+
20+
assert(iscell(groups) && length(groups)==2 && all(cellfun(@(x) isa(x, 'Group'), groups)), ...
21+
['BRAPH:Comparison:GroupErr'], ...
22+
['The input must be a cell array with two Group']) %#ok<NBRAK>
23+
c.groups = groups;
24+
25+
c.settings = get_from_varargin(varargin, 'ComparisonSettings', varargin{:});
26+
27+
c.initialize_data(atlases, groups, varargin{:});
28+
end
29+
function comparison_copy = copyElement(c)
30+
% It does not make a deep copy of atlases or groups
31+
32+
% Make a shallow copy
33+
comparison_copy = copyElement@matlab.mixin.Copyable(c);
34+
35+
end
36+
end
37+
methods (Abstract, Access = protected)
38+
initialize_data(c, varargin) % initialize datadict
39+
end
40+
methods
41+
function id = getID(c)
42+
id = c.id;
43+
end
44+
function str = tostring(c)
45+
str = [Comparison.getClass(c) ' ' c.getID()];
46+
end
47+
function disp(c)
48+
disp(['<a href="matlab:help ' Comparison.getClass(c) '">' Comparison.getClass(c) '</a>'])
49+
disp(['id = ' c.getID()])
50+
end
51+
function setBrainAtlases(c, atlases)
52+
c.atlases = atlases;
53+
end
54+
function atlases = getBrainAtlases(c)
55+
atlases = c.atlases;
56+
end
57+
function setGroups(c, groups)
58+
c.groups = groups;
59+
end
60+
function groups = getGroups(c)
61+
groups = c.groups;
62+
end
63+
end
64+
methods (Static)
65+
function comparison_list = getList()
66+
comparison_list = subclasses('Comparison');
67+
end
68+
function comparison_class = getClass(c)
69+
if isa(c, 'Comparison')
70+
comparison_class = class(c);
71+
else % c should be a string with the comparison class
72+
comparison_class = c;
73+
end
74+
end
75+
function name = getName(c)
76+
name = eval([Comparison.getClass(c) '.getName()']);
77+
end
78+
function description = getDescription(c)
79+
% comparison description
80+
description = eval([Comparison.getClass(c) '.getDescription()']);
81+
end
82+
function atlas_number = getBrainAtlasNumber(c)
83+
atlas_number = eval([Comparison.getClass(c) '.getBrainAtlasNumber()']);
84+
end
85+
function analysis_class = getAnalysisClass(c)
86+
% comparison analysis class
87+
analysis_class = eval([Comparison.getClass(c) '.getAnalysisClass()']);
88+
end
89+
function subject_class = getSubjectClass(c)
90+
% comparison subject class
91+
subject_class = eval([Comparison.getClass(c) '.getSubjectClass()']);
92+
end
93+
function sub = getComparison(comparisonClass, id, atlases, groups, varargin) %#ok<*INUSD>
94+
sub = eval([comparisonClass '(id, atlases, groups, varargin{:})']);
95+
end
96+
end
97+
end

braph/analysis/Correlation.m

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
classdef Correlation
2+
properties (Constant)
3+
CORRELATION_RULE_LIST = {'pearson', 'spearman', 'kendall', 'partial pearson', 'partial spearman'};
4+
NEGATIVE_WEIGHT_RULE_LIST = {'zero', 'abs', 'none'};
5+
end
6+
methods (Static)
7+
function [A, P] = getAdjacencyMatrix(data, correlation_rule, negative_weight_rule)
8+
9+
switch lower(correlation_rule)
10+
case 'spearman'
11+
[A, P] = corr(data, 'Type', 'Spearman');
12+
case 'kendall'
13+
[A, P] = corr(data,'Type','Kendall');
14+
case 'partial pearson'
15+
[A, P] = partialcorr(data,'Type','Pearson');
16+
case 'partial spearman'
17+
[A, P] = partialcorr(data,'Type','Spearman');
18+
otherwise % 'Pearson' default
19+
[A, P] = corrcoef(data);
20+
end
21+
22+
switch lower(negative_weight_rule)
23+
case 'none'
24+
25+
case 'abs'
26+
A = abs(A);
27+
otherwise % 'zero' default
28+
A(A < 0) = 0;
29+
end
30+
end
31+
end
32+
end

0 commit comments

Comments
 (0)