1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 """The result creation and processing methods of the specific API for model-free analysis."""
24
25
26 from math import pi
27 from numpy import float64, array, transpose
28 from re import search
29 import sys
30
31
32 import generic_fns
33 from generic_fns import dipole_pair
34 from generic_fns.interatomic import return_interatom, return_interatom_list
35 from generic_fns.mol_res_spin import create_spin, generate_spin_id_unique, return_spin, spin_loop
36 from generic_fns import pipes
37 from relax_errors import RelaxError, RelaxInvalidDataError
38
39
40
42 """Class containing methods specific to the model-free results files."""
43
45 """Determine which relax version the results file belongs to.
46
47 @param file_data: The processed results file data.
48 @type file_data: list of lists of str
49 @keyword verbosity: A variable specifying the amount of information to print. The higher
50 the value, the greater the verbosity.
51 @type verbosity: int
52 @return: The relax version number.
53 @rtype: str
54 @raises RelaxError: If the relax version the model-free results file belongs to cannot be
55 determined.
56 """
57
58
59 if len(file_data[0]) > 9 and file_data[0][0:8] == ['Num', 'Name', 'Selected', 'Data_set', 'Nucleus', 'Model', 'Equation', 'Params']:
60 version = '1.2'
61
62
63 else:
64 raise RelaxError("Cannot determine the relax version the model-free results file belongs to.")
65
66
67 if verbosity:
68 print("relax " + version + " model-free results file.")
69
70
71 return version
72
73
75 """Fix certain parameters depending on the model type.
76
77 @param spin_line: The line of data for a single spin.
78 @type spin_line: list of str
79 @param col: The column indices.
80 @type col: dict of int
81 @keyword verbosity: A variable specifying the amount of information to print. The higher
82 the value, the greater the verbosity.
83 @type verbosity: int
84 """
85
86
87 if spin_line[col['param_set']] != 'None':
88 model_type = spin_line[col['param_set']]
89 else:
90 return
91
92
93 if model_type == 'local_tm' or model_type == 'mf':
94 diff_fixed = True
95 mf_fixed = False
96
97
98 elif model_type == 'diff':
99 diff_fixed = False
100 mf_fixed = True
101
102
103 elif model_type == 'all':
104 diff_fixed = False
105 mf_fixed = False
106
107
108 elif model_type == 'None':
109 model_type = None
110 diff_fixed = None
111 mf_fixed = None
112
113
114 if verbosity >= 2:
115 print("\nFixing parameters based on the model type.")
116 print("Model type: " + model_type)
117 print("Diffusion tensor fixed: " + repr(diff_fixed))
118 print("Model-free parameters fixed: " + repr(mf_fixed))
119
120
121 if model_type != 'local_tm' and diff_fixed != None:
122 cdp.diff_tensor.set_fixed(diff_fixed)
123
124
125 for spin, id in spin_loop(return_id=True):
126 if not spin.select:
127 continue
128
129 if mf_fixed != None:
130 spin.fixed = mf_fixed
131
132
134 """Generate the sequence.
135
136 @param spin_line: The line of data for a single spin.
137 @type spin_line: list of str
138 @param col: The column indices.
139 @type col: dict of int
140 @keyword verbosity: A variable specifying the amount of information to print. The higher
141 the value, the greater the verbosity.
142 @type verbosity: int
143 """
144
145
146 if 'num' in col:
147 mol_name = None
148 res_num = int(spin_line[col['num']])
149 res_name = spin_line[col['name']]
150 spin_num = None
151 spin_name = None
152 if col['nucleus'] < len(spin_line) and search('N', spin_line[col['nucleus']]):
153 spin_name = 'N'
154 if col['nucleus'] < len(spin_line) and search('C', spin_line[col['nucleus']]):
155 spin_name = 'C'
156
157
158 else:
159 mol_name = spin_line[col['mol_name']]
160 res_num = int(spin_line[col['res_num']])
161 res_name = spin_line[col['res_name']]
162 spin_num = int(spin_line[col['spin_num']])
163 spin_name = spin_line[col['spin_name']]
164
165
166 generic_fns.sequence.generate(mol_name, res_num, res_name, spin_num, spin_name, verbose=False)
167
168
169 spin_id = generate_spin_id_unique(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin_num, spin_name=spin_name)
170
171
172 select = bool(int(spin_line[col['select']]))
173 if select:
174 generic_fns.selection.sel_spin(spin_id)
175 else:
176 generic_fns.selection.desel_spin(spin_id)
177
178
180 """Read the model-free data for the spin.
181
182 @param spin_line: The line of data for a single spin.
183 @type spin_line: list of str
184 @param col: The column indices.
185 @type col: dict of int
186 @param data_set: The data set type, one of 'value', 'error', or 'sim_xxx' (where xxx is
187 a number).
188 @type data_set: str
189 @param spin: The spin container.
190 @type spin: SpinContainer instance
191 @param spin_id: The spin identification string.
192 @type spin_id: str
193 @keyword verbosity: A variable specifying the amount of information to print. The higher
194 the value, the greater the verbosity.
195 @type verbosity: int
196 """
197
198
199 if data_set == 'value':
200
201 model = spin_line[col['model']]
202 if model == 'None':
203 model = None
204
205
206 equation = spin_line[col['eqi']]
207 if equation == 'None':
208 equation = None
209
210
211 params = eval(spin_line[col['params']])
212
213
214 if params:
215 for i in range(len(params)):
216
217 if params[i] == 'tm':
218 params[i] = 'local_tm'
219
220
221 params[i] = params[i].lower()
222
223
224 self._model_setup(model=model, equation=equation, params=params, spin_id=spin_id)
225
226
227 model_type = spin_line[col['param_set']]
228
229
230 interatom = return_interatom_list(spin_id)[0]
231
232
233 if data_set == 'value':
234
235 try:
236 spin.s2 = float(spin_line[col['s2']]) * self.return_conversion_factor('s2')
237 except ValueError:
238 spin.s2 = None
239
240
241 try:
242 spin.s2f = float(spin_line[col['s2f']]) * self.return_conversion_factor('s2f')
243 except ValueError:
244 spin.s2f = None
245
246
247 try:
248 spin.s2s = float(spin_line[col['s2s']]) * self.return_conversion_factor('s2s')
249 except ValueError:
250 spin.s2s = None
251
252
253 try:
254 spin.local_tm = float(spin_line[col['local_tm']]) * self.return_conversion_factor('local_tm')
255 except ValueError:
256 spin.local_tm = None
257
258
259 try:
260 spin.te = float(spin_line[col['te']]) * self.return_conversion_factor('te')
261 except ValueError:
262 spin.te = None
263
264
265 try:
266 spin.tf = float(spin_line[col['tf']]) * self.return_conversion_factor('tf')
267 except ValueError:
268 spin.tf = None
269
270
271 try:
272 spin.ts = float(spin_line[col['ts']]) * self.return_conversion_factor('ts')
273 except ValueError:
274 spin.ts = None
275
276
277 try:
278 spin.rex = float(spin_line[col['rex']]) * self.return_conversion_factor('rex')
279 except ValueError:
280 spin.rex = None
281
282
283 try:
284 spin.csa = float(spin_line[col['csa']]) * self.return_conversion_factor('csa')
285 except ValueError:
286 spin.csa = None
287
288
289 if model_type == 'diff' or model_type == 'all':
290 cdp.chi2 = eval(spin_line[col['chi2']])
291 cdp.iter = eval(spin_line[col['iter']])
292 cdp.f_count = eval(spin_line[col['f_count']])
293 cdp.g_count = eval(spin_line[col['g_count']])
294 cdp.h_count = eval(spin_line[col['h_count']])
295 if spin_line[col['warn']] == 'None':
296 cdp.warning = None
297 else:
298 cdp.warning = spin_line[col['warn']].replace('_', ' ')
299
300
301 else:
302 spin.chi2 = eval(spin_line[col['chi2']])
303 spin.iter = eval(spin_line[col['iter']])
304 spin.f_count = eval(spin_line[col['f_count']])
305 spin.g_count = eval(spin_line[col['g_count']])
306 spin.h_count = eval(spin_line[col['h_count']])
307 if spin_line[col['warn']] == 'None':
308 spin.warning = None
309 else:
310 spin.warning = spin_line[col['warn']].replace('_', ' ')
311
312
313 try:
314 interatom.r = float(spin_line[col['r']]) * 1e-10
315 except ValueError:
316 interatom.r = None
317
318
319 if data_set == 'error':
320
321 try:
322 spin.s2_err = float(spin_line[col['s2']]) * self.return_conversion_factor('s2')
323 except ValueError:
324 spin.s2_err = None
325
326
327 try:
328 spin.s2f_err = float(spin_line[col['s2f']]) * self.return_conversion_factor('s2f')
329 except ValueError:
330 spin.s2f_err = None
331
332
333 try:
334 spin.s2s_err = float(spin_line[col['s2s']]) * self.return_conversion_factor('s2s')
335 except ValueError:
336 spin.s2s_err = None
337
338
339 try:
340 spin.local_tm_err = float(spin_line[col['local_tm']]) * self.return_conversion_factor('local_tm')
341 except ValueError:
342 spin.local_tm_err = None
343
344
345 try:
346 spin.te_err = float(spin_line[col['te']]) * self.return_conversion_factor('te')
347 except ValueError:
348 spin.te_err = None
349
350
351 try:
352 spin.tf_err = float(spin_line[col['tf']]) * self.return_conversion_factor('tf')
353 except ValueError:
354 spin.tf_err = None
355
356
357 try:
358 spin.ts_err = float(spin_line[col['ts']]) * self.return_conversion_factor('ts')
359 except ValueError:
360 spin.ts_err = None
361
362
363 try:
364 spin.rex_err = float(spin_line[col['rex']]) * self.return_conversion_factor('rex')
365 except ValueError:
366 spin.rex_err = None
367
368
369 try:
370 spin.csa_err = float(spin_line[col['csa']]) * self.return_conversion_factor('csa')
371 except ValueError:
372 spin.csa_err = None
373
374
375 if data_set == 'sim_0':
376
377 param_names = self.data_names(set='params', scope='spin')
378
379
380 min_names = self.data_names(set='min', scope='spin')
381
382
383 for object_name in param_names:
384
385 sim_object_name = object_name + '_sim'
386
387
388 setattr(spin, sim_object_name, [])
389
390
391 for object_name in min_names:
392
393 sim_object_name = object_name + '_sim'
394
395
396 if model_type == 'diff' or model_type == 'all':
397 setattr(cdp, sim_object_name, [])
398 object = getattr(cdp, sim_object_name)
399 object = []
400 else:
401 setattr(spin, sim_object_name, [])
402
403
404 if data_set != 'value' and data_set != 'error':
405
406 try:
407 spin.s2_sim.append(float(spin_line[col['s2']]) * self.return_conversion_factor('s2'))
408 except ValueError:
409 spin.s2_sim.append(None)
410
411
412 try:
413 spin.s2f_sim.append(float(spin_line[col['s2f']]) * self.return_conversion_factor('s2f'))
414 except ValueError:
415 spin.s2f_sim.append(None)
416
417
418 try:
419 spin.s2s_sim.append(float(spin_line[col['s2s']]) * self.return_conversion_factor('s2s'))
420 except ValueError:
421 spin.s2s_sim.append(None)
422
423
424 try:
425 spin.local_tm_sim.append(float(spin_line[col['local_tm']]) * self.return_conversion_factor('local_tm'))
426 except ValueError:
427 spin.local_tm_sim.append(None)
428
429
430 try:
431 spin.te_sim.append(float(spin_line[col['te']]) * self.return_conversion_factor('te'))
432 except ValueError:
433 spin.te_sim.append(None)
434
435
436 try:
437 spin.tf_sim.append(float(spin_line[col['tf']]) * self.return_conversion_factor('tf'))
438 except ValueError:
439 spin.tf_sim.append(None)
440
441
442 try:
443 spin.ts_sim.append(float(spin_line[col['ts']]) * self.return_conversion_factor('ts'))
444 except ValueError:
445 spin.ts_sim.append(None)
446
447
448 try:
449 spin.rex_sim.append(float(spin_line[col['rex']]) * self.return_conversion_factor('rex'))
450 except ValueError:
451 spin.rex_sim.append(None)
452
453
454 try:
455 spin.csa_sim.append(float(spin_line[col['csa']]) * self.return_conversion_factor('csa'))
456 except ValueError:
457 spin.csa_sim.append(None)
458
459
460 if model_type == 'diff' or model_type == 'all':
461
462 index = int(data_set.split('_')[1])
463
464
465 if len(cdp.chi2_sim) == index + 1:
466 return
467
468
469 cdp.chi2_sim.append(eval(spin_line[col['chi2']]))
470 cdp.iter_sim.append(eval(spin_line[col['iter']]))
471 cdp.f_count_sim.append(eval(spin_line[col['f_count']]))
472 cdp.g_count_sim.append(eval(spin_line[col['g_count']]))
473 cdp.h_count_sim.append(eval(spin_line[col['h_count']]))
474 if spin_line[col['warn']] == 'None':
475 cdp.warning_sim.append(None)
476 else:
477 cdp.warning_sim.append(spin_line[col['warn']].replace('_', ' '))
478
479
480 else:
481 spin.chi2_sim.append(eval(spin_line[col['chi2']]))
482 spin.iter_sim.append(eval(spin_line[col['iter']]))
483 spin.f_count_sim.append(eval(spin_line[col['f_count']]))
484 spin.g_count_sim.append(eval(spin_line[col['g_count']]))
485 spin.h_count_sim.append(eval(spin_line[col['h_count']]))
486 if spin_line[col['warn']] == 'None':
487 spin.warning_sim.append(None)
488 else:
489 spin.warning_sim.append(spin_line[col['warn']].replace('_', ' '))
490
491
493 """Load the relaxation data.
494
495 @param spin_line: The line of data for a single spin.
496 @type spin_line: list of str
497 @param col: The column indices.
498 @type col: dict of int
499 @param data_set: The data set type, one of 'value', 'error', or 'sim_xxx' (where xxx is
500 a number).
501 @type data_set: str
502 @param spin: The spin container.
503 @type spin: SpinContainer instance
504 @keyword verbosity: A variable specifying the amount of information to print. The higher
505 the value, the greater the verbosity.
506 @type verbosity: int
507 """
508
509
510 if data_set == 'error':
511 return
512
513
514 ri_labels = eval(spin_line[col['ri_labels']])
515 remap_table = eval(spin_line[col['remap_table']])
516 frq_labels = eval(spin_line[col['frq_labels']])
517 frq = eval(spin_line[col['frq']])
518
519
520 if not ri_labels:
521 return
522
523
524 values = []
525 errors = []
526
527
528 for i in range(len(ri_labels)):
529
530 data_col = col['frq'] + i + 1
531 error_col = col['frq'] + len(ri_labels) + i + 1
532
533
534 values.append(eval(spin_line[data_col]))
535 errors.append(eval(spin_line[error_col]))
536
537
538 sim = True
539 if data_set == 'value' or data_set == 'error':
540 sim = False
541
542
543 for i in range(len(ri_labels)):
544
545 ri_id = "%s_%s" % (ri_labels[i], frq_labels[remap_table[i]])
546
547
548 if not hasattr(cdp, 'ri_ids'):
549 cdp.ri_ids = []
550 if not hasattr(cdp, 'ri_type'):
551 cdp.ri_type = {}
552 if not hasattr(cdp, 'frq'):
553 cdp.frq = {}
554
555
556 if ri_id not in cdp.ri_ids:
557 cdp.ri_ids.append(ri_id)
558 cdp.ri_type[ri_id] = ri_labels[i]
559 cdp.frq[ri_id] = frq[remap_table[i]]
560
561
562 if sim:
563
564 if not hasattr(spin, 'ri_data_sim'):
565 spin.ri_data_sim = {}
566
567
568 spin.ri_data_sim[ri_id] = values[i]
569
570
571 else:
572
573 if not hasattr(spin, 'ri_data'):
574 spin.ri_data = {}
575 if not hasattr(spin, 'ri_data_err'):
576 spin.ri_data_err = {}
577
578
579 if values[i] != None:
580 spin.ri_data[ri_id] = values[i]
581 if errors[i] != None:
582 spin.ri_data_err[ri_id] = errors[i]
583
584
586 """Load the structure back into the current data pipe.
587
588 @param spin_line: The line of data for a single spin.
589 @type spin_line: list of str
590 @param col: The column indices.
591 @type col: dict of int
592 @keyword verbosity: A variable specifying the amount of information to print. The higher
593 the value, the greater the verbosity.
594 @type verbosity: int
595 @return: True if the structure was loaded, False otherwise.
596 @rtype: bool
597 """
598
599
600 pdb = spin_line[col['pdb']]
601
602
603 pdb_model = eval(spin_line[col['pdb_model']])
604
605
606 if not pdb == 'None':
607 generic_fns.structure.main.read_pdb(file=pdb, set_model_num=pdb_model, fail=False, verbosity=verbosity)
608 return True
609 else:
610 return False
611
612
614 """Read the relax 1.2 model-free results file.
615
616 @param file_data: The processed results file data.
617 @type file_data: list of lists of str
618 @keyword verbosity: A variable specifying the amount of information to print. The higher
619 the value, the greater the verbosity.
620 @type verbosity: int
621 """
622
623
624 header = file_data[0]
625 file_data = file_data[1:]
626
627
628 col = self._read_1_2_col_numbers(header)
629
630
631 if len(col) < 2:
632 raise RelaxInvalidDataError
633
634
635 sim_num = None
636 sims = []
637 all_select_sim = []
638 diff_data_set = False
639 diff_error_set = False
640 diff_sim_set = None
641 model_type = None
642 pdb = False
643 pdb_model = None
644 pdb_heteronuc = None
645 pdb_proton = None
646 ri_labels = None
647
648
649 if verbosity:
650 print("\nGenerating the sequence.")
651 for file_line in file_data:
652
653 data_set = file_line[col['data_set']]
654
655
656 if data_set != 'value':
657 break
658
659
660 self._generate_sequence(file_line, col, verbosity)
661
662
663 for file_line in file_data:
664
665 data_set = file_line[col['data_set']]
666
667
668 if data_set != 'value' and data_set != 'error':
669
670 sim_num = data_set.split('_')
671 try:
672 sim_num = int(sim_num[1])
673 except:
674 raise RelaxError("The simulation number '%s' is invalid." % sim_num)
675 if sim_num != None:
676 cdp.sim_number = sim_num + 1
677
678
679 for file_line in file_data:
680
681 data_set = file_line[col['data_set']]
682
683
684 if 'num' in col:
685 mol_name = None
686 res_num = int(file_line[col['num']])
687 res_name = file_line[col['name']]
688 spin_num = None
689 spin_name = None
690 if col['nucleus'] < len(file_line) and search('N', file_line[col['nucleus']]):
691 spin_name = 'N'
692 if col['nucleus'] < len(file_line) and search('C', file_line[col['nucleus']]):
693 spin_name = 'C'
694
695
696 else:
697 mol_name = file_line[col['mol_name']]
698 res_num = int(file_line[col['res_num']])
699 res_name = file_line[col['res_name']]
700 spin_num = int(file_line[col['spin_num']])
701 spin_name = file_line[col['spin_name']]
702
703
704 spin_id = generate_spin_id_unique(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_num=spin_num, spin_name=spin_name)
705
706
707 spin = return_spin(spin_id)
708
709
710 if data_set == 'value' and spin_name:
711 h_spin = create_spin(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_name='H')
712 h_spin.select = False
713 h_spin.element = 'H'
714 h_spin.isotope = '1H'
715 spin_id2 = generate_spin_id_unique(mol_name=mol_name, res_num=res_num, res_name=res_name, spin_name='H')
716 dipole_pair.define(spin_id, spin_id2, verbose=False)
717
718
719 if len(file_line) == 4:
720 continue
721
722
723 if data_set == 'value':
724 if file_line[col['nucleus']] != 'None':
725 if search('N', file_line[col['nucleus']]):
726 spin.isotope = '15N'
727 if spin.name == None:
728 spin.name = 'N'
729 elif search('C', file_line[col['nucleus']]):
730 spin.isotope = '13C'
731 if spin.name == None:
732 spin.name = 'C'
733
734
735 if data_set != 'value' and data_set != 'error':
736
737 sim_num = data_set.split('_')
738 try:
739 sim_num = int(sim_num[1])
740 except:
741 raise RelaxError("The simulation number '%s' is invalid." % sim_num)
742
743
744 if sim_num not in sims:
745
746 sims.append(sim_num)
747 all_select_sim.append([])
748
749
750 all_select_sim[-1].append(bool(file_line[col['select']]))
751
752
753 if verbosity:
754 if diff_sim_set == None:
755 print("\nLoading simulations.")
756 if sim_num != diff_sim_set:
757 print(data_set)
758
759
760 if data_set == 'value' and not diff_data_set:
761 self._read_1_2_set_diff_tensor(file_line, col, data_set, verbosity, sim_num=sim_num)
762 diff_data_set = True
763
764
765 elif data_set == 'error' and not diff_error_set:
766 self._read_1_2_set_diff_tensor(file_line, col, data_set, verbosity, sim_num=sim_num)
767 diff_error_set = True
768
769
770 elif data_set != 'value' and data_set != 'error' and sim_num != diff_sim_set:
771
772 if not hasattr(cdp.diff_tensor, '_sim_num') or cdp.diff_tensor._sim_num == None:
773 cdp.diff_tensor.set_sim_num(cdp.sim_number)
774
775 self._read_1_2_set_diff_tensor(file_line, col, data_set, verbosity, sim_num=sim_num)
776 diff_sim_set = sim_num
777
778
779 if model_type == None:
780 self._fix_params(file_line, col, verbosity)
781
782
783 if not pdb:
784 if self._load_structure(file_line, col, verbosity):
785 pdb = True
786
787
788 if data_set == 'value':
789 self._set_xh_vect(file_line, col, spin, spin_id1=spin_id, spin_id2=spin_id2, verbosity=verbosity)
790
791
792 self._load_relax_data(file_line, col, data_set, spin, verbosity)
793
794
795 self._load_model_free_data(file_line, col, data_set, spin, spin_id, verbosity)
796
797
798 if len(sims):
799
800 all_select_sim = transpose(array(all_select_sim))
801 all_select_sim = all_select_sim.tolist()
802
803
804 generic_fns.monte_carlo.setup(number=len(sims), all_select_sim=all_select_sim)
805
806
807 cdp.sim_state = False
808
809
811 """Determine the column indices from the header line.
812
813 @param header: The header line.
814 @type header: list of str
815 @return: The column indices.
816 @rtype: dictionary of int
817 """
818
819
820 col = {}
821
822
823 for i in range(len(header)):
824
825 if header[i] == 'Num':
826 col['num'] = i
827 elif header[i] == 'Name':
828 col['name'] = i
829
830
831 elif header[i] == 'Spin_id':
832 col['spin_id'] = i
833 elif header[i] == 'Selected':
834 col['select'] = i
835 elif header[i] == 'Data_set':
836 col['data_set'] = i
837 elif header[i] == 'Nucleus':
838 col['nucleus'] = i
839 elif header[i] == 'Model':
840 col['model'] = i
841 elif header[i] == 'Equation':
842 col['eqi'] = i
843 elif header[i] == 'Params':
844 col['params'] = i
845 elif header[i] == 'Param_set':
846 col['param_set'] = i
847
848
849 elif header[i] == 'S2':
850 col['s2'] = i
851 elif header[i] == 'S2f':
852 col['s2f'] = i
853 elif header[i] == 'S2s':
854 col['s2s'] = i
855 elif search('^Local_tm', header[i]):
856 col['local_tm'] = i
857 elif search('^te', header[i]):
858 col['te'] = i
859 elif search('^tf', header[i]):
860 col['tf'] = i
861 elif search('^ts', header[i]):
862 col['ts'] = i
863 elif search('^Rex', header[i]):
864 col['rex'] = i
865 elif search('^Bond_length', header[i]):
866 col['r'] = i
867 elif search('^CSA', header[i]):
868 col['csa'] = i
869
870
871 elif header[i] == 'Chi-squared':
872 col['chi2'] = i
873 elif header[i] == 'Iter':
874 col['iter'] = i
875 elif header[i] == 'f_count':
876 col['f_count'] = i
877 elif header[i] == 'g_count':
878 col['g_count'] = i
879 elif header[i] == 'h_count':
880 col['h_count'] = i
881 elif header[i] == 'Warning':
882 col['warn'] = i
883
884
885 elif header[i] == 'Diff_type':
886 col['diff_type'] = i
887 elif header[i] == 'tm_(s)':
888 col['tm'] = i
889 elif header[i] == 'Da_(1/s)':
890 col['da'] = i
891 elif header[i] == 'theta_(deg)':
892 col['theta'] = i
893 elif header[i] == 'phi_(deg)':
894 col['phi'] = i
895 elif header[i] == 'Da_(1/s)':
896 col['da'] = i
897 elif header[i] == 'Dr_(1/s)':
898 col['dr'] = i
899 elif header[i] == 'alpha_(deg)':
900 col['alpha'] = i
901 elif header[i] == 'beta_(deg)':
902 col['beta'] = i
903 elif header[i] == 'gamma_(deg)':
904 col['gamma'] = i
905
906
907 elif header[i] == 'PDB':
908 col['pdb'] = i
909 elif header[i] == 'PDB_model':
910 col['pdb_model'] = i
911 elif header[i] == 'PDB_heteronuc':
912 col['pdb_heteronuc'] = i
913 elif header[i] == 'PDB_proton':
914 col['pdb_proton'] = i
915 elif header[i] == 'XH_vector':
916 col['xh_vect'] = i
917
918
919 elif header[i] == 'Ri_labels':
920 col['ri_labels'] = i
921 elif header[i] == 'Remap_table':
922 col['remap_table'] = i
923 elif header[i] == 'Frq_labels':
924 col['frq_labels'] = i
925 elif header[i] == 'Frequencies':
926 col['frq'] = i
927
928
929 return col
930
931
933 """Set up the diffusion tensor.
934
935 @param spin_line: The line of data for a single spin.
936 @type spin_line: list of str
937 @param col: The column indices.
938 @type col: dict of int
939 @param data_set: The data set type, one of 'value', 'error', or 'sim_xxx' (where xxx is a number).
940 @type data_set: str
941 @keyword verbosity: A variable specifying the amount of information to print. The higher the value, the greater the verbosity.
942 @type verbosity: int
943 @keyword sim_num: The Monte Carlo simulation index.
944 @type sim_num: int or None
945 """
946
947
948 diff_type = spin_line[col['diff_type']]
949 if diff_type == 'None':
950 diff_type = None
951
952
953 if diff_type and data_set == 'value' and verbosity:
954 print("\nSetting the diffusion tensor.")
955 print("Diffusion type: " + diff_type)
956
957
958 if diff_type == 'sphere':
959
960 try:
961 tm = float(spin_line[col['tm']])
962 except ValueError:
963
964 if data_set != 'value' and spin_line[col['tm']] == 'None':
965 return
966
967
968 raise RelaxError("The diffusion tensor parameters are not numbers.")
969
970
971 if data_set == 'value':
972 diff_params = tm
973
974
975 elif data_set == 'error':
976 cdp.diff_tensor.set(param='tm', value=tm, category='err')
977
978
979 else:
980
981 cdp.diff_tensor.set(param='tm', value=tm, category='sim', sim_index=sim_num)
982
983
984
985 elif diff_type == 'spheroid' or diff_type == 'oblate' or diff_type == 'prolate':
986
987 try:
988 tm = float(spin_line[col['tm']])
989 Da = float(spin_line[col['da']])
990 theta = float(spin_line[col['theta']]) / 360.0 * 2.0 * pi
991 phi = float(spin_line[col['phi']]) / 360.0 * 2.0 * pi
992 except ValueError:
993
994 if data_set != 'value' and spin_line[col['tm']] == 'None':
995 return
996
997
998 raise RelaxError("The diffusion tensor parameters are not numbers.")
999
1000
1001 if data_set == 'value':
1002 diff_params = [tm, Da, theta, phi]
1003
1004
1005 elif data_set == 'error':
1006 cdp.diff_tensor.set(param='tm', value=tm, category='err')
1007 cdp.diff_tensor.set(param='Da', value=Da, category='err')
1008 cdp.diff_tensor.set(param='theta', value=theta, category='err')
1009 cdp.diff_tensor.set(param='phi', value=phi, category='err')
1010
1011
1012 else:
1013
1014 cdp.diff_tensor.set(param='tm', value=tm, category='sim', sim_index=sim_num)
1015 cdp.diff_tensor.set(param='Da', value=Da, category='sim', sim_index=sim_num)
1016 cdp.diff_tensor.set(param='theta', value=theta, category='sim', sim_index=sim_num)
1017 cdp.diff_tensor.set(param='phi', value=phi, category='sim', sim_index=sim_num)
1018
1019
1020
1021 elif diff_type == 'ellipsoid':
1022
1023 try:
1024 tm = float(spin_line[col['tm']])
1025 Da = float(spin_line[col['da']])
1026 Dr = float(spin_line[col['dr']])
1027 alpha = float(spin_line[col['alpha']]) / 360.0 * 2.0 * pi
1028 beta = float(spin_line[col['beta']]) / 360.0 * 2.0 * pi
1029 gamma = float(spin_line[col['gamma']]) / 360.0 * 2.0 * pi
1030 except ValueError:
1031
1032 if data_set != 'value' and spin_line[col['tm']] == 'None':
1033 return
1034
1035
1036 raise RelaxError("The diffusion tensor parameters are not numbers.")
1037
1038
1039 if data_set == 'value':
1040 diff_params = [tm, Da, Dr, alpha, beta, gamma]
1041
1042
1043 elif data_set == 'error':
1044 cdp.diff_tensor.set(param='tm', value=tm, category='err')
1045 cdp.diff_tensor.set(param='Da', value=Da, category='err')
1046 cdp.diff_tensor.set(param='Dr', value=Dr, category='err')
1047 cdp.diff_tensor.set(param='alpha', value=alpha, category='err')
1048 cdp.diff_tensor.set(param='beta', value=beta, category='err')
1049 cdp.diff_tensor.set(param='gamma', value=gamma, category='err')
1050
1051
1052 else:
1053
1054 cdp.diff_tensor.set(param='tm', value=tm, category='sim', sim_index=sim_num)
1055 cdp.diff_tensor.set(param='Da', value=Da, category='sim', sim_index=sim_num)
1056 cdp.diff_tensor.set(param='Dr', value=Dr, category='sim', sim_index=sim_num)
1057 cdp.diff_tensor.set(param='alpha', value=alpha, category='sim', sim_index=sim_num)
1058 cdp.diff_tensor.set(param='beta', value=beta, category='sim', sim_index=sim_num)
1059 cdp.diff_tensor.set(param='gamma', value=gamma, category='sim', sim_index=sim_num)
1060
1061
1062 if data_set == 'value' and diff_type:
1063
1064 spheroid_type = None
1065 if diff_type == 'oblate' or diff_type == 'prolate':
1066 spheroid_type = diff_type
1067
1068
1069 generic_fns.diffusion_tensor.init(params=diff_params, angle_units='rad', spheroid_type=spheroid_type)
1070
1071
1072 - def _set_xh_vect(self, spin_line, col, spin, spin_id1=None, spin_id2=None, verbosity=1):
1073 """Set the unit vectors.
1074
1075 @param spin_line: The line of data for a single spin.
1076 @type spin_line: list of str
1077 @param col: The column indices.
1078 @type col: dict of int
1079 @param spin: The spin container.
1080 @type spin: SpinContainer instance
1081 @keyword spin_id1: The ID string of the first spin.
1082 @type spin_id1: str
1083 @keyword spin_id2: The ID string of the second spin.
1084 @type spin_id2: str
1085 @keyword verbosity: A variable specifying the amount of information to print. The higher the value, the greater the verbosity.
1086 @type verbosity: int
1087 """
1088
1089
1090 interatom = return_interatom(spin_id1=spin_id1, spin_id2=spin_id2)
1091 if interatom == None:
1092 raise RelaxError("No interatomic interaction between spins '%s' and '%s' could be found." (spin_id1, spin_id2))
1093
1094
1095 vector = eval(spin_line[col['xh_vect']])
1096 if vector:
1097
1098 try:
1099 vector = array(vector, float64)
1100 except:
1101 raise RelaxError("The XH unit vector " + spin_line[col['xh_vect']] + " is invalid.")
1102
1103
1104 interatom.vector = vector
1105
1106
1108 """Read the columnar formatted model-free results file.
1109
1110 @param file_data: The processed results file data.
1111 @type file_data: list of lists of str
1112 @keyword verbosity: A variable specifying the amount of information to print. The higher
1113 the value, the greater the verbosity.
1114 @type verbosity: int
1115 """
1116
1117
1118 version = self._determine_version(file_data, verbosity)
1119
1120
1121 if version == '1.2':
1122 self._read_1_2_results(file_data, verbosity)
1123