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