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