1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 """Functions for sorting and nesting the models in relaxation dispersion specific analysis."""
25
26
27 from datetime import date
28 from functools import partial
29 from operator import attrgetter, ne
30
31
32 from lib.dispersion.variables import EQ_ANALYTIC, EQ_NUMERIC, EQ_SILICO, EXP_TYPE_CPMG_MMQ, EXP_TYPE_R1RHO, EXP_TYPE_CPMG_SQ, EXP_TYPE_NOREX, EXP_TYPE_R2EFF, MODEL_DESC, MODEL_EQ, MODEL_EXP_TYPE, MODEL_NEST, MODEL_PARAMS, MODEL_PARAMS_LM63, MODEL_PARAMS_LM63_3SITE, MODEL_PARAMS_NS_MMQ_2SITE, MODEL_PARAMS_NS_MMQ_3SITE, MODEL_PARAMS_NS_MMQ_3SITE_LINEAR, MODEL_PARAMS_NS_R1RHO_2SITE, MODEL_PARAMS_NS_R1RHO_3SITE, MODEL_PARAMS_NS_R1RHO_3SITE_LINEAR, MODEL_SITES, MODEL_YEAR, PARAMS_R20
33 from specific_analyses.relax_disp.data import is_r1_optimised
34
35
36
37
40 """Class for storing model information.
41
42 @keyword model: Current model
43 @type model: str
44 """
45
46
47 self.model = model
48
49
50 self.desc = MODEL_DESC[self.model]
51
52
53 self.eq = MODEL_EQ[self.model]
54
55
56 self.exp_type = MODEL_EXP_TYPE[self.model]
57
58
59 self.params = MODEL_PARAMS[self.model]
60 if is_r1_optimised(model=model) and 'r1' not in self.params:
61 self.params.insert(0, 'r1')
62
63
64 self.params_nr = len(self.params)
65
66
67 self.sites = MODEL_SITES[self.model]
68
69
70 self.year = MODEL_YEAR[self.model]
71
72
73 nest_list = MODEL_NEST[self.model]
74
75
76 if nest_list == None:
77 self.nest_list = nest_list
78 else:
79 nest_list = list(filter(partial(ne, self.model), nest_list))
80 self.nest_list = nest_list
81
82
83 order_exp_type = [EXP_TYPE_R2EFF, EXP_TYPE_NOREX, EXP_TYPE_CPMG_SQ, EXP_TYPE_CPMG_MMQ, EXP_TYPE_R1RHO]
84
85
86 self.exp_type_i = order_exp_type.index(self.exp_type)
87
88
89 order_eq = [EQ_NUMERIC, EQ_SILICO, EQ_ANALYTIC]
90
91
92 self.eq_i = order_eq.index(self.eq)
93
94
95 order_s = [EQ_SILICO, EQ_ANALYTIC, EQ_NUMERIC]
96
97
98 self.eq_s = order_s.index(self.eq)
99
100
101 self.year_diff = date.today().year - self.year
102
103
105 return repr((self.model, self.desc, self.exp_type, self.eq, self.sites, self.year, self.params, self.params_nr))
106
107
108
110 """Get model info for list of models.
111
112 @keyword model: The list of all models analysed.
113 @type model: list of str
114 @return: List of tuples, where each tuple contains model info.
115 @rtype: List of tuples with str.
116 """
117
118
119 models_info = []
120
121
122 for model in models:
123
124 models_info.append(Model_class(model=model))
125
126
127 return models_info
128
129
130
132 """Determine if the current model can use nested results from any of the previous analysed models.
133
134 @keyword self_models: The list of all models analysed.
135 @type self_models: list of str
136 @keyword model: The current model to analyse.
137 @type model: str
138 @return: The current model info, the possible nest model info.
139 @rtype: class, class
140 """
141
142
143
144 model_index = self_models.index(model)
145
146
147 completed_models = self_models[:model_index]
148
149
150 model_info = models_info([model])[0]
151
152
153 completed_models_info = models_info(completed_models)
154
155
156 completed_models_info = sorted(completed_models_info, key=attrgetter('exp_type_i', 'eq_i', 'sites', 'year_diff', 'params_nr'))
157
158
159 if model_info.nest_list == None:
160 return model_info, None
161
162 else:
163
164 for nest_model in model_info.nest_list:
165
166 for completed_model_info in completed_models_info:
167
168 if nest_model == completed_model_info.model:
169 return model_info, completed_model_info
170
171
172 return model_info, None
173
174
175
177 """Determine the conversion from the nested models params, to the current model params.
178
179 @keyword model_params: The list of the current model parameters.
180 @type model_params: list of str
181 @keyword nested_model_params: The list of the nested model parameters.
182 @type nested_model_params: list of str
183 @return: A dictionary of parameter conversion for the current model params.
184 @rtype: dictionary
185 """
186
187
188 par_dic = {}
189
190
191 for param in model_params:
192
193 if param in PARAMS_R20:
194
195 if param in nested_model_params:
196 par_dic[param] = param
197
198
199 elif param == 'r2a' and 'r2' in nested_model_params:
200 par_dic[param] = 'r2'
201
202 elif param == 'r2b' and 'r2' in nested_model_params:
203 par_dic[param] = 'r2'
204
205
206 elif param == 'r2' and 'r2a' in nested_model_params:
207 par_dic[param] = 'r2a'
208
209
210 elif param in nested_model_params:
211 par_dic[param] = param
212
213 else:
214 par_dic[param] = None
215
216
217 if set(model_params) == set(MODEL_PARAMS_LM63_3SITE) and set(nested_model_params) == set(MODEL_PARAMS_LM63):
218 for param in model_params:
219 if param == 'phi_ex_B':
220 par_dic[param] = 'phi_ex'
221
222 elif param == 'phi_ex_C':
223 par_dic[param] = 'phi_ex'
224
225 elif param == 'kB':
226 par_dic[param] = 'kex'
227
228 elif param == 'kC':
229 par_dic[param] = 'kex'
230
231
232 elif set(model_params) == set(MODEL_PARAMS_NS_R1RHO_3SITE) and set(nested_model_params) == set(MODEL_PARAMS_NS_R1RHO_3SITE_LINEAR):
233 for param in model_params:
234 if param == 'kex_AC':
235 par_dic[param] = '0.0'
236
237
238 elif set(model_params) == set(MODEL_PARAMS_NS_R1RHO_3SITE_LINEAR) and set(nested_model_params) == set(MODEL_PARAMS_NS_R1RHO_2SITE):
239 for param in model_params:
240 if param == 'dw_AB':
241 par_dic[param] = 'dw'
242
243 elif param == 'kex_AB':
244 par_dic[param] = 'kex'
245
246 elif param == 'dw_BC':
247 par_dic[param] = 'dw'
248
249 elif param == 'kex_BC':
250 par_dic[param] = 'kex'
251
252 elif param == 'pB':
253 par_dic[param] = '1 - pA'
254
255
256 elif set(model_params) == set(MODEL_PARAMS_NS_R1RHO_3SITE) and set(nested_model_params) == set(MODEL_PARAMS_NS_R1RHO_2SITE):
257 for param in model_params:
258 if param == 'dw_AB':
259 par_dic[param] = 'dw'
260
261 elif param == 'kex_AB':
262 par_dic[param] = 'kex'
263
264 elif param == 'dw_BC':
265 par_dic[param] = 'dw'
266
267 elif param == 'kex_BC':
268 par_dic[param] = 'kex'
269
270 elif param == 'kex_AC':
271 par_dic[param] = 'kex'
272
273 elif param == 'pB':
274 par_dic[param] = '1 - pA'
275
276
277 elif set(model_params) == set(MODEL_PARAMS_NS_MMQ_3SITE) and set(nested_model_params) == set(MODEL_PARAMS_NS_MMQ_3SITE_LINEAR):
278 for param in model_params:
279 if param == 'kex_AC':
280 par_dic[param] = '0.0'
281
282
283 elif set(model_params) == set(MODEL_PARAMS_NS_MMQ_3SITE_LINEAR) and set(nested_model_params) == set(MODEL_PARAMS_NS_MMQ_2SITE):
284 for param in model_params:
285 if param == 'dw_AB':
286 par_dic[param] = 'dw'
287
288 elif param == 'dwH_AB':
289 par_dic[param] = 'dwH'
290
291 elif param == 'kex_AB':
292 par_dic[param] = 'kex'
293
294 elif param == 'dw_BC':
295 par_dic[param] = 'dw'
296
297 elif param == 'dwH_BC':
298 par_dic[param] = 'dwH'
299
300 elif param == 'kex_BC':
301 par_dic[param] = 'kex'
302
303 elif param == 'pB':
304 par_dic[param] = '1 - pA'
305
306
307 elif set(model_params) == set(MODEL_PARAMS_NS_MMQ_3SITE) and set(nested_model_params) == set(MODEL_PARAMS_NS_MMQ_2SITE):
308 for param in model_params:
309 if param == 'dw_AB':
310 par_dic[param] = 'dw'
311
312 elif param == 'dwH_AB':
313 par_dic[param] = 'dwH'
314
315 elif param == 'kex_AB':
316 par_dic[param] = 'kex'
317
318 elif param == 'dw_BC':
319 par_dic[param] = 'dw'
320
321 elif param == 'dwH_BC':
322 par_dic[param] = 'dwH'
323
324 elif param == 'kex_BC':
325 par_dic[param] = 'kex'
326
327 elif param == 'kex_AC':
328 par_dic[param] = 'kex'
329
330 elif param == 'pB':
331 par_dic[param] = '1 - pA'
332
333
334 return par_dic
335
336
337
339 """Determine how to order the models for analyses.
340
341 @keyword models: The list of all models to be analysed.
342 @type models: list of str
343 @return: The ordered list how models should be analysed.
344 @rtype: list of str
345 """
346
347
348 all_models_info = models_info(models)
349
350
351 all_models_info_sorted = sorted(all_models_info, key=attrgetter('exp_type_i', 'eq_s', 'sites', 'year_diff', 'params_nr'))
352
353
354 sorted_models = []
355
356
357 for model_info in all_models_info_sorted:
358 sorted_models.append(model_info.model)
359
360
361 return sorted_models
362