1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from numpy import array
24
25
26 from data_store import Relax_data_store; ds = Relax_data_store()
27 from pipe_control import pipes
28 from pipe_control.mol_res_spin import metadata_update
29 from lib.errors import RelaxError, RelaxNoPipeError
30 from test_suite.unit_tests.base_classes import UnitTestCase
31
32
34 """Testing base class for 'prompt.spin' and corresponding 'pipe_control.mol_res_spin' fns.
35
36 This base class also contains many shared unit tests.
37 """
38
40 """Set up for all the spin unit tests.
41
42 The data contained within the 'orig' data pipe is:
43
44 ID Molecule Res number Res name Spin number Spin name
45 0,0,0 Old mol 1 Ala 111 C8
46 0,0,1 Old mol 1 Ala 6 C19
47 0,0,2 Old mol 1 Ala 7 C21
48 0,0,3 Old mol 1 Ala 8 C24
49 0,0,4 Old mol 1 Ala 9 C26
50 0,1,0 Old mol 2 Arg 78 NH
51 1,0,0 New mol 5 Lys 239 NH
52 1,1,0 New mol 6 Thr None None
53 1,1,1 New mol 6 Thr 3239 NH
54
55 The IDs correspond to the molecule, residue and spin indices.
56 """
57
58
59 ds.add(pipe_name='orig', pipe_type='mf')
60
61
62 ds.add(pipe_name='test', pipe_type='mf')
63
64
65 pipes.switch('orig')
66
67
68 cdp.mol[0].name = 'Old mol'
69
70
71 cdp.mol[0].res[0].num = 1
72 cdp.mol[0].res[0].name = 'Ala'
73 cdp.mol[0].res[0].spin[0].num = 111
74 cdp.mol[0].res[0].spin[0].name = 'C8'
75 cdp.mol[0].res[0].spin[0].x = 1
76
77
78 cdp.mol[0].res[0].spin.add_item('C19', 6)
79 cdp.mol[0].res[0].spin.add_item('C21', 7)
80 cdp.mol[0].res[0].spin.add_item('C24', 8)
81 cdp.mol[0].res[0].spin.add_item('C26', 9)
82
83
84 cdp.mol[0].res.add_item('Arg', 2)
85 cdp.mol[0].res[1].spin[0].num = 78
86 cdp.mol[0].res[1].spin[0].name = 'NH'
87
88
89 cdp.mol.add_item('New mol')
90
91
92 cdp.mol[1].res[0].num = 5
93 cdp.mol[1].res[0].name = 'Lys'
94 cdp.mol[1].res[0].spin[0].num = 239
95 cdp.mol[1].res[0].spin[0].name = 'NH'
96 cdp.mol[1].res.add_item('Thr', 6)
97 cdp.mol[1].res[1].spin.add_item(None, 1433)
98 cdp.mol[1].res[1].spin.add_item('NH', 3239)
99
100
101 cdp.mol.add_item('3rd')
102
103
104 cdp.mol[2].res[0].num = 13
105 cdp.mol[2].res[0].name = 'Gly'
106 cdp.mol[2].res[0].spin[0].x = 'hello'
107
108
109 metadata_update()
110
111
113 """Test the copying of the spin data within the same residue.
114
115 The function tested is both pipe_control.mol_res_spin.copy_spin() and
116 prompt.spin.copy().
117 """
118
119
120 self.spin_fns.copy(spin_from='#3rd:13', spin_to='#3rd:13@NE')
121
122
123 dp = pipes.get_pipe('orig')
124
125
126 self.assertEqual(dp.mol[2].res[0].num, 13)
127 self.assertEqual(dp.mol[2].res[0].name, 'Gly')
128 self.assertEqual(dp.mol[2].res[0].spin[0].num, None)
129 self.assertEqual(dp.mol[2].res[0].spin[0].name, None)
130 self.assertEqual(dp.mol[2].res[0].spin[0].x, 'hello')
131
132
133 self.assertEqual(dp.mol[2].res[0].spin[1].num, None)
134 self.assertEqual(dp.mol[2].res[0].spin[1].name, 'NE')
135 self.assertEqual(dp.mol[2].res[0].spin[1].x, 'hello')
136
137
139 """Test the copying of the spin data between different molecules.
140
141 The function tested is both pipe_control.mol_res_spin.copy_spin() and
142 prompt.spin.copy().
143 """
144
145
146 self.spin_fns.copy(spin_from='#Old mol:1@C8', spin_to='#New mol:5@334')
147
148
149 dp = pipes.get_pipe('orig')
150
151
152 self.assertEqual(dp.mol[0].res[0].num, 1)
153 self.assertEqual(dp.mol[0].res[0].name, 'Ala')
154 self.assertEqual(dp.mol[0].res[0].spin[0].num, 111)
155 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C8')
156 self.assertEqual(dp.mol[0].res[0].spin[0].x, 1)
157
158
159 self.assertEqual(dp.mol[1].res[0].num, 5)
160 self.assertEqual(dp.mol[1].res[0].name, 'Lys')
161 self.assertEqual(dp.mol[1].res[0].spin[0].num, 239)
162 self.assertEqual(dp.mol[1].res[0].spin[0].name, 'NH')
163 self.assertEqual(dp.mol[1].res[0].spin[1].num, 334)
164 self.assertEqual(dp.mol[1].res[0].spin[1].name, 'C8')
165 self.assertEqual(dp.mol[1].res[0].spin[1].x, 1)
166
167
169 """Test the copying of the spin data between different residues.
170
171 The function tested is both pipe_control.mol_res_spin.copy_spin() and
172 prompt.spin.copy().
173 """
174
175
176 self.spin_fns.copy(spin_from='#Old mol:1@C8', spin_to='#Old mol:2')
177
178
179 dp = pipes.get_pipe('orig')
180
181
182 self.assertEqual(dp.mol[0].res[0].num, 1)
183 self.assertEqual(dp.mol[0].res[0].name, 'Ala')
184 self.assertEqual(dp.mol[0].res[0].spin[0].num, 111)
185 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C8')
186 self.assertEqual(dp.mol[0].res[0].spin[0].x, 1)
187
188
189 self.assertEqual(dp.mol[0].res[1].num, 2)
190 self.assertEqual(dp.mol[0].res[1].name, 'Arg')
191 self.assertEqual(dp.mol[0].res[1].spin[0].num, 78)
192 self.assertEqual(dp.mol[0].res[1].spin[0].name, 'NH')
193 self.assertEqual(dp.mol[0].res[1].spin[1].num, 111)
194 self.assertEqual(dp.mol[0].res[1].spin[1].name, 'C8')
195 self.assertEqual(dp.mol[0].res[1].spin[1].x, 1)
196
197
199 """Test the copying of the spin data between different data pipes.
200
201 The function tested is both pipe_control.mol_res_spin.copy_spin() and
202 prompt.spin.copy().
203 """
204
205
206 self.spin_fns.copy(spin_from='#Old mol:1@C8', pipe_to='test')
207
208
209 dp = pipes.get_pipe('orig')
210 dp_test = pipes.get_pipe('test')
211
212
213 dp.mol[0].res[0].spin[0].num = 222
214 dp.mol[0].res[0].spin[0].x = 2
215
216
217 metadata_update()
218
219
220 self.assertEqual(dp.mol[0].res[0].spin[0].num, 222)
221 self.assertEqual(dp.mol[0].res[0].spin[0].x, 2)
222
223
224 self.assertEqual(dp_test.mol[0].res[0].spin[0].num, 111)
225 self.assertEqual(dp_test.mol[0].res[0].spin[0].x, 1)
226
227
229 """Test the copying of the spin data between different data pipes.
230
231 The function tested is both pipe_control.mol_res_spin.copy_spin() and
232 prompt.spin.copy().
233 """
234
235
236 self.assertRaises(RelaxNoPipeError, self.spin_fns.copy, spin_from='#Old mol:1@C8', pipe_to='test2')
237
238
239
241 """Test the failure of the copying of the spin data of a non-existent residue.
242
243 The function tested is both pipe_control.mol_res_spin.copy_spin() and
244 prompt.spin.copy().
245 """
246
247
248 self.assertRaises(RelaxError, self.spin_fns.copy, spin_from=':Met@C8', spin_to=':2,Gly')
249
250
252 """Test the failure of the copying of the spin data of a non-existent spin.
253
254 The function tested is both pipe_control.mol_res_spin.copy_spin() and
255 prompt.spin.copy().
256 """
257
258
259 self.assertRaises(RelaxError, self.spin_fns.copy, spin_from=':Ala@234', spin_to=':2,Gly')
260
261
263 """Test the failure of the copying of the spin data to a non-existent residue.
264
265 The function tested is both pipe_control.mol_res_spin.copy_spin() and
266 prompt.spin.copy().
267 """
268
269
270 self.assertRaises(RelaxError, self.spin_fns.copy, spin_from='#Old mol:1@C8', spin_to='#Old mol:3')
271
272
274 """Test the failure of the copying of the spin data to a number which already exists.
275
276 The function tested is both pipe_control.mol_res_spin.copy_spin() and
277 prompt.spin.copy().
278 """
279
280
281 self.assertRaises(RelaxError, self.spin_fns.copy, spin_from=':1', spin_to=':2@78')
282
283
285 """Test the creation of a pseudo-atom.
286
287 The function tested is both pipe_control.mol_res_spin.create_pseudo_spin() and
288 prompt.spin.create_pseudo().
289 """
290
291
292 self.spin_fns.create(spin_num=100, spin_name='H13', res_num=1, mol_name='Old mol')
293 self.spin_fns.create(spin_num=101, spin_name='H14', res_num=1, mol_name='Old mol')
294 self.spin_fns.create(spin_num=102, spin_name='H15', res_num=1, mol_name='Old mol')
295
296
297 dp = pipes.get_pipe('orig')
298
299
300 dp.mol[0].res[0].spin[5].pos = [array([3.0, 0.0, 0.0])]
301 dp.mol[0].res[0].spin[6].pos = [array([0.0, 3.0, 0.0])]
302 dp.mol[0].res[0].spin[7].pos = [array([0.0, 0.0, 3.0])]
303
304
305 self.spin_fns.create_pseudo(spin_name='Q3', spin_num=105, members=['#Old mol:1@H13', '#Old mol:1@H14', '#Old mol:1@H15'], averaging='linear')
306
307
308 self.assertEqual(dp.mol[0].res[0].spin[5].num, 100)
309 self.assertEqual(dp.mol[0].res[0].spin[6].num, 101)
310 self.assertEqual(dp.mol[0].res[0].spin[7].num, 102)
311 self.assertEqual(dp.mol[0].res[0].spin[8].num, 105)
312
313
314 self.assertEqual(dp.mol[0].res[0].spin[5].name, 'H13')
315 self.assertEqual(dp.mol[0].res[0].spin[6].name, 'H14')
316 self.assertEqual(dp.mol[0].res[0].spin[7].name, 'H15')
317 self.assertEqual(dp.mol[0].res[0].spin[8].name, 'Q3')
318
319
320 self.assertEqual(len(dp.mol[0].res[0].spin[8].pos), 1)
321 self.assertEqual(dp.mol[0].res[0].spin[8].pos[0][0], 1.0)
322 self.assertEqual(dp.mol[0].res[0].spin[8].pos[0][1], 1.0)
323 self.assertEqual(dp.mol[0].res[0].spin[8].pos[0][2], 1.0)
324
325
326 self.assertEqual(dp.mol[0].res[0].spin[5].pseudo_name, '@Q3')
327 self.assertEqual(dp.mol[0].res[0].spin[5].pseudo_num, 105)
328 self.assertEqual(dp.mol[0].res[0].spin[6].pseudo_name, '@Q3')
329 self.assertEqual(dp.mol[0].res[0].spin[6].pseudo_num, 105)
330 self.assertEqual(dp.mol[0].res[0].spin[7].pseudo_name, '@Q3')
331 self.assertEqual(dp.mol[0].res[0].spin[7].pseudo_num, 105)
332 self.assertEqual(dp.mol[0].res[0].spin[8].members, ['#Old mol:1@H13', '#Old mol:1@H14', '#Old mol:1@H15'])
333 self.assertEqual(dp.mol[0].res[0].spin[8].averaging, 'linear')
334
335
337 """Test the creation of a pseudo-atom (test 2).
338
339 The function tested is both pipe_control.mol_res_spin.create_pseudo_spin() and
340 prompt.spin.create_pseudo().
341 """
342
343
344 self.spin_fns.create(spin_num=100, spin_name='H93', res_num=1, mol_name='Old mol')
345 self.spin_fns.create(spin_num=101, spin_name='H94', res_num=1, mol_name='Old mol')
346
347
348 dp = pipes.get_pipe('orig')
349
350
351 dp.mol[0].res[0].spin[5].pos = [array([2.0, 0.0, 0.0]), array([-2.0, 0.0, 0.0])]
352 dp.mol[0].res[0].spin[6].pos = [array([0.0, 2.0, 0.0]), array([0.0, -2.0, 0.0])]
353
354
355 self.spin_fns.create_pseudo(spin_name='Q10', spin_num=105, members=['#Old mol:1@H93', '#Old mol:1@H94'], averaging='linear')
356
357
358 self.assertEqual(dp.mol[0].res[0].spin[5].num, 100)
359 self.assertEqual(dp.mol[0].res[0].spin[6].num, 101)
360 self.assertEqual(dp.mol[0].res[0].spin[7].num, 105)
361
362
363 self.assertEqual(dp.mol[0].res[0].spin[5].name, 'H93')
364 self.assertEqual(dp.mol[0].res[0].spin[6].name, 'H94')
365 self.assertEqual(dp.mol[0].res[0].spin[7].name, 'Q10')
366
367
368 self.assertEqual(len(dp.mol[0].res[0].spin[7].pos), 2)
369 self.assertEqual(dp.mol[0].res[0].spin[7].pos[0][0], 1.0)
370 self.assertEqual(dp.mol[0].res[0].spin[7].pos[0][1], 1.0)
371 self.assertEqual(dp.mol[0].res[0].spin[7].pos[0][2], 0.0)
372 self.assertEqual(dp.mol[0].res[0].spin[7].pos[1][0], -1.0)
373 self.assertEqual(dp.mol[0].res[0].spin[7].pos[1][1], -1.0)
374 self.assertEqual(dp.mol[0].res[0].spin[7].pos[1][2], 0.0)
375
376
377 self.assertEqual(dp.mol[0].res[0].spin[5].pseudo_name, '@Q10')
378 self.assertEqual(dp.mol[0].res[0].spin[5].pseudo_num, 105)
379 self.assertEqual(dp.mol[0].res[0].spin[6].pseudo_name, '@Q10')
380 self.assertEqual(dp.mol[0].res[0].spin[6].pseudo_num, 105)
381 self.assertEqual(dp.mol[0].res[0].spin[7].members, ['#Old mol:1@H93', '#Old mol:1@H94'])
382 self.assertEqual(dp.mol[0].res[0].spin[7].averaging, 'linear')
383
384
386 """Test the creation of a spin.
387
388 The function tested is both pipe_control.mol_res_spin.create_spin() and
389 prompt.spin.create().
390 """
391
392
393 self.spin_fns.create(spin_num=1, spin_name='C3', res_num=1, mol_name='Old mol')
394 self.spin_fns.create(spin_num=2, spin_name='C17', res_num=1, mol_name='Old mol')
395 self.spin_fns.create(spin_num=-3, spin_name='N7', res_num=6, mol_name='New mol')
396
397
398 dp = pipes.get_pipe('orig')
399
400
401 self.assertEqual(dp.mol[0].res[0].spin[5].num, 1)
402 self.assertEqual(dp.mol[0].res[0].spin[6].num, 2)
403 self.assertEqual(dp.mol[1].res[1].spin[2].num, -3)
404
405
406 self.assertEqual(dp.mol[0].res[0].spin[5].name, 'C3')
407 self.assertEqual(dp.mol[0].res[0].spin[6].name, 'C17')
408 self.assertEqual(dp.mol[1].res[1].spin[2].name, 'N7')
409
410
412 """Test the failure of spin creation (by supplying two spins with the same name and number).
413
414 The function tested is both pipe_control.mol_res_spin.create_spin() and prompt.spin.create().
415 """
416
417
418 self.spin_fns.create(spin_num=1, spin_name='P1', res_num=1, mol_name='Old mol')
419
420
421 self.assertRaises(RelaxError, self.spin_fns.create, spin_num=1, spin_name='P1', res_num=1, mol_name='Old mol')
422
423
425 """Test spin deletion using spin name identifiers.
426
427 The function tested is both pipe_control.mol_res_spin.delete_spin() and
428 prompt.spin.delete().
429 """
430
431
432 self.spin_fns.delete(spin_id='@C8')
433
434
435 dp = pipes.get_pipe('orig')
436
437
438 self.assertEqual(dp.mol[0].res[0].spin[0].num, 6)
439 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C19')
440 self.assertTrue(not hasattr(dp.mol[0].res[0].spin[0], 'x'))
441
442
444 """Test spin deletion using spin number identifiers.
445
446 The function tested is both pipe_control.mol_res_spin.delete_spin() and
447 prompt.spin.delete().
448 """
449
450
451 self.spin_fns.delete(spin_id='@C8')
452
453
454 dp = pipes.get_pipe('orig')
455
456
457 self.assertEqual(dp.mol[0].res[0].spin[0].num, 6)
458 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C19')
459 self.assertTrue(not hasattr(dp.mol[0].res[0].spin[0], 'x'))
460
461
463 """Test the deletion of all spins in one residue.
464
465 The function tested is both pipe_control.mol_res_spin.delete_spin() and
466 prompt.spin.delete().
467 """
468
469
470 self.spin_fns.delete(spin_id='@1-200')
471
472
473 dp = pipes.get_pipe('orig')
474
475
476 self.assertEqual(dp.mol[0].res[0].spin[0].num, None)
477 self.assertEqual(dp.mol[0].res[0].spin[0].name, None)
478 self.assertEqual(dp.mol[0].res[0].spin[0].select, False)
479
480
482 """Test the deletion of multiple spins.
483
484 The function tested is both pipe_control.mol_res_spin.delete_spin() and
485 prompt.spin.delete().
486 """
487
488
489 self.spin_fns.delete(spin_id='@C8,7')
490
491
492 dp = pipes.get_pipe('orig')
493
494
495 self.assertEqual(dp.mol[0].res[0].spin[0].num, 6)
496 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C19')
497 self.assertEqual(dp.mol[0].res[0].spin[1].num, 8)
498 self.assertEqual(dp.mol[0].res[0].spin[1].name, 'C24')
499 self.assertEqual(dp.mol[0].res[0].spin[2].num, 9)
500 self.assertEqual(dp.mol[0].res[0].spin[2].name, 'C26')
501
502
504 """Test the display of spin information.
505
506 The function tested is both pipe_control.mol_res_spin.display_spin() and
507 prompt.spin.display().
508 """
509
510
511 self.spin_fns.display()
512 self.spin_fns.display(':1')
513 self.spin_fns.display('#Old mol:1')
514 self.spin_fns.display('#New mol:5')
515 self.spin_fns.display('#New mol:6@3239')
516
517
519 """Test the renaming of a spin.
520
521 The function tested is both pipe_control.mol_res_spin.name_spin() and
522 prompt.spin.name().
523 """
524
525
526 self.spin_fns.name(spin_id='@C26', name='C25', force=True)
527 self.spin_fns.name(spin_id=':2@78', name='Ca', force=True)
528 self.spin_fns.name(spin_id='#New mol:6@3239', name='NHe', force=True)
529
530
531 dp = pipes.get_pipe('orig')
532
533
534 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C8')
535 self.assertEqual(dp.mol[0].res[0].spin[1].name, 'C19')
536 self.assertEqual(dp.mol[0].res[0].spin[2].name, 'C21')
537 self.assertEqual(dp.mol[0].res[0].spin[3].name, 'C24')
538 self.assertEqual(dp.mol[0].res[0].spin[4].name, 'C25')
539 self.assertEqual(dp.mol[0].res[1].spin[0].name, 'Ca')
540 self.assertEqual(dp.mol[1].res[0].spin[0].name, 'NH')
541 self.assertEqual(dp.mol[1].res[1].spin[0].name, None)
542 self.assertEqual(dp.mol[1].res[1].spin[1].name, 'NHe')
543
544
546 """Test the renaming of multiple spins.
547
548 The function tested is both pipe_control.mol_res_spin.name_spin() and
549 prompt.spin.name().
550 """
551
552
553 self.spin_fns.name(spin_id='@NH', name='N', force=True)
554
555
556 dp = pipes.get_pipe('orig')
557
558
559 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C8')
560 self.assertEqual(dp.mol[0].res[0].spin[1].name, 'C19')
561 self.assertEqual(dp.mol[0].res[0].spin[2].name, 'C21')
562 self.assertEqual(dp.mol[0].res[0].spin[3].name, 'C24')
563 self.assertEqual(dp.mol[0].res[0].spin[4].name, 'C26')
564 self.assertEqual(dp.mol[0].res[1].spin[0].name, 'N')
565 self.assertEqual(dp.mol[1].res[0].spin[0].name, 'N')
566 self.assertEqual(dp.mol[1].res[1].spin[0].name, None)
567 self.assertEqual(dp.mol[1].res[1].spin[1].name, 'N')
568
569
571 """Test the numbering of a spin.
572
573 The function tested is both pipe_control.mol_res_spin.number_spin() and
574 prompt.spin.number().
575 """
576
577
578 self.spin_fns.number(spin_id='@C8', number=1, force=True)
579 self.spin_fns.number(spin_id='@6', number=2, force=True)
580 self.spin_fns.number(spin_id='@7', number=3, force=True)
581 self.spin_fns.number(spin_id='@8', number=4, force=True)
582 self.spin_fns.number(spin_id='@9', number=5, force=True)
583 self.spin_fns.number(spin_id='@78', number=6, force=True)
584 self.spin_fns.number(spin_id='@239', number=7, force=True)
585 self.spin_fns.number(spin_id='@3239', number=9, force=True)
586
587
588 dp = pipes.get_pipe('orig')
589
590
591 self.assertEqual(dp.mol[0].res[0].spin[0].num, 1)
592 self.assertEqual(dp.mol[0].res[0].spin[1].num, 2)
593 self.assertEqual(dp.mol[0].res[0].spin[2].num, 3)
594 self.assertEqual(dp.mol[0].res[0].spin[3].num, 4)
595 self.assertEqual(dp.mol[0].res[0].spin[4].num, 5)
596 self.assertEqual(dp.mol[0].res[1].spin[0].num, 6)
597 self.assertEqual(dp.mol[1].res[0].spin[0].num, 7)
598 self.assertEqual(dp.mol[1].res[1].spin[1].num, 9)
599
600
602 """Test the renaming of multiple spins.
603
604 The function tested is both pipe_control.mol_res_spin.number_spin() and
605 prompt.spin.number().
606 """
607
608
609 self.assertRaises(RelaxError, self.spin_fns.number, spin_id='@NH', number=-6)
610