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 import sys
25
26
29 """Class containing functions for relaxation data."""
30
31 self.relax = relax
32
33
34 - def add_residue(self, run=None, res_index=None, ri_labels=None, remap_table=None, frq_labels=None, frq=None, values=None, errors=None, sim=0):
35 """Function for adding all relaxation data for a single residue."""
36
37
38 self.run = run
39 self.ri_labels = ri_labels
40 self.remap_table = remap_table
41 self.frq_labels = frq_labels
42 self.frq = frq
43
44
45 if not self.run in self.relax.data.run_names:
46 raise RelaxNoRunError, self.run
47
48
49 if not self.relax.data.res.has_key(self.run):
50 raise RelaxNoSequenceError, self.run
51
52
53
54
55
56
57 self.global_flag = 1
58
59
60 self.data_init(self.relax.data)
61
62
63 self.relax.data.ri_labels[self.run] = ri_labels
64 self.relax.data.remap_table[self.run] = remap_table
65 self.relax.data.frq_labels[self.run] = frq_labels
66 self.relax.data.frq[self.run] = frq
67 self.relax.data.num_ri[self.run] = len(ri_labels)
68 self.relax.data.num_frq[self.run] = len(frq)
69
70
71
72
73
74
75 self.global_flag = 0
76
77
78 data = self.relax.data.res[self.run][res_index]
79
80
81 if not sim:
82
83 self.data_init(data)
84
85
86 data.relax_data = values
87 data.relax_error = errors
88
89
90 data.ri_labels = ri_labels
91 data.remap_table = remap_table
92 data.frq_labels = frq_labels
93 data.frq = frq
94 data.num_ri = len(ri_labels)
95 data.num_frq = len(frq)
96
97
98 for i in xrange(data.num_ri):
99 data.noe_r1_table.append(None)
100
101
102 for i in xrange(data.num_ri):
103
104 if data.ri_labels[i] == 'NOE':
105 for j in xrange(data.num_ri):
106 if data.ri_labels[j] == 'R1' and data.frq_labels[data.remap_table[i]] == data.frq_labels[data.remap_table[j]]:
107 data.noe_r1_table[i] = j
108
109
110 if data.ri_labels[i] == 'R1':
111 for j in xrange(data.num_ri):
112 if data.ri_labels[j] == 'NOE' and data.frq_labels[data.remap_table[i]] == data.frq_labels[data.remap_table[j]]:
113 data.noe_r1_table[j] = i
114
115
116
117 else:
118
119 if not hasattr(data, 'relax_sim_data') or type(data.relax_sim_data) != list:
120 data.relax_sim_data = []
121
122
123 data.relax_sim_data.append(values)
124
125
126 - def back_calc(self, run=None, ri_label=None, frq_label=None, frq=None):
127 """Function for back calculating relaxation data."""
128
129
130 self.run = run
131 self.ri_label = ri_label
132 self.frq_label = frq_label
133 self.frq = frq
134
135
136 if not self.run in self.relax.data.run_names:
137 raise RelaxNoRunError, self.run
138
139
140 if not self.relax.data.res.has_key(self.run):
141 raise RelaxNoSequenceError, self.run
142
143
144 if self.test_labels(run):
145 raise RelaxRiError, (self.ri_label, self.frq_label)
146
147
148
149
150
151
152 self.global_flag = 1
153
154
155 self.data_init(self.relax.data)
156
157
158 self.update_global_data_structures()
159
160
161
162
163
164
165 self.global_flag = 0
166
167
168 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
169
170
171 back_calculate = self.relax.specific_setup.setup('back_calc', function_type)
172
173
174 for i in xrange(len(self.relax.data.res[self.run])):
175
176 data = self.relax.data.res[self.run][i]
177
178
179 back_up = deepcopy(data)
180
181
182 self.update_data_structures(data)
183
184
185 try:
186 value = back_calculate(run=self.run, index=i, ri_label=self.ri_label, frq_label=frq_label, frq=self.frq)
187 except:
188
189 self.relax.data.res[self.run][i] = deepcopy(back_up)
190 del back_up
191 raise
192
193
194 self.update_data_structures(data, value)
195
196
197 - def copy(self, run1=None, run2=None, ri_label=None, frq_label=None):
198 """Function for copying relaxation data from run1 to run2."""
199
200
201 self.ri_label = ri_label
202 self.frq_label = frq_label
203
204
205 if not run1 in self.relax.data.run_names:
206 raise RelaxNoRunError, run1
207
208
209 if not run2 in self.relax.data.run_names:
210 raise RelaxNoRunError, run2
211
212
213 if not self.relax.data.res.has_key(run1):
214 raise RelaxNoSequenceError, run1
215
216
217 if not self.relax.data.res.has_key(run2):
218 raise RelaxNoSequenceError, run2
219
220
221 if ri_label == None and frq_label == None:
222
223 names = self.data_names()
224
225
226 for i in xrange(len(self.relax.data.res[run1])):
227
228 data1 = self.relax.data.res[run1][i]
229 data2 = self.relax.data.res[run2][i]
230
231
232 for name in names:
233
234 if not hasattr(data1, name):
235 continue
236
237
238 setattr(data2, name, deepcopy(getattr(data1, name)))
239
240
241 else:
242
243 if not self.test_labels(run1):
244 raise RelaxNoRiError, (self.ri_label, self.frq_label)
245
246
247 if self.test_labels(run2):
248 raise RelaxRiError, (self.ri_label, self.frq_label)
249
250
251 for i in xrange(len(self.relax.data.res[run1])):
252
253 data1 = self.relax.data.res[run1][i]
254 data2 = self.relax.data.res[run2][i]
255
256
257 index = self.find_index(data1)
258
259
260 if index == None:
261 continue
262
263
264 value = data1.relax_data[index]
265 error = data1.relax_error[index]
266
267
268 self.update_data_structures(data2, value, error)
269
270
272 """Function for initialising the data structures."""
273
274
275 data_names = self.data_names()
276
277
278 for name in data_names:
279
280 if self.global_flag == 1:
281
282 if not hasattr(data, name):
283 setattr(data, name, {})
284
285
286 list_data = [ 'relax_data',
287 'relax_error',
288 'ri_labels',
289 'remap_table',
290 'noe_r1_table',
291 'frq_labels',
292 'frq' ]
293 if name in list_data:
294
295 if self.global_flag == 1:
296
297 object = getattr(data, name)
298
299
300 if not object.has_key(self.run):
301 object[self.run] = []
302
303
304 else:
305
306 if not hasattr(data, name):
307 setattr(data, name, [])
308
309
310 zero_data = [ 'num_ri', 'num_frq' ]
311 if name in zero_data:
312
313 if self.global_flag == 1:
314
315 object = getattr(data, name)
316
317
318 if not object.has_key(self.run):
319 object[self.run] = 0
320
321
322 else:
323
324 if not hasattr(data, name):
325 setattr(data, name, 0)
326
327
329 """Function for returning a list of names of data structures associated with relax_data.
330
331 Description
332 ~~~~~~~~~~~
333
334 The names are as follows:
335
336 relax_data: Relaxation data.
337
338 relax_error: Relaxation error.
339
340 num_ri: Number of data points, eg 6.
341
342 num_frq: Number of field strengths, eg 2.
343
344 ri_labels: Labels corresponding to the data type, eg ['NOE', 'R1', 'R2', 'NOE', 'R1',
345 'R2'].
346
347 remap_table: A translation table to map relaxation data points to their frequencies, eg [0,
348 0, 0, 1, 1, 1].
349
350 noe_r1_table: A translation table to direct the NOE data points to the R1 data points.
351 This is used to speed up calculations by avoiding the recalculation of R1 values. eg [None,
352 None, 0, None, None, 3]
353
354 frq_labels: NMR frequency labels, eg ['600', '500']
355
356 frq: NMR frequencies in Hz, eg [600.0 * 1e6, 500.0 * 1e6]
357 """
358
359
360 if self.global_flag == 1:
361 names = [ 'num_ri',
362 'num_frq',
363 'ri_labels',
364 'remap_table',
365 'noe_r1_table',
366 'frq_labels',
367 'frq' ]
368
369
370 else:
371 names = [ 'relax_data',
372 'relax_error',
373 'num_ri',
374 'num_frq',
375 'ri_labels',
376 'remap_table',
377 'noe_r1_table',
378 'frq_labels',
379 'frq' ]
380
381 return names
382
383
384 - def delete(self, run=None, ri_label=None, frq_label=None):
385 """Function for deleting relaxation data corresponding to ri_label and frq_label."""
386
387
388 self.run = run
389 self.ri_label = ri_label
390 self.frq_label = frq_label
391
392
393 if not self.run in self.relax.data.run_names:
394 raise RelaxNoRunError, self.run
395
396
397 if not self.relax.data.res.has_key(self.run):
398 raise RelaxNoSequenceError, self.run
399
400
401 if not self.test_labels(run):
402 raise RelaxNoRiError, (self.ri_label, self.frq_label)
403
404
405 for i in xrange(len(self.relax.data.res[self.run])):
406
407 data = self.relax.data.res[self.run][i]
408
409
410 index = self.find_index(data)
411
412
413 if index == None:
414 continue
415
416
417 data.relax_data.pop(index)
418 data.relax_error.pop(index)
419
420
421 data.num_ri = data.num_ri - 1
422
423
424 data.ri_labels.pop(index)
425
426
427 data.remap_table.pop(index)
428
429
430 frq_index = data.frq_labels.index(self.frq_label)
431 if not frq_index in data.remap_table:
432
433 data.num_frq = data.num_frq - 1
434
435
436 data.frq_labels.pop(frq_index)
437
438
439 data.frq.pop(frq_index)
440
441
442 data.noe_r1_table.pop(index)
443 for j in xrange(data.num_ri):
444 if data.noe_r1_table[j] > index:
445 data.noe_r1_table[j] = data.noe_r1_table[j] - 1
446
447
448 self.relax.generic.runs.eliminate_unused_runs()
449
450
451 - def display(self, run=None, ri_label=None, frq_label=None):
473
474
476 """Function for finding the index corresponding to self.ri_label and self.frq_label."""
477
478
479 if self.global_flag == 1:
480 if not data.num_ri.has_key(self.relax):
481 return None
482 else:
483 if not hasattr(data, 'num_ri'):
484 return None
485
486
487 index = None
488
489
490 if self.global_flag == 1:
491 for j in xrange(data.num_ri[self.run]):
492 if self.ri_label == data.ri_labels[self.run][j] and self.frq_label == data.frq_labels[self.run][data.remap_table[self.run][j]]:
493 index = j
494 else:
495 for j in xrange(data.num_ri):
496 if self.ri_label == data.ri_labels[j] and self.frq_label == data.frq_labels[data.remap_table[j]]:
497 index = j
498
499
500 return index
501
502
503 - def read(self, run=None, ri_label=None, frq_label=None, frq=None, file=None, dir=None, file_data=None, num_col=0, name_col=1, data_col=2, error_col=3, sep=None):
504 """Function for reading R1, R2, or NOE relaxation data."""
505
506
507 self.run = run
508 self.ri_label = ri_label
509 self.frq_label = frq_label
510 self.frq = frq
511
512
513 if not self.run in self.relax.data.run_names:
514 raise RelaxNoRunError, self.run
515
516
517 if not self.relax.data.res.has_key(self.run):
518 raise RelaxNoSequenceError, self.run
519
520
521 if self.test_labels(run):
522 raise RelaxRiError, (self.ri_label, self.frq_label)
523
524
525 if not file_data:
526
527 file_data = self.relax.IO.extract_data(file, dir)
528
529
530 header_lines = 0
531 for i in xrange(len(file_data)):
532 try:
533 int(file_data[i][num_col])
534 except:
535 header_lines = header_lines + 1
536 else:
537 break
538
539
540 file_data = file_data[header_lines:]
541
542
543 file_data = self.relax.IO.strip(file_data)
544
545
546 for i in xrange(len(file_data)):
547 try:
548 int(file_data[i][num_col])
549 eval(file_data[i][data_col])
550 eval(file_data[i][error_col])
551 except ValueError:
552 raise RelaxError, "The relaxation data is invalid (num=" + file_data[i][num_col] + ", name=" + file_data[i][name_col] + ", data=" + file_data[i][data_col] + ", error=" + file_data[i][error_col] + ")."
553
554
555
556
557
558
559 self.global_flag = 1
560
561
562 self.data_init(self.relax.data)
563
564
565 self.update_global_data_structures()
566
567
568
569
570
571
572 self.global_flag = 0
573
574
575 index_list = []
576
577
578 for i in xrange(len(file_data)):
579
580 res_num = int(file_data[i][num_col])
581 res_name = file_data[i][name_col]
582 value = eval(file_data[i][data_col])
583 error = eval(file_data[i][error_col])
584
585
586 if value == None or error == None:
587 continue
588
589
590 index = None
591 for j in xrange(len(self.relax.data.res[self.run])):
592 if self.relax.data.res[self.run][j].num == res_num and self.relax.data.res[self.run][j].name == res_name:
593 index = j
594 break
595 if index == None:
596 raise RelaxNoResError, (res_num, res_name)
597
598
599 data = self.relax.data.res[self.run][index]
600
601
602 self.update_data_structures(data, value, error)
603
604
605 index_list.append(index)
606
607
608
609
610
611
612 for index in xrange(len(self.relax.data.res[self.run])):
613
614 data = self.relax.data.res[self.run][index]
615
616
617 if index not in index_list:
618
619 if not hasattr(data, 'relax_data'):
620 data.select = 0
621
622
624 """Function for returning the value and error corresponding to 'data_type'."""
625
626
627 self.run = run
628
629
630 self.ri_label, self.frq_label = data_type
631
632
633 value = None
634 error = None
635
636
637 index = self.find_index(self.relax.data.res[self.run][i])
638
639
640 if index != None:
641 value = self.relax.data.res[self.run][i].relax_data[index]
642 error = self.relax.data.res[self.run][i].relax_error[index]
643
644
645 return value, error
646
647
649 """Test if data corresponding to 'self.ri_label' and 'self.frq_label' currently exists."""
650
651
652 exists = 0
653
654
655 for i in xrange(len(self.relax.data.res[run])):
656
657 data = self.relax.data.res[run][i]
658
659
660 if not hasattr(data, 'num_ri'):
661 continue
662
663
664 for j in xrange(data.num_ri):
665
666 if self.ri_label == data.ri_labels[j] and self.frq_label == data.frq_labels[data.remap_table[j]]:
667 exists = 1
668
669 return exists
670
671
673 """Function for updating all relaxation data structures."""
674
675
676 self.data_init(data)
677
678
679 index = self.find_index(data)
680
681
682 if index == None:
683 data.relax_data.append(None)
684 data.relax_error.append(None)
685 data.ri_labels.append(None)
686 data.remap_table.append(None)
687 data.noe_r1_table.append(None)
688
689
690 if index == None:
691 i = len(data.relax_data) - 1
692 else:
693 i = index
694
695
696 data.relax_data[i] = value
697 data.relax_error[i] = error
698
699
700 if index == None:
701 data.num_ri = data.num_ri + 1
702
703
704 data.ri_labels[i] = self.ri_label
705
706
707 remap = len(data.frq)
708 flag = 0
709 for j in xrange(len(data.frq)):
710 if self.frq == data.frq[j]:
711 remap = j
712 flag = 1
713
714
715 data.remap_table[i] = remap
716
717
718 if not flag:
719
720 if index == None:
721 data.num_frq = data.num_frq + 1
722
723
724 data.frq_labels.append(self.frq_label)
725
726
727 data.frq.append(self.frq)
728
729
730
731 if self.ri_label == 'NOE':
732 for j in xrange(data.num_ri):
733 if data.ri_labels[j] == 'R1' and self.frq_label == data.frq_labels[data.remap_table[j]]:
734 data.noe_r1_table[data.num_ri - 1] = j
735
736
737
738 if self.ri_label == 'R1':
739 for j in xrange(data.num_ri):
740 if data.ri_labels[j] == 'NOE' and self.frq_label == data.frq_labels[data.remap_table[j]]:
741 data.noe_r1_table[j] = data.num_ri - 1
742
743
745 """Function for updating all relaxation data structures."""
746
747
748 self.data_init(self.relax.data)
749
750
751 i = len(self.relax.data.ri_labels[self.run]) - 1
752
753
754 self.relax.data.num_ri[self.run] = self.relax.data.num_ri[self.run] + 1
755
756
757 self.relax.data.ri_labels[self.run].append(self.ri_label)
758
759
760 remap = len(self.relax.data.frq[self.run])
761 flag = 0
762 for j in xrange(len(self.relax.data.frq[self.run])):
763 if self.frq == self.relax.data.frq[self.run][j]:
764 remap = j
765 flag = 1
766
767
768 self.relax.data.remap_table[self.run].append(remap)
769
770
771 if not flag:
772
773 self.relax.data.num_frq[self.run] = self.relax.data.num_frq[self.run] + 1
774
775
776 self.relax.data.frq_labels[self.run].append(self.frq_label)
777
778
779 self.relax.data.frq[self.run].append(self.frq)
780
781
782 self.relax.data.noe_r1_table[self.run].append(None)
783
784
785 if self.ri_label == 'NOE':
786 for j in xrange(self.relax.data.num_ri[self.run]):
787 if self.relax.data.ri_labels[self.run][j] == 'R1' and self.frq_label == self.relax.data.frq_labels[self.run][self.relax.data.remap_table[self.run][j]]:
788 self.relax.data.noe_r1_table[self.run][self.relax.data.num_ri[self.run] - 1] = j
789
790
791
792 if self.ri_label == 'R1':
793 for j in xrange(self.relax.data.num_ri[self.run]):
794 if self.relax.data.ri_labels[self.run][j] == 'NOE' and self.frq_label == self.relax.data.frq_labels[self.run][self.relax.data.remap_table[self.run][j]]:
795 self.relax.data.noe_r1_table[self.run][j] = self.relax.data.num_ri[self.run] - 1
796
797
798 - def write(self, run=None, ri_label=None, frq_label=None, file=None, dir=None, force=0):
799 """Function for writing relaxation data."""
800
801
802 self.run = run
803 self.ri_label = ri_label
804 self.frq_label = frq_label
805
806
807 if not self.run in self.relax.data.run_names:
808 raise RelaxNoRunError, self.run
809
810
811 if not self.relax.data.res.has_key(self.run):
812 raise RelaxNoSequenceError, self.run
813
814
815 if not self.test_labels(run):
816 raise RelaxNoRiError, (self.ri_label, self.frq_label)
817
818
819 if file == None:
820 file = self.ri_label + "." + self.frq_label + ".out"
821
822
823 relax_file = self.relax.IO.open_write_file(file, dir, force)
824
825
826 self.relax.generic.value.write_data(self.run, (self.ri_label, self.frq_label), relax_file, return_value=self.return_value)
827
828
829 relax_file.close()
830