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.assert_(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.assert_(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
479
481 """Test the deletion of multiple spins.
482
483 The function tested is both pipe_control.mol_res_spin.delete_spin() and
484 prompt.spin.delete().
485 """
486
487
488 self.spin_fns.delete(spin_id='@C8,7')
489
490
491 dp = pipes.get_pipe('orig')
492
493
494 self.assertEqual(dp.mol[0].res[0].spin[0].num, 6)
495 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C19')
496 self.assertEqual(dp.mol[0].res[0].spin[1].num, 8)
497 self.assertEqual(dp.mol[0].res[0].spin[1].name, 'C24')
498 self.assertEqual(dp.mol[0].res[0].spin[2].num, 9)
499 self.assertEqual(dp.mol[0].res[0].spin[2].name, 'C26')
500
501
503 """Test the display of spin information.
504
505 The function tested is both pipe_control.mol_res_spin.display_spin() and
506 prompt.spin.display().
507 """
508
509
510 self.spin_fns.display()
511 self.spin_fns.display(':1')
512 self.spin_fns.display('#Old mol:1')
513 self.spin_fns.display('#New mol:5')
514 self.spin_fns.display('#New mol:6@3239')
515
516
518 """Test the renaming of a spin.
519
520 The function tested is both pipe_control.mol_res_spin.name_spin() and
521 prompt.spin.name().
522 """
523
524
525 self.spin_fns.name(spin_id='@C26', name='C25', force=True)
526 self.spin_fns.name(spin_id=':2@78', name='Ca', force=True)
527 self.spin_fns.name(spin_id='#New mol:6@3239', name='NHe', force=True)
528
529
530 dp = pipes.get_pipe('orig')
531
532
533 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C8')
534 self.assertEqual(dp.mol[0].res[0].spin[1].name, 'C19')
535 self.assertEqual(dp.mol[0].res[0].spin[2].name, 'C21')
536 self.assertEqual(dp.mol[0].res[0].spin[3].name, 'C24')
537 self.assertEqual(dp.mol[0].res[0].spin[4].name, 'C25')
538 self.assertEqual(dp.mol[0].res[1].spin[0].name, 'Ca')
539 self.assertEqual(dp.mol[1].res[0].spin[0].name, 'NH')
540 self.assertEqual(dp.mol[1].res[1].spin[0].name, None)
541 self.assertEqual(dp.mol[1].res[1].spin[1].name, 'NHe')
542
543
545 """Test the renaming of multiple spins.
546
547 The function tested is both pipe_control.mol_res_spin.name_spin() and
548 prompt.spin.name().
549 """
550
551
552 self.spin_fns.name(spin_id='@NH', name='N', force=True)
553
554
555 dp = pipes.get_pipe('orig')
556
557
558 self.assertEqual(dp.mol[0].res[0].spin[0].name, 'C8')
559 self.assertEqual(dp.mol[0].res[0].spin[1].name, 'C19')
560 self.assertEqual(dp.mol[0].res[0].spin[2].name, 'C21')
561 self.assertEqual(dp.mol[0].res[0].spin[3].name, 'C24')
562 self.assertEqual(dp.mol[0].res[0].spin[4].name, 'C26')
563 self.assertEqual(dp.mol[0].res[1].spin[0].name, 'N')
564 self.assertEqual(dp.mol[1].res[0].spin[0].name, 'N')
565 self.assertEqual(dp.mol[1].res[1].spin[0].name, None)
566 self.assertEqual(dp.mol[1].res[1].spin[1].name, 'N')
567
568
570 """Test the numbering of a spin.
571
572 The function tested is both pipe_control.mol_res_spin.number_spin() and
573 prompt.spin.number().
574 """
575
576
577 self.spin_fns.number(spin_id='@C8', number=1, force=True)
578 self.spin_fns.number(spin_id='@6', number=2, force=True)
579 self.spin_fns.number(spin_id='@7', number=3, force=True)
580 self.spin_fns.number(spin_id='@8', number=4, force=True)
581 self.spin_fns.number(spin_id='@9', number=5, force=True)
582 self.spin_fns.number(spin_id='@78', number=6, force=True)
583 self.spin_fns.number(spin_id='@239', number=7, force=True)
584 self.spin_fns.number(spin_id='@3239', number=9, force=True)
585
586
587 dp = pipes.get_pipe('orig')
588
589
590 self.assertEqual(dp.mol[0].res[0].spin[0].num, 1)
591 self.assertEqual(dp.mol[0].res[0].spin[1].num, 2)
592 self.assertEqual(dp.mol[0].res[0].spin[2].num, 3)
593 self.assertEqual(dp.mol[0].res[0].spin[3].num, 4)
594 self.assertEqual(dp.mol[0].res[0].spin[4].num, 5)
595 self.assertEqual(dp.mol[0].res[1].spin[0].num, 6)
596 self.assertEqual(dp.mol[1].res[0].spin[0].num, 7)
597 self.assertEqual(dp.mol[1].res[1].spin[1].num, 9)
598
599
601 """Test the renaming of multiple spins.
602
603 The function tested is both pipe_control.mol_res_spin.number_spin() and
604 prompt.spin.number().
605 """
606
607
608 self.assertRaises(RelaxError, self.spin_fns.number, spin_id='@NH', number=-6)
609