1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from copy import deepcopy
24 from numpy import array, array_equal, diag, float64
25
26
27 from data_store import Relax_data_store; ds = Relax_data_store()
28 from data_store.mol_res_spin import SpinContainer
29 from lib.dispersion.variables import MODEL_LIST_FULL, \
30 MODEL_PARAMS, \
31 MODEL_R2EFF, \
32 MODEL_NOREX, \
33 MODEL_LM63, \
34 MODEL_LM63_3SITE, \
35 MODEL_CR72, \
36 MODEL_CR72_FULL, \
37 MODEL_IT99, \
38 MODEL_TSMFK01, \
39 MODEL_B14, \
40 MODEL_B14_FULL, \
41 MODEL_M61, \
42 MODEL_M61B, \
43 MODEL_DPL94, \
44 MODEL_TP02, \
45 MODEL_TAP03, \
46 MODEL_MP05, \
47 MODEL_NS_CPMG_2SITE_3D, \
48 MODEL_NS_CPMG_2SITE_3D_FULL, \
49 MODEL_NS_CPMG_2SITE_STAR, \
50 MODEL_NS_CPMG_2SITE_STAR_FULL, \
51 MODEL_NS_CPMG_2SITE_EXPANDED, \
52 MODEL_NS_R1RHO_2SITE, \
53 MODEL_NS_R1RHO_3SITE, \
54 MODEL_NS_R1RHO_3SITE_LINEAR, \
55 MODEL_MMQ_CR72, \
56 MODEL_NS_MMQ_2SITE, \
57 MODEL_NS_MMQ_3SITE, \
58 MODEL_NS_MMQ_3SITE_LINEAR, \
59 MODEL_EXP_TYPE_R2EFF, \
60 MODEL_EXP_TYPE_NOREX, \
61 MODEL_EXP_TYPE_LM63, \
62 MODEL_EXP_TYPE_LM63_3SITE, \
63 MODEL_EXP_TYPE_CR72, \
64 MODEL_EXP_TYPE_CR72_FULL, \
65 MODEL_EXP_TYPE_TSMFK01, \
66 MODEL_EXP_TYPE_TSMFK01, \
67 MODEL_EXP_TYPE_B14, \
68 MODEL_EXP_TYPE_B14_FULL, \
69 MODEL_EXP_TYPE_M61, \
70 MODEL_EXP_TYPE_M61B, \
71 MODEL_EXP_TYPE_DPL94, \
72 MODEL_EXP_TYPE_TP02, \
73 MODEL_EXP_TYPE_TAP03, \
74 MODEL_EXP_TYPE_MP05, \
75 MODEL_EXP_TYPE_NS_CPMG_2SITE_3D, \
76 MODEL_EXP_TYPE_NS_CPMG_2SITE_3D_FULL, \
77 MODEL_EXP_TYPE_NS_CPMG_2SITE_STAR, \
78 MODEL_EXP_TYPE_NS_CPMG_2SITE_STAR_FULL, \
79 MODEL_EXP_TYPE_NS_CPMG_2SITE_EXPANDED, \
80 MODEL_EXP_TYPE_NS_R1RHO_2SITE, \
81 MODEL_EXP_TYPE_NS_R1RHO_3SITE, \
82 MODEL_EXP_TYPE_NS_R1RHO_3SITE_LINEAR, \
83 MODEL_EXP_TYPE_MMQ_CR72, \
84 MODEL_EXP_TYPE_NS_MMQ_2SITE, \
85 MODEL_EXP_TYPE_NS_MMQ_3SITE, \
86 MODEL_EXP_TYPE_NS_MMQ_3SITE_LINEAR
87 from specific_analyses.relax_disp.parameters import linear_constraints, loop_parameters, param_conversion, param_num
88 from test_suite.unit_tests.base_classes import UnitTestCase
89
90
92 """Unit tests for the functions of the specific_analyses.relax_disp.parameters module."""
93
95 """Setup some structures for the unit tests."""
96
97
98 ds.add(pipe_name='testing', pipe_type='relax_disp')
99
100
101 self.exp_type = {
102 MODEL_R2EFF: MODEL_EXP_TYPE_R2EFF,
103 MODEL_NOREX: MODEL_EXP_TYPE_NOREX,
104 MODEL_LM63: MODEL_EXP_TYPE_LM63,
105 MODEL_LM63_3SITE: MODEL_EXP_TYPE_LM63_3SITE,
106 MODEL_CR72: MODEL_EXP_TYPE_CR72,
107 MODEL_CR72_FULL: MODEL_EXP_TYPE_CR72_FULL,
108 MODEL_IT99: MODEL_EXP_TYPE_TSMFK01,
109 MODEL_TSMFK01: MODEL_EXP_TYPE_TSMFK01,
110 MODEL_B14: MODEL_EXP_TYPE_B14,
111 MODEL_B14_FULL: MODEL_EXP_TYPE_B14_FULL,
112 MODEL_M61: MODEL_EXP_TYPE_M61,
113 MODEL_M61B: MODEL_EXP_TYPE_M61B,
114 MODEL_DPL94: MODEL_EXP_TYPE_DPL94,
115 MODEL_TP02: MODEL_EXP_TYPE_TP02,
116 MODEL_TAP03: MODEL_EXP_TYPE_TAP03,
117 MODEL_MP05: MODEL_EXP_TYPE_MP05,
118 MODEL_NS_CPMG_2SITE_3D: MODEL_EXP_TYPE_NS_CPMG_2SITE_3D,
119 MODEL_NS_CPMG_2SITE_3D_FULL: MODEL_EXP_TYPE_NS_CPMG_2SITE_3D_FULL,
120 MODEL_NS_CPMG_2SITE_STAR: MODEL_EXP_TYPE_NS_CPMG_2SITE_STAR,
121 MODEL_NS_CPMG_2SITE_STAR_FULL: MODEL_EXP_TYPE_NS_CPMG_2SITE_STAR_FULL,
122 MODEL_NS_CPMG_2SITE_EXPANDED: MODEL_EXP_TYPE_NS_CPMG_2SITE_EXPANDED,
123 MODEL_NS_R1RHO_2SITE: MODEL_EXP_TYPE_NS_R1RHO_2SITE,
124 MODEL_NS_R1RHO_3SITE: MODEL_EXP_TYPE_NS_R1RHO_3SITE,
125 MODEL_NS_R1RHO_3SITE_LINEAR: MODEL_EXP_TYPE_NS_R1RHO_3SITE_LINEAR,
126 MODEL_MMQ_CR72: MODEL_EXP_TYPE_MMQ_CR72,
127 MODEL_NS_MMQ_2SITE: MODEL_EXP_TYPE_NS_MMQ_2SITE,
128 MODEL_NS_MMQ_3SITE: MODEL_EXP_TYPE_NS_MMQ_3SITE,
129 MODEL_NS_MMQ_3SITE_LINEAR: MODEL_EXP_TYPE_NS_MMQ_3SITE_LINEAR
130 }
131
132
134 """Test the specific_analyses.relax_disp.parameters.linear_constraints() function for a cluster of 2 spins."""
135
136
137 expected = {
138 MODEL_R2EFF: {
139 'scaling_matrix': diag(array([1, 1], float64)),
140 'A': array(
141 [[ 1, 0],
142 [-1, 0],
143 [ 0, 1],
144 [ 0, -1]],
145 float64),
146 'b': array([0, -200, 0, -200], float64)
147 },
148 MODEL_NOREX: {
149 'scaling_matrix': diag(array([10, 10], float64)),
150 'A': array(
151 [[ 1, 0],
152 [-1, 0],
153 [ 0, 1],
154 [ 0, -1]],
155 float64),
156 'b': array([0, -20, 0, -20], float64)
157 },
158 MODEL_LM63: {
159 'scaling_matrix': diag(array([10, 10, 1, 1, 10000], float64)),
160 'A': array(
161 [[ 1, 0, 0, 0, 0],
162 [-1, 0, 0, 0, 0],
163 [ 0, 1, 0, 0, 0],
164 [ 0, -1, 0, 0, 0],
165 [ 0, 0, 1, 0, 0],
166 [ 0, 0, 0, 1, 0],
167 [ 0, 0, 0, 0, 1],
168 [ 0, 0, 0, 0, -1]],
169 float64),
170 'b': array([0, -20, 0, -20, 0, 0, 0, -200], float64)
171 },
172 MODEL_LM63_3SITE: {
173 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1, 10000, 10000], float64)),
174 'A': array(
175 [[ 1, 0, 0, 0, 0, 0, 0, 0],
176 [-1, 0, 0, 0, 0, 0, 0, 0],
177 [ 0, 1, 0, 0, 0, 0, 0, 0],
178 [ 0, -1, 0, 0, 0, 0, 0, 0],
179 [ 0, 0, 1, 0, 0, 0, 0, 0],
180 [ 0, 0, 0, 1, 0, 0, 0, 0],
181 [ 0, 0, 0, 0, 1, 0, 0, 0],
182 [ 0, 0, 0, 0, 0, 1, 0, 0],
183 [ 0, 0, 0, 0, 0, 0, 1, 0],
184 [ 0, 0, 0, 0, 0, 0, -1, 0],
185 [ 0, 0, 0, 0, 0, 0, 0, 1],
186 [ 0, 0, 0, 0, 0, 0, 0, -1]],
187 float64),
188 'b': array([0, -20, 0, -20, 0, 0, 0, 0, 0, -200, 0, -200], float64)
189 },
190 MODEL_CR72: {
191 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
192 'A': array(
193 [[ 1, 0, 0, 0, 0, 0],
194 [-1, 0, 0, 0, 0, 0],
195 [ 0, 1, 0, 0, 0, 0],
196 [ 0, -1, 0, 0, 0, 0],
197 [ 0, 0, 1, 0, 0, 0],
198 [ 0, 0, 0, 1, 0, 0],
199 [ 0, 0, 0, 0, -1, 0],
200 [ 0, 0, 0, 0, 1, 0],
201 [ 0, 0, 0, 0, 0, 1],
202 [ 0, 0, 0, 0, 0, -1]],
203 float64),
204 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
205 },
206 MODEL_CR72_FULL: {
207 'scaling_matrix': diag(array([10, 10, 10, 10, 1, 1, 1, 10000], float64)),
208 'A': array(
209 [[ 1, 0, 0, 0, 0, 0, 0, 0],
210 [-1, 0, 0, 0, 0, 0, 0, 0],
211 [ 0, 1, 0, 0, 0, 0, 0, 0],
212 [ 0, -1, 0, 0, 0, 0, 0, 0],
213 [ 0, 0, 1, 0, 0, 0, 0, 0],
214 [ 0, 0, -1, 0, 0, 0, 0, 0],
215 [ 0, 0, 0, 1, 0, 0, 0, 0],
216 [ 0, 0, 0, -1, 0, 0, 0, 0],
217 [ 0, 0, 0, 0, 1, 0, 0, 0],
218 [ 0, 0, 0, 0, 0, 1, 0, 0],
219 [ 0, 0, 0, 0, 0, 0, -1, 0],
220 [ 0, 0, 0, 0, 0, 0, 1, 0],
221 [ 0, 0, 0, 0, 0, 0, 0, 1],
222 [ 0, 0, 0, 0, 0, 0, 0, -1]],
223 float64),
224 'b': array([0, -20, 0, -20, 0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
225 },
226 MODEL_IT99: {
227 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1e-4], float64)),
228 'A': array(
229 [[ 1, 0, 0, 0, 0, 0],
230 [-1, 0, 0, 0, 0, 0],
231 [ 0, 1, 0, 0, 0, 0],
232 [ 0, -1, 0, 0, 0, 0],
233 [ 0, 0, 1, 0, 0, 0],
234 [ 0, 0, 0, 1, 0, 0],
235 [ 0, 0, 0, 0, -1, 0],
236 [ 0, 0, 0, 0, 1, 0],
237 [ 0, 0, 0, 0, 0, 1]],
238 float64),
239 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0], float64)
240 },
241 MODEL_TSMFK01: {
242 'scaling_matrix': diag(array([10, 10, 1, 1, 20], float64)),
243 'A': array(
244 [[ 1, 0, 0, 0, 0],
245 [-1, 0, 0, 0, 0],
246 [ 0, 1, 0, 0, 0],
247 [ 0, -1, 0, 0, 0],
248 [ 0, 0, 1, 0, 0],
249 [ 0, 0, 0, 1, 0],
250 [ 0, 0, 0, 0, 1],
251 [ 0, 0, 0, 0, -1]],
252 float64),
253 'b': array([0, -20, 0, -20, 0, 0, 0, -5], float64)
254 },
255 MODEL_B14: {
256 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
257 'A': array(
258 [[ 1, 0, 0, 0, 0, 0],
259 [-1, 0, 0, 0, 0, 0],
260 [ 0, 1, 0, 0, 0, 0],
261 [ 0, -1, 0, 0, 0, 0],
262 [ 0, 0, 1, 0, 0, 0],
263 [ 0, 0, 0, 1, 0, 0],
264 [ 0, 0, 0, 0, -1, 0],
265 [ 0, 0, 0, 0, 1, 0],
266 [ 0, 0, 0, 0, 0, 1],
267 [ 0, 0, 0, 0, 0, -1]],
268 float64),
269 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
270 },
271 MODEL_B14_FULL: {
272 'scaling_matrix': diag(array([10, 10, 10, 10, 1, 1, 1, 10000], float64)),
273 'A': array(
274 [[ 1, 0, 0, 0, 0, 0, 0, 0],
275 [-1, 0, 0, 0, 0, 0, 0, 0],
276 [ 0, 1, 0, 0, 0, 0, 0, 0],
277 [ 0, -1, 0, 0, 0, 0, 0, 0],
278 [ 0, 0, 1, 0, 0, 0, 0, 0],
279 [ 0, 0, -1, 0, 0, 0, 0, 0],
280 [ 0, 0, 0, 1, 0, 0, 0, 0],
281 [ 0, 0, 0, -1, 0, 0, 0, 0],
282 [ 0, 0, 0, 0, 1, 0, 0, 0],
283 [ 0, 0, 0, 0, 0, 1, 0, 0],
284 [ 0, 0, 0, 0, 0, 0, -1, 0],
285 [ 0, 0, 0, 0, 0, 0, 1, 0],
286 [ 0, 0, 0, 0, 0, 0, 0, 1],
287 [ 0, 0, 0, 0, 0, 0, 0, -1]],
288 float64),
289 'b': array([0, -20, 0, -20, 0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
290 },
291 MODEL_M61: {
292 'scaling_matrix': diag(array([10, 10, 1, 1, 10000], float64)),
293 'A': array(
294 [[ 1, 0, 0, 0, 0],
295 [-1, 0, 0, 0, 0],
296 [ 0, 1, 0, 0, 0],
297 [ 0, -1, 0, 0, 0],
298 [ 0, 0, 1, 0, 0],
299 [ 0, 0, 0, 1, 0],
300 [ 0, 0, 0, 0, 1],
301 [ 0, 0, 0, 0, -1]],
302 float64),
303 'b': array([0, -20, 0, -20, 0, 0, 0, -200], float64)
304 },
305 MODEL_M61B: {
306 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
307 'A': array(
308 [[ 1, 0, 0, 0, 0, 0],
309 [-1, 0, 0, 0, 0, 0],
310 [ 0, 1, 0, 0, 0, 0],
311 [ 0, -1, 0, 0, 0, 0],
312 [ 0, 0, 1, 0, 0, 0],
313 [ 0, 0, 0, 1, 0, 0],
314 [ 0, 0, 0, 0, -1, 0],
315 [ 0, 0, 0, 0, 1, 0],
316 [ 0, 0, 0, 0, 0, 1],
317 [ 0, 0, 0, 0, 0, -1]],
318 float64),
319 'b': array([0, -20, 0, -20, 0, 0, -1, 0.85, 0, -200], float64)
320 },
321 MODEL_DPL94: {
322 'scaling_matrix': diag(array([10, 10, 1, 1, 10000], float64)),
323 'A': array(
324 [[ 1, 0, 0, 0, 0],
325 [-1, 0, 0, 0, 0],
326 [ 0, 1, 0, 0, 0],
327 [ 0, -1, 0, 0, 0],
328 [ 0, 0, 1, 0, 0],
329 [ 0, 0, 0, 1, 0],
330 [ 0, 0, 0, 0, 1],
331 [ 0, 0, 0, 0, -1]],
332 float64),
333 'b': array([0, -20, 0, -20, 0, 0, 0, -200], float64)
334 },
335 MODEL_TP02: {
336 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
337 'A': array(
338 [[ 1, 0, 0, 0, 0, 0],
339 [-1, 0, 0, 0, 0, 0],
340 [ 0, 1, 0, 0, 0, 0],
341 [ 0, -1, 0, 0, 0, 0],
342 [ 0, 0, 1, 0, 0, 0],
343 [ 0, 0, 0, 1, 0, 0],
344 [ 0, 0, 0, 0, -1, 0],
345 [ 0, 0, 0, 0, 1, 0],
346 [ 0, 0, 0, 0, 0, 1],
347 [ 0, 0, 0, 0, 0, -1]],
348 float64),
349 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
350 },
351 MODEL_TAP03: {
352 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
353 'A': array(
354 [[ 1, 0, 0, 0, 0, 0],
355 [-1, 0, 0, 0, 0, 0],
356 [ 0, 1, 0, 0, 0, 0],
357 [ 0, -1, 0, 0, 0, 0],
358 [ 0, 0, 1, 0, 0, 0],
359 [ 0, 0, 0, 1, 0, 0],
360 [ 0, 0, 0, 0, -1, 0],
361 [ 0, 0, 0, 0, 1, 0],
362 [ 0, 0, 0, 0, 0, 1],
363 [ 0, 0, 0, 0, 0, -1]],
364 float64),
365 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
366 },
367 MODEL_MP05: {
368 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
369 'A': array(
370 [[ 1, 0, 0, 0, 0, 0],
371 [-1, 0, 0, 0, 0, 0],
372 [ 0, 1, 0, 0, 0, 0],
373 [ 0, -1, 0, 0, 0, 0],
374 [ 0, 0, 1, 0, 0, 0],
375 [ 0, 0, 0, 1, 0, 0],
376 [ 0, 0, 0, 0, -1, 0],
377 [ 0, 0, 0, 0, 1, 0],
378 [ 0, 0, 0, 0, 0, 1],
379 [ 0, 0, 0, 0, 0, -1]],
380 float64),
381 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
382 },
383 MODEL_NS_CPMG_2SITE_3D: {
384 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
385 'A': array(
386 [[ 1, 0, 0, 0, 0, 0],
387 [-1, 0, 0, 0, 0, 0],
388 [ 0, 1, 0, 0, 0, 0],
389 [ 0, -1, 0, 0, 0, 0],
390 [ 0, 0, 1, 0, 0, 0],
391 [ 0, 0, 0, 1, 0, 0],
392 [ 0, 0, 0, 0, -1, 0],
393 [ 0, 0, 0, 0, 1, 0],
394 [ 0, 0, 0, 0, 0, 1],
395 [ 0, 0, 0, 0, 0, -1]],
396 float64),
397 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
398 },
399 MODEL_NS_CPMG_2SITE_3D_FULL: {
400 'scaling_matrix': diag(array([10, 10, 10, 10, 1, 1, 1, 10000], float64)),
401 'A': array(
402 [[ 1, 0, 0, 0, 0, 0, 0, 0],
403 [-1, 0, 0, 0, 0, 0, 0, 0],
404 [ 0, 1, 0, 0, 0, 0, 0, 0],
405 [ 0, -1, 0, 0, 0, 0, 0, 0],
406 [ 0, 0, 1, 0, 0, 0, 0, 0],
407 [ 0, 0, -1, 0, 0, 0, 0, 0],
408 [ 0, 0, 0, 1, 0, 0, 0, 0],
409 [ 0, 0, 0, -1, 0, 0, 0, 0],
410 [ 0, 0, 0, 0, 1, 0, 0, 0],
411 [ 0, 0, 0, 0, 0, 1, 0, 0],
412 [ 0, 0, 0, 0, 0, 0, -1, 0],
413 [ 0, 0, 0, 0, 0, 0, 1, 0],
414 [ 0, 0, 0, 0, 0, 0, 0, 1],
415 [ 0, 0, 0, 0, 0, 0, 0, -1]],
416 float64),
417 'b': array([0, -20, 0, -20, 0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
418 },
419 MODEL_NS_CPMG_2SITE_STAR: {
420 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
421 'A': array(
422 [[ 1, 0, 0, 0, 0, 0],
423 [-1, 0, 0, 0, 0, 0],
424 [ 0, 1, 0, 0, 0, 0],
425 [ 0, -1, 0, 0, 0, 0],
426 [ 0, 0, 1, 0, 0, 0],
427 [ 0, 0, 0, 1, 0, 0],
428 [ 0, 0, 0, 0, -1, 0],
429 [ 0, 0, 0, 0, 1, 0],
430 [ 0, 0, 0, 0, 0, 1],
431 [ 0, 0, 0, 0, 0, -1]],
432 float64),
433 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
434 },
435 MODEL_NS_CPMG_2SITE_STAR_FULL: {
436 'scaling_matrix': diag(array([10, 10, 10, 10, 1, 1, 1, 10000], float64)),
437 'A': array(
438 [[ 1, 0, 0, 0, 0, 0, 0, 0],
439 [-1, 0, 0, 0, 0, 0, 0, 0],
440 [ 0, 1, 0, 0, 0, 0, 0, 0],
441 [ 0, -1, 0, 0, 0, 0, 0, 0],
442 [ 0, 0, 1, 0, 0, 0, 0, 0],
443 [ 0, 0, -1, 0, 0, 0, 0, 0],
444 [ 0, 0, 0, 1, 0, 0, 0, 0],
445 [ 0, 0, 0, -1, 0, 0, 0, 0],
446 [ 0, 0, 0, 0, 1, 0, 0, 0],
447 [ 0, 0, 0, 0, 0, 1, 0, 0],
448 [ 0, 0, 0, 0, 0, 0, -1, 0],
449 [ 0, 0, 0, 0, 0, 0, 1, 0],
450 [ 0, 0, 0, 0, 0, 0, 0, 1],
451 [ 0, 0, 0, 0, 0, 0, 0, -1]],
452 float64),
453 'b': array([0, -20, 0, -20, 0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
454 },
455 MODEL_NS_CPMG_2SITE_EXPANDED: {
456 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
457 'A': array(
458 [[ 1, 0, 0, 0, 0, 0],
459 [-1, 0, 0, 0, 0, 0],
460 [ 0, 1, 0, 0, 0, 0],
461 [ 0, -1, 0, 0, 0, 0],
462 [ 0, 0, 1, 0, 0, 0],
463 [ 0, 0, 0, 1, 0, 0],
464 [ 0, 0, 0, 0, -1, 0],
465 [ 0, 0, 0, 0, 1, 0],
466 [ 0, 0, 0, 0, 0, 1],
467 [ 0, 0, 0, 0, 0, -1]],
468 float64),
469 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
470 },
471 MODEL_NS_R1RHO_2SITE: {
472 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 10000], float64)),
473 'A': array(
474 [[ 1, 0, 0, 0, 0, 0],
475 [-1, 0, 0, 0, 0, 0],
476 [ 0, 1, 0, 0, 0, 0],
477 [ 0, -1, 0, 0, 0, 0],
478 [ 0, 0, 1, 0, 0, 0],
479 [ 0, 0, 0, 1, 0, 0],
480 [ 0, 0, 0, 0, -1, 0],
481 [ 0, 0, 0, 0, 1, 0],
482 [ 0, 0, 0, 0, 0, 1],
483 [ 0, 0, 0, 0, 0, -1]],
484 float64),
485 'b': array([0, -20, 0, -20, 0, 0, -1, 0.5, 0, -200], float64)
486 },
487 MODEL_NS_R1RHO_3SITE: {
488 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1, 1, 10000, 1, 10000, 10000], float64)),
489 'A': array(
490 [[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
491 [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
492 [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
493 [ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
494 [ 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0],
495 [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
496 [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
497 [ 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0],
498 [ 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0],
499 [ 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0],
500 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
501 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0],
502 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
503 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1]],
504 float64),
505 'b': array([0, -20, 0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200, 0, -200], float64)
506 },
507 MODEL_NS_R1RHO_3SITE_LINEAR: {
508 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1, 1, 10000, 1, 10000], float64)),
509 'A': array(
510 [[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
511 [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
512 [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
513 [ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0],
514 [ 0, 0, 0, 0, 0, 0, -1, 0, 0, 0],
515 [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
516 [ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
517 [ 0, 0, 0, 0, 0, 0, 0, -1, 0, 0],
518 [ 0, 0, 0, 0, 0, 0, -1, 0, -1, 0],
519 [ 0, 0, 0, 0, 0, 0, 1, 0, -1, 0],
520 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
521 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1]],
522 float64),
523 'b': array([0, -20, 0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200], float64)
524 },
525 MODEL_MMQ_CR72: {
526 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1, 1, 10000], float64)),
527 'A': array(
528 [[ 1, 0, 0, 0, 0, 0, 0, 0],
529 [-1, 0, 0, 0, 0, 0, 0, 0],
530 [ 0, 1, 0, 0, 0, 0, 0, 0],
531 [ 0, -1, 0, 0, 0, 0, 0, 0],
532 [ 0, 0, 0, 0, 0, 0, -1, 0],
533 [ 0, 0, 0, 0, 0, 0, 1, 0],
534 [ 0, 0, 0, 0, 0, 0, 0, 1],
535 [ 0, 0, 0, 0, 0, 0, 0, -1]],
536 float64),
537 'b': array([0, -20, 0, -20, -1, 0.5, 0, -200], float64)
538 },
539 MODEL_NS_MMQ_2SITE: {
540 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1, 1, 10000], float64)),
541 'A': array(
542 [[ 1, 0, 0, 0, 0, 0, 0, 0],
543 [-1, 0, 0, 0, 0, 0, 0, 0],
544 [ 0, 1, 0, 0, 0, 0, 0, 0],
545 [ 0, -1, 0, 0, 0, 0, 0, 0],
546 [ 0, 0, 0, 0, 0, 0, -1, 0],
547 [ 0, 0, 0, 0, 0, 0, 1, 0],
548 [ 0, 0, 0, 0, 0, 0, 0, 1],
549 [ 0, 0, 0, 0, 0, 0, 0, -1]],
550 float64),
551 'b': array([0, -20, 0, -20, -1, 0.5, 0, -200], float64)
552 },
553 MODEL_NS_MMQ_3SITE: {
554 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10000, 1, 10000, 10000], float64)),
555 'A': array(
556 [[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
557 [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
558 [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
559 [ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
560 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0, 0],
561 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
562 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
563 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0],
564 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, 0],
565 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0, 0],
566 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
567 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0],
568 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
569 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1]],
570 float64),
571 'b': array([0, -20, 0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200, 0, -200], float64)
572 },
573 MODEL_NS_MMQ_3SITE_LINEAR: {
574 'scaling_matrix': diag(array([10, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10000, 1, 10000], float64)),
575 'A': array(
576 [[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
577 [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
578 [ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
579 [ 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
580 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 0],
581 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
582 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0],
583 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0],
584 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0],
585 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, -1, 0],
586 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
587 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1]],
588 float64),
589 'b': array([0, -20, 0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200], float64)
590 },
591 }
592
593
594 print("Checking the linear constraints for a cluster of 2 spins.")
595 for model in MODEL_LIST_FULL:
596
597 if model not in expected:
598 raise RelaxError("The model '%s' is not being checked." % model)
599
600
601 print(" Model '%s'." % model)
602
603
604 ds.add(pipe_name=model, pipe_type='relax_disp')
605 if model == MODEL_R2EFF:
606 cdp.model_type = 'R2eff'
607 else:
608 cdp.model_type = 'disp'
609 cdp.exp_type_list = [self.exp_type[model]]
610 cdp.spectrometer_frq_list = [1e6]
611 spins = [SpinContainer(), SpinContainer()]
612 for spin in spins:
613 spin.model = model
614 spin.params = deepcopy(MODEL_PARAMS[model])
615
616
617 A, b = linear_constraints(spins=spins, scaling_matrix=expected[model]['scaling_matrix'])
618
619
620 self.assertTrue(array_equal(A, expected[model]['A']))
621 self.assertTrue(array_equal(b, expected[model]['b']))
622
623
625 """Test the specific_analyses.relax_disp.parameters.linear_constraints() function for a single spin."""
626
627
628 expected = {
629 MODEL_R2EFF: {
630 'scaling_matrix': diag(array([1], float64)),
631 'A': array([[1], [-1]], float64),
632 'b': array([0, -200], float64)
633 },
634 MODEL_NOREX: {
635 'scaling_matrix': diag(array([10], float64)),
636 'A': array([[1], [-1]], float64),
637 'b': array([0, -20], float64)
638 },
639 MODEL_LM63: {
640 'scaling_matrix': diag(array([10, 1, 10000], float64)),
641 'A': array(
642 [[ 1, 0, 0],
643 [-1, 0, 0],
644 [ 0, 1, 0],
645 [ 0, 0, 1],
646 [ 0, 0, -1]],
647 float64),
648 'b': array([0, -20, 0, 0, -200], float64)
649 },
650 MODEL_LM63_3SITE: {
651 'scaling_matrix': diag(array([10, 1, 1, 10000, 10000], float64)),
652 'A': array(
653 [[ 1, 0, 0, 0, 0],
654 [-1, 0, 0, 0, 0],
655 [ 0, 1, 0, 0, 0],
656 [ 0, 0, 1, 0, 0],
657 [ 0, 0, 0, 1, 0],
658 [ 0, 0, 0, -1, 0],
659 [ 0, 0, 0, 0, 1],
660 [ 0, 0, 0, 0, -1]],
661 float64),
662 'b': array([0, -20, 0, 0, 0, -200, 0, -200], float64)
663 },
664 MODEL_CR72: {
665 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
666 'A': array(
667 [[ 1, 0, 0, 0],
668 [-1, 0, 0, 0],
669 [ 0, 1, 0, 0],
670 [ 0, 0, -1, 0],
671 [ 0, 0, 1, 0],
672 [ 0, 0, 0, 1],
673 [ 0, 0, 0, -1]],
674 float64),
675 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
676 },
677 MODEL_CR72_FULL: {
678 'scaling_matrix': diag(array([10, 10, 1, 1, 10000], float64)),
679 'A': array(
680 [[ 1, 0, 0, 0, 0],
681 [-1, 0, 0, 0, 0],
682 [ 0, 1, 0, 0, 0],
683 [ 0, -1, 0, 0, 0],
684 [ 0, 0, 1, 0, 0],
685 [ 0, 0, 0, -1, 0],
686 [ 0, 0, 0, 1, 0],
687 [ 0, 0, 0, 0, 1],
688 [ 0, 0, 0, 0, -1]],
689 float64),
690 'b': array([0, -20, 0, -20, 0, -1, 0.5, 0, -200], float64)
691 },
692 MODEL_IT99: {
693 'scaling_matrix': diag(array([10, 1, 1, 1e-4], float64)),
694 'A': array(
695 [[ 1, 0, 0, 0],
696 [-1, 0, 0, 0],
697 [ 0, 1, 0, 0],
698 [ 0, 0, -1, 0],
699 [ 0, 0, 1, 0],
700 [ 0, 0, 0, 1]],
701 float64),
702 'b': array([0, -20, 0, -1, 0.5, 0], float64)
703 },
704 MODEL_TSMFK01: {
705 'scaling_matrix': diag(array([10, 1, 20], float64)),
706 'A': array(
707 [[ 1, 0, 0],
708 [-1, 0, 0],
709 [ 0, 1, 0],
710 [ 0, 0, 1],
711 [ 0, 0, -1]],
712 float64),
713 'b': array([0, -20, 0, 0, -5], float64)
714 },
715 MODEL_B14: {
716 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
717 'A': array(
718 [[ 1, 0, 0, 0],
719 [-1, 0, 0, 0],
720 [ 0, 1, 0, 0],
721 [ 0, 0, -1, 0],
722 [ 0, 0, 1, 0],
723 [ 0, 0, 0, 1],
724 [ 0, 0, 0, -1]],
725 float64),
726 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
727 },
728 MODEL_B14_FULL: {
729 'scaling_matrix': diag(array([10, 10, 1, 1, 10000], float64)),
730 'A': array(
731 [[ 1, 0, 0, 0, 0],
732 [-1, 0, 0, 0, 0],
733 [ 0, 1, 0, 0, 0],
734 [ 0, -1, 0, 0, 0],
735 [ 0, 0, 1, 0, 0],
736 [ 0, 0, 0, -1, 0],
737 [ 0, 0, 0, 1, 0],
738 [ 0, 0, 0, 0, 1],
739 [ 0, 0, 0, 0, -1]],
740 float64),
741 'b': array([0, -20, 0, -20, 0, -1, 0.5, 0, -200], float64)
742 },
743 MODEL_M61: {
744 'scaling_matrix': diag(array([10, 1, 10000], float64)),
745 'A': array(
746 [[ 1, 0, 0],
747 [-1, 0, 0],
748 [ 0, 1, 0],
749 [ 0, 0, 1],
750 [ 0, 0, -1]],
751 float64),
752 'b': array([0, -20, 0, 0, -200], float64)
753 },
754 MODEL_M61B: {
755 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
756 'A': array(
757 [[ 1, 0, 0, 0],
758 [-1, 0, 0, 0],
759 [ 0, 1, 0, 0],
760 [ 0, 0, -1, 0],
761 [ 0, 0, 1, 0],
762 [ 0, 0, 0, 1],
763 [ 0, 0, 0, -1]],
764 float64),
765 'b': array([0, -20, 0, -1, 0.85, 0, -200], float64)
766 },
767 MODEL_DPL94: {
768 'scaling_matrix': diag(array([10, 1, 10000], float64)),
769 'A': array(
770 [[ 1, 0, 0],
771 [-1, 0, 0],
772 [ 0, 1, 0],
773 [ 0, 0, 1],
774 [ 0, 0, -1]],
775 float64),
776 'b': array([0, -20, 0, 0, -200], float64)
777 },
778 MODEL_TP02: {
779 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
780 'A': array(
781 [[ 1, 0, 0, 0],
782 [-1, 0, 0, 0],
783 [ 0, 1, 0, 0],
784 [ 0, 0, -1, 0],
785 [ 0, 0, 1, 0],
786 [ 0, 0, 0, 1],
787 [ 0, 0, 0, -1]],
788 float64),
789 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
790 },
791 MODEL_TAP03: {
792 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
793 'A': array(
794 [[ 1, 0, 0, 0],
795 [-1, 0, 0, 0],
796 [ 0, 1, 0, 0],
797 [ 0, 0, -1, 0],
798 [ 0, 0, 1, 0],
799 [ 0, 0, 0, 1],
800 [ 0, 0, 0, -1]],
801 float64),
802 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
803 },
804 MODEL_MP05: {
805 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
806 'A': array(
807 [[ 1, 0, 0, 0],
808 [-1, 0, 0, 0],
809 [ 0, 1, 0, 0],
810 [ 0, 0, -1, 0],
811 [ 0, 0, 1, 0],
812 [ 0, 0, 0, 1],
813 [ 0, 0, 0, -1]],
814 float64),
815 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
816 },
817 MODEL_NS_CPMG_2SITE_3D: {
818 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
819 'A': array(
820 [[ 1, 0, 0, 0],
821 [-1, 0, 0, 0],
822 [ 0, 1, 0, 0],
823 [ 0, 0, -1, 0],
824 [ 0, 0, 1, 0],
825 [ 0, 0, 0, 1],
826 [ 0, 0, 0, -1]],
827 float64),
828 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
829 },
830 MODEL_NS_CPMG_2SITE_3D_FULL: {
831 'scaling_matrix': diag(array([10, 10, 1, 1, 10000], float64)),
832 'A': array(
833 [[ 1, 0, 0, 0, 0],
834 [-1, 0, 0, 0, 0],
835 [ 0, 1, 0, 0, 0],
836 [ 0, -1, 0, 0, 0],
837 [ 0, 0, 1, 0, 0],
838 [ 0, 0, 0, -1, 0],
839 [ 0, 0, 0, 1, 0],
840 [ 0, 0, 0, 0, 1],
841 [ 0, 0, 0, 0, -1]],
842 float64),
843 'b': array([0, -20, 0, -20, 0, -1, 0.5, 0, -200], float64)
844 },
845 MODEL_NS_CPMG_2SITE_STAR: {
846 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
847 'A': array(
848 [[ 1, 0, 0, 0],
849 [-1, 0, 0, 0],
850 [ 0, 1, 0, 0],
851 [ 0, 0, -1, 0],
852 [ 0, 0, 1, 0],
853 [ 0, 0, 0, 1],
854 [ 0, 0, 0, -1]],
855 float64),
856 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
857 },
858 MODEL_NS_CPMG_2SITE_STAR_FULL: {
859 'scaling_matrix': diag(array([10, 10, 1, 1, 10000], float64)),
860 'A': array(
861 [[ 1, 0, 0, 0, 0],
862 [-1, 0, 0, 0, 0],
863 [ 0, 1, 0, 0, 0],
864 [ 0, -1, 0, 0, 0],
865 [ 0, 0, 1, 0, 0],
866 [ 0, 0, 0, -1, 0],
867 [ 0, 0, 0, 1, 0],
868 [ 0, 0, 0, 0, 1],
869 [ 0, 0, 0, 0, -1]],
870 float64),
871 'b': array([0, -20, 0, -20, 0, -1, 0.5, 0, -200], float64)
872 },
873 MODEL_NS_CPMG_2SITE_EXPANDED: {
874 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
875 'A': array(
876 [[ 1, 0, 0, 0],
877 [-1, 0, 0, 0],
878 [ 0, 1, 0, 0],
879 [ 0, 0, -1, 0],
880 [ 0, 0, 1, 0],
881 [ 0, 0, 0, 1],
882 [ 0, 0, 0, -1]],
883 float64),
884 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
885 },
886 MODEL_NS_R1RHO_2SITE: {
887 'scaling_matrix': diag(array([10, 1, 1, 10000], float64)),
888 'A': array(
889 [[ 1, 0, 0, 0],
890 [-1, 0, 0, 0],
891 [ 0, 1, 0, 0],
892 [ 0, 0, -1, 0],
893 [ 0, 0, 1, 0],
894 [ 0, 0, 0, 1],
895 [ 0, 0, 0, -1]],
896 float64),
897 'b': array([0, -20, 0, -1, 0.5, 0, -200], float64)
898 },
899 MODEL_NS_R1RHO_3SITE: {
900 'scaling_matrix': diag(array([10, 1, 1, 1, 10000, 1, 10000, 10000], float64)),
901 'A': array(
902 [[ 1, 0, 0, 0, 0, 0, 0, 0],
903 [-1, 0, 0, 0, 0, 0, 0, 0],
904 [ 0, 0, 0, -1, 0, 0, 0, 0],
905 [ 0, 0, 0, 1, 0, 0, 0, 0],
906 [ 0, 0, 0, 0, 1, 0, 0, 0],
907 [ 0, 0, 0, 0, -1, 0, 0, 0],
908 [ 0, 0, 0, -1, 0, -1, 0, 0],
909 [ 0, 0, 0, 1, 0, -1, 0, 0],
910 [ 0, 0, 0, 0, 0, 0, 1, 0],
911 [ 0, 0, 0, 0, 0, 0, -1, 0],
912 [ 0, 0, 0, 0, 0, 0, 0, 1],
913 [ 0, 0, 0, 0, 0, 0, 0, -1]],
914 float64),
915 'b': array([0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200, 0, -200], float64)
916 },
917 MODEL_NS_R1RHO_3SITE_LINEAR: {
918 'scaling_matrix': diag(array([10, 1, 1, 1, 10000, 1, 10000], float64)),
919 'A': array(
920 [[ 1, 0, 0, 0, 0, 0, 0],
921 [-1, 0, 0, 0, 0, 0, 0],
922 [ 0, 0, 0, -1, 0, 0, 0],
923 [ 0, 0, 0, 1, 0, 0, 0],
924 [ 0, 0, 0, 0, 1, 0, 0],
925 [ 0, 0, 0, 0, -1, 0, 0],
926 [ 0, 0, 0, -1, 0, -1, 0],
927 [ 0, 0, 0, 1, 0, -1, 0],
928 [ 0, 0, 0, 0, 0, 0, 1],
929 [ 0, 0, 0, 0, 0, 0, -1]],
930 float64),
931 'b': array([0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200], float64)
932 },
933 MODEL_MMQ_CR72: {
934 'scaling_matrix': diag(array([10, 1, 1, 1, 10000], float64)),
935 'A': array(
936 [[ 1, 0, 0, 0, 0],
937 [-1, 0, 0, 0, 0],
938 [ 0, 0, 0, -1, 0],
939 [ 0, 0, 0, 1, 0],
940 [ 0, 0, 0, 0, 1],
941 [ 0, 0, 0, 0, -1]],
942 float64),
943 'b': array([0, -20, -1, 0.5, 0, -200], float64)
944 },
945 MODEL_NS_MMQ_2SITE: {
946 'scaling_matrix': diag(array([10, 1, 1, 1, 10000], float64)),
947 'A': array(
948 [[ 1, 0, 0, 0, 0],
949 [-1, 0, 0, 0, 0],
950 [ 0, 0, 0, -1, 0],
951 [ 0, 0, 0, 1, 0],
952 [ 0, 0, 0, 0, 1],
953 [ 0, 0, 0, 0, -1]],
954 float64),
955 'b': array([0, -20, -1, 0.5, 0, -200], float64)
956 },
957 MODEL_NS_MMQ_3SITE: {
958 'scaling_matrix': diag(array([10, 1, 1, 1, 1, 1, 10000, 1, 10000, 10000], float64)),
959 'A': array(
960 [[ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
961 [-1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
962 [ 0, 0, 0, 0, 0, -1, 0, 0, 0, 0],
963 [ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0],
964 [ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0],
965 [ 0, 0, 0, 0, 0, 0, -1, 0, 0, 0],
966 [ 0, 0, 0, 0, 0, -1, 0, -1, 0, 0],
967 [ 0, 0, 0, 0, 0, 1, 0, -1, 0, 0],
968 [ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0],
969 [ 0, 0, 0, 0, 0, 0, 0, 0, -1, 0],
970 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
971 [ 0, 0, 0, 0, 0, 0, 0, 0, 0, -1]],
972 float64),
973 'b': array([0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200, 0, -200], float64)
974 },
975 MODEL_NS_MMQ_3SITE_LINEAR: {
976 'scaling_matrix': diag(array([10, 1, 1, 1, 1, 1, 10000, 1, 10000], float64)),
977 'A': array(
978 [[ 1, 0, 0, 0, 0, 0, 0, 0, 0],
979 [-1, 0, 0, 0, 0, 0, 0, 0, 0],
980 [ 0, 0, 0, 0, 0, -1, 0, 0, 0],
981 [ 0, 0, 0, 0, 0, 1, 0, 0, 0],
982 [ 0, 0, 0, 0, 0, 0, 1, 0, 0],
983 [ 0, 0, 0, 0, 0, 0, -1, 0, 0],
984 [ 0, 0, 0, 0, 0, -1, 0, -1, 0],
985 [ 0, 0, 0, 0, 0, 1, 0, -1, 0],
986 [ 0, 0, 0, 0, 0, 0, 0, 0, 1],
987 [ 0, 0, 0, 0, 0, 0, 0, 0, -1]],
988 float64),
989 'b': array([0, -20, -1, 0.5, 0, -200, -1, 0, 0, -200], float64)
990 },
991 }
992
993
994 print("Checking the linear constraints for a single spin.")
995 for model in MODEL_LIST_FULL:
996
997 if model not in expected:
998 raise RelaxError("The model '%s' is not being checked." % model)
999
1000
1001 print(" Model '%s'." % model)
1002
1003
1004 ds.add(pipe_name=model, pipe_type='relax_disp')
1005 if model == MODEL_R2EFF:
1006 cdp.model_type = 'R2eff'
1007 else:
1008 cdp.model_type = 'disp'
1009 cdp.exp_type_list = [self.exp_type[model]]
1010 cdp.spectrometer_frq_list = [1e6]
1011 spin = SpinContainer()
1012 spin.model = model
1013 spin.params = deepcopy(MODEL_PARAMS[model])
1014
1015
1016 A, b = linear_constraints(spins=[spin], scaling_matrix=expected[model]['scaling_matrix'])
1017
1018
1019 self.assertTrue(array_equal(A, expected[model]['A']))
1020 self.assertTrue(array_equal(b, expected[model]['b']))
1021
1022
1024 """Test the specific_analyses.relax_disp.parameters.loop_parameters() function for a cluster of 2 spins."""
1025
1026
1027 expected = {
1028 MODEL_R2EFF: [
1029 ['r2eff', 0, None],
1030 ['r2eff', 1, None],
1031 ],
1032 MODEL_NOREX: [
1033 ['r2', 0, 'No Rex - 1.00000000 MHz'],
1034 ['r2', 1, 'No Rex - 1.00000000 MHz'],
1035 ],
1036 MODEL_LM63: [
1037 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1038 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1039 ['phi_ex', 0, None],
1040 ['phi_ex', 1, None],
1041 ['kex', None, None],
1042 ],
1043 MODEL_LM63_3SITE: [
1044 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1045 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1046 ['phi_ex_B', 0, None],
1047 ['phi_ex_C', 0, None],
1048 ['phi_ex_B', 1, None],
1049 ['phi_ex_C', 1, None],
1050 ['kB', None, None],
1051 ['kC', None, None],
1052 ],
1053 MODEL_CR72: [
1054 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1055 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1056 ['dw', 0, None],
1057 ['dw', 1, None],
1058 ['pA', None, None],
1059 ['kex', None, None],
1060 ],
1061 MODEL_CR72_FULL: [
1062 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1063 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1064 ['r2a', 1, 'SQ CPMG - 1.00000000 MHz'],
1065 ['r2b', 1, 'SQ CPMG - 1.00000000 MHz'],
1066 ['dw', 0, None],
1067 ['dw', 1, None],
1068 ['pA', None, None],
1069 ['kex', None, None],
1070 ],
1071 MODEL_IT99: [
1072 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1073 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1074 ['dw', 0, None],
1075 ['dw', 1, None],
1076 ['pA', None, None],
1077 ['tex', None, None],
1078 ],
1079 MODEL_TSMFK01: [
1080 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1081 ['r2a', 1, 'SQ CPMG - 1.00000000 MHz'],
1082 ['dw', 0, None],
1083 ['dw', 1, None],
1084 ['k_AB', None, None],
1085 ],
1086 MODEL_B14: [
1087 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1088 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1089 ['dw', 0, None],
1090 ['dw', 1, None],
1091 ['pA', None, None],
1092 ['kex', None, None],
1093 ],
1094 MODEL_B14_FULL: [
1095 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1096 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1097 ['r2a', 1, 'SQ CPMG - 1.00000000 MHz'],
1098 ['r2b', 1, 'SQ CPMG - 1.00000000 MHz'],
1099 ['dw', 0, None],
1100 ['dw', 1, None],
1101 ['pA', None, None],
1102 ['kex', None, None],
1103 ],
1104 MODEL_M61: [
1105 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1106 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1107 ['phi_ex', 0, None],
1108 ['phi_ex', 1, None],
1109 ['kex', None, None],
1110 ],
1111 MODEL_M61B: [
1112 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1113 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1114 ['dw', 0, None],
1115 ['dw', 1, None],
1116 ['pA', None, None],
1117 ['kex', None, None],
1118 ],
1119 MODEL_DPL94: [
1120 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1121 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1122 ['phi_ex', 0, None],
1123 ['phi_ex', 1, None],
1124 ['kex', None, None],
1125 ],
1126 MODEL_TP02: [
1127 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1128 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1129 ['dw', 0, None],
1130 ['dw', 1, None],
1131 ['pA', None, None],
1132 ['kex', None, None],
1133 ],
1134 MODEL_TAP03: [
1135 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1136 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1137 ['dw', 0, None],
1138 ['dw', 1, None],
1139 ['pA', None, None],
1140 ['kex', None, None],
1141 ],
1142 MODEL_MP05: [
1143 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1144 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1145 ['dw', 0, None],
1146 ['dw', 1, None],
1147 ['pA', None, None],
1148 ['kex', None, None],
1149 ],
1150 MODEL_NS_CPMG_2SITE_3D: [
1151 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1152 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1153 ['dw', 0, None],
1154 ['dw', 1, None],
1155 ['pA', None, None],
1156 ['kex', None, None],
1157 ],
1158 MODEL_NS_CPMG_2SITE_3D_FULL: [
1159 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1160 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1161 ['r2a', 1, 'SQ CPMG - 1.00000000 MHz'],
1162 ['r2b', 1, 'SQ CPMG - 1.00000000 MHz'],
1163 ['dw', 0, None],
1164 ['dw', 1, None],
1165 ['pA', None, None],
1166 ['kex', None, None],
1167 ],
1168 MODEL_NS_CPMG_2SITE_STAR: [
1169 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1170 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1171 ['dw', 0, None],
1172 ['dw', 1, None],
1173 ['pA', None, None],
1174 ['kex', None, None],
1175 ],
1176 MODEL_NS_CPMG_2SITE_STAR_FULL: [
1177 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1178 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1179 ['r2a', 1, 'SQ CPMG - 1.00000000 MHz'],
1180 ['r2b', 1, 'SQ CPMG - 1.00000000 MHz'],
1181 ['dw', 0, None],
1182 ['dw', 1, None],
1183 ['pA', None, None],
1184 ['kex', None, None],
1185 ],
1186 MODEL_NS_CPMG_2SITE_EXPANDED: [
1187 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1188 ['r2', 1, 'SQ CPMG - 1.00000000 MHz'],
1189 ['dw', 0, None],
1190 ['dw', 1, None],
1191 ['pA', None, None],
1192 ['kex', None, None],
1193 ],
1194 MODEL_NS_R1RHO_2SITE: [
1195 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1196 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1197 ['dw', 0, None],
1198 ['dw', 1, None],
1199 ['pA', None, None],
1200 ['kex', None, None],
1201 ],
1202 MODEL_NS_R1RHO_3SITE: [
1203 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1204 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1205 ['dw_AB', 0, None],
1206 ['dw_BC', 0, None],
1207 ['dw_AB', 1, None],
1208 ['dw_BC', 1, None],
1209 ['pA', None, None],
1210 ['kex_AB', None, None],
1211 ['pB', None, None],
1212 ['kex_BC', None, None],
1213 ['kex_AC', None, None],
1214 ],
1215 MODEL_NS_R1RHO_3SITE_LINEAR: [
1216 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1217 ['r2', 1, 'R1rho - 1.00000000 MHz'],
1218 ['dw_AB', 0, None],
1219 ['dw_BC', 0, None],
1220 ['dw_AB', 1, None],
1221 ['dw_BC', 1, None],
1222 ['pA', None, None],
1223 ['kex_AB', None, None],
1224 ['pB', None, None],
1225 ['kex_BC', None, None],
1226 ],
1227 MODEL_MMQ_CR72: [
1228 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1229 ['r2', 1, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1230 ['dw', 0, None],
1231 ['dw', 1, None],
1232 ['dwH', 0, None],
1233 ['dwH', 1, None],
1234 ['pA', None, None],
1235 ['kex', None, None],
1236 ],
1237 MODEL_NS_MMQ_2SITE: [
1238 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1239 ['r2', 1, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1240 ['dw', 0, None],
1241 ['dw', 1, None],
1242 ['dwH', 0, None],
1243 ['dwH', 1, None],
1244 ['pA', None, None],
1245 ['kex', None, None],
1246 ],
1247 MODEL_NS_MMQ_3SITE: [
1248 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1249 ['r2', 1, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1250 ['dw_AB', 0, None],
1251 ['dw_BC', 0, None],
1252 ['dw_AB', 1, None],
1253 ['dw_BC', 1, None],
1254 ['dwH_AB', 0, None],
1255 ['dwH_BC', 0, None],
1256 ['dwH_AB', 1, None],
1257 ['dwH_BC', 1, None],
1258 ['pA', None, None],
1259 ['kex_AB', None, None],
1260 ['pB', None, None],
1261 ['kex_BC', None, None],
1262 ['kex_AC', None, None],
1263 ],
1264 MODEL_NS_MMQ_3SITE_LINEAR: [
1265 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1266 ['r2', 1, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1267 ['dw_AB', 0, None],
1268 ['dw_BC', 0, None],
1269 ['dw_AB', 1, None],
1270 ['dw_BC', 1, None],
1271 ['dwH_AB', 0, None],
1272 ['dwH_BC', 0, None],
1273 ['dwH_AB', 1, None],
1274 ['dwH_BC', 1, None],
1275 ['pA', None, None],
1276 ['kex_AB', None, None],
1277 ['pB', None, None],
1278 ['kex_BC', None, None],
1279 ],
1280 }
1281
1282
1283 print("Checking the parameter looping for a cluster of 2 spins.")
1284 for model in MODEL_LIST_FULL:
1285
1286 if model not in expected:
1287 raise RelaxError("The model '%s' is not being checked." % model)
1288
1289
1290 print(" Model '%s'." % model)
1291
1292
1293 ds.add(pipe_name=model, pipe_type='relax_disp')
1294 if model == MODEL_R2EFF:
1295 cdp.model_type = 'R2eff'
1296 else:
1297 cdp.model_type = 'disp'
1298 cdp.exp_type_list = [self.exp_type[model]]
1299 cdp.spectrometer_frq_list = [1e6]
1300 spins = [SpinContainer(), SpinContainer()]
1301 for spin in spins:
1302 spin.model = model
1303 spin.params = deepcopy(MODEL_PARAMS[model])
1304
1305
1306 i = 0
1307 for name, param_index, spin_index, R20_key in loop_parameters(spins):
1308 print(" Parameter '%s', %s, %s, %s." % (name, param_index, spin_index, repr(R20_key)))
1309 self.assertEqual(name, expected[model][i][0])
1310 self.assertEqual(spin_index, expected[model][i][1])
1311 self.assertEqual(R20_key, expected[model][i][2])
1312 i += 1
1313
1314
1315 self.assertEqual(i, len(expected[model]))
1316
1317
1319 """Test the specific_analyses.relax_disp.parameters.loop_parameters() function for a single spin."""
1320
1321
1322 expected = {
1323 MODEL_R2EFF: [
1324 ['r2eff', 0, None],
1325 ],
1326 MODEL_NOREX: [
1327 ['r2', 0, 'No Rex - 1.00000000 MHz'],
1328 ],
1329 MODEL_LM63: [
1330 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1331 ['phi_ex', 0, None],
1332 ['kex', None, None],
1333 ],
1334 MODEL_LM63_3SITE: [
1335 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1336 ['phi_ex_B', 0, None],
1337 ['phi_ex_C', 0, None],
1338 ['kB', None, None],
1339 ['kC', None, None],
1340 ],
1341 MODEL_CR72: [
1342 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1343 ['dw', 0, None],
1344 ['pA', None, None],
1345 ['kex', None, None],
1346 ],
1347 MODEL_CR72_FULL: [
1348 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1349 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1350 ['dw', 0, None],
1351 ['pA', None, None],
1352 ['kex', None, None],
1353 ],
1354 MODEL_IT99: [
1355 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1356 ['dw', 0, None],
1357 ['pA', None, None],
1358 ['tex', None, None],
1359 ],
1360 MODEL_TSMFK01: [
1361 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1362 ['dw', 0, None],
1363 ['k_AB', None, None],
1364 ],
1365 MODEL_B14: [
1366 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1367 ['dw', 0, None],
1368 ['pA', None, None],
1369 ['kex', None, None],
1370 ],
1371 MODEL_B14_FULL: [
1372 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1373 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1374 ['dw', 0, None],
1375 ['pA', None, None],
1376 ['kex', None, None],
1377 ],
1378 MODEL_M61: [
1379 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1380 ['phi_ex', 0, None],
1381 ['kex', None, None],
1382 ],
1383 MODEL_M61B: [
1384 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1385 ['dw', 0, None],
1386 ['pA', None, None],
1387 ['kex', None, None],
1388 ],
1389 MODEL_DPL94: [
1390 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1391 ['phi_ex', 0, None],
1392 ['kex', None, None],
1393 ],
1394 MODEL_TP02: [
1395 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1396 ['dw', 0, None],
1397 ['pA', None, None],
1398 ['kex', None, None],
1399 ],
1400 MODEL_TAP03: [
1401 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1402 ['dw', 0, None],
1403 ['pA', None, None],
1404 ['kex', None, None],
1405 ],
1406 MODEL_MP05: [
1407 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1408 ['dw', 0, None],
1409 ['pA', None, None],
1410 ['kex', None, None],
1411 ],
1412 MODEL_NS_CPMG_2SITE_3D: [
1413 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1414 ['dw', 0, None],
1415 ['pA', None, None],
1416 ['kex', None, None],
1417 ],
1418 MODEL_NS_CPMG_2SITE_3D_FULL: [
1419 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1420 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1421 ['dw', 0, None],
1422 ['pA', None, None],
1423 ['kex', None, None],
1424 ],
1425 MODEL_NS_CPMG_2SITE_STAR: [
1426 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1427 ['dw', 0, None],
1428 ['pA', None, None],
1429 ['kex', None, None],
1430 ],
1431 MODEL_NS_CPMG_2SITE_STAR_FULL: [
1432 ['r2a', 0, 'SQ CPMG - 1.00000000 MHz'],
1433 ['r2b', 0, 'SQ CPMG - 1.00000000 MHz'],
1434 ['dw', 0, None],
1435 ['pA', None, None],
1436 ['kex', None, None],
1437 ],
1438 MODEL_NS_CPMG_2SITE_EXPANDED: [
1439 ['r2', 0, 'SQ CPMG - 1.00000000 MHz'],
1440 ['dw', 0, None],
1441 ['pA', None, None],
1442 ['kex', None, None],
1443 ],
1444 MODEL_NS_R1RHO_2SITE: [
1445 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1446 ['dw', 0, None],
1447 ['pA', None, None],
1448 ['kex', None, None],
1449 ],
1450 MODEL_NS_R1RHO_3SITE: [
1451 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1452 ['dw_AB', 0, None],
1453 ['dw_BC', 0, None],
1454 ['pA', None, None],
1455 ['kex_AB', None, None],
1456 ['pB', None, None],
1457 ['kex_BC', None, None],
1458 ['kex_AC', None, None],
1459 ],
1460 MODEL_NS_R1RHO_3SITE_LINEAR: [
1461 ['r2', 0, 'R1rho - 1.00000000 MHz'],
1462 ['dw_AB', 0, None],
1463 ['dw_BC', 0, None],
1464 ['pA', None, None],
1465 ['kex_AB', None, None],
1466 ['pB', None, None],
1467 ['kex_BC', None, None],
1468 ],
1469 MODEL_MMQ_CR72: [
1470 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1471 ['dw', 0, None],
1472 ['dwH', 0, None],
1473 ['pA', None, None],
1474 ['kex', None, None],
1475 ],
1476 MODEL_NS_MMQ_2SITE: [
1477 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1478 ['dw', 0, None],
1479 ['dwH', 0, None],
1480 ['pA', None, None],
1481 ['kex', None, None],
1482 ],
1483 MODEL_NS_MMQ_3SITE: [
1484 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1485 ['dw_AB', 0, None],
1486 ['dw_BC', 0, None],
1487 ['dwH_AB', 0, None],
1488 ['dwH_BC', 0, None],
1489 ['pA', None, None],
1490 ['kex_AB', None, None],
1491 ['pB', None, None],
1492 ['kex_BC', None, None],
1493 ['kex_AC', None, None],
1494 ],
1495 MODEL_NS_MMQ_3SITE_LINEAR: [
1496 ['r2', 0, 'CPMG: SQ, DQ, MQ, ZQ, 1H SQ, 1H MQ - 1.00000000 MHz'],
1497 ['dw_AB', 0, None],
1498 ['dw_BC', 0, None],
1499 ['dwH_AB', 0, None],
1500 ['dwH_BC', 0, None],
1501 ['pA', None, None],
1502 ['kex_AB', None, None],
1503 ['pB', None, None],
1504 ['kex_BC', None, None],
1505 ],
1506 }
1507
1508
1509 print("Checking the parameter looping for a single spin.")
1510 for model in MODEL_LIST_FULL:
1511
1512 if model not in expected:
1513 raise RelaxError("The model '%s' is not being checked." % model)
1514
1515
1516 print(" Model '%s'." % model)
1517
1518
1519 ds.add(pipe_name=model, pipe_type='relax_disp')
1520 if model == MODEL_R2EFF:
1521 cdp.model_type = 'R2eff'
1522 else:
1523 cdp.model_type = 'disp'
1524 cdp.exp_type_list = [self.exp_type[model]]
1525 cdp.spectrometer_frq_list = [1e6]
1526 spin = SpinContainer()
1527 spin.model = model
1528 spin.params = deepcopy(MODEL_PARAMS[model])
1529
1530
1531 i = 0
1532 for name, param_index, spin_index, R20_key in loop_parameters([spin]):
1533 print(" Parameter '%s', %s, %s, %s." % (name, param_index, spin_index, repr(R20_key)))
1534 self.assertEqual(name, expected[model][i][0])
1535 self.assertEqual(spin_index, expected[model][i][1])
1536 self.assertEqual(R20_key, expected[model][i][2])
1537 i += 1
1538
1539
1540 self.assertEqual(i, len(expected[model]))
1541
1542
1544 """Test the specific_analyses.relax_disp.parameters.param_conversion() function for a cluster of 2 spins."""
1545
1546
1547 fixed_values = {
1548 'r2eff': 10.0,
1549 'r2': 15.0,
1550 'r2a': 12.0,
1551 'r2b': 18.0,
1552 'pA': 0.80,
1553 'pB': 0.15,
1554 'k_AB': 0.001,
1555 'k_BA': 0.003,
1556 'kex': 0.01,
1557 'kex_AB': 0.015,
1558 'kex_BC': 0.017,
1559 'kex_AC': 0.016,
1560 'kB': 0.005,
1561 'kC': 0.004,
1562 'tex': 50.0,
1563 'dw': 1.0,
1564 'dw_AB': 1.02,
1565 'dw_BC': 1.03,
1566 'dwH': 0.1,
1567 'dwH_AB': 0.12,
1568 'dwH_BC': 0.13,
1569 'phi_ex': 0.5,
1570 'phi_ex_B': 0.4,
1571 'phi_ex_C': 0.3,
1572 }
1573
1574
1575 print("Checking the parameter conversion and setting for a cluster of 2 spins.")
1576 for model in MODEL_LIST_FULL:
1577
1578 print(" Model '%s'." % model)
1579
1580
1581 ds.add(pipe_name=model, pipe_type='relax_disp')
1582 if model == MODEL_R2EFF:
1583 cdp.model_type = 'R2eff'
1584 else:
1585 cdp.model_type = 'disp'
1586 cdp.exp_type_list = [self.exp_type[model]]
1587 cdp.spectrometer_frq_list = [1e6]
1588 spins = [SpinContainer(), SpinContainer()]
1589 for spin in spins:
1590 spin.model = model
1591 spin.params = deepcopy(MODEL_PARAMS[model])
1592
1593
1594 for name, param_index, spin_index, R20_key in loop_parameters(spins):
1595
1596 if name in ['r2', 'r2a', 'r2b']:
1597 key = "%s - %.8f MHz" % (cdp.exp_type_list[0], cdp.spectrometer_frq_list[0]/1e6)
1598 print(" Setting spin %i parameter %s['%s'] to %s." % (spin_index, name, key, fixed_values[name]))
1599 setattr(spins[spin_index], name, {key: fixed_values[name]})
1600
1601
1602 elif spin_index == None:
1603 print(" Setting global parameter %s to %s." % (name, fixed_values[name]))
1604 setattr(spins[0], name, fixed_values[name])
1605 setattr(spins[1], name, fixed_values[name])
1606
1607
1608 else:
1609 print(" Setting spin %i parameter %s to %s." % (spin_index, name, fixed_values[name]))
1610 setattr(spins[spin_index], name, fixed_values[name])
1611
1612
1613 param_conversion(key=None, spins=spins, sim_index=None)
1614
1615
1616 if 'pB' in MODEL_PARAMS[model]:
1617 print(" Checking parameter pC.")
1618 self.assertAlmostEqual(spins[0].pC, 0.05)
1619 self.assertAlmostEqual(spins[1].pC, 0.05)
1620 elif 'pA' in MODEL_PARAMS[model]:
1621 print(" Checking parameter pB.")
1622 self.assertAlmostEqual(spins[0].pB, 0.20)
1623 self.assertAlmostEqual(spins[1].pB, 0.20)
1624
1625
1626 if 'kex' in MODEL_PARAMS[model]:
1627 print(" Checking parameter tex.")
1628 self.assertAlmostEqual(spins[0].tex, 100.0)
1629 self.assertAlmostEqual(spins[1].tex, 100.0)
1630 elif 'tex' in MODEL_PARAMS[model]:
1631 print(" Checking parameter kex.")
1632 self.assertAlmostEqual(spins[0].kex, 0.02)
1633 self.assertAlmostEqual(spins[1].kex, 0.02)
1634
1635
1636 if 'kex' in MODEL_PARAMS[model] and 'pA' in MODEL_PARAMS[model]:
1637 print(" Checking parameter k_AB.")
1638 self.assertAlmostEqual(spins[0].k_AB, 0.002)
1639 self.assertAlmostEqual(spins[1].k_AB, 0.002)
1640 print(" Checking parameter k_BA.")
1641 self.assertAlmostEqual(spins[0].k_BA, 0.008)
1642 self.assertAlmostEqual(spins[1].k_BA, 0.008)
1643
1644
1646 """Test the specific_analyses.relax_disp.parameters.param_conversion() function for a cluster of 2 spins for Monte Carlo simulations."""
1647
1648
1649 fixed_values = {
1650 'r2eff': 10.0,
1651 'r2': 15.0,
1652 'r2a': 12.0,
1653 'r2b': 18.0,
1654 'pA': 0.80,
1655 'pB': 0.15,
1656 'k_AB': 0.001,
1657 'k_BA': 0.003,
1658 'kex': 0.01,
1659 'kex_AB': 0.015,
1660 'kex_BC': 0.017,
1661 'kex_AC': 0.016,
1662 'kB': 0.005,
1663 'kC': 0.004,
1664 'tex': 50.0,
1665 'dw': 1.0,
1666 'dw_AB': 1.02,
1667 'dw_BC': 1.03,
1668 'dwH': 0.1,
1669 'dwH_AB': 0.12,
1670 'dwH_BC': 0.13,
1671 'phi_ex': 0.5,
1672 'phi_ex_B': 0.4,
1673 'phi_ex_C': 0.3,
1674 }
1675
1676
1677 print("Checking the parameter conversion and setting for a cluster of 2 spins.")
1678 for model in MODEL_LIST_FULL:
1679
1680 print(" Model '%s'." % model)
1681
1682
1683 ds.add(pipe_name=model, pipe_type='relax_disp')
1684 if model == MODEL_R2EFF:
1685 cdp.model_type = 'R2eff'
1686 else:
1687 cdp.model_type = 'disp'
1688 cdp.exp_type_list = [self.exp_type[model]]
1689 cdp.spectrometer_frq_list = [1e6]
1690 spins = [SpinContainer(), SpinContainer()]
1691 for spin in spins:
1692 spin.model = model
1693 spin.params = deepcopy(MODEL_PARAMS[model])
1694
1695
1696 for name, param_index, spin_index, R20_key in loop_parameters(spins):
1697
1698 sim_name = "%s_sim" % name
1699
1700
1701 if name in ['r2', 'r2a', 'r2b']:
1702 key = "%s - %.8f MHz" % (cdp.exp_type_list[0], cdp.spectrometer_frq_list[0]/1e6)
1703 print(" Setting spin %i parameter %s[0]['%s'] to %s." % (spin_index, sim_name, key, fixed_values[name]))
1704 setattr(spins[spin_index], sim_name, [{key: fixed_values[name]}])
1705
1706
1707 elif spin_index == None:
1708 print(" Setting global parameter %s[0] to %s." % (sim_name, fixed_values[name]))
1709 setattr(spins[0], sim_name, [fixed_values[name]])
1710 setattr(spins[1], sim_name, [fixed_values[name]])
1711
1712
1713 else:
1714 print(" Setting spin %i parameter %s[0] to %s." % (spin_index, sim_name, fixed_values[name]))
1715 setattr(spins[spin_index], sim_name, [fixed_values[name]])
1716
1717
1718 for spin in spins:
1719 if 'pB' in MODEL_PARAMS[model]:
1720 spin.pC_sim = [None]
1721 elif 'pA' in MODEL_PARAMS[model]:
1722 spin.pB_sim = [None]
1723 if 'kex' in MODEL_PARAMS[model]:
1724 spin.tex_sim = [None]
1725 elif 'tex' in MODEL_PARAMS[model]:
1726 spin.kex_sim = [None]
1727 if 'kex' in MODEL_PARAMS[model] and 'pA' in MODEL_PARAMS[model]:
1728 spin.k_AB_sim = [None]
1729 spin.k_BA_sim = [None]
1730
1731
1732 param_conversion(key=None, spins=spins, sim_index=0)
1733
1734
1735 if 'pB' in MODEL_PARAMS[model]:
1736 print(" Checking parameter pC.")
1737 self.assertAlmostEqual(spins[0].pC_sim[0], 0.05)
1738 self.assertAlmostEqual(spins[1].pC_sim[0], 0.05)
1739 elif 'pA' in MODEL_PARAMS[model]:
1740 print(" Checking parameter pB.")
1741 self.assertAlmostEqual(spins[0].pB_sim[0], 0.20)
1742 self.assertAlmostEqual(spins[1].pB_sim[0], 0.20)
1743
1744
1745 if 'kex' in MODEL_PARAMS[model]:
1746 print(" Checking parameter tex.")
1747 self.assertAlmostEqual(spins[0].tex_sim[0], 100.0)
1748 self.assertAlmostEqual(spins[1].tex_sim[0], 100.0)
1749 elif 'tex' in MODEL_PARAMS[model]:
1750 print(" Checking parameter kex.")
1751 self.assertAlmostEqual(spins[0].kex_sim[0], 0.02)
1752 self.assertAlmostEqual(spins[1].kex_sim[0], 0.02)
1753
1754
1755 if 'kex' in MODEL_PARAMS[model] and 'pA' in MODEL_PARAMS[model]:
1756 print(" Checking parameter k_AB.")
1757 self.assertAlmostEqual(spins[0].k_AB_sim[0], 0.002)
1758 self.assertAlmostEqual(spins[1].k_AB_sim[0], 0.002)
1759 print(" Checking parameter k_BA.")
1760 self.assertAlmostEqual(spins[0].k_BA_sim[0], 0.008)
1761 self.assertAlmostEqual(spins[1].k_BA_sim[0], 0.008)
1762
1763
1765 """Test the specific_analyses.relax_disp.parameters.param_conversion() function for a single spin."""
1766
1767
1768 fixed_values = {
1769 'r2eff': 10.0,
1770 'r2': 15.0,
1771 'r2a': 12.0,
1772 'r2b': 18.0,
1773 'pA': 0.80,
1774 'pB': 0.15,
1775 'k_AB': 0.001,
1776 'k_BA': 0.003,
1777 'kex': 0.01,
1778 'kex_AB': 0.015,
1779 'kex_BC': 0.017,
1780 'kex_AC': 0.016,
1781 'kB': 0.005,
1782 'kC': 0.004,
1783 'tex': 50.0,
1784 'dw': 1.0,
1785 'dw_AB': 1.02,
1786 'dw_BC': 1.03,
1787 'dwH': 0.1,
1788 'dwH_AB': 0.12,
1789 'dwH_BC': 0.13,
1790 'phi_ex': 0.5,
1791 'phi_ex_B': 0.4,
1792 'phi_ex_C': 0.3,
1793 }
1794
1795
1796 print("Checking the parameter conversion and setting for a single spin.")
1797 for model in MODEL_LIST_FULL:
1798
1799 print(" Model '%s'." % model)
1800
1801
1802 ds.add(pipe_name=model, pipe_type='relax_disp')
1803 if model == MODEL_R2EFF:
1804 cdp.model_type = 'R2eff'
1805 else:
1806 cdp.model_type = 'disp'
1807 cdp.exp_type_list = [self.exp_type[model]]
1808 cdp.spectrometer_frq_list = [1e6]
1809 spin = SpinContainer()
1810 spin.model = model
1811 spin.params = deepcopy(MODEL_PARAMS[model])
1812
1813
1814 for name, param_index, spin_index, R20_key in loop_parameters([spin]):
1815
1816 if name in ['r2', 'r2a', 'r2b']:
1817 key = "%s - %.8f MHz" % (cdp.exp_type_list[0], cdp.spectrometer_frq_list[0]/1e6)
1818 print(" Setting spin %i parameter %s['%s'] to %s." % (spin_index, name, key, fixed_values[name]))
1819 setattr(spin, name, {key: fixed_values[name]})
1820
1821
1822 elif spin_index == None:
1823 print(" Setting global parameter %s to %s." % (name, fixed_values[name]))
1824 setattr(spin, name, fixed_values[name])
1825
1826
1827 else:
1828 print(" Setting spin %i parameter %s to %s." % (spin_index, name, fixed_values[name]))
1829 setattr(spin, name, fixed_values[name])
1830
1831
1832 param_conversion(key=None, spins=[spin], sim_index=None)
1833
1834
1835 if 'pB' in MODEL_PARAMS[model]:
1836 print(" Checking parameter pC.")
1837 self.assertAlmostEqual(spin.pC, 0.05)
1838 elif 'pA' in MODEL_PARAMS[model]:
1839 print(" Checking parameter pB.")
1840 self.assertAlmostEqual(spin.pB, 0.20)
1841
1842
1843 if 'kex' in MODEL_PARAMS[model]:
1844 print(" Checking parameter tex.")
1845 self.assertAlmostEqual(spin.tex, 100.0)
1846 elif 'tex' in MODEL_PARAMS[model]:
1847 print(" Checking parameter kex.")
1848 self.assertAlmostEqual(spin.kex, 0.02)
1849
1850
1851 if 'kex' in MODEL_PARAMS[model] and 'pA' in MODEL_PARAMS[model]:
1852 print(" Checking parameter k_AB.")
1853 self.assertAlmostEqual(spin.k_AB, 0.002)
1854 print(" Checking parameter k_BA.")
1855 self.assertAlmostEqual(spin.k_BA, 0.008)
1856
1857
1859 """Test the specific_analyses.relax_disp.parameters.param_num() function for a cluster of 2 spins."""
1860
1861
1862 expected = {
1863 MODEL_R2EFF: 2,
1864 MODEL_NOREX: 2,
1865 MODEL_LM63: 5,
1866 MODEL_LM63_3SITE: 8,
1867 MODEL_CR72: 6,
1868 MODEL_CR72_FULL: 8,
1869 MODEL_IT99: 6,
1870 MODEL_TSMFK01: 5,
1871 MODEL_B14: 6,
1872 MODEL_B14_FULL: 8,
1873 MODEL_M61: 5,
1874 MODEL_M61B: 6,
1875 MODEL_DPL94: 5,
1876 MODEL_TP02: 6,
1877 MODEL_TAP03: 6,
1878 MODEL_MP05: 6,
1879 MODEL_NS_CPMG_2SITE_3D: 6,
1880 MODEL_NS_CPMG_2SITE_3D_FULL: 8,
1881 MODEL_NS_CPMG_2SITE_STAR: 6,
1882 MODEL_NS_CPMG_2SITE_STAR_FULL: 8,
1883 MODEL_NS_CPMG_2SITE_EXPANDED: 6,
1884 MODEL_NS_R1RHO_2SITE: 6,
1885 MODEL_NS_R1RHO_3SITE: 11,
1886 MODEL_NS_R1RHO_3SITE_LINEAR: 10,
1887 MODEL_MMQ_CR72: 8,
1888 MODEL_NS_MMQ_2SITE: 8,
1889 MODEL_NS_MMQ_3SITE: 15,
1890 MODEL_NS_MMQ_3SITE_LINEAR: 14
1891 }
1892
1893
1894 print("Checking the parameter number counts for a cluster of 2 spins.")
1895 for model in MODEL_LIST_FULL:
1896
1897 if model not in expected:
1898 raise RelaxError("The model '%s' is not being checked." % model)
1899
1900
1901 print(" Model '%s'." % model)
1902
1903
1904 ds.add(pipe_name=model, pipe_type='relax_disp')
1905 if model == MODEL_R2EFF:
1906 cdp.model_type = 'R2eff'
1907 else:
1908 cdp.model_type = 'disp'
1909 cdp.exp_type_list = [self.exp_type[model]]
1910 spins = [SpinContainer(), SpinContainer()]
1911 for spin in spins:
1912 spin.model = model
1913 spin.params = deepcopy(MODEL_PARAMS[model])
1914
1915
1916 self.assertEqual(param_num(spins), expected[model])
1917
1918
1920 """Test the specific_analyses.relax_disp.parameters.param_num() function for a single spin."""
1921
1922
1923 expected = {
1924 MODEL_R2EFF: 1,
1925 MODEL_NOREX: 1,
1926 MODEL_LM63: 3,
1927 MODEL_LM63_3SITE: 5,
1928 MODEL_CR72: 4,
1929 MODEL_CR72_FULL: 5,
1930 MODEL_IT99: 4,
1931 MODEL_TSMFK01: 3,
1932 MODEL_B14: 4,
1933 MODEL_B14_FULL: 5,
1934 MODEL_M61: 3,
1935 MODEL_M61B: 4,
1936 MODEL_DPL94: 3,
1937 MODEL_TP02: 4,
1938 MODEL_TAP03: 4,
1939 MODEL_MP05: 4,
1940 MODEL_NS_CPMG_2SITE_3D: 4,
1941 MODEL_NS_CPMG_2SITE_3D_FULL: 5,
1942 MODEL_NS_CPMG_2SITE_STAR: 4,
1943 MODEL_NS_CPMG_2SITE_STAR_FULL: 5,
1944 MODEL_NS_CPMG_2SITE_EXPANDED: 4,
1945 MODEL_NS_R1RHO_2SITE: 4,
1946 MODEL_NS_R1RHO_3SITE: 8,
1947 MODEL_NS_R1RHO_3SITE_LINEAR: 7,
1948 MODEL_MMQ_CR72: 5,
1949 MODEL_NS_MMQ_2SITE: 5,
1950 MODEL_NS_MMQ_3SITE: 10,
1951 MODEL_NS_MMQ_3SITE_LINEAR: 9
1952 }
1953
1954
1955 print("Checking the parameter number counts for a single spin.")
1956 for model in MODEL_LIST_FULL:
1957
1958 if model not in expected:
1959 raise RelaxError("The model '%s' is not being checked." % model)
1960
1961
1962 print(" Model '%s'." % model)
1963
1964
1965 ds.add(pipe_name=model, pipe_type='relax_disp')
1966 if model == MODEL_R2EFF:
1967 cdp.model_type = 'R2eff'
1968 else:
1969 cdp.model_type = 'disp'
1970 cdp.exp_type_list = [self.exp_type[model]]
1971 spin = SpinContainer()
1972 spin.model = model
1973 spin.params = deepcopy(MODEL_PARAMS[model])
1974
1975
1976 self.assertEqual(param_num([spin]), expected[model])
1977