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
0 commit comments