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