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 from LinearAlgebra import inverse
25 from math import pi
26 from Numeric import Float64, array, identity, matrixmultiply, ones, transpose, zeros
27 from re import match, search
28 from string import replace, split
29 import sys
30
31 from base_class import Common_functions
32 from maths_fns.mf import Mf
33 from minimise.generic import generic_minimise
34
35
38 """Class containing functions specific to model-free analysis."""
39
40 self.relax = relax
41
42
44 """Function for testing if the model-free parameter values are set."""
45
46
47 data = self.relax.data.res[self.run][index]
48
49
50 if data.select == 0:
51 return
52
53
54 for j in xrange(len(data.params)):
55
56 if data.params[j] == 'tm' and data.tm == None:
57 return data.params[j]
58
59
60 elif data.params[j] == 'S2' and data.s2 == None:
61 return data.params[j]
62
63
64 elif data.params[j] == 'S2f' and data.s2f == None:
65 return data.params[j]
66
67
68 elif data.params[j] == 'S2s' and data.s2s == None:
69 return data.params[j]
70
71
72 elif data.params[j] == 'te' and data.te == None:
73 return data.params[j]
74
75
76 elif data.params[j] == 'tf' and data.tf == None:
77 return data.params[j]
78
79
80 elif data.params[j] == 'ts' and data.ts == None:
81 return data.params[j]
82
83
84 elif data.params[j] == 'Rex' and data.rex == None:
85 return data.params[j]
86
87
88 elif data.params[j] == 'r' and data.r == None:
89 return data.params[j]
90
91
92 elif data.params[j] == 'CSA' and data.csa == None:
93 return data.params[j]
94
95
97 """Function for assembling various pieces of data into a Numeric parameter array."""
98
99
100 self.param_names = []
101
102
103 if self.param_set == 'diff' or self.param_set == 'all':
104
105 if self.relax.data.diff[self.run].type == 'iso':
106 self.param_names.append('tm')
107
108
109 elif self.relax.data.diff[self.run].type == 'axial':
110 self.param_names.append('tm')
111 self.param_names.append('Da')
112 self.param_names.append('theta')
113 self.param_names.append('phi')
114
115
116 elif self.relax.data.diff[self.run].type == 'aniso':
117 self.param_names.append('tm')
118 self.param_names.append('Da')
119 self.param_names.append('Dr')
120 self.param_names.append('alpha')
121 self.param_names.append('beta')
122 self.param_names.append('gamma')
123
124
125 if self.param_set != 'diff':
126 for i in xrange(len(self.relax.data.res[self.run])):
127
128 if index != None and i != index:
129 continue
130
131
132 if not self.relax.data.res[self.run][i].select:
133 continue
134
135
136 for j in xrange(len(self.relax.data.res[self.run][i].params)):
137 self.param_names.append(self.relax.data.res[self.run][i].params[j])
138
139
141 """Function for assembling various pieces of data into a Numeric parameter array."""
142
143
144 param_vector = []
145 if param_set == None:
146 param_set = self.param_set
147
148
149 if sim_index != None and (param_set == 'diff' or param_set == 'all'):
150
151 if self.relax.data.diff[self.run].type == 'iso':
152 param_vector.append(self.relax.data.diff[self.run].tm_sim[sim_index])
153
154
155 elif self.relax.data.diff[self.run].type == 'axial':
156 param_vector.append(self.relax.data.diff[self.run].tm_sim[sim_index])
157 param_vector.append(self.relax.data.diff[self.run].Da_sim[sim_index])
158 param_vector.append(self.relax.data.diff[self.run].theta_sim[sim_index])
159 param_vector.append(self.relax.data.diff[self.run].phi_sim[sim_index])
160
161
162 elif self.relax.data.diff[self.run].type == 'aniso':
163 param_vector.append(self.relax.data.diff[self.run].tm_sim[sim_index])
164 param_vector.append(self.relax.data.diff[self.run].Da_sim[sim_index])
165 param_vector.append(self.relax.data.diff[self.run].Dr_sim[sim_index])
166 param_vector.append(self.relax.data.diff[self.run].alpha_sim[sim_index])
167 param_vector.append(self.relax.data.diff[self.run].beta_sim[sim_index])
168 param_vector.append(self.relax.data.diff[self.run].gamma_sim[sim_index])
169
170
171 elif param_set == 'diff' or param_set == 'all':
172
173 if self.relax.data.diff[self.run].type == 'iso':
174 param_vector.append(self.relax.data.diff[self.run].tm)
175
176
177 elif self.relax.data.diff[self.run].type == 'axial':
178 param_vector.append(self.relax.data.diff[self.run].tm)
179 param_vector.append(self.relax.data.diff[self.run].Da)
180 param_vector.append(self.relax.data.diff[self.run].theta)
181 param_vector.append(self.relax.data.diff[self.run].phi)
182
183
184 elif self.relax.data.diff[self.run].type == 'aniso':
185 param_vector.append(self.relax.data.diff[self.run].tm)
186 param_vector.append(self.relax.data.diff[self.run].Da)
187 param_vector.append(self.relax.data.diff[self.run].Dr)
188 param_vector.append(self.relax.data.diff[self.run].alpha)
189 param_vector.append(self.relax.data.diff[self.run].beta)
190 param_vector.append(self.relax.data.diff[self.run].gamma)
191
192
193 if param_set != 'diff':
194 for i in xrange(len(self.relax.data.res[self.run])):
195
196 if not self.relax.data.res[self.run][i].select:
197 continue
198
199
200 if (param_set == 'mf' or param_set == 'local_tm') and index != None and i != index:
201 continue
202
203
204 for j in xrange(len(self.relax.data.res[self.run][i].params)):
205
206 if self.relax.data.res[self.run][i].params[j] == 'tm':
207 if self.relax.data.res[self.run][i].tm == None:
208 param_vector.append(0.0)
209 elif sim_index != None:
210 param_vector.append(self.relax.data.res[self.run][i].tm_sim[sim_index])
211 else:
212 param_vector.append(self.relax.data.res[self.run][i].tm)
213
214
215 elif self.relax.data.res[self.run][i].params[j] == 'S2':
216 if self.relax.data.res[self.run][i].s2 == None:
217 param_vector.append(0.0)
218 elif sim_index != None:
219 param_vector.append(self.relax.data.res[self.run][i].s2_sim[sim_index])
220 else:
221 param_vector.append(self.relax.data.res[self.run][i].s2)
222
223
224 elif self.relax.data.res[self.run][i].params[j] == 'S2f':
225 if self.relax.data.res[self.run][i].s2f == None:
226 param_vector.append(0.0)
227 elif sim_index != None:
228 param_vector.append(self.relax.data.res[self.run][i].s2f_sim[sim_index])
229 else:
230 param_vector.append(self.relax.data.res[self.run][i].s2f)
231
232
233 elif self.relax.data.res[self.run][i].params[j] == 'S2s':
234 if self.relax.data.res[self.run][i].s2s == None:
235 param_vector.append(0.0)
236 elif sim_index != None:
237 param_vector.append(self.relax.data.res[self.run][i].s2s_sim[sim_index])
238 else:
239 param_vector.append(self.relax.data.res[self.run][i].s2s)
240
241
242 elif self.relax.data.res[self.run][i].params[j] == 'te':
243 if self.relax.data.res[self.run][i].te == None:
244 param_vector.append(0.0)
245 elif sim_index != None:
246 param_vector.append(self.relax.data.res[self.run][i].te_sim[sim_index])
247 else:
248 param_vector.append(self.relax.data.res[self.run][i].te)
249
250
251 elif self.relax.data.res[self.run][i].params[j] == 'tf':
252 if self.relax.data.res[self.run][i].tf == None:
253 param_vector.append(0.0)
254 elif sim_index != None:
255 param_vector.append(self.relax.data.res[self.run][i].tf_sim[sim_index])
256 else:
257 param_vector.append(self.relax.data.res[self.run][i].tf)
258
259
260 elif self.relax.data.res[self.run][i].params[j] == 'ts':
261 if self.relax.data.res[self.run][i].ts == None:
262 param_vector.append(0.0)
263 elif sim_index != None:
264 param_vector.append(self.relax.data.res[self.run][i].ts_sim[sim_index])
265 else:
266 param_vector.append(self.relax.data.res[self.run][i].ts)
267
268
269 elif self.relax.data.res[self.run][i].params[j] == 'Rex':
270 if self.relax.data.res[self.run][i].rex == None:
271 param_vector.append(0.0)
272 elif sim_index != None:
273 param_vector.append(self.relax.data.res[self.run][i].rex_sim[sim_index])
274 else:
275 param_vector.append(self.relax.data.res[self.run][i].rex)
276
277
278 elif self.relax.data.res[self.run][i].params[j] == 'r':
279 if self.relax.data.res[self.run][i].r == None:
280 param_vector.append(0.0)
281 elif sim_index != None:
282 param_vector.append(self.relax.data.res[self.run][i].r_sim[sim_index])
283 else:
284 param_vector.append(self.relax.data.res[self.run][i].r)
285
286
287 elif self.relax.data.res[self.run][i].params[j] == 'CSA':
288 if self.relax.data.res[self.run][i].csa == None:
289 param_vector.append(0.0)
290 elif sim_index != None:
291 param_vector.append(self.relax.data.res[self.run][i].csa_sim[sim_index])
292 else:
293 param_vector.append(self.relax.data.res[self.run][i].csa)
294
295
296 else:
297 raise RelaxError, "Unknown parameter."
298
299
300 return array(param_vector, Float64)
301
302
304 """Function for creating the scaling matrix."""
305
306
307 self.scaling_matrix = identity(len(self.param_vector), Float64)
308 i = 0
309
310
311 if not scaling:
312 return
313
314
315 if self.param_set == 'diff' or self.param_set == 'all':
316
317 if self.relax.data.diff[self.run].type == 'iso':
318
319 self.scaling_matrix[i, i] = 1e-9
320
321
322 i = i + 1
323
324
325 elif self.relax.data.diff[self.run].type == 'axial':
326
327 self.scaling_matrix[i, i] = 1e-9
328 self.scaling_matrix[i+1, i+1] = 1e7
329 self.scaling_matrix[i+2, i+2] = 1.0
330 self.scaling_matrix[i+3, i+3] = 1.0
331
332
333 i = i + 4
334
335
336 elif self.relax.data.diff[self.run].type == 'aniso':
337
338 self.scaling_matrix[i, i] = 1e-9
339 self.scaling_matrix[i+1, i+1] = 1e7
340 self.scaling_matrix[i+2, i+2] = 1e7
341 self.scaling_matrix[i+3, i+3] = 1.0
342 self.scaling_matrix[i+4, i+4] = 1.0
343 self.scaling_matrix[i+5, i+5] = 1.0
344
345
346 i = i + 6
347
348
349 if self.param_set != 'diff':
350
351 for j in xrange(len(self.relax.data.res[self.run])):
352
353 if not self.relax.data.res[self.run][j].select:
354 continue
355
356
357 if index != None and j != index:
358 continue
359
360
361 for k in xrange(len(self.relax.data.res[self.run][j].params)):
362
363 if self.relax.data.res[self.run][j].params[k] == 'tm':
364 self.scaling_matrix[i, i] = 1e-9
365
366
367 elif match('t', self.relax.data.res[self.run][j].params[k]):
368 self.scaling_matrix[i, i] = 1e-9
369
370
371 elif self.relax.data.res[self.run][j].params[k] == 'Rex':
372 self.scaling_matrix[i, i] = 1.0 / (2.0 * pi * self.relax.data.res[self.run][j].frq[0]) ** 2
373
374
375 elif self.relax.data.res[self.run][j].params[k] == 'r':
376 self.scaling_matrix[i, i] = 1e-10
377
378
379 elif self.relax.data.res[self.run][j].params[k] == 'CSA':
380 self.scaling_matrix[i, i] = 1e-4
381
382
383 i = i + 1
384
385
386 - def back_calc(self, run=None, index=None, ri_label=None, frq_label=None, frq=None):
387 """Back-calculation of relaxation data from the model-free parameter values."""
388
389
390 self.run = run
391
392
393 value = self.minimise(run=self.run, min_algor='back_calc', min_options=(index, ri_label, frq_label, frq))
394
395
396 return value
397
398
399 - def calculate(self, run=None, res_num=None, print_flag=1, sim_index=None):
400 """Calculation of the model-free chi-squared value."""
401
402
403 self.run = run
404
405
406 self.minimise(run=self.run, min_algor='calc', min_options=res_num, sim_index=sim_index)
407
408
409 - def copy(self, run1=None, run2=None, sim=None):
410 """Function for copying all model-free data from run1 to run2."""
411
412
413 if not run1 in self.relax.data.run_names:
414 raise RelaxNoRunError, run1
415
416
417 if not run2 in self.relax.data.run_names:
418 raise RelaxNoRunError, run2
419
420
421 function_type = self.relax.data.run_types[self.relax.data.run_names.index(run1)]
422 if function_type != 'mf':
423 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
424
425
426 function_type = self.relax.data.run_types[self.relax.data.run_names.index(run2)]
427 if function_type != 'mf':
428 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
429
430
431 if not self.relax.data.res.has_key(run1):
432 raise RelaxNoSequenceError, run1
433
434
435 if not self.relax.data.res.has_key(run2):
436 raise RelaxNoSequenceError, run2
437
438
439 names = self.data_names()
440
441
442 for i in xrange(len(self.relax.data.res[run1])):
443
444 data1 = self.relax.data.res[run1][i]
445 data2 = self.relax.data.res[run2][i]
446
447
448 for name in names:
449
450 if not sim:
451
452 if not hasattr(data1, name):
453 continue
454
455
456 setattr(data2, name, deepcopy(getattr(data1, name)))
457
458
459 else:
460
461 name = name + '_sim'
462
463
464 if not hasattr(data1, name) or not hasattr(data2, name):
465 continue
466
467
468 object1 = getattr(data1, name)
469 object2 = getattr(data2, name)
470
471
472 object2[sim] = object1[sim]
473
474
498
499
500 - def create_model(self, run=None, model=None, equation=None, params=None, res_num=None):
501 """Function to create a model-free model."""
502
503
504 self.run = run
505
506
507 if not self.run in self.relax.data.run_names:
508 raise RelaxNoRunError, self.run
509
510
511 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
512 if function_type != 'mf':
513 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
514
515
516 if not self.relax.data.res.has_key(self.run):
517 raise RelaxNoSequenceError, self.run
518
519
520 valid_types = ['mf_orig', 'mf_ext', 'mf_ext2']
521 if not equation in valid_types:
522 raise RelaxError, "The model-free equation type argument " + `equation` + " is invalid and should be one of " + `valid_types` + "."
523
524
525 s2, te, s2f, tf, s2s, ts, rex, csa, r = 0, 0, 0, 0, 0, 0, 0, 0, 0
526 for i in xrange(len(params)):
527
528 invalid_param = 0
529
530
531 if params[i] == 'S2':
532
533 if s2:
534 invalid_param = 1
535 s2 = 1
536
537
538 s2s_flag = 0
539 for j in xrange(len(params)):
540 if params[j] == 'S2s':
541 s2s_flag = 1
542 if s2s_flag:
543 invalid_param = 1
544
545
546 elif params[i] == 'te':
547
548 if equation == 'mf_ext' or te:
549 invalid_param = 1
550 te = 1
551
552
553 s2_flag = 0
554 for j in xrange(len(params)):
555 if params[j] == 'S2':
556 s2_flag = 1
557 if not s2_flag:
558 invalid_param = 1
559
560
561 elif params[i] == 'S2f':
562
563 if equation == 'mf_orig' or s2f:
564 invalid_param = 1
565 s2f = 1
566
567
568 elif params[i] == 'S2s':
569
570 if equation == 'mf_orig' or s2s:
571 invalid_param = 1
572 s2s = 1
573
574
575 elif params[i] == 'tf':
576
577 if equation == 'mf_orig' or tf:
578 invalid_param = 1
579 tf = 1
580
581
582 s2f_flag = 0
583 for j in xrange(len(params)):
584 if params[j] == 'S2f':
585 s2f_flag = 1
586 if not s2f_flag:
587 invalid_param = 1
588
589
590 elif params[i] == 'ts':
591
592 if equation == 'mf_orig' or ts:
593 invalid_param = 1
594 ts = 1
595
596
597 flag = 0
598 for j in xrange(len(params)):
599 if params[j] == 'S2' or params[j] == 'S2f':
600 flag = 1
601 if not flag:
602 invalid_param = 1
603
604
605 elif params[i] == 'Rex':
606 if rex:
607 invalid_param = 1
608 rex = 1
609
610
611 elif params[i] == 'r':
612 if r:
613 invalid_param = 1
614 r = 1
615
616
617 elif params[i] == 'CSA':
618 if csa:
619 invalid_param = 1
620 csa = 1
621
622
623 else:
624 raise RelaxError, "The parameter " + params[i] + " is not supported."
625
626
627 if invalid_param:
628 raise RelaxError, "The parameter array " + `params` + " contains an invalid combination of parameters."
629
630
631 self.model_setup(run, model, equation, params, res_num)
632
633
635 """Function for returning an initial data structure corresponding to 'name'."""
636
637
638 list_data = [ 'params' ]
639 if name in list_data:
640 return []
641
642
643 none_data = [ 'equation',
644 'model',
645 's2',
646 's2f',
647 's2s',
648 'tm',
649 'te',
650 'tf',
651 'ts',
652 'rex',
653 'r',
654 'csa',
655 'chi2',
656 'iter',
657 'f_count',
658 'g_count',
659 'h_count',
660 'warning' ]
661 if name in none_data:
662 return None
663
664
666 """Function for returning a list of names of data structures.
667
668 Description
669 ~~~~~~~~~~~
670
671 The names are as follows:
672
673 model: The model-free model name.
674
675 equation: The model-free equation type.
676
677 params: An array of the model-free parameter names associated with the model.
678
679 s2: S2.
680
681 s2f: S2f.
682
683 s2s: S2s.
684
685 tm: tm.
686
687 te: te.
688
689 tf: tf.
690
691 ts: ts.
692
693 rex: Rex.
694
695 r: Bond length.
696
697 csa: CSA value.
698
699 chi2: Chi-squared value.
700
701 iter: Iterations.
702
703 f_count: Function count.
704
705 g_count: Gradient count.
706
707 h_count: Hessian count.
708
709 warning: Minimisation warning.
710 """
711
712
713 names = []
714
715
716 if set == 'all' or set == 'generic':
717 names.append('model')
718 names.append('equation')
719 names.append('params')
720
721
722 if set == 'all' or set == 'params':
723 names.append('s2')
724 names.append('s2f')
725 names.append('s2s')
726 names.append('tm')
727 names.append('te')
728 names.append('tf')
729 names.append('ts')
730 names.append('rex')
731 names.append('r')
732 names.append('csa')
733
734
735 if set == 'all' or set == 'min':
736 names.append('chi2')
737 names.append('iter')
738 names.append('f_count')
739 names.append('g_count')
740 names.append('h_count')
741 names.append('warning')
742
743 return names
744
745
747 """
748 Model-free default values
749 ~~~~~~~~~~~~~~~~~~~~~~~~~
750
751 _______________________________________________________________________________________
752 | | | |
753 | Data type | Object name | Value |
754 |_______________________________________|______________|______________________________|
755 | | | |
756 | Bond length | r | 1.02 * 1e-10 |
757 |_______________________________________|______________|______________________________|
758 | | | |
759 | CSA | csa | -170 * 1e-6 |
760 |_______________________________________|______________|______________________________|
761 | | | |
762 | Chemical exchange relaxation | rex | 0.0 |
763 |_______________________________________|______________|______________________________|
764 | | | |
765 | Order parameters S2, S2f, and S2s | s2, s2f, s2s | 0.8 |
766 |_______________________________________|______________|______________________________|
767 | | | |
768 | Correlation time te | te | 100 * 1e-12 |
769 |_______________________________________|______________|______________________________|
770 | | | |
771 | Correlation time tf | tf | 10 * 1e-12 |
772 |_______________________________________|______________|______________________________|
773 | | | |
774 | Correlation time ts | ts | 1000 * 1e-12 |
775 |_______________________________________|______________|______________________________|
776 | | | |
777 | Local tm | tm | 10 * 1e-9 |
778 |_______________________________________|______________|______________________________|
779
780 """
781
782
783 if param == 'r':
784 return 1.02 * 1e-10
785
786
787 if param == 'CSA':
788 return -170 * 1e-6
789
790
791 if param == 'Rex':
792 return 0.0
793
794
795 if match('S2', param):
796 return 0.8
797
798
799 elif match('t', param):
800 if param == 'tf':
801 return 10.0 * 1e-12
802 elif param == 'ts':
803 return 1000.0 * 1e-12
804 elif param == 'tm':
805 return 10.0 * 1e-9
806 else:
807 return 100.0 * 1e-12
808
809
848
849
851 """Determine the type of parameter set."""
852
853
854 if not self.relax.data.res.has_key(self.run):
855 raise RelaxNoSequenceError, self.run
856
857
858 local_tm = 0
859 for i in xrange(len(self.relax.data.res[self.run])):
860
861 if not self.relax.data.res[self.run][i].select:
862 continue
863
864
865 if not hasattr(self.relax.data.res[self.run][i], 'params'):
866 continue
867
868
869 if local_tm == 0 and 'tm' in self.relax.data.res[self.run][i].params:
870 local_tm = 1
871
872
873 elif local_tm == 1 and not 'tm' in self.relax.data.res[self.run][i].params:
874 raise RelaxError, "All residues must either have a local tm parameter or not."
875
876
877 mf_all_fixed = 1
878 for i in xrange(len(self.relax.data.res[self.run])):
879
880
881
882
883
884
885 if not hasattr(self.relax.data.res[self.run][i], 'fixed'):
886 mf_all_fixed = 0
887 break
888 if not self.relax.data.res[self.run][i].fixed:
889 mf_all_fixed = 0
890 break
891
892
893 if local_tm:
894 return 'local_tm'
895
896
897 if not self.relax.data.diff.has_key(self.run):
898 return None
899
900
901 if mf_all_fixed:
902
903 if self.relax.data.diff[self.run].fixed:
904 raise RelaxError, "All parameters are fixed."
905
906 return 'diff'
907
908
909 if self.relax.data.diff[self.run].fixed:
910 return 'mf'
911
912
913 else:
914 return 'all'
915
916
918 """Function for disassembling the parameter vector."""
919
920
921 param_index = 0
922
923
924 if sim_index != None and (self.param_set == 'diff' or self.param_set == 'all'):
925
926 if self.relax.data.diff[self.run].type == 'iso':
927
928 self.relax.data.diff[self.run].tm_sim[sim_index] = self.param_vector[0]
929
930
931 param_index = param_index + 1
932
933
934 elif self.relax.data.diff[self.run].type == 'axial':
935
936 theta = self.relax.data.diff[self.run].theta
937 phi = self.relax.data.diff[self.run].phi
938
939
940 self.relax.data.diff[self.run].tm_sim[sim_index] = self.param_vector[0]
941 self.relax.data.diff[self.run].Da_sim[sim_index] = self.param_vector[1]
942 self.relax.data.diff[self.run].theta_sim[sim_index] = self.relax.generic.angles.wrap_angles(self.param_vector[2], theta - pi/2.0, theta + pi/2.0)
943 self.relax.data.diff[self.run].phi_sim[sim_index] = self.relax.generic.angles.wrap_angles(self.param_vector[3], phi - pi, phi + pi)
944
945
946 param_index = param_index + 4
947
948
949 elif self.relax.data.diff[self.run].type == 'aniso':
950
951 alpha = self.relax.data.diff[self.run].alpha
952 beta = self.relax.data.diff[self.run].beta
953 gamma = self.relax.data.diff[self.run].gamma
954
955
956 self.relax.data.diff[self.run].tm_sim[sim_index] = self.param_vector[0]
957 self.relax.data.diff[self.run].Da_sim[sim_index] = self.param_vector[1]
958 self.relax.data.diff[self.run].Dr_sim[sim_index] = self.param_vector[2]
959 self.relax.data.diff[self.run].alpha_sim[sim_index] = self.relax.generic.angles.wrap_angles(self.param_vector[3], alpha - pi, alpha + pi)
960 self.relax.data.diff[self.run].beta_sim[sim_index] = self.relax.generic.angles.wrap_angles(self.param_vector[4], beta - pi/2.0, beta + pi/2.0)
961 self.relax.data.diff[self.run].gamma_sim[sim_index] = self.relax.generic.angles.wrap_angles(self.param_vector[5], gamma - pi, gamma + pi)
962
963
964 param_index = param_index + 6
965
966
967 elif self.param_set == 'diff' or self.param_set == 'all':
968
969 if self.relax.data.diff[self.run].type == 'iso':
970
971 self.relax.data.diff[self.run].tm = self.param_vector[0]
972
973
974 param_index = param_index + 1
975
976
977 elif self.relax.data.diff[self.run].type == 'axial':
978
979 self.relax.data.diff[self.run].tm = self.param_vector[0]
980 self.relax.data.diff[self.run].Da = self.param_vector[1]
981 self.relax.data.diff[self.run].theta = self.relax.generic.angles.wrap_angles(self.param_vector[2], 0.0, pi)
982 self.relax.data.diff[self.run].phi = self.relax.generic.angles.wrap_angles(self.param_vector[3], 0.0, 2.0*pi)
983
984
985 param_index = param_index + 4
986
987
988 elif self.relax.data.diff[self.run].type == 'aniso':
989
990 self.relax.data.diff[self.run].tm = self.param_vector[0]
991 self.relax.data.diff[self.run].Da = self.param_vector[1]
992 self.relax.data.diff[self.run].Dr = self.param_vector[2]
993 self.relax.data.diff[self.run].alpha = self.relax.generic.angles.wrap_angles(self.param_vector[3], 0.0, 2.0*pi)
994 self.relax.data.diff[self.run].beta = self.relax.generic.angles.wrap_angles(self.param_vector[4], 0.0, pi)
995 self.relax.data.diff[self.run].gamma = self.relax.generic.angles.wrap_angles(self.param_vector[5], 0.0, 2.0*pi)
996
997
998 param_index = param_index + 6
999
1000
1001 if self.param_set != 'diff':
1002
1003 for i in xrange(len(self.relax.data.res[self.run])):
1004
1005 data = self.relax.data.res[self.run][i]
1006
1007
1008 if not data.select:
1009 continue
1010
1011
1012 if index != None and i != index:
1013 continue
1014
1015
1016 for j in xrange(len(data.params)):
1017
1018 if data.params[j] == 'tm':
1019 if sim_index == None:
1020 data.tm = self.param_vector[param_index]
1021 else:
1022 data.tm_sim[sim_index] = self.param_vector[param_index]
1023
1024
1025 elif data.params[j] == 'S2':
1026 if sim_index == None:
1027 data.s2 = self.param_vector[param_index]
1028 else:
1029 data.s2_sim[sim_index] = self.param_vector[param_index]
1030
1031
1032 elif data.params[j] == 'S2f':
1033 if sim_index == None:
1034 data.s2f = self.param_vector[param_index]
1035 else:
1036 data.s2f_sim[sim_index] = self.param_vector[param_index]
1037
1038
1039 elif data.params[j] == 'S2s':
1040 if sim_index == None:
1041 data.s2s = self.param_vector[param_index]
1042 else:
1043 data.s2s_sim[sim_index] = self.param_vector[param_index]
1044
1045
1046 elif data.params[j] == 'te':
1047 if sim_index == None:
1048 data.te = self.param_vector[param_index]
1049 else:
1050 data.te_sim[sim_index] = self.param_vector[param_index]
1051
1052
1053 elif data.params[j] == 'tf':
1054 if sim_index == None:
1055 data.tf = self.param_vector[param_index]
1056 else:
1057 data.tf_sim[sim_index] = self.param_vector[param_index]
1058
1059
1060 elif data.params[j] == 'ts':
1061 if sim_index == None:
1062 data.ts = self.param_vector[param_index]
1063 else:
1064 data.ts_sim[sim_index] = self.param_vector[param_index]
1065
1066
1067 elif data.params[j] == 'Rex':
1068 if sim_index == None:
1069 data.rex = self.param_vector[param_index]
1070 else:
1071 data.rex_sim[sim_index] = self.param_vector[param_index]
1072
1073
1074 elif data.params[j] == 'r':
1075 if sim_index == None:
1076 data.r = self.param_vector[param_index]
1077 else:
1078 data.r_sim[sim_index] = self.param_vector[param_index]
1079
1080
1081 elif data.params[j] == 'CSA':
1082 if sim_index == None:
1083 data.csa = self.param_vector[param_index]
1084 else:
1085 data.csa_sim[sim_index] = self.param_vector[param_index]
1086
1087
1088 else:
1089 raise RelaxError, "Unknown parameter."
1090
1091
1092 param_index = param_index + 1
1093
1094
1095 if self.param_set != 'diff':
1096
1097 for i in xrange(len(self.relax.data.res[self.run])):
1098
1099 data = self.relax.data.res[self.run][i]
1100
1101
1102 if not data.select:
1103 continue
1104
1105
1106 if index != None and i != index:
1107 continue
1108
1109
1110 if sim_index == None:
1111
1112 if 'S2' not in data.params and 'S2f' in data.params and 'S2s' in data.params:
1113 data.s2 = data.s2f * data.s2s
1114
1115
1116 if 'S2f' not in data.params and 'S2' in data.params and 'S2s' in data.params:
1117 if data.s2s == 0.0:
1118 data.s2f = 1e99
1119 else:
1120 data.s2f = data.s2 / data.s2s
1121
1122
1123 if 'S2s' not in data.params and 'S2' in data.params and 'S2f' in data.params:
1124 if data.s2f == 0.0:
1125 data.s2s = 1e99
1126 else:
1127 data.s2s = data.s2 / data.s2f
1128
1129
1130 else:
1131
1132 if 'S2' not in data.params and 'S2f' in data.params and 'S2s' in data.params:
1133 data.s2_sim[sim_index] = data.s2f_sim[sim_index] * data.s2s_sim[sim_index]
1134
1135
1136 if 'S2f' not in data.params and 'S2' in data.params and 'S2s' in data.params:
1137 if data.s2s_sim[sim_index] == 0.0:
1138 data.s2f_sim[sim_index] = 1e99
1139 else:
1140 data.s2f_sim[sim_index] = data.s2_sim[sim_index] / data.s2s_sim[sim_index]
1141
1142
1143 if 'S2s' not in data.params and 'S2' in data.params and 'S2f' in data.params:
1144 if data.s2f_sim[sim_index] == 0.0:
1145 data.s2s_sim[sim_index] = 1e99
1146 else:
1147 data.s2s_sim[sim_index] = data.s2_sim[sim_index] / data.s2f_sim[sim_index]
1148
1149
1150 - def duplicate_data(self, new_run=None, old_run=None, instance=None):
1151 """Function for duplicating data."""
1152
1153
1154 self.run = old_run
1155
1156
1157 for data_name in dir(self.relax.data):
1158
1159 if data_name == 'res':
1160 continue
1161
1162
1163 data = getattr(self.relax.data, data_name)
1164
1165
1166 if not hasattr(data, 'has_key'):
1167 continue
1168
1169
1170 if not data.has_key(old_run):
1171 continue
1172
1173
1174 if data_name != 'pdb' and data_name != 'diff' and data.has_key(new_run) and data[old_run] != data[new_run]:
1175 raise RelaxError, "The data between run " + `new_run` + " and run " + `old_run` + " is not consistent."
1176
1177
1178 if data.has_key(new_run):
1179 continue
1180
1181
1182 data[new_run] = deepcopy(data[old_run])
1183
1184
1185 self.param_set = self.determine_param_set_type()
1186
1187
1188 if self.param_set == 'mf' or self.param_set == 'local_tm':
1189
1190 if not self.relax.data.res.has_key(new_run) or not len(self.relax.data.res[new_run]):
1191
1192 self.relax.data.res.add_list(new_run)
1193
1194
1195 for i in xrange(len(self.relax.data.res[old_run])):
1196
1197 self.relax.data.res[new_run].add_item()
1198
1199
1200 self.relax.data.res[new_run][i].num = self.relax.data.res[old_run][i].num
1201 self.relax.data.res[new_run][i].name = self.relax.data.res[old_run][i].name
1202 self.relax.data.res[new_run][i].select = self.relax.data.res[old_run][i].select
1203
1204
1205 self.relax.data.res[new_run][instance] = deepcopy(self.relax.data.res[old_run][instance])
1206
1207
1208 elif self.param_set == 'diff' or self.param_set == 'all':
1209
1210 self.relax.data.res[new_run] = deepcopy(self.relax.data.res[old_run])
1211
1212
1213 - def eliminate(self, name, value, run, i, args):
1214 """
1215 Model-free model elimination rules
1216 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1217
1218 Local tm.
1219
1220 The local tm, in some cases, may exceed the value expected for a global correlation time.
1221 Generally the tm value will be stuck at the upper limit defined for the parameter. These
1222 models are eliminated using the rule:
1223
1224 tm >= c
1225
1226 The default value of c is 50 ns, although this can be overriden by supplying the value (in
1227 seconds) as the first element of the args tuple.
1228
1229
1230 Internal correlation times {te, tf, ts}.
1231
1232 These parameters may experience the same problem as the local tm in that the model fails and
1233 the parameter value is stuck at the upper limit. These parameters are constrained using the
1234 formula 'te, tf, ts <= 2.tm'. These failed models are eliminated using the rule:
1235
1236 te, tf, ts >= c.tm
1237
1238 The default value of c is 1.5. Because of round-off errors and the constraint algorithm,
1239 setting c to 2 will result in no models being eliminated as the minimised parameters will
1240 always be less than 2.tm. The value can be changed by supplying the value as the second
1241 element of the tuple.
1242
1243
1244 Arguments.
1245
1246 The 'args' argument must be a tuple of length 2, the elements of which must be numbers. For
1247 example, to eliminate models which have a local tm value greater than 25 ns and models with
1248 internal correlation times greater than 1.5 times tm, set 'args' to (25 * 1e-9, 1.5).
1249 """
1250
1251
1252 c1 = 50.0 * 1e-9
1253 c2 = 1.5
1254
1255
1256 if args != None:
1257 c1, c2 = args
1258
1259
1260 if self.param_set == 'local_tm':
1261 tm = self.relax.data.res[run][i].tm
1262 else:
1263 tm = self.relax.data.diff[run].tm
1264
1265
1266 if name == 'tm' and value >= c1:
1267 return 1
1268
1269
1270 if match('t[efs]', name) and value >= c2 * tm:
1271 return 1
1272
1273
1274 return 0
1275
1276
1278 """
1279 Model-free data type string matching patterns
1280 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1281
1282 ____________________________________________________________________________________________
1283 | | | |
1284 | Data type | Object name | Patterns |
1285 |________________________|______________|__________________________________________________|
1286 | | | |
1287 | Bond length | r | '^r$' or '[Bb]ond[ -_][Ll]ength' |
1288 |________________________|______________|__________________________________________________|
1289 | | | |
1290 | CSA | csa | '^[Cc][Ss][Aa]$' |
1291 |________________________|______________|__________________________________________________|
1292 | | | |
1293 | Chemical exchange | rex | '^[Rr]ex$' or '[Cc]emical[ -_][Ee]xchange' |
1294 |________________________|______________|__________________________________________________|
1295 | | | |
1296 | Order parameter S2 | s2 | '^[Ss]2$' |
1297 |________________________|______________|__________________________________________________|
1298 | | | |
1299 | Order parameter S2f | s2f | '^[Ss]2f$' |
1300 |________________________|______________|__________________________________________________|
1301 | | | |
1302 | Order parameter S2s | s2s | '^[Ss]2s$' |
1303 |________________________|______________|__________________________________________________|
1304 | | | |
1305 | Correlation time te | te | '^te$' |
1306 |________________________|______________|__________________________________________________|
1307 | | | |
1308 | Correlation time tf | tf | '^tf$' |
1309 |________________________|______________|__________________________________________________|
1310 | | | |
1311 | Correlation time ts | ts | '^ts$' |
1312 |________________________|______________|__________________________________________________|
1313 | | | |
1314 | Local tm | tm | '^tm$' |
1315 |________________________|______________|__________________________________________________|
1316
1317 """
1318
1319
1320 if match('^r$', name) or match('[Bb]ond[ -_][Ll]ength', name):
1321 return 'r'
1322
1323
1324 if match('^[Cc][Ss][Aa]$', name):
1325 return 'csa'
1326
1327
1328 if match('^[Rr]ex$', name) or match('[Cc]emical[ -_][Ee]xchange', name):
1329 return 'rex'
1330
1331
1332 if match('^[Ss]2$', name):
1333 return 's2'
1334
1335
1336 if match('^[Ss]2f$', name):
1337 return 's2f'
1338
1339
1340 if match('^[Ss]2s$', name):
1341 return 's2s'
1342
1343
1344 if match('^te$', name):
1345 return 'te'
1346
1347
1348 if match('^tf$', name):
1349 return 'tf'
1350
1351
1352 if match('^ts$', name):
1353 return 'ts'
1354
1355
1356 if match('^tm$', name):
1357 return 'tm'
1358
1359
1361 """Function for returning a vector of parameter names."""
1362
1363
1364 self.run = run
1365
1366
1367 if not hasattr(self.relax.data.res[self.run][i], 'relax_data') or not hasattr(self.relax.data.res[self.run][i], 'relax_error'):
1368 return
1369
1370
1371 for j in xrange(len(self.relax.data.res[self.run])):
1372
1373 if not self.relax.data.res[self.run][j].select:
1374 continue
1375
1376
1377 if not self.relax.data.res[self.run][j].model:
1378 raise RelaxNoMfModelError, self.run
1379
1380
1381 self.param_set = self.determine_param_set_type()
1382
1383
1384 if self.param_set == 'mf' or self.param_set == 'local_tm':
1385 index = i
1386 else:
1387 index = None
1388
1389
1390 self.assemble_param_names(index=index)
1391
1392
1393 return self.param_names
1394
1395
1397 """Function for returning a vector of parameter values."""
1398
1399
1400 self.run = run
1401
1402
1403 if not hasattr(self.relax.data.res[self.run][i], 'relax_data') or not hasattr(self.relax.data.res[self.run][i], 'relax_error'):
1404 return
1405
1406
1407 for j in xrange(len(self.relax.data.res[self.run])):
1408
1409 if not self.relax.data.res[self.run][j].select:
1410 continue
1411
1412
1413 if not self.relax.data.res[self.run][j].model:
1414 raise RelaxNoMfModelError, self.run
1415
1416
1417 self.param_set = self.determine_param_set_type()
1418
1419
1420 if self.param_set == 'mf' or self.param_set == 'local_tm':
1421 index = i
1422 else:
1423 index = None
1424
1425
1426 self.param_vector = self.assemble_param_vector(index=index)
1427
1428
1429 return self.param_vector
1430
1431
1432 - def grid_search(self, run, lower, upper, inc, constraints, print_flag, sim_index=None):
1433 """The grid search function."""
1434
1435
1436 self.lower = lower
1437 self.upper = upper
1438 self.inc = inc
1439
1440
1441 self.minimise(run=run, min_algor='grid', constraints=constraints, print_flag=print_flag, sim_index=sim_index)
1442
1443
1445 """The grid search setup function."""
1446
1447
1448 n = len(self.param_vector)
1449
1450
1451 if n == 0:
1452 raise RelaxError, "Cannot run a grid search on a model with zero parameters."
1453
1454
1455 if self.lower != None:
1456 if len(self.lower) != n:
1457 raise RelaxLenError, ('lower bounds', n)
1458
1459
1460 if self.upper != None:
1461 if len(self.upper) != n:
1462 raise RelaxLenError, ('upper bounds', n)
1463
1464
1465 if type(self.inc) == list:
1466 if len(self.inc) != n:
1467 raise RelaxLenError, ('increment', n)
1468 inc = self.inc
1469 elif type(self.inc) == int:
1470 temp = []
1471 for j in xrange(n):
1472 temp.append(self.inc)
1473 inc = temp
1474
1475
1476 min_options = []
1477 m = 0
1478
1479
1480 if self.param_set == 'diff' or self.param_set == 'all':
1481
1482 if self.relax.data.diff[self.run].type == 'iso':
1483 min_options.append([inc[0], 1.0 * 1e-9, 20.0 * 1e-9])
1484 m = m + 1
1485
1486
1487 if self.relax.data.diff[self.run].type == 'axial':
1488 min_options.append([inc[0], 1.0 * 1e-9, 20.0 * 1e-9])
1489 if self.relax.data.diff[self.run].axial_type == 'prolate':
1490 min_options.append([inc[1], 0.0, 1e7])
1491 elif self.relax.data.diff[self.run].axial_type == 'oblate':
1492 min_options.append([inc[1], -1e7, 0.0])
1493 else:
1494 min_options.append([inc[1], -1e7, 1e7])
1495 min_options.append([inc[2], 0.0, pi])
1496 min_options.append([inc[3], 0.0, 2 * pi])
1497 m = m + 4
1498
1499
1500 elif self.relax.data.diff[self.run].type == 'aniso':
1501 min_options.append([inc[0], 1.0 * 1e-9, 20.0 * 1e-9])
1502 min_options.append([inc[1], -1e7, 1e7])
1503 min_options.append([inc[2], -1e7, 1e7])
1504 min_options.append([inc[3], 0.0, 2 * pi])
1505 min_options.append([inc[4], 0.0, pi])
1506 min_options.append([inc[5], 0.0, 2 * pi])
1507 m = m + 6
1508
1509
1510 if self.param_set != 'diff':
1511 for i in xrange(len(self.relax.data.res[self.run])):
1512
1513 if not self.relax.data.res[self.run][i].select:
1514 continue
1515
1516
1517 if index != None and i != index:
1518 continue
1519
1520
1521 for j in xrange(len(self.relax.data.res[self.run][i].params)):
1522
1523 if self.relax.data.res[self.run][i].params[j] == 'tm':
1524 min_options.append([inc[m], 1.0 * 1e-9, 20.0 * 1e-9])
1525
1526
1527 elif match('S2', self.relax.data.res[self.run][i].params[j]):
1528 min_options.append([inc[m], 0.0, 1.0])
1529
1530
1531 elif match('t', self.relax.data.res[self.run][i].params[j]):
1532 min_options.append([inc[m], 0.0, 500.0 * 1e-12])
1533
1534
1535 elif self.relax.data.res[self.run][i].params[j] == 'Rex':
1536 min_options.append([inc[m], 0.0, 5.0 / (2.0 * pi * self.relax.data.res[self.run][i].frq[0])**2])
1537
1538
1539 elif self.relax.data.res[self.run][i].params[j] == 'r':
1540 min_options.append([inc[m], 1.0 * 1e-10, 1.05 * 1e-10])
1541
1542
1543 elif self.relax.data.res[self.run][i].params[j] == 'CSA':
1544 min_options.append([inc[m], -120 * 1e-6, -200 * 1e-6])
1545
1546
1547 else:
1548 raise RelaxError, "Unknown model-free parameter."
1549
1550
1551 m = m + 1
1552
1553
1554 if self.lower != None:
1555 for j in xrange(n):
1556 if self.lower[j] != None:
1557 min_options[j][1] = self.lower[j]
1558 if self.upper != None:
1559 for j in xrange(n):
1560 if self.upper[j] != None:
1561 min_options[j][2] = self.upper[j]
1562
1563
1564 self.grid_size = 1
1565 for i in xrange(len(min_options)):
1566 self.grid_size = self.grid_size * min_options[i][0]
1567 if type(self.grid_size) == long:
1568 raise RelaxError, "A grid search of size " + `self.grid_size` + " is too large."
1569
1570
1571 for j in xrange(len(min_options)):
1572 min_options[j][1] = min_options[j][1] / self.scaling_matrix[j, j]
1573 min_options[j][2] = min_options[j][2] / self.scaling_matrix[j, j]
1574
1575 return min_options
1576
1577
1579 """Function for setting up the model-free linear constraint matrices A and b.
1580
1581 Standard notation
1582 ~~~~~~~~~~~~~~~~~
1583
1584 The order parameter constraints are:
1585
1586 0 <= S2 <= 1
1587 0 <= S2f <= 1
1588 0 <= S2s <= 1
1589
1590 By substituting the formula S2 = S2f.S2s into the above inequalities, the additional two
1591 inequalities can be derived:
1592
1593 S2 <= S2f
1594 S2 <= S2s
1595
1596 Correlation time constraints are:
1597
1598 te >= 0
1599 tf >= 0
1600 ts >= 0
1601
1602 tf <= ts
1603
1604 te, tf, ts <= 2 * tm
1605
1606 Additional constraints used include:
1607
1608 Rex >= 0
1609 0.9e-10 <= r <= 2e-10
1610 -300e-6 <= CSA <= 0
1611
1612
1613 Rearranged notation
1614 ~~~~~~~~~~~~~~~~~~~
1615 The above ineqality constraints can be rearranged into:
1616
1617 S2 >= 0
1618 -S2 >= -1
1619 S2f >= 0
1620 -S2f >= -1
1621 S2s >= 0
1622 -S2s >= -1
1623 S2f - S2 >= 0
1624 S2s - S2 >= 0
1625 te >= 0
1626 tf >= 0
1627 ts >= 0
1628 ts - tf >= 0
1629 Rex >= 0
1630 r >= 0.9e-10
1631 -r >= -2e-10
1632 CSA >= -300e-6
1633 -CSA >= 0
1634
1635
1636 Matrix notation
1637 ~~~~~~~~~~~~~~~
1638
1639 In the notation A.x >= b, where A is an matrix of coefficients, x is an array of parameter
1640 values, and b is a vector of scalars, these inequality constraints are:
1641
1642 | 1 0 0 0 0 0 0 0 0 | | 0 |
1643 | | | |
1644 |-1 0 0 0 0 0 0 0 0 | | -1 |
1645 | | | |
1646 | 0 1 0 0 0 0 0 0 0 | | 0 |
1647 | | | |
1648 | 0 -1 0 0 0 0 0 0 0 | | -1 |
1649 | | | |
1650 | 0 0 1 0 0 0 0 0 0 | | S2 | | 0 |
1651 | | | | | |
1652 | 0 0 -1 0 0 0 0 0 0 | | S2f | | -1 |
1653 | | | | | |
1654 |-1 1 0 0 0 0 0 0 0 | | S2s | | 0 |
1655 | | | | | |
1656 |-1 0 1 0 0 0 0 0 0 | | te | | 0 |
1657 | | | | | |
1658 | 0 0 0 1 0 0 0 0 0 | . | tf | >= | 0 |
1659 | | | | | |
1660 | 0 0 0 0 1 0 0 0 0 | | ts | | 0 |
1661 | | | | | |
1662 | 0 0 0 0 0 1 0 0 0 | | Rex | | 0 |
1663 | | | | | |
1664 | 0 0 0 0 -1 1 0 0 0 | | r | | 0 |
1665 | | | | | |
1666 | 0 0 0 0 0 0 1 0 0 | | CSA | | 0 |
1667 | | | |
1668 | 0 0 0 0 0 0 0 1 0 | | 0.9e-10 |
1669 | | | |
1670 | 0 0 0 0 0 0 0 -1 0 | | -2e-10 |
1671 | | | |
1672 | 0 0 0 0 0 0 0 0 1 | | -300e-6 |
1673 | | | |
1674 | 0 0 0 0 0 0 0 0 -1 | | 0 |
1675
1676 """
1677
1678
1679 upper_time_limit = 1
1680
1681
1682 A = []
1683 b = []
1684 n = len(self.param_vector)
1685 zero_array = zeros(n, Float64)
1686 i = 0
1687 j = 0
1688
1689
1690 if self.param_set != 'mf' and self.relax.data.diff.has_key(self.run):
1691
1692 if self.relax.data.diff[self.run].type == 'iso':
1693
1694 A.append(zero_array * 0.0)
1695 A.append(zero_array * 0.0)
1696 A[j][i] = 1.0
1697 A[j+1][i] = -1.0
1698 b.append(0.0 / self.scaling_matrix[i, i])
1699 b.append(-200.0 * 1e-9 / self.scaling_matrix[i, i])
1700 i = i + 1
1701 j = j + 2
1702
1703
1704 elif self.relax.data.diff[self.run].type == 'axial':
1705
1706 A.append(zero_array * 0.0)
1707 A.append(zero_array * 0.0)
1708 A[j][i] = 1.0
1709 A[j+1][i] = -1.0
1710 b.append(0.0 / self.scaling_matrix[i, i])
1711 b.append(-200.0 * 1e-9 / self.scaling_matrix[i, i])
1712 i = i + 1
1713 j = j + 2
1714
1715
1716 if self.relax.data.diff[self.run].axial_type == 'prolate':
1717 A.append(zero_array * 0.0)
1718 A[j][i] = 1.0
1719 b.append(0.0 / self.scaling_matrix[i, i])
1720 i = i + 1
1721 j = j + 1
1722
1723
1724 i = i + 2
1725
1726
1727 elif self.relax.data.diff[self.run].axial_type == 'oblate':
1728 A.append(zero_array * 0.0)
1729 A[j][i] = -1.0
1730 b.append(0.0 / self.scaling_matrix[i, i])
1731 i = i + 1
1732 j = j + 1
1733
1734
1735 i = i + 2
1736
1737 else:
1738
1739 i = i + 3
1740
1741
1742 elif self.relax.data.diff[self.run].type == 'aniso':
1743
1744 A.append(zero_array * 0.0)
1745 A.append(zero_array * 0.0)
1746 A[j][i] = 1.0
1747 A[j+1][i] = -1.0
1748 b.append(0.0 / self.scaling_matrix[i, i])
1749 b.append(-200.0 * 1e-9 / self.scaling_matrix[i, i])
1750 i = i + 1
1751 j = j + 2
1752
1753
1754 i = i + 5
1755
1756
1757 if self.param_set != 'diff':
1758
1759 for k in xrange(len(self.relax.data.res[self.run])):
1760
1761 if not self.relax.data.res[self.run][k].select:
1762 continue
1763
1764
1765 if index != None and k != index:
1766 continue
1767
1768
1769 old_i = i
1770
1771
1772 for l in xrange(len(self.relax.data.res[self.run][k].params)):
1773
1774 if self.relax.data.res[self.run][k].params[l] == 'tm':
1775 if upper_time_limit:
1776
1777 A.append(zero_array * 0.0)
1778 A.append(zero_array * 0.0)
1779 A[j][i] = 1.0
1780 A[j+1][i] = -1.0
1781 b.append(0.0 / self.scaling_matrix[i, i])
1782 b.append(-200.0 * 1e-9 / self.scaling_matrix[i, i])
1783 j = j + 2
1784 else:
1785
1786 A.append(zero_array * 0.0)
1787 A[j][i] = 1.0
1788 b.append(0.0 / self.scaling_matrix[i, i])
1789 j = j + 1
1790
1791
1792 elif match('S2', self.relax.data.res[self.run][k].params[l]):
1793
1794 A.append(zero_array * 0.0)
1795 A.append(zero_array * 0.0)
1796 A[j][i] = 1.0
1797 A[j+1][i] = -1.0
1798 b.append(0.0 / self.scaling_matrix[i, i])
1799 b.append(-1.0 / self.scaling_matrix[i, i])
1800 j = j + 2
1801
1802
1803 if self.relax.data.res[self.run][k].params[l] == 'S2':
1804 for m in xrange(len(self.relax.data.res[self.run][k].params)):
1805 if self.relax.data.res[self.run][k].params[m] == 'S2f' or self.relax.data.res[self.run][k].params[m] == 'S2s':
1806 A.append(zero_array * 0.0)
1807 A[j][i] = -1.0
1808 A[j][old_i+m] = 1.0
1809 b.append(0.0)
1810 j = j + 1
1811
1812
1813 elif match('t[efs]', self.relax.data.res[self.run][k].params[l]):
1814
1815 A.append(zero_array * 0.0)
1816 A[j][i] = 1.0
1817 b.append(0.0 / self.scaling_matrix[i, i])
1818 j = j + 1
1819
1820
1821 if self.relax.data.res[self.run][k].params[l] == 'ts':
1822 for m in xrange(len(self.relax.data.res[self.run][k].params)):
1823 if self.relax.data.res[self.run][k].params[m] == 'tf':
1824 A.append(zero_array * 0.0)
1825 A[j][i] = 1.0
1826 A[j][old_i+m] = -1.0
1827 b.append(0.0)
1828 j = j + 1
1829
1830
1831 if upper_time_limit:
1832 if not self.relax.data.res[self.run][k].params[l] == 'tf':
1833 if self.param_set == 'mf':
1834 A.append(zero_array * 0.0)
1835 A[j][i] = -1.0
1836 b.append(-2.0 * self.relax.data.diff[self.run].tm / self.scaling_matrix[i, i])
1837 else:
1838 A.append(zero_array * 0.0)
1839 A[j][0] = 2.0
1840 A[j][i] = -1.0
1841 b.append(0.0)
1842
1843 j = j + 1
1844
1845
1846 elif self.relax.data.res[self.run][k].params[l] == 'Rex':
1847 A.append(zero_array * 0.0)
1848 A[j][i] = 1.0
1849 b.append(0.0 / self.scaling_matrix[i, i])
1850 j = j + 1
1851
1852
1853 elif self.relax.data.res[self.run][k].params[l] == 'r':
1854
1855 A.append(zero_array * 0.0)
1856 A.append(zero_array * 0.0)
1857 A[j][i] = 1.0
1858 A[j+1][i] = -1.0
1859 b.append(0.9e-10 / self.scaling_matrix[i, i])
1860 b.append(-2e-10 / self.scaling_matrix[i, i])
1861 j = j + 2
1862
1863
1864 elif self.relax.data.res[self.run][k].params[l] == 'CSA':
1865
1866 A.append(zero_array * 0.0)
1867 A.append(zero_array * 0.0)
1868 A[j][i] = 1.0
1869 A[j+1][i] = -1.0
1870 b.append(-300e-6 / self.scaling_matrix[i, i])
1871 b.append(0.0 / self.scaling_matrix[i, i])
1872 j = j + 2
1873
1874
1875 i = i + 1
1876
1877
1878 A = array(A, Float64)
1879 b = array(b, Float64)
1880
1881 return A, b
1882
1883
1885 """The function for creating bounds for the mapping function."""
1886
1887
1888 self.run = run
1889
1890
1891
1892
1893
1894 params = self.relax.data.res[run][index].params
1895
1896
1897 bounds = zeros((len(params), 2), Float64)
1898
1899
1900 for i in xrange(len(params)):
1901
1902 if match('S2', params[i]):
1903 bounds[i] = [0, 1]
1904
1905
1906 elif match('t', params[i]):
1907 bounds[i] = [0, 1e-8]
1908
1909
1910 elif params[i] == 'Rex':
1911 bounds[i] = [0, 30.0 / (2.0 * pi * self.relax.data.res[run][index].frq[0])**2]
1912
1913
1914 elif params[i] == 'r':
1915 bounds[i] = [1.0 * 1e-10, 1.1 * 1e-10]
1916
1917
1918 elif params[i] == 'CSA':
1919 bounds[i] = [-100 * 1e-6, -300 * 1e-6]
1920
1921 return bounds
1922
1923
1924 - def map_labels(self, run, index, params, bounds, swap, inc):
1925 """Function for creating labels, tick locations, and tick values for an OpenDX map."""
1926
1927
1928 labels = "{"
1929 tick_locations = []
1930 tick_values = []
1931 n = len(params)
1932 axis_incs = 5
1933 loc_inc = inc / axis_incs
1934
1935
1936 for i in xrange(n):
1937
1938 if params[swap[i]] == 'tm':
1939
1940 labels = labels + "\"" + params[swap[i]] + " (ns)\""
1941
1942
1943 vals = bounds[swap[i], 0] * 1e9
1944 val_inc = (bounds[swap[i], 1] - bounds[swap[i], 0]) / axis_incs * 1e9
1945
1946
1947 elif match('S2', params[swap[i]]):
1948
1949 labels = labels + "\"" + params[swap[i]] + "\""
1950
1951
1952 vals = bounds[swap[i], 0] * 1.0
1953 val_inc = (bounds[swap[i], 1] - bounds[swap[i], 0]) / axis_incs * 1.0
1954
1955
1956 elif match('t', params[swap[i]]):
1957
1958 labels = labels + "\"" + params[swap[i]] + " (ps)\""
1959
1960
1961 vals = bounds[swap[i], 0] * 1e12
1962 val_inc = (bounds[swap[i], 1] - bounds[swap[i], 0]) / axis_incs * 1e12
1963
1964
1965 elif params[swap[i]] == 'Rex':
1966
1967 labels = labels + "\"Rex (" + self.relax.data.res[run][index].frq_labels[0] + " MHz)\""
1968
1969
1970 vals = bounds[swap[i], 0] * (2.0 * pi * self.relax.data.res[run][index].frq[0])**2
1971 val_inc = (bounds[swap[i], 1] - bounds[swap[i], 0]) / axis_incs * (2.0 * pi * self.relax.data.res[run][index].frq[0])**2
1972
1973
1974 elif params[swap[i]] == 'r':
1975
1976 labels = labels + "\"" + params[swap[i]] + " (A)\""
1977
1978
1979 vals = bounds[swap[i], 0] * 1e-10
1980 val_inc = (bounds[swap[i], 1] - bounds[swap[i], 0]) / axis_incs * 1e-10
1981
1982
1983 elif params[swap[i]] == 'CSA':
1984
1985 labels = labels + "\"" + params[swap[i]] + " (ppm)\""
1986
1987
1988 vals = bounds[swap[i], 0] * 1e-6
1989 val_inc = (bounds[swap[i], 1] - bounds[swap[i], 0]) / axis_incs * 1e-6
1990
1991 if i < n - 1:
1992 labels = labels + " "
1993 else:
1994 labels = labels + "}"
1995
1996
1997 string = "{"
1998 val = 0.0
1999 for j in xrange(axis_incs + 1):
2000 string = string + " " + `val`
2001 val = val + loc_inc
2002 string = string + " }"
2003 tick_locations.append(string)
2004
2005
2006 string = "{"
2007 for j in xrange(axis_incs + 1):
2008 string = string + "\"" + "%.2f" % vals + "\" "
2009 vals = vals + val_inc
2010 string = string + "}"
2011 tick_values.append(string)
2012
2013 return labels, tick_locations, tick_values
2014
2015
2016 - def minimise(self, run=None, min_algor=None, min_options=None, func_tol=None, grad_tol=None, max_iterations=None, constraints=0, scaling=1, print_flag=0, sim_index=None):
2017 """Model-free minimisation.
2018
2019 Three types of parameter sets exist for which minimisation is different. These are:
2020 'mf' - Model-free parameters for single residues.
2021 'diff' - Diffusion tensor parameters.
2022 'all' - All model-free and all diffusion tensor parameters.
2023
2024 """
2025
2026
2027 self.run = run
2028 self.print_flag = print_flag
2029
2030
2031 for i in xrange(len(self.relax.data.res[self.run])):
2032
2033 if not self.relax.data.res[self.run][i].select:
2034 continue
2035
2036
2037 if not self.relax.data.res[self.run][i].model:
2038 raise RelaxNoMfModelError, self.run
2039
2040
2041 self.param_set = self.determine_param_set_type()
2042
2043
2044 if min_algor == 'back_calc' and self.param_set != 'local_tm':
2045 self.param_set = 'mf'
2046
2047
2048 if self.param_set != 'local_tm' and not self.relax.data.diff.has_key(self.run):
2049 raise RelaxNoTensorError, self.run
2050
2051
2052 if self.param_set != 'local_tm' and self.relax.data.diff[self.run].type != 'iso':
2053
2054 if not self.relax.data.pdb.has_key(self.run):
2055 raise RelaxNoPdbError, self.run
2056
2057
2058 for i in xrange(len(self.relax.data.res[self.run])):
2059
2060 if not self.relax.data.res[self.run][i].select:
2061 continue
2062
2063
2064 if not hasattr(self.relax.data.res[self.run][i], 'xh_vect'):
2065 raise RelaxNoVectorsError, self.run
2066
2067
2068 if not hasattr(self.relax.data, 'gx'):
2069 raise RelaxNucleusError
2070
2071
2072 if self.param_set == 'diff':
2073
2074 for i in xrange(len(self.relax.data.res[self.run])):
2075 unset_param = self.are_mf_params_set(i)
2076 if unset_param != None:
2077 raise RelaxNoValueError, unset_param
2078
2079
2080 if self.print_flag >= 1:
2081 if self.param_set == 'mf':
2082 print "Only the model-free parameters for single residues will be used."
2083 elif self.param_set == 'local_mf':
2084 print "Only a local tm value together with the model-free parameters for single residues will be used."
2085 elif self.param_set == 'diff':
2086 print "Only diffusion tensor parameters will be used."
2087 elif self.param_set == 'all':
2088 print "The diffusion tensor parameters together with the model-free parameters for all residues will be used."
2089
2090
2091 num_res = 0
2092 for i in xrange(len(self.relax.data.res[self.run])):
2093
2094 if not self.relax.data.res[self.run][i].select:
2095 continue
2096
2097
2098 if not hasattr(self.relax.data.res[self.run][i], 'csa') or self.relax.data.res[self.run][i].csa == None:
2099 raise RelaxNoValueError, "CSA"
2100
2101
2102 if not hasattr(self.relax.data.res[self.run][i], 'r') or self.relax.data.res[self.run][i].r == None:
2103 raise RelaxNoValueError, "bond length"
2104
2105
2106 num_res = num_res + 1
2107
2108
2109 if self.param_set == 'mf' or self.param_set == 'local_tm':
2110 num_instances = len(self.relax.data.res[self.run])
2111 num_data_sets = 1
2112 num_res = 1
2113 elif self.param_set == 'diff' or self.param_set == 'all':
2114 num_instances = 1
2115 num_data_sets = len(self.relax.data.res[self.run])
2116
2117
2118 if min_algor == 'calc' and min_options != None:
2119 num_res = 1
2120
2121
2122 if min_algor == 'back_calc':
2123 num_instances = 1
2124 num_data_sets = 0
2125 num_res = 1
2126
2127
2128 for i in xrange(num_instances):
2129
2130 if min_algor == 'back_calc':
2131 index = min_options[0]
2132 else:
2133 index = i
2134
2135
2136 if (self.param_set == 'mf' or self.param_set == 'local_tm') and not min_algor == 'back_calc':
2137
2138 if not self.relax.data.res[self.run][i].select:
2139 continue
2140
2141
2142 if not hasattr(self.relax.data.res[self.run][i], 'relax_data') or not hasattr(self.relax.data.res[self.run][i], 'relax_error'):
2143 continue
2144
2145
2146 if min_algor == 'calc' and min_options != None and min_options != self.relax.data.res[self.run][i].num:
2147 continue
2148
2149
2150 if min_algor == 'back_calc':
2151
2152 self.param_vector = self.assemble_param_vector(index=index)
2153
2154
2155 self.scaling_matrix = None
2156
2157 else:
2158
2159 self.param_vector = self.assemble_param_vector(index=index, sim_index=sim_index)
2160
2161
2162 self.assemble_scaling_matrix(index=index, scaling=scaling)
2163 self.param_vector = matrixmultiply(inverse(self.scaling_matrix), self.param_vector)
2164
2165
2166 if match('^[Gg]rid', min_algor):
2167 min_options = self.grid_search_setup(index=index)
2168
2169
2170 if match('^[Ss]et', min_algor):
2171 min_options = matrixmultiply(inverse(self.scaling_matrix), min_options)
2172
2173
2174 if constraints and min_algor != 'calc':
2175 A, b = self.linear_constraints(index=index)
2176
2177
2178 if self.print_flag >= 1:
2179
2180 if self.param_set == 'mf' or self.param_set == 'local_tm':
2181 if self.print_flag >= 2:
2182 print "\n\n"
2183 string = "Fitting to residue: " + `self.relax.data.res[self.run][index].num` + " " + self.relax.data.res[self.run][index].name
2184 print "\n\n" + string
2185 print len(string) * '~'
2186 if match('^[Gg]rid', min_algor):
2187 print "Unconstrained grid search size: " + `self.grid_size` + " (constraints may decrease this size).\n"
2188
2189
2190 self.iter_count = 0
2191 self.f_count = 0
2192 self.g_count = 0
2193 self.h_count = 0
2194
2195
2196 relax_data = []
2197 relax_error = []
2198 equations = []
2199 param_types = []
2200 param_values = None
2201 r = []
2202 csa = []
2203 num_frq = []
2204 frq = []
2205 num_ri = []
2206 remap_table = []
2207 noe_r1_table = []
2208 ri_labels = []
2209 num_params = []
2210 xh_unit_vectors = []
2211 if self.param_set == 'local_tm':
2212 mf_params = []
2213 elif self.param_set == 'diff':
2214 param_values = []
2215
2216
2217 if min_algor == 'back_calc':
2218
2219 relax_data = [0.0]
2220 relax_error = [0.000001]
2221 equations = [self.relax.data.res[self.run][index].equation]
2222 param_types = [self.relax.data.res[self.run][index].params]
2223 r = [self.relax.data.res[self.run][index].r]
2224 csa = [self.relax.data.res[self.run][index].csa]
2225 num_frq = [1]
2226 frq = [[min_options[3]]]
2227 num_ri = [1]
2228 remap_table = [[0]]
2229 noe_r1_table = [[None]]
2230 ri_labels = [[min_options[1]]]
2231 if self.param_set != 'local_tm' and self.relax.data.diff[self.run].type != 'iso':
2232 xh_unit_vectors = [self.relax.data.res[self.run][index].xh_vect]
2233 else:
2234 xh_unit_vectors = [None]
2235
2236
2237 num_params = [len(self.relax.data.res[self.run][index].params)]
2238
2239
2240 for j in xrange(num_data_sets):
2241
2242 if self.param_set == 'mf' or self.param_set == 'local_tm':
2243 seq_index = i
2244 else:
2245 seq_index = j
2246
2247
2248 data = self.relax.data.res[self.run][seq_index]
2249
2250
2251 if not data.select:
2252 continue
2253
2254
2255 if not hasattr(data, 'relax_data') or not hasattr(data, 'relax_error'):
2256 continue
2257
2258
2259 for k in xrange(len(data.relax_error)):
2260 if data.relax_error[k] == 0.0:
2261 raise RelaxError, "Zero error for residue '" + `data.num` + " " + data.name + "', minimisation not possible."
2262 elif data.relax_error[k] < 0.0:
2263 raise RelaxError, "Negative error for residue '" + `data.num` + " " + data.name + "', minimisation not possible."
2264
2265
2266 if sim_index == None:
2267 relax_data.append(data.relax_data)
2268 else:
2269 relax_data.append(data.relax_sim_data[sim_index])
2270 relax_error.append(data.relax_error)
2271 equations.append(data.equation)
2272 param_types.append(data.params)
2273 num_frq.append(data.num_frq)
2274 frq.append(data.frq)
2275 num_ri.append(data.num_ri)
2276 remap_table.append(data.remap_table)
2277 noe_r1_table.append(data.noe_r1_table)
2278 ri_labels.append(data.ri_labels)
2279 if sim_index == None:
2280 r.append(data.r)
2281 csa.append(data.csa)
2282 else:
2283 r.append(data.r_sim[sim_index])
2284 csa.append(data.csa_sim[sim_index])
2285
2286
2287 if self.param_set == 'local_tm':
2288 pass
2289
2290
2291 if self.param_set != 'local_tm' and self.relax.data.diff[self.run].type != 'iso':
2292 xh_unit_vectors.append(data.xh_vect)
2293 else:
2294 xh_unit_vectors.append(None)
2295
2296
2297 num_params.append(len(data.params))
2298
2299
2300 if self.param_set == 'diff':
2301 param_values.append(self.assemble_param_vector(param_set='mf'))
2302
2303
2304 for k in xrange(len(relax_data)):
2305 relax_data[k] = array(relax_data[k], Float64)
2306 relax_error[k] = array(relax_error[k], Float64)
2307
2308
2309 if self.param_set == 'local_tm':
2310 diff_type = 'iso'
2311 else:
2312 diff_type = self.relax.data.diff[self.run].type
2313
2314
2315 diff_params = None
2316 if self.param_set == 'mf':
2317
2318 data = self.relax.data.diff[self.run]
2319
2320
2321 if diff_type == 'iso':
2322 diff_params = [data.tm]
2323
2324
2325 elif diff_type == 'axial':
2326 diff_params = [data.tm, data.Da, data.theta, data.phi]
2327
2328
2329 elif diff_type == 'aniso':
2330 diff_params = [data.tm, data.Da, data.Dr, data.alpha, data.beta, data.gamma]
2331 elif min_algor == 'back_calc' and self.param_set == 'local_tm':
2332
2333 diff_params = [self.relax.data.res[self.run][index].tm]
2334
2335
2336
2337
2338
2339
2340 self.mf = Mf(init_params=self.param_vector, param_set=self.param_set, diff_type=diff_type, diff_params=diff_params, scaling_matrix=self.scaling_matrix, num_res=num_res, equations=equations, param_types=param_types, param_values=param_values, relax_data=relax_data, errors=relax_error, bond_length=r, csa=csa, num_frq=num_frq, frq=frq, num_ri=num_ri, remap_table=remap_table, noe_r1_table=noe_r1_table, ri_labels=ri_labels, gx=self.relax.data.gx, gh=self.relax.data.gh, g_ratio=self.relax.data.g_ratio, h_bar=self.relax.data.h_bar, mu0=self.relax.data.mu0, num_params=num_params, vectors=xh_unit_vectors)
2341
2342
2343
2344
2345
2346 if constraints and not match('^[Gg]rid', min_algor) and min_algor != 'calc':
2347 algor = min_options[0]
2348 else:
2349 algor = min_algor
2350
2351
2352
2353
2354
2355 if match('[Ll][Mm]$', algor) or match('[Ll]evenburg-[Mm]arquardt$', algor):
2356
2357 number_ri = 0
2358 for k in xrange(len(relax_error)):
2359 number_ri = number_ri + len(relax_error[k])
2360
2361
2362 lm_error = zeros(number_ri, Float64)
2363 index = 0
2364 for k in xrange(len(relax_error)):
2365 lm_error[index:index+len(relax_error[k])] = relax_error[k]
2366 index = index + len(relax_error[k])
2367
2368 min_options = min_options + (self.mf.lm_dri, lm_error)
2369
2370
2371
2372
2373
2374 if min_algor == 'calc':
2375
2376 try:
2377 self.relax.data.res[self.run][i].chi2 = self.mf.func(self.param_vector)
2378 except OverflowError:
2379 self.relax.data.res[self.run][i].chi2 = 1e200
2380
2381
2382 return
2383
2384
2385
2386
2387
2388 if min_algor == 'back_calc':
2389 return self.mf.calc_ri()
2390
2391
2392
2393
2394
2395 if constraints:
2396 results = generic_minimise(func=self.mf.func, dfunc=self.mf.dfunc, d2func=self.mf.d2func, args=(), x0=self.param_vector, min_algor=min_algor, min_options=min_options, func_tol=func_tol, grad_tol=grad_tol, maxiter=max_iterations, A=A, b=b, full_output=1, print_flag=print_flag)
2397 else:
2398 results = generic_minimise(func=self.mf.func, dfunc=self.mf.dfunc, d2func=self.mf.d2func, args=(), x0=self.param_vector, min_algor=min_algor, min_options=min_options, func_tol=func_tol, grad_tol=grad_tol, maxiter=max_iterations, full_output=1, print_flag=print_flag)
2399 if results == None:
2400 return
2401 self.param_vector, self.func, iter, fc, gc, hc, self.warning = results
2402 self.iter_count = self.iter_count + iter
2403 self.f_count = self.f_count + fc
2404 self.g_count = self.g_count + gc
2405 self.h_count = self.h_count + hc
2406
2407
2408 if scaling:
2409 self.param_vector = matrixmultiply(self.scaling_matrix, self.param_vector)
2410
2411
2412 self.disassemble_param_vector(index=index, sim_index=sim_index)
2413
2414
2415 if sim_index != None:
2416
2417 if self.param_set == 'mf' or self.param_set == 'local_tm':
2418
2419 self.relax.data.res[self.run][i].chi2_sim[sim_index] = self.func
2420
2421
2422 self.relax.data.res[self.run][i].iter_sim[sim_index] = self.iter_count
2423
2424
2425 self.relax.data.res[self.run][i].f_count_sim[sim_index] = self.f_count
2426
2427
2428 self.relax.data.res[self.run][i].g_count_sim[sim_index] = self.g_count
2429
2430
2431 self.relax.data.res[self.run][i].h_count_sim[sim_index] = self.h_count
2432
2433
2434 self.relax.data.res[self.run][i].warning_sim[sim_index] = self.warning
2435
2436
2437 elif self.param_set == 'diff' or self.param_set == 'all':
2438
2439 self.relax.data.chi2_sim[self.run][sim_index] = self.func
2440
2441
2442 self.relax.data.iter_sim[self.run][sim_index] = self.iter_count
2443
2444
2445 self.relax.data.f_count_sim[self.run][sim_index] = self.f_count
2446
2447
2448 self.relax.data.g_count_sim[self.run][sim_index] = self.g_count
2449
2450
2451 self.relax.data.h_count_sim[self.run][sim_index] = self.h_count
2452
2453
2454 self.relax.data.warning_sim[self.run][sim_index] = self.warning
2455
2456
2457 else:
2458
2459 if self.param_set == 'mf' or self.param_set == 'local_tm':
2460
2461 self.relax.data.res[self.run][i].chi2 = self.func
2462
2463
2464 self.relax.data.res[self.run][i].iter = self.iter_count
2465
2466
2467 self.relax.data.res[self.run][i].f_count = self.f_count
2468
2469
2470 self.relax.data.res[self.run][i].g_count = self.g_count
2471
2472
2473 self.relax.data.res[self.run][i].h_count = self.h_count
2474
2475
2476 self.relax.data.res[self.run][i].warning = self.warning
2477
2478
2479 elif self.param_set == 'diff' or self.param_set == 'all':
2480
2481 self.relax.data.chi2[self.run] = self.func
2482
2483
2484 self.relax.data.iter[self.run] = self.iter_count
2485
2486
2487 self.relax.data.f_count[self.run] = self.f_count
2488
2489
2490 self.relax.data.g_count[self.run] = self.g_count
2491
2492
2493 self.relax.data.h_count[self.run] = self.h_count
2494
2495
2496 self.relax.data.warning[self.run] = self.warning
2497
2498
2499 - def model_setup(self, run=None, model=None, equation=None, params=None, res_num=None):
2500 """Function for updating various data structures depending on the model selected."""
2501
2502
2503 for param in params:
2504 if param == 'tm' and self.relax.data.diff.has_key(run):
2505 raise RelaxTensorError, run
2506
2507
2508 for i in xrange(len(self.relax.data.res[run])):
2509
2510 if not self.relax.data.res[run][i].select:
2511 continue
2512
2513
2514 if res_num != None and res_num != self.relax.data.res[run][i].num:
2515 continue
2516
2517
2518 self.initialise_data(self.relax.data.res[run][i], run)
2519
2520
2521 self.relax.data.res[run][i].model = model
2522 self.relax.data.res[run][i].equation = equation
2523 self.relax.data.res[run][i].params = params
2524
2525
2526 - def model_statistics(self, run=None, instance=None, min_instances=None, num_instances=None):
2527 """Function for returning k, n, and chi2.
2528
2529 k - number of parameters.
2530 n - number of data points.
2531 chi2 - the chi-squared value.
2532 """
2533
2534
2535 self.run = run
2536
2537
2538 self.param_set = self.determine_param_set_type()
2539
2540
2541 consolidate = 0
2542 if min_instances == 1 and min_instances != num_instances:
2543 consolidate = 1
2544
2545
2546 if (self.param_set == 'mf' or self.param_set == 'local_tm') and not consolidate:
2547
2548 if not hasattr(self.relax.data.res[self.run][instance], 'relax_data'):
2549 return None, None, None
2550
2551
2552 self.param_vector = self.assemble_param_vector(index=instance)
2553 k = len(self.param_vector)
2554
2555
2556 n = len(self.relax.data.res[self.run][instance].relax_data)
2557
2558
2559 chi2 = self.relax.data.res[self.run][instance].chi2
2560
2561
2562 elif (self.param_set == 'mf' or self.param_set == 'local_tm') and consolidate:
2563
2564 k = 0
2565 n = 0
2566 chi2 = 0
2567
2568
2569 for i in xrange(len(self.relax.data.res[self.run])):
2570
2571 if not self.relax.data.res[self.run][i].select:
2572 continue
2573
2574
2575 self.param_vector = self.assemble_param_vector(index=i)
2576 k = k + len(self.param_vector)
2577
2578
2579 n = n + len(self.relax.data.res[self.run][i].relax_data)
2580
2581
2582 chi2 = chi2 + self.relax.data.res[self.run][i].chi2
2583
2584
2585 elif self.param_set == 'diff' or self.param_set == 'all':
2586
2587 self.param_vector = self.assemble_param_vector()
2588 k = len(self.param_vector)
2589
2590
2591 n = 0
2592 for i in xrange(len(self.relax.data.res[self.run])):
2593
2594 if not self.relax.data.res[self.run][i].select:
2595 continue
2596
2597 n = n + len(self.relax.data.res[self.run][i].relax_data)
2598
2599
2600 chi2 = self.relax.data.chi2[self.run]
2601
2602
2603
2604 return k, n, chi2
2605
2606
2608 """Function for returning the number of instances."""
2609
2610
2611 self.run = run
2612
2613
2614 if not self.relax.data.res.has_key(self.run):
2615 return 0
2616
2617
2618 self.param_set = self.determine_param_set_type()
2619
2620
2621 if self.param_set == 'mf' or self.param_set == 'local_tm':
2622 return len(self.relax.data.res[self.run])
2623
2624
2625 elif self.param_set == 'diff' or self.param_set == 'all':
2626 return 1
2627
2628
2630 """Function for sorting the column numbers from the columnar formatted results file."""
2631
2632
2633 self.col = {}
2634
2635
2636 for i in xrange(len(header)):
2637
2638 if header[i] == 'Num':
2639 self.col['num'] = i
2640 elif header[i] == 'Name':
2641 self.col['name'] = i
2642 elif header[i] == 'Selected':
2643 self.col['select'] = i
2644 elif header[i] == 'Data_set':
2645 self.col['data_set'] = i
2646 elif header[i] == 'Nucleus':
2647 self.col['nucleus'] = i
2648 elif header[i] == 'Model':
2649 self.col['model'] = i
2650 elif header[i] == 'Equation':
2651 self.col['eqi'] = i
2652 elif header[i] == 'Params':
2653 self.col['params'] = i
2654 elif header[i] == 'Param_set':
2655 self.col['param_set'] = i
2656
2657
2658 elif header[i] == 'S2':
2659 self.col['s2'] = i
2660 elif header[i] == 'S2f':
2661 self.col['s2f'] = i
2662 elif header[i] == 'S2s':
2663 self.col['s2s'] = i
2664 elif header[i] == 'Local_tm_(ns)':
2665 self.col['local_tm'] = i
2666 elif header[i] == 'te_(ps)':
2667 self.col['te'] = i
2668 elif header[i] == 'tf_(ps)':
2669 self.col['tf'] = i
2670 elif header[i] == 'ts_(ps)':
2671 self.col['ts'] = i
2672 elif header[i] == 'Rex_(1st_field)':
2673 self.col['rex'] = i
2674 elif header[i] == 'Bond_length_(A)':
2675 self.col['r'] = i
2676 elif header[i] == 'CSA_(ppm)':
2677 self.col['csa'] = i
2678
2679
2680 elif header[i] == 'Chi-squared':
2681 self.col['chi2'] = i
2682 elif header[i] == 'Iter':
2683 self.col['iter'] = i
2684 elif header[i] == 'f_count':
2685 self.col['f_count'] = i
2686 elif header[i] == 'g_count':
2687 self.col['g_count'] = i
2688 elif header[i] == 'h_count':
2689 self.col['h_count'] = i
2690 elif header[i] == 'Warning':
2691 self.col['warn'] = i
2692
2693
2694 elif header[i] == 'Diff_type':
2695 self.col['diff_type'] = i
2696 elif header[i] == 'tm_(s)':
2697 self.col['tm'] = i
2698 elif header[i] == 'Da_(1/s)':
2699 self.col['da'] = i
2700 elif header[i] == 'theta_(deg)':
2701 self.col['theta'] = i
2702 elif header[i] == 'phi_(deg)':
2703 self.col['phi'] = i
2704 elif header[i] == 'Da_(1/s)':
2705 self.col['da'] = i
2706 elif header[i] == 'Dr_(1/s)':
2707 self.col['dr'] = i
2708 elif header[i] == 'alpha_(deg)':
2709 self.col['alpha'] = i
2710 elif header[i] == 'beta_(deg)':
2711 self.col['beta'] = i
2712 elif header[i] == 'gamma_(deg)':
2713 self.col['gamma'] = i
2714
2715
2716 elif header[i] == 'PDB':
2717 self.col['pdb'] = i
2718 elif header[i] == 'PDB_model':
2719 self.col['pdb_model'] = i
2720 elif header[i] == 'PDB_heteronuc':
2721 self.col['pdb_heteronuc'] = i
2722 elif header[i] == 'PDB_proton':
2723 self.col['pdb_proton'] = i
2724 elif header[i] == 'XH_vector':
2725 self.col['xh_vect'] = i
2726
2727
2728 elif header[i] == 'Ri_labels':
2729 self.col['ri_labels'] = i
2730 elif header[i] == 'Remap_table':
2731 self.col['remap_table'] = i
2732 elif header[i] == 'Frq_labels':
2733 self.col['frq_labels'] = i
2734 elif header[i] == 'Frequencies':
2735 self.col['frq'] = i
2736
2737
2739 """Function for setting up the diffusion tensor from the columnar formatted results file."""
2740
2741
2742 diff_type = self.file_line[self.col['diff_type']]
2743 if diff_type == 'None':
2744 diff_type = None
2745
2746
2747 if diff_type == 'iso':
2748
2749 try:
2750 tm = float(self.file_line[self.col['tm']])
2751 except ValueError:
2752
2753 if self.data_set != 'value' and self.file_line[self.col['tm']] == 'None':
2754 return
2755
2756
2757 raise RelaxError, "The diffusion tensor parameters are not numbers."
2758
2759
2760 if self.data_set == 'value':
2761 diff_params = tm
2762
2763
2764 elif self.data_set == 'error':
2765 self.relax.data.diff[self.run].tm_err = tm
2766
2767
2768 else:
2769
2770 if not hasattr(self.relax.data.diff[self.run], 'tm_sim'):
2771 self.relax.data.diff[self.run].tm_sim = []
2772
2773
2774 self.relax.data.diff[self.run].tm_sim.append(tm)
2775
2776
2777
2778 elif diff_type == 'axial' or diff_type == 'oblate' or diff_type == 'prolate':
2779
2780 try:
2781 tm = float(self.file_line[self.col['tm']])
2782 Da = float(self.file_line[self.col['da']])
2783 theta = float(self.file_line[self.col['theta']]) / 360.0 * 2.0 * pi
2784 phi = float(self.file_line[self.col['phi']]) / 360.0 * 2.0 * pi
2785 except ValueError:
2786
2787 if self.data_set != 'value' and self.file_line[self.col['tm']] == 'None':
2788 return
2789
2790
2791 raise RelaxError, "The diffusion tensor parameters are not numbers."
2792
2793
2794 if self.data_set == 'value':
2795 diff_params = [tm, Da, theta, phi]
2796
2797
2798 elif self.data_set == 'error':
2799 self.relax.data.diff[self.run].tm_err = tm
2800 self.relax.data.diff[self.run].Da_err = Da
2801 self.relax.data.diff[self.run].theta_err = theta
2802 self.relax.data.diff[self.run].phi_err = phi
2803
2804
2805 else:
2806
2807 if not hasattr(self.relax.data.diff[self.run], 'tm_sim'):
2808 self.relax.data.diff[self.run].tm_sim = []
2809 if not hasattr(self.relax.data.diff[self.run], 'Da_sim'):
2810 self.relax.data.diff[self.run].Da_sim = []
2811 if not hasattr(self.relax.data.diff[self.run], 'theta_sim'):
2812 self.relax.data.diff[self.run].theta_sim = []
2813 if not hasattr(self.relax.data.diff[self.run], 'phi_sim'):
2814 self.relax.data.diff[self.run].phi_sim = []
2815
2816
2817 self.relax.data.diff[self.run].tm_sim.append(tm)
2818 self.relax.data.diff[self.run].Da_sim.append(Da)
2819 self.relax.data.diff[self.run].theta_sim.append(theta)
2820 self.relax.data.diff[self.run].phi_sim.append(phi)
2821
2822
2823
2824 elif diff_type == 'aniso':
2825
2826 try:
2827 tm = float(self.file_line[self.col['tm']])
2828 Da = float(self.file_line[self.col['da']])
2829 Dr = float(self.file_line[self.col['dr']])
2830 alpha = float(self.file_line[self.col['alpha']]) / 360.0 * 2.0 * pi
2831 beta = float(self.file_line[self.col['beta']]) / 360.0 * 2.0 * pi
2832 gamma = float(self.file_line[self.col['gamma']]) / 360.0 * 2.0 * pi
2833 except ValueError:
2834
2835 if self.data_set != 'value' and self.file_line[self.col['tm']] == 'None':
2836 return
2837
2838
2839 raise RelaxError, "The diffusion tensor parameters are not numbers."
2840
2841
2842 if self.data_set == 'value':
2843 diff_params = [tm, Da, Dr, alpha, beta, gamma]
2844
2845
2846 elif self.data_set == 'error':
2847 self.relax.data.diff[self.run].tm_err = tm
2848 self.relax.data.diff[self.run].Da_err = Da
2849 self.relax.data.diff[self.run].Dr_err = Dr
2850 self.relax.data.diff[self.run].alpha_err = alpha
2851 self.relax.data.diff[self.run].beta_err = beta
2852 self.relax.data.diff[self.run].gamma_err = gamma
2853
2854
2855 else:
2856
2857 if not hasattr(self.relax.data.diff[self.run], 'tm_sim'):
2858 self.relax.data.diff[self.run].tm_sim = []
2859 if not hasattr(self.relax.data.diff[self.run], 'Da_sim'):
2860 self.relax.data.diff[self.run].Da_sim = []
2861 if not hasattr(self.relax.data.diff[self.run], 'Dr_sim'):
2862 self.relax.data.diff[self.run].Dr_sim = []
2863 if not hasattr(self.relax.data.diff[self.run], 'alpha_sim'):
2864 self.relax.data.diff[self.run].alpha_sim = []
2865 if not hasattr(self.relax.data.diff[self.run], 'beta_sim'):
2866 self.relax.data.diff[self.run].beta_sim = []
2867 if not hasattr(self.relax.data.diff[self.run], 'gamma_sim'):
2868 self.relax.data.diff[self.run].gamma_sim = []
2869
2870
2871 self.relax.data.diff[self.run].tm_sim.append(tm)
2872 self.relax.data.diff[self.run].Da_sim.append(Da)
2873 self.relax.data.diff[self.run].Dr_sim.append(Dr)
2874 self.relax.data.diff[self.run].alpha_sim.append(alpha)
2875 self.relax.data.diff[self.run].beta_sim.append(beta)
2876 self.relax.data.diff[self.run].gamma_sim.append(gamma)
2877
2878
2879
2880 if self.data_set == 'value' and diff_type:
2881
2882 axial_type = None
2883 if diff_type == 'oblate' or diff_type == 'prolate':
2884 axial_type = diff_type
2885
2886
2887 self.relax.generic.diffusion_tensor.set(run=self.run, params=diff_params, angle_units='rad', axial_type=axial_type)
2888
2889
2891 """Function for generating the sequence and or returning the residue index."""
2892
2893
2894 try:
2895 self.res_num = int(self.file_line[self.col['num']])
2896 except ValueError:
2897 raise RelaxError, "The residue number " + self.file_line[self.col['num']] + " is not an integer."
2898 self.res_name = self.file_line[self.col['name']]
2899
2900
2901 res_index = None
2902 for j in xrange(len(self.relax.data.res[self.run])):
2903 if self.relax.data.res[self.run][j].num == self.res_num and self.relax.data.res[self.run][j].name == self.res_name:
2904 res_index = j
2905 break
2906 if res_index == None:
2907 raise RelaxError, "Residue " + `self.res_num` + " " + self.res_name + " cannot be found in the sequence."
2908
2909
2910 return res_index
2911
2912
2914 """Function for reading the model-free data."""
2915
2916
2917 data = self.relax.data.res[self.run][self.res_index]
2918
2919
2920 if self.data_set == 'value':
2921 model = self.file_line[self.col['model']]
2922 equation = self.file_line[self.col['eqi']]
2923 params = eval(self.file_line[self.col['params']])
2924 if model and equation and params:
2925 self.model_setup(self.run, model=model, equation=equation, params=params, res_num=self.res_num)
2926
2927
2928 if self.data_set == 'value':
2929
2930 try:
2931 data.s2 = float(self.file_line[self.col['s2']])
2932 except ValueError:
2933 data.s2 = None
2934
2935
2936 try:
2937 data.s2f = float(self.file_line[self.col['s2f']])
2938 except ValueError:
2939 data.s2f = None
2940
2941
2942 try:
2943 data.s2s = float(self.file_line[self.col['s2s']])
2944 except ValueError:
2945 data.s2s = None
2946
2947
2948 try:
2949 data.tm = float(self.file_line[self.col['local_tm']]) * 1e-9
2950 except ValueError:
2951 data.tm = None
2952
2953
2954 try:
2955 data.te = float(self.file_line[self.col['te']]) * 1e-12
2956 except ValueError:
2957 data.te = None
2958
2959
2960 try:
2961 data.tf = float(self.file_line[self.col['tf']]) * 1e-12
2962 except ValueError:
2963 data.tf = None
2964
2965
2966 try:
2967 data.ts = float(self.file_line[self.col['ts']]) * 1e-12
2968 except ValueError:
2969 data.ts = None
2970
2971
2972 try:
2973 data.rex = float(self.file_line[self.col['rex']]) / (2.0 * pi * data.frq[0])**2
2974 except:
2975 data.rex = None
2976
2977
2978 try:
2979 data.r = float(self.file_line[self.col['r']]) * 1e-10
2980 except ValueError:
2981 data.r = None
2982
2983
2984 try:
2985 data.csa = float(self.file_line[self.col['csa']]) * 1e-6
2986 except ValueError:
2987 data.csa = None
2988
2989
2990 if self.param_set == 'diff' or self.param_set == 'all':
2991 self.relax.data.chi2[self.run] = eval(self.file_line[self.col['chi2']])
2992 self.relax.data.iter[self.run] = eval(self.file_line[self.col['iter']])
2993 self.relax.data.f_count[self.run] = eval(self.file_line[self.col['f_count']])
2994 self.relax.data.g_count[self.run] = eval(self.file_line[self.col['g_count']])
2995 self.relax.data.h_count[self.run] = eval(self.file_line[self.col['h_count']])
2996 if self.file_line[self.col['warn']] == 'None':
2997 self.relax.data.warning[self.run] = None
2998 else:
2999 self.relax.data.warning[self.run] = replace(self.file_line[self.col['warn']], '_', ' ')
3000
3001
3002 else:
3003 data.chi2 = eval(self.file_line[self.col['chi2']])
3004 data.iter = eval(self.file_line[self.col['iter']])
3005 data.f_count = eval(self.file_line[self.col['f_count']])
3006 data.g_count = eval(self.file_line[self.col['g_count']])
3007 data.h_count = eval(self.file_line[self.col['h_count']])
3008 if self.file_line[self.col['warn']] == 'None':
3009 data.warning = None
3010 else:
3011 data.warning = replace(self.file_line[self.col['warn']], '_', ' ')
3012
3013
3014 if self.data_set == 'error':
3015
3016 try:
3017 data.s2_err = float(self.file_line[self.col['s2']])
3018 except ValueError:
3019 data.s2_err = None
3020
3021
3022 try:
3023 data.s2f_err = float(self.file_line[self.col['s2f']])
3024 except ValueError:
3025 data.s2f_err = None
3026
3027
3028 try:
3029 data.s2s_err = float(self.file_line[self.col['s2s']])
3030 except ValueError:
3031 data.s2s_err = None
3032
3033
3034 try:
3035 data.tm_err = float(self.file_line[self.col['local_tm']]) * 1e-9
3036 except ValueError:
3037 data.tm_err = None
3038
3039
3040 try:
3041 data.te_err = float(self.file_line[self.col['te']]) * 1e-12
3042 except ValueError:
3043 data.te_err = None
3044
3045
3046 try:
3047 data.tf_err = float(self.file_line[self.col['tf']]) * 1e-12
3048 except ValueError:
3049 data.tf_err = None
3050
3051
3052 try:
3053 data.ts_err = float(self.file_line[self.col['ts']]) * 1e-12
3054 except ValueError:
3055 data.ts_err = None
3056
3057
3058 try:
3059 data.rex_err = float(self.file_line[self.col['rex']]) / (2.0 * pi * data.frq[0])**2
3060 except:
3061 data.rex_err = None
3062
3063
3064 try:
3065 data.r_err = float(self.file_line[self.col['r']]) * 1e-10
3066 except ValueError:
3067 data.r_err = None
3068
3069
3070 try:
3071 data.csa_err = float(self.file_line[self.col['csa']]) * 1e-6
3072 except ValueError:
3073 data.csa_err = None
3074
3075
3076
3077 if self.data_set == 'sim_0':
3078
3079 param_names = self.data_names(set='params')
3080
3081
3082 min_names = self.data_names(set='min')
3083
3084
3085 for object_name in param_names:
3086
3087 sim_object_name = object_name + '_sim'
3088
3089
3090 setattr(data, sim_object_name, [])
3091
3092
3093 for object_name in min_names:
3094
3095 sim_object_name = object_name + '_sim'
3096
3097
3098 if self.param_set == 'diff' or self.param_set == 'all':
3099 setattr(self.relax.data, sim_object_name, {})
3100 object = getattr(self.relax.data, sim_object_name)
3101 object[self.run] = []
3102 else:
3103 setattr(data, sim_object_name, [])
3104
3105
3106 if self.data_set != 'value' and self.data_set != 'error':
3107
3108 try:
3109 data.s2_sim.append(float(self.file_line[self.col['s2']]))
3110 except ValueError:
3111 data.s2_sim.append(None)
3112
3113
3114 try:
3115 data.s2f_sim.append(float(self.file_line[self.col['s2f']]))
3116 except ValueError:
3117 data.s2f_sim.append(None)
3118
3119
3120 try:
3121 data.s2s_sim.append(float(self.file_line[self.col['s2s']]))
3122 except ValueError:
3123 data.s2s_sim.append(None)
3124
3125
3126 try:
3127 data.tm_sim.append(float(self.file_line[self.col['local_tm']]) * 1e-9)
3128 except ValueError:
3129 data.tm_sim.append(None)
3130
3131
3132 try:
3133 data.te_sim.append(float(self.file_line[self.col['te']]) * 1e-12)
3134 except ValueError:
3135 data.te_sim.append(None)
3136
3137
3138 try:
3139 data.tf_sim.append(float(self.file_line[self.col['tf']]) * 1e-12)
3140 except ValueError:
3141 data.tf_sim.append(None)
3142
3143
3144 try:
3145 data.ts_sim.append(float(self.file_line[self.col['ts']]) * 1e-12)
3146 except ValueError:
3147 data.ts_sim.append(None)
3148
3149
3150 try:
3151 data.rex_sim.append(float(self.file_line[self.col['rex']]) / (2.0 * pi * data.frq[0])**2)
3152 except:
3153 data.rex_sim.append(None)
3154
3155
3156 try:
3157 data.r_sim.append(float(self.file_line[self.col['r']]) * 1e-10)
3158 except ValueError:
3159 data.r_sim.append(None)
3160
3161
3162 try:
3163 data.csa_sim.append(float(self.file_line[self.col['csa']]) * 1e-6)
3164 except ValueError:
3165 data.csa_sim.append(None)
3166
3167
3168 if self.param_set == 'diff' or self.param_set == 'all':
3169 self.relax.data.chi2_sim[self.run].append(eval(self.file_line[self.col['chi2']]))
3170 self.relax.data.iter_sim[self.run].append(eval(self.file_line[self.col['iter']]))
3171 self.relax.data.f_count_sim[self.run].append(eval(self.file_line[self.col['f_count']]))
3172 self.relax.data.g_count_sim[self.run].append(eval(self.file_line[self.col['g_count']]))
3173 self.relax.data.h_count_sim[self.run].append(eval(self.file_line[self.col['h_count']]))
3174 if self.file_line[self.col['warn']] == 'None':
3175 self.relax.data.warning_sim[self.run].append(None)
3176 else:
3177 self.relax.data.warning_sim[self.run].append(replace(self.file_line[self.col['warn']], '_', ' '))
3178
3179
3180 else:
3181 data.chi2_sim.append(eval(self.file_line[self.col['chi2']]))
3182 data.iter_sim.append(eval(self.file_line[self.col['iter']]))
3183 data.f_count_sim.append(eval(self.file_line[self.col['f_count']]))
3184 data.g_count_sim.append(eval(self.file_line[self.col['g_count']]))
3185 data.h_count_sim.append(eval(self.file_line[self.col['h_count']]))
3186 if self.file_line[self.col['warn']] == 'None':
3187 data.warning_sim.append(None)
3188 else:
3189 data.warning_sim.append(replace(self.file_line[self.col['warn']], '_', ' '))
3190
3191
3193 """Function for reading the parameter set."""
3194
3195
3196 if self.file_line[self.col['param_set']] != 'None':
3197 self.param_set = self.file_line[self.col['param_set']]
3198 else:
3199 return
3200
3201
3202 if self.param_set == 'local_tm' or self.param_set == 'mf':
3203 diff_fixed = 1
3204 res_fixed = 0
3205
3206
3207 elif self.param_set == 'diff':
3208 diff_fixed = 0
3209 res_fixed = 1
3210
3211
3212 elif self.param_set == 'all':
3213 diff_fixed = 0
3214 res_fixed = 0
3215
3216
3217 elif self.param_set == 'None':
3218 self.param_set = None
3219 diff_fixed = None
3220 res_fixed = None
3221
3222
3223 if self.param_set != 'local_tm' and diff_fixed != None:
3224 self.relax.data.diff[self.run].fixed = diff_fixed
3225
3226
3227 for i in xrange(len(self.relax.data.res[self.run])):
3228 if res_fixed != None:
3229 self.relax.data.res[self.run][i].fixed = res_fixed
3230
3231
3233 """Function for reading the PDB file."""
3234
3235
3236 pdb = self.file_line[self.col['pdb']]
3237
3238
3239 pdb_model = eval(self.file_line[self.col['pdb_model']])
3240
3241
3242 if self.col.has_key('pdb_heteronuc'):
3243 pdb_heteronuc = self.file_line[self.col['pdb_heteronuc']]
3244
3245
3246 if self.col.has_key('pdb_proton'):
3247 pdb_proton = self.file_line[self.col['pdb_proton']]
3248
3249
3250 if not pdb == 'None':
3251 self.relax.generic.pdb.load(run=self.run, file=pdb, model=pdb_model, heteronuc=pdb_heteronuc, proton=pdb_proton, calc_vectors=0, fail=0, print_flag=print_flag)
3252 return 1
3253 else:
3254 return 0
3255
3256
3258 """Function for reading the relaxation data."""
3259
3260
3261 if self.data_set == 'error':
3262 return
3263
3264
3265 if not self.ri_labels:
3266 self.ri_labels = eval(self.file_line[self.col['ri_labels']])
3267 self.remap_table = eval(self.file_line[self.col['remap_table']])
3268 self.frq_labels = eval(self.file_line[self.col['frq_labels']])
3269 self.frq = eval(self.file_line[self.col['frq']])
3270
3271
3272 if self.ri_labels != eval(self.file_line[self.col['ri_labels']]) or self.remap_table != eval(self.file_line[self.col['remap_table']]) or self.frq_labels != eval(self.file_line[self.col['frq_labels']]) or self.frq != eval(self.file_line[self.col['frq']]):
3273 raise RelaxError, "The relaxation data is not consistent for all residues."
3274
3275
3276 if not self.ri_labels:
3277 return
3278
3279
3280 values = []
3281 errors = []
3282
3283
3284 for i in xrange(len(self.ri_labels)):
3285
3286 data_col = self.col['frq'] + i + 1
3287 error_col = self.col['frq'] + len(self.ri_labels) + i + 1
3288
3289
3290 values.append(eval(self.file_line[data_col]))
3291 errors.append(eval(self.file_line[error_col]))
3292
3293
3294 sim = 0
3295 if self.data_set != 'value' and self.data_set != 'error':
3296 sim = 1
3297
3298
3299 self.relax.specific.relax_data.add_residue(run=self.run, res_index=self.res_index, ri_labels=self.ri_labels, remap_table=self.remap_table, frq_labels=self.frq_labels, frq=self.frq, values=values, errors=errors, sim=sim)
3300
3301
3303 """Function for reading the results file."""
3304
3305
3306 self.run = run
3307
3308
3309 header = file_data[0]
3310 file_data = file_data[1:]
3311
3312
3313 self.read_columnar_col_numbers(header)
3314
3315
3316 if len(self.col) < 2:
3317 raise RelaxInvalidDataError
3318
3319
3320 nucleus_set = 0
3321 sim_num = None
3322 sims = []
3323 diff_data_set = 0
3324 diff_error_set = 0
3325 diff_sim_set = None
3326 self.param_set = None
3327 pdb = 0
3328 pdb_model = None
3329 pdb_heteronuc = None
3330 pdb_proton = None
3331 self.ri_labels = None
3332
3333
3334 for self.file_line in file_data:
3335
3336 self.data_set = self.file_line[self.col['data_set']]
3337
3338
3339 if self.data_set != 'value':
3340 break
3341
3342
3343 self.read_columnar_sequence()
3344
3345
3346
3347 for self.file_line in file_data:
3348
3349 self.data_set = self.file_line[self.col['data_set']]
3350
3351
3352 self.res_index = self.read_columnar_find_index()
3353
3354
3355 data = self.relax.data.res[self.run][self.res_index]
3356
3357
3358 if not data.select:
3359 continue
3360
3361
3362 if not nucleus_set:
3363 if self.file_line[self.col['nucleus']] != 'None':
3364 self.relax.generic.nuclei.set_values(self.file_line[self.col['nucleus']])
3365 nucleus_set = 1
3366
3367
3368 if self.data_set != 'value' and self.data_set != 'error':
3369
3370 sim_num = split(self.data_set, '_')
3371 try:
3372 sim_num = int(sim_num[1])
3373 except:
3374 raise RelaxError, "The simulation number '%s' is invalid." % sim_num
3375
3376
3377 if sim_num not in sims:
3378 sims.append(sim_num)
3379
3380
3381 if self.data_set == 'value' and not diff_data_set:
3382 self.read_columnar_diff_tensor()
3383 diff_data_set = 1
3384
3385
3386 elif self.data_set == 'error' and not diff_error_set:
3387 self.read_columnar_diff_tensor()
3388 diff_error_set = 1
3389
3390
3391 elif self.data_set != 'value' and self.data_set != 'error' and sim_num != diff_sim_set:
3392 self.read_columnar_diff_tensor()
3393 diff_sim_set = sim_num
3394
3395
3396 if self.param_set == None:
3397 self.read_columnar_param_set()
3398
3399
3400 if not pdb:
3401 if self.read_columnar_pdb(print_flag):
3402 pdb = 1
3403
3404
3405 if self.data_set == 'value':
3406 self.read_columnar_xh_vect()
3407
3408
3409 self.read_columnar_relax_data()
3410
3411
3412 self.read_columnar_model_free_data()
3413
3414
3415 if len(sims):
3416 self.relax.generic.monte_carlo.setup(self.run, len(sims))
3417
3418
3420 """Function for generating the sequence."""
3421
3422
3423 try:
3424 res_num = int(self.file_line[self.col['num']])
3425 except ValueError:
3426 raise RelaxError, "The residue number " + self.file_line[self.col['num']] + " is not an integer."
3427 res_name = self.file_line[self.col['name']]
3428
3429
3430 self.relax.generic.sequence.add(self.run, res_num, res_name, select=int(self.file_line[self.col['select']]))
3431
3432
3434 """Function for reading the XH unit vectors."""
3435
3436
3437 xh_vect = eval(self.file_line[self.col['xh_vect']])
3438 if xh_vect:
3439
3440 try:
3441 xh_vect = array(xh_vect, Float64)
3442 except:
3443 raise RelaxError, "The XH unit vector " + self.file_line[self.col['xh_vect']] + " is invalid."
3444
3445
3446 self.relax.generic.pdb.set_vector(run=self.run, res=self.res_index, xh_vect=xh_vect)
3447
3448
3450 """Function for removing the local tm parameter from the model-free parameters."""
3451
3452
3453 self.run = run
3454
3455
3456 if not self.run in self.relax.data.run_names:
3457 raise RelaxNoRunError, self.run
3458
3459
3460 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
3461 if function_type != 'mf':
3462 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
3463
3464
3465 if not self.relax.data.res.has_key(self.run):
3466 raise RelaxNoSequenceError, self.run
3467
3468
3469 for i in xrange(len(self.relax.data.res[self.run])):
3470
3471 data = self.relax.data.res[self.run][i]
3472
3473
3474 if not data.select:
3475 continue
3476
3477
3478 if res_num != None and res_num != data.num:
3479 continue
3480
3481
3482 if not hasattr(data, 'params') or not 'tm' in data.params:
3483 continue
3484
3485
3486 data.params.remove('tm')
3487
3488
3489 if match('^tm', data.model):
3490 data.model = data.model[1:]
3491
3492
3493 data.tm = None
3494
3495
3496 data.chi2 = None
3497 data.iter = None
3498 data.f_count = None
3499 data.g_count = None
3500 data.h_count = None
3501 data.warning = None
3502
3503
3504 self.relax.data.chi2[self.run] = None
3505 self.relax.data.iter[self.run] = None
3506 self.relax.data.f_count[self.run] = None
3507 self.relax.data.g_count[self.run] = None
3508 self.relax.data.h_count[self.run] = None
3509 self.relax.data.warning[self.run] = None
3510
3511
3513 """Function for returning the value and error corresponding to 'data_type'."""
3514
3515
3516 self.run = run
3517
3518
3519 object_name = self.get_data_name(data_type)
3520 if not object_name:
3521 raise RelaxError, "The model-free data type " + `data_type` + " does not exist."
3522 object_error = object_name + "_err"
3523
3524
3525 if hasattr(self.relax.data.res[self.run][i], object_name):
3526 value = getattr(self.relax.data.res[self.run][i], object_name)
3527 else:
3528 value = None
3529
3530
3531 if hasattr(self.relax.data.res[self.run][i], object_error):
3532 error = getattr(self.relax.data.res[self.run][i], object_error)
3533 else:
3534 error = None
3535
3536
3537 return value, error
3538
3539
3540 - def select_model(self, run=None, model=None, res_num=None):
3541 """Function for the selection of a preset model-free model."""
3542
3543
3544 self.run = run
3545
3546
3547 if not self.run in self.relax.data.run_names:
3548 raise RelaxNoRunError, self.run
3549
3550
3551 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
3552 if function_type != 'mf':
3553 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
3554
3555
3556 if not self.relax.data.res.has_key(self.run):
3557 raise RelaxNoSequenceError, self.run
3558
3559
3560
3561
3562
3563
3564 if model == 'm0':
3565 equation = 'mf_orig'
3566 params = []
3567 elif model == 'm1':
3568 equation = 'mf_orig'
3569 params = ['S2']
3570 elif model == 'm2':
3571 equation = 'mf_orig'
3572 params = ['S2', 'te']
3573 elif model == 'm3':
3574 equation = 'mf_orig'
3575 params = ['S2', 'Rex']
3576 elif model == 'm4':
3577 equation = 'mf_orig'
3578 params = ['S2', 'te', 'Rex']
3579 elif model == 'm5':
3580 equation = 'mf_ext'
3581 params = ['S2f', 'S2', 'ts']
3582 elif model == 'm6':
3583 equation = 'mf_ext'
3584 params = ['S2f', 'tf', 'S2', 'ts']
3585 elif model == 'm7':
3586 equation = 'mf_ext'
3587 params = ['S2f', 'S2', 'ts', 'Rex']
3588 elif model == 'm8':
3589 equation = 'mf_ext'
3590 params = ['S2f', 'tf', 'S2', 'ts', 'Rex']
3591 elif model == 'm9':
3592 equation = 'mf_orig'
3593 params = ['Rex']
3594
3595
3596 elif model == 'm10':
3597 equation = 'mf_orig'
3598 params = ['CSA']
3599 elif model == 'm11':
3600 equation = 'mf_orig'
3601 params = ['CSA', 'S2']
3602 elif model == 'm12':
3603 equation = 'mf_orig'
3604 params = ['CSA', 'S2', 'te']
3605 elif model == 'm13':
3606 equation = 'mf_orig'
3607 params = ['CSA', 'S2', 'Rex']
3608 elif model == 'm14':
3609 equation = 'mf_orig'
3610 params = ['CSA', 'S2', 'te', 'Rex']
3611 elif model == 'm15':
3612 equation = 'mf_ext'
3613 params = ['CSA', 'S2f', 'S2', 'ts']
3614 elif model == 'm16':
3615 equation = 'mf_ext'
3616 params = ['CSA', 'S2f', 'tf', 'S2', 'ts']
3617 elif model == 'm17':
3618 equation = 'mf_ext'
3619 params = ['CSA', 'S2f', 'S2', 'ts', 'Rex']
3620 elif model == 'm18':
3621 equation = 'mf_ext'
3622 params = ['CSA', 'S2f', 'tf', 'S2', 'ts', 'Rex']
3623 elif model == 'm19':
3624 equation = 'mf_orig'
3625 params = ['CSA', 'Rex']
3626
3627
3628 elif model == 'm20':
3629 equation = 'mf_orig'
3630 params = ['r']
3631 elif model == 'm21':
3632 equation = 'mf_orig'
3633 params = ['r', 'S2']
3634 elif model == 'm22':
3635 equation = 'mf_orig'
3636 params = ['r', 'S2', 'te']
3637 elif model == 'm23':
3638 equation = 'mf_orig'
3639 params = ['r', 'S2', 'Rex']
3640 elif model == 'm24':
3641 equation = 'mf_orig'
3642 params = ['r', 'S2', 'te', 'Rex']
3643 elif model == 'm25':
3644 equation = 'mf_ext'
3645 params = ['r', 'S2f', 'S2', 'ts']
3646 elif model == 'm26':
3647 equation = 'mf_ext'
3648 params = ['r', 'S2f', 'tf', 'S2', 'ts']
3649 elif model == 'm27':
3650 equation = 'mf_ext'
3651 params = ['r', 'S2f', 'S2', 'ts', 'Rex']
3652 elif model == 'm28':
3653 equation = 'mf_ext'
3654 params = ['r', 'S2f', 'tf', 'S2', 'ts', 'Rex']
3655 elif model == 'm29':
3656 equation = 'mf_orig'
3657 params = ['r', 'Rex']
3658
3659
3660 elif model == 'm30':
3661 equation = 'mf_orig'
3662 params = ['r', 'CSA']
3663 elif model == 'm31':
3664 equation = 'mf_orig'
3665 params = ['r', 'CSA', 'S2']
3666 elif model == 'm32':
3667 equation = 'mf_orig'
3668 params = ['r', 'CSA', 'S2', 'te']
3669 elif model == 'm33':
3670 equation = 'mf_orig'
3671 params = ['r', 'CSA', 'S2', 'Rex']
3672 elif model == 'm34':
3673 equation = 'mf_orig'
3674 params = ['r', 'CSA', 'S2', 'te', 'Rex']
3675 elif model == 'm35':
3676 equation = 'mf_ext'
3677 params = ['r', 'CSA', 'S2f', 'S2', 'ts']
3678 elif model == 'm36':
3679 equation = 'mf_ext'
3680 params = ['r', 'CSA', 'S2f', 'tf', 'S2', 'ts']
3681 elif model == 'm37':
3682 equation = 'mf_ext'
3683 params = ['r', 'CSA', 'S2f', 'S2', 'ts', 'Rex']
3684 elif model == 'm38':
3685 equation = 'mf_ext'
3686 params = ['r', 'CSA', 'S2f', 'tf', 'S2', 'ts', 'Rex']
3687 elif model == 'm39':
3688 equation = 'mf_orig'
3689 params = ['r', 'CSA', 'Rex']
3690
3691
3692
3693
3694
3695
3696 elif model == 'tm0':
3697 equation = 'mf_orig'
3698 params = ['tm']
3699 elif model == 'tm1':
3700 equation = 'mf_orig'
3701 params = ['tm', 'S2']
3702 elif model == 'tm2':
3703 equation = 'mf_orig'
3704 params = ['tm', 'S2', 'te']
3705 elif model == 'tm3':
3706 equation = 'mf_orig'
3707 params = ['tm', 'S2', 'Rex']
3708 elif model == 'tm4':
3709 equation = 'mf_orig'
3710 params = ['tm', 'S2', 'te', 'Rex']
3711 elif model == 'tm5':
3712 equation = 'mf_ext'
3713 params = ['tm', 'S2f', 'S2', 'ts']
3714 elif model == 'tm6':
3715 equation = 'mf_ext'
3716 params = ['tm', 'S2f', 'tf', 'S2', 'ts']
3717 elif model == 'tm7':
3718 equation = 'mf_ext'
3719 params = ['tm', 'S2f', 'S2', 'ts', 'Rex']
3720 elif model == 'tm8':
3721 equation = 'mf_ext'
3722 params = ['tm', 'S2f', 'tf', 'S2', 'ts', 'Rex']
3723 elif model == 'tm9':
3724 equation = 'mf_orig'
3725 params = ['tm', 'Rex']
3726
3727
3728 elif model == 'tm10':
3729 equation = 'mf_orig'
3730 params = ['tm', 'CSA']
3731 elif model == 'tm11':
3732 equation = 'mf_orig'
3733 params = ['tm', 'CSA', 'S2']
3734 elif model == 'tm12':
3735 equation = 'mf_orig'
3736 params = ['tm', 'CSA', 'S2', 'te']
3737 elif model == 'tm13':
3738 equation = 'mf_orig'
3739 params = ['tm', 'CSA', 'S2', 'Rex']
3740 elif model == 'tm14':
3741 equation = 'mf_orig'
3742 params = ['tm', 'CSA', 'S2', 'te', 'Rex']
3743 elif model == 'tm15':
3744 equation = 'mf_ext'
3745 params = ['tm', 'CSA', 'S2f', 'S2', 'ts']
3746 elif model == 'tm16':
3747 equation = 'mf_ext'
3748 params = ['tm', 'CSA', 'S2f', 'tf', 'S2', 'ts']
3749 elif model == 'tm17':
3750 equation = 'mf_ext'
3751 params = ['tm', 'CSA', 'S2f', 'S2', 'ts', 'Rex']
3752 elif model == 'tm18':
3753 equation = 'mf_ext'
3754 params = ['tm', 'CSA', 'S2f', 'tf', 'S2', 'ts', 'Rex']
3755 elif model == 'tm19':
3756 equation = 'mf_orig'
3757 params = ['tm', 'CSA', 'Rex']
3758
3759
3760 elif model == 'tm20':
3761 equation = 'mf_orig'
3762 params = ['tm', 'r']
3763 elif model == 'tm21':
3764 equation = 'mf_orig'
3765 params = ['tm', 'r', 'S2']
3766 elif model == 'tm22':
3767 equation = 'mf_orig'
3768 params = ['tm', 'r', 'S2', 'te']
3769 elif model == 'tm23':
3770 equation = 'mf_orig'
3771 params = ['tm', 'r', 'S2', 'Rex']
3772 elif model == 'tm24':
3773 equation = 'mf_orig'
3774 params = ['tm', 'r', 'S2', 'te', 'Rex']
3775 elif model == 'tm25':
3776 equation = 'mf_ext'
3777 params = ['tm', 'r', 'S2f', 'S2', 'ts']
3778 elif model == 'tm26':
3779 equation = 'mf_ext'
3780 params = ['tm', 'r', 'S2f', 'tf', 'S2', 'ts']
3781 elif model == 'tm27':
3782 equation = 'mf_ext'
3783 params = ['tm', 'r', 'S2f', 'S2', 'ts', 'Rex']
3784 elif model == 'tm28':
3785 equation = 'mf_ext'
3786 params = ['tm', 'r', 'S2f', 'tf', 'S2', 'ts', 'Rex']
3787 elif model == 'tm29':
3788 equation = 'mf_orig'
3789 params = ['tm', 'r', 'Rex']
3790
3791
3792 elif model == 'tm30':
3793 equation = 'mf_orig'
3794 params = ['tm', 'r', 'CSA']
3795 elif model == 'tm31':
3796 equation = 'mf_orig'
3797 params = ['tm', 'r', 'CSA', 'S2']
3798 elif model == 'tm32':
3799 equation = 'mf_orig'
3800 params = ['tm', 'r', 'CSA', 'S2', 'te']
3801 elif model == 'tm33':
3802 equation = 'mf_orig'
3803 params = ['tm', 'r', 'CSA', 'S2', 'Rex']
3804 elif model == 'tm34':
3805 equation = 'mf_orig'
3806 params = ['tm', 'r', 'CSA', 'S2', 'te', 'Rex']
3807 elif model == 'tm35':
3808 equation = 'mf_ext'
3809 params = ['tm', 'r', 'CSA', 'S2f', 'S2', 'ts']
3810 elif model == 'tm36':
3811 equation = 'mf_ext'
3812 params = ['tm', 'r', 'CSA', 'S2f', 'tf', 'S2', 'ts']
3813 elif model == 'tm37':
3814 equation = 'mf_ext'
3815 params = ['tm', 'r', 'CSA', 'S2f', 'S2', 'ts', 'Rex']
3816 elif model == 'tm38':
3817 equation = 'mf_ext'
3818 params = ['tm', 'r', 'CSA', 'S2f', 'tf', 'S2', 'ts', 'Rex']
3819 elif model == 'tm39':
3820 equation = 'mf_orig'
3821 params = ['tm', 'r', 'CSA', 'Rex']
3822
3823
3824 else:
3825 raise RelaxError, "The model '" + model + "' is invalid."
3826
3827
3828 self.model_setup(self.run, model, equation, params, res_num)
3829
3830
3831 - def set(self, run=None, value=None, error=None, data_type=None, index=None):
3832 """
3833 Model-free set details
3834 ~~~~~~~~~~~~~~~~~~~~~~
3835
3836 Setting a parameter value may have no effect depending on which model-free model is chosen,
3837 for example if S2f values and S2s values are set but the run corresponds to model-free model
3838 'm4' then, because these data values are not parameters of the model, they will have no
3839 effect.
3840
3841 Note that the Rex values are scaled quadratically with field strength and should be supplied
3842 as a field strength independent value. Use the following formula to get the correct value:
3843
3844 value = Rex / (2.0 * pi * frequency) ** 2
3845
3846 where:
3847 Rex is the chemical exchange value for the current frequency.
3848 pi is in the namespace of relax, ie just type 'pi'.
3849 frequency is the proton frequency corresponding to the data.
3850 """
3851
3852
3853 self.run = run
3854
3855
3856
3857
3858 if data_type == None:
3859
3860 if value:
3861
3862 if len(value) != len(self.relax.data.res[self.run][index].params):
3863 raise RelaxError, "The length of " + `len(value)` + " of the value array must be equal to the length of the model-free parameter array, " + `self.relax.data.res[self.run][index].params` + ", for residue " + `self.relax.data.res[self.run][index].num` + " " + self.relax.data.res[self.run][index].name + "."
3864
3865
3866 else:
3867
3868 value = []
3869
3870
3871 for i in xrange(len(self.relax.data.res[self.run][index].params)):
3872 value.append(self.default_value(self.relax.data.res[self.run][index].params[i]))
3873
3874
3875 for i in xrange(len(self.relax.data.res[self.run][index].params)):
3876
3877 object_name = self.get_data_name(self.relax.data.res[self.run][index].params[i])
3878 if not object_name:
3879 raise RelaxError, "The model-free data type " + `self.relax.data.res[self.run][index].params[i]` + " does not exist."
3880
3881
3882 if not hasattr(self.relax.data.res[self.run][index], object_name):
3883 self.initialise_data(self.relax.data.res[self.run][index], self.run)
3884
3885
3886 setattr(self.relax.data.res[self.run][index], object_name, float(value[i]))
3887
3888
3889
3890
3891
3892 else:
3893
3894 object_name = self.get_data_name(data_type)
3895 if not object_name:
3896 raise RelaxError, "The model-free data type " + `data_type` + " does not exist."
3897
3898
3899 if not hasattr(self.relax.data.res[self.run][index], object_name):
3900 self.initialise_data(self.relax.data.res[self.run][index], self.run)
3901
3902
3903 if value == None:
3904 value = self.default_value(object_name)
3905
3906
3907 setattr(self.relax.data.res[self.run][index], object_name, float(value))
3908
3909
3910 if error != None:
3911 setattr(self.relax.data.res[self.run][index], object_name+'_error', float(error))
3912
3913
3914 - def set_error(self, run, instance, index, error):
3915 """Function for setting parameter errors."""
3916
3917
3918 self.run = run
3919
3920
3921 inc = 0
3922
3923
3924 param_names = self.data_names(set='params')
3925
3926
3927
3928
3929
3930 if self.param_set == 'diff' or self.param_set == 'all':
3931
3932 if self.relax.data.diff[self.run].type == 'iso':
3933
3934 if index == 0:
3935 self.relax.data.diff[self.run].tm_err = error
3936
3937
3938 inc = inc + 1
3939
3940
3941 elif self.relax.data.diff[self.run].type == 'axial':
3942
3943 if index == 0:
3944 self.relax.data.diff[self.run].tm_err = error
3945 elif index == 1:
3946 self.relax.data.diff[self.run].Da_err = error
3947 elif index == 2:
3948 self.relax.data.diff[self.run].theta_err = error
3949 elif index == 3:
3950 self.relax.data.diff[self.run].phi_err = error
3951
3952
3953 inc = inc + 4
3954
3955
3956 elif self.relax.data.diff[self.run].type == 'aniso':
3957
3958 if index == 0:
3959 self.relax.data.diff[self.run].tm_err = error
3960 elif index == 1:
3961 self.relax.data.diff[self.run].Da_err = error
3962 elif index == 2:
3963 self.relax.data.diff[self.run].Dr_err = error
3964 elif index == 3:
3965 self.relax.data.diff[self.run].alpha_err = error
3966 elif index == 4:
3967 self.relax.data.diff[self.run].beta_err = error
3968 elif index == 5:
3969 self.relax.data.diff[self.run].gamma_err = error
3970
3971
3972 inc = inc + 6
3973
3974
3975
3976
3977
3978 if self.param_set == 'all':
3979
3980 for i in xrange(len(self.relax.data.res[self.run])):
3981
3982 if not self.relax.data.res[self.run][i].select:
3983 continue
3984
3985
3986 for param in param_names:
3987
3988 if index == inc:
3989 setattr(self.relax.data.res[self.run][i], param + "_err", error)
3990
3991
3992 inc = inc + 1
3993
3994
3995
3996
3997
3998 if self.param_set == 'mf' or self.param_set == 'local_tm':
3999
4000 if not self.relax.data.res[self.run][instance].select:
4001 return
4002
4003
4004 for param in param_names:
4005
4006 if index == inc:
4007 setattr(self.relax.data.res[self.run][instance], param + "_err", error)
4008
4009
4010 inc = inc + 1
4011
4012
4014 """Function for initialising Monte Carlo parameter values."""
4015
4016
4017 self.run = run
4018
4019
4020 self.param_set = self.determine_param_set_type()
4021
4022
4023 param_names = self.data_names(set='params')
4024
4025
4026 min_names = self.data_names(set='min')
4027
4028
4029 if self.param_set == 'diff' or self.param_set == 'all':
4030
4031 if self.relax.data.diff[self.run].type == 'iso':
4032 diff_params = ['tm']
4033
4034
4035 elif self.relax.data.diff[self.run].type == 'axial':
4036 diff_params = ['tm', 'Da', 'theta', 'phi']
4037
4038
4039 elif self.relax.data.diff[self.run].type == 'aniso':
4040 diff_params = ['tm', 'Da', 'Dr', 'alpha', 'beta', 'gamma']
4041
4042
4043
4044
4045
4046
4047 if self.param_set == 'diff' or self.param_set == 'all':
4048
4049 for object_name in diff_params:
4050
4051 sim_object_name = object_name + '_sim'
4052
4053
4054 if hasattr(self.relax.data.diff[self.run], sim_object_name):
4055 raise RelaxError, "Monte Carlo parameter values have already been set."
4056
4057
4058 for object_name in min_names:
4059
4060 sim_object_name = object_name + '_sim'
4061
4062
4063 if hasattr(self.relax.data, sim_object_name):
4064 raise RelaxError, "Monte Carlo parameter values have already been set."
4065
4066
4067 if self.param_set != 'diff':
4068 for i in xrange(len(self.relax.data.res[self.run])):
4069
4070 if not self.relax.data.res[self.run][i].select:
4071 continue
4072
4073
4074 for object_name in param_names:
4075
4076 sim_object_name = object_name + '_sim'
4077
4078
4079 if hasattr(self.relax.data.res[self.run][i], sim_object_name):
4080 raise RelaxError, "Monte Carlo parameter values have already been set."
4081
4082
4083
4084
4085
4086
4087 for object_name in min_names:
4088
4089 sim_object_name = object_name + '_sim'
4090
4091
4092 setattr(self.relax.data, sim_object_name, {})
4093
4094
4095 sim_object = getattr(self.relax.data, sim_object_name)
4096
4097
4098 sim_object[self.run] = []
4099
4100
4101 for j in xrange(self.relax.data.sim_number[self.run]):
4102
4103 object = getattr(self.relax.data, object_name)
4104
4105
4106 if not object.has_key(self.relax):
4107 continue
4108
4109
4110 sim_object[self.run].append(deepcopy(object[self.run]))
4111
4112
4113 if self.param_set == 'diff' or self.param_set == 'all':
4114
4115 for object_name in diff_params:
4116
4117 sim_object_name = object_name + '_sim'
4118
4119
4120 setattr(self.relax.data.diff[self.run], sim_object_name, [])
4121
4122
4123 sim_object = getattr(self.relax.data.diff[self.run], sim_object_name)
4124
4125
4126 for j in xrange(self.relax.data.sim_number[self.run]):
4127
4128 sim_object.append(deepcopy(getattr(self.relax.data.diff[self.run], object_name)))
4129
4130
4131 if self.param_set != 'diff':
4132 for i in xrange(len(self.relax.data.res[self.run])):
4133
4134 if not self.relax.data.res[self.run][i].select:
4135 continue
4136
4137
4138 for object_name in param_names:
4139
4140 sim_object_name = object_name + '_sim'
4141
4142
4143 setattr(self.relax.data.res[self.run][i], sim_object_name, [])
4144
4145
4146 sim_object = getattr(self.relax.data.res[self.run][i], sim_object_name)
4147
4148
4149 for j in xrange(self.relax.data.sim_number[self.run]):
4150
4151 sim_object.append(deepcopy(getattr(self.relax.data.res[self.run][i], object_name)))
4152
4153
4154 for object_name in min_names:
4155
4156 sim_object_name = object_name + '_sim'
4157
4158
4159 setattr(self.relax.data.res[self.run][i], sim_object_name, [])
4160
4161
4162 sim_object = getattr(self.relax.data.res[self.run][i], sim_object_name)
4163
4164
4165 for j in xrange(self.relax.data.sim_number[self.run]):
4166
4167 sim_object.append(deepcopy(getattr(self.relax.data.res[self.run][i], object_name)))
4168
4169
4171 """Function for returning the array of simulation chi-squared values."""
4172
4173
4174 self.run = run
4175
4176
4177 self.param_set = self.determine_param_set_type()
4178
4179
4180 if self.param_set == 'all' or self.param_set == 'diff':
4181 return self.relax.data.chi2_sim[self.run]
4182
4183
4184 else:
4185 return self.relax.data.res[self.run][instance].chi2_sim
4186
4187
4189 """Function for returning the array of simulation parameter values."""
4190
4191
4192 self.run = run
4193
4194
4195 inc = 0
4196
4197
4198 param_names = self.data_names(set='params')
4199
4200
4201
4202
4203
4204 if self.param_set == 'diff' or self.param_set == 'all':
4205
4206 if self.relax.data.diff[self.run].type == 'iso':
4207
4208 if index == 0:
4209 return self.relax.data.diff[self.run].tm_sim
4210
4211
4212 inc = inc + 1
4213
4214
4215 elif self.relax.data.diff[self.run].type == 'axial':
4216
4217 if index == 0:
4218 return self.relax.data.diff[self.run].tm_sim
4219 elif index == 1:
4220 return self.relax.data.diff[self.run].Da_sim
4221 elif index == 2:
4222 return self.relax.data.diff[self.run].theta_sim
4223 elif index == 3:
4224 return self.relax.data.diff[self.run].phi_sim
4225
4226
4227 inc = inc + 4
4228
4229
4230 elif self.relax.data.diff[self.run].type == 'aniso':
4231
4232 if index == 0:
4233 return self.relax.data.diff[self.run].tm_sim
4234 elif index == 1:
4235 return self.relax.data.diff[self.run].Da_sim
4236 elif index == 2:
4237 return self.relax.data.diff[self.run].Dr_sim
4238 elif index == 3:
4239 return self.relax.data.diff[self.run].alpha_sim
4240 elif index == 4:
4241 return self.relax.data.diff[self.run].beta_sim
4242 elif index == 5:
4243 return self.relax.data.diff[self.run].gamma_sim
4244
4245
4246 inc = inc + 6
4247
4248
4249
4250
4251
4252 if self.param_set == 'all':
4253
4254 for i in xrange(len(self.relax.data.res[self.run])):
4255
4256 if not self.relax.data.res[self.run][i].select:
4257 continue
4258
4259
4260 for param in param_names:
4261
4262 if index == inc:
4263 return getattr(self.relax.data.res[self.run][i], param + "_sim")
4264
4265
4266 inc = inc + 1
4267
4268
4269
4270
4271
4272 if self.param_set == 'mf' or self.param_set == 'local_tm':
4273
4274 if not self.relax.data.res[self.run][instance].select:
4275 return
4276
4277
4278 for param in param_names:
4279
4280 if index == inc:
4281 return getattr(self.relax.data.res[self.run][instance], param + "_sim")
4282
4283
4284 inc = inc + 1
4285
4286
4287 - def skip_function(self, run=None, instance=None, min_instances=None, num_instances=None):
4288 """Function for skiping certain data."""
4289
4290
4291 self.run = run
4292
4293
4294 self.param_set = self.determine_param_set_type()
4295
4296
4297 consolidate = 0
4298 if min_instances == 1 and min_instances != num_instances:
4299 consolidate = 1
4300
4301
4302 if (self.param_set == 'mf' or self.param_set == 'local_tm') and not consolidate and not self.relax.data.res[self.run][instance].select:
4303 return 1
4304
4305
4306 return 0
4307
4308
4310 """Function for unselecting models."""
4311
4312
4313 self.run = run
4314
4315
4316 self.param_set = self.determine_param_set_type()
4317
4318
4319 if self.param_set == 'mf' or self.param_set == 'local_tm':
4320 self.relax.data.res[self.run][i].select = 0
4321
4322
4323 - def write_columnar_line(self, file=None, num=None, name=None, select=None, data_set=None, nucleus=None, model=None, equation=None, params=None, param_set=None, s2=None, s2f=None, s2s=None, local_tm=None, te=None, tf=None, ts=None, rex=None, r=None, csa=None, chi2=None, i=None, f=None, g=None, h=None, warn=None, diff_type=None, diff_params=None, pdb=None, pdb_model=None, pdb_heteronuc=None, pdb_proton=None, xh_vect=None, ri_labels=None, remap_table=None, frq_labels=None, frq=None, ri=None, ri_error=None):
4324 """Function for printing a single line of the columnar formatted results."""
4325
4326
4327 file.write("%-4s %-5s " % (num, name))
4328
4329
4330 file.write("%-9s %-9s " % (select, data_set))
4331 if not select:
4332 file.write("\n")
4333 return
4334
4335
4336 file.write("%-7s " % nucleus)
4337
4338
4339 file.write("%-5s %-9s %-35s " % (model, equation, params))
4340
4341
4342 file.write("%-10s " % param_set)
4343
4344
4345 file.write("%-25s " % s2)
4346 file.write("%-25s " % s2f)
4347 file.write("%-25s " % s2s)
4348 file.write("%-25s " % local_tm)
4349 file.write("%-25s " % te)
4350 file.write("%-25s " % tf)
4351 file.write("%-25s " % ts)
4352 file.write("%-25s " % rex)
4353 file.write("%-25s " % r)
4354 file.write("%-25s " % csa)
4355
4356
4357 file.write("%-25s %-8s %-8s %-8s %-8s %-45s " % (chi2, i, f, g, h, warn))
4358
4359
4360 file.write("%-10s " % diff_type)
4361 if diff_params:
4362 for i in xrange(len(diff_params)):
4363 file.write("%-25s " % diff_params[i])
4364
4365
4366 file.write("%-40s " % pdb)
4367 file.write("%-10s " % pdb_model)
4368 file.write("%-15s " % pdb_heteronuc)
4369 file.write("%-15s " % pdb_proton)
4370
4371
4372 file.write("%-70s " % xh_vect)
4373
4374
4375 if ri_labels:
4376 file.write("%-40s " % ri_labels)
4377 file.write("%-25s " % remap_table)
4378 file.write("%-25s " % frq_labels)
4379 file.write("%-30s " % frq)
4380
4381
4382 if ri:
4383 for i in xrange(len(ri)):
4384 if ri[i] == None:
4385 file.write("%-25s " % 'None')
4386 else:
4387 file.write("%-25s " % ri[i])
4388
4389
4390 if ri_error:
4391 for i in xrange(len(ri_error)):
4392 if ri_error[i] == None:
4393 file.write("%-25s " % 'None')
4394 else:
4395 file.write("%-25s " % ri_error[i])
4396
4397
4398 file.write("\n")
4399
4400
4402 """Function for printing the results into a file."""
4403
4404
4405 self.run = run
4406
4407
4408 self.param_set = self.determine_param_set_type()
4409
4410
4411
4412
4413
4414
4415 diff_params = None
4416 if self.param_set != 'local_tm' and hasattr(self.relax.data, 'diff') and self.relax.data.diff.has_key(self.run):
4417
4418 if self.relax.data.diff[self.run].type == 'iso':
4419 diff_params = ['tm_(s)']
4420
4421
4422 elif self.relax.data.diff[self.run].type == 'axial':
4423 diff_params = ['tm_(s)', 'Da_(1/s)', 'theta_(deg)', 'phi_(deg)']
4424
4425
4426 elif self.relax.data.diff[self.run].type == 'aniso':
4427 diff_params = ['tm_(s)', 'Da_(1/s)', 'Dr_(1/s)', 'alpha_(deg)', 'beta_(deg)', 'gamma_(deg)']
4428
4429
4430 ri = []
4431 ri_error = []
4432 if hasattr(self.relax.data, 'num_ri'):
4433 for i in xrange(self.relax.data.num_ri[self.run]):
4434 ri.append('Ri_(' + self.relax.data.ri_labels[self.run][i] + "_" + self.relax.data.frq_labels[self.run][self.relax.data.remap_table[self.run][i]] + ")")
4435 ri_error.append('Ri_error_(' + self.relax.data.ri_labels[self.run][i] + "_" + self.relax.data.frq_labels[self.run][self.relax.data.remap_table[self.run][i]] + ")")
4436
4437
4438 self.write_columnar_line(file=file, num='Num', name='Name', select='Selected', data_set='Data_set', nucleus='Nucleus', model='Model', equation='Equation', params='Params', param_set='Param_set', s2='S2', s2f='S2f', s2s='S2s', local_tm='Local_tm_(ns)', te='te_(ps)', tf='tf_(ps)', ts='ts_(ps)', rex='Rex_(1st_field)', r='Bond_length_(A)', csa='CSA_(ppm)', chi2='Chi-squared', i='Iter', f='f_count', g='g_count', h='h_count', warn='Warning', diff_type='Diff_type', diff_params=diff_params, pdb='PDB', pdb_model='PDB_model', pdb_heteronuc='PDB_heteronuc', pdb_proton='PDB_proton', xh_vect='XH_vector', ri_labels='Ri_labels', remap_table='Remap_table', frq_labels='Frq_labels', frq='Frequencies', ri=ri, ri_error=ri_error)
4439
4440
4441
4442
4443
4444
4445 nucleus = self.relax.generic.nuclei.find_nucleus()
4446
4447
4448 diff_type = None
4449 diff_params = None
4450 if self.param_set != 'local_tm' and hasattr(self.relax.data, 'diff') and self.relax.data.diff.has_key(self.run):
4451
4452 if self.relax.data.diff[self.run].type == 'iso':
4453 diff_type = 'iso'
4454 diff_params = [`self.relax.data.diff[self.run].tm`]
4455
4456
4457 elif self.relax.data.diff[self.run].type == 'axial':
4458 diff_type = self.relax.data.diff[self.run].axial_type
4459 if diff_type == None:
4460 diff_type = 'axial'
4461 diff_params = [`self.relax.data.diff[self.run].tm`, `self.relax.data.diff[self.run].Da`, `self.relax.data.diff[self.run].theta * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].phi * 360 / (2.0 * pi)`]
4462
4463
4464 elif self.relax.data.diff[self.run].type == 'aniso':
4465 diff_type = 'aniso'
4466 diff_params = [`self.relax.data.diff[self.run].tm`, `self.relax.data.diff[self.run].Da`, `self.relax.data.diff[self.run].Dr`, `self.relax.data.diff[self.run].alpha * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].beta * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].gamma * 360 / (2.0 * pi)`]
4467
4468
4469 pdb = None
4470 pdb_model = None
4471 pdb_heteronuc = None
4472 pdb_proton = None
4473 if self.relax.data.pdb.has_key(self.run):
4474 pdb = self.relax.data.pdb[self.run].file_name
4475 pdb_model = self.relax.data.pdb[self.run].model
4476 pdb_heteronuc = self.relax.data.pdb[self.run].heteronuc
4477 pdb_proton = self.relax.data.pdb[self.run].proton
4478
4479
4480 try:
4481 ri_labels = replace(`self.relax.data.ri_labels[self.run]`, ' ', '')
4482 remap_table = replace(`self.relax.data.remap_table[self.run]`, ' ', '')
4483 frq_labels = replace(`self.relax.data.frq_labels[self.run]`, ' ', '')
4484 frq = replace(`self.relax.data.frq[self.run]`, ' ', '')
4485 except AttributeError:
4486 ri_labels = `None`
4487 remap_table = `None`
4488 frq_labels = `None`
4489 frq = `None`
4490
4491
4492 for i in xrange(len(self.relax.data.res[self.run])):
4493
4494 data = self.relax.data.res[self.run][i]
4495
4496
4497 if not data.select:
4498 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='value')
4499 continue
4500
4501
4502 model = None
4503 if hasattr(data, 'model'):
4504 model = data.model
4505
4506 equation = None
4507 if hasattr(data, 'equation'):
4508 equation = data.equation
4509
4510 params = None
4511 if hasattr(data, 'params'):
4512 params = replace(`data.params`, ' ', '')
4513
4514
4515 s2 = None
4516 if hasattr(data, 's2'):
4517 s2 = data.s2
4518
4519
4520 s2f = None
4521 if hasattr(data, 's2f'):
4522 s2f = data.s2f
4523
4524
4525 s2s = None
4526 if hasattr(data, 's2s'):
4527 s2s = data.s2s
4528
4529
4530 local_tm = None
4531 if hasattr(data, 'tm') and data.tm != None:
4532 local_tm = data.tm / 1e-9
4533
4534
4535 te = None
4536 if hasattr(data, 'te') and data.te != None:
4537 te = data.te / 1e-12
4538
4539
4540 tf = None
4541 if hasattr(data, 'tf') and data.tf != None:
4542 tf = data.tf / 1e-12
4543
4544
4545 ts = None
4546 if hasattr(data, 'ts') and data.ts != None:
4547 ts = data.ts / 1e-12
4548
4549
4550 rex = None
4551 if hasattr(data, 'rex') and data.rex != None:
4552 rex = data.rex * (2.0 * pi * data.frq[0])**2
4553
4554
4555 r = None
4556 if hasattr(data, 'r') and data.r != None:
4557 r = data.r / 1e-10
4558
4559
4560 csa = None
4561 if hasattr(data, 'csa') and data.csa != None:
4562 csa = data.csa / 1e-6
4563
4564
4565 try:
4566
4567 if self.param_set == 'diff' or self.param_set == 'all':
4568 chi2 = self.relax.data.chi2[self.run]
4569 iter = self.relax.data.iter[self.run]
4570 f = self.relax.data.f_count[self.run]
4571 g = self.relax.data.g_count[self.run]
4572 h = self.relax.data.h_count[self.run]
4573 if type(self.relax.data.warning[self.run]) == str:
4574 warn = replace(self.relax.data.warning[self.run], ' ', '_')
4575 else:
4576 warn = self.relax.data.warning[self.run]
4577
4578
4579 else:
4580 chi2 = data.chi2
4581 iter = data.iter
4582 f = data.f_count
4583 g = data.g_count
4584 h = data.h_count
4585 if type(data.warning) == str:
4586 warn = replace(data.warning, ' ', '_')
4587 else:
4588 warn = data.warning
4589
4590
4591 except:
4592 chi2 = None
4593 iter = None
4594 f = None
4595 g = None
4596 h = None
4597 warn = None
4598
4599
4600 xh_vect = None
4601 if hasattr(data, 'xh_vect'):
4602 xh_vect = replace(`data.xh_vect.tolist()`, ' ', '')
4603
4604
4605 ri = []
4606 ri_error = []
4607 if hasattr(self.relax.data, 'num_ri'):
4608 for i in xrange(self.relax.data.num_ri[self.run]):
4609 try:
4610
4611 index = None
4612 for j in xrange(data.num_ri):
4613 if data.ri_labels[j] == self.relax.data.ri_labels[self.run][i] and data.frq_labels[data.remap_table[j]] == self.relax.data.frq_labels[self.run][self.relax.data.remap_table[self.run][i]]:
4614 index = j
4615
4616
4617 ri.append(`data.relax_data[index]`)
4618 ri_error.append(`data.relax_error[index]`)
4619
4620
4621 except:
4622 ri.append(None)
4623 ri_error.append(None)
4624
4625
4626 self.write_columnar_line(file=file, num=data.num, name=data.name, select=data.select, data_set='value', nucleus=nucleus, model=model, equation=equation, params=params, param_set=self.param_set, s2=`s2`, s2f=`s2f`, s2s=`s2s`, local_tm=`local_tm`, te=`te`, tf=`tf`, ts=`ts`, rex=`rex`, r=`r`, csa=`csa`, chi2=chi2, i=iter, f=f, g=g, h=h, warn=warn, diff_type=diff_type, diff_params=diff_params, pdb=pdb, pdb_model=pdb_model, pdb_heteronuc=pdb_heteronuc, pdb_proton=pdb_proton, xh_vect=xh_vect, ri_labels=ri_labels, remap_table=remap_table, frq_labels=frq_labels, frq=frq, ri=ri, ri_error=ri_error)
4627
4628
4629
4630
4631
4632
4633 if not hasattr(self.relax.data, 'sim_state'):
4634 return
4635 elif self.relax.data.sim_state[self.run] == 0:
4636 return
4637
4638
4639 diff_params = None
4640 if self.param_set != 'local_tm' and hasattr(self.relax.data, 'diff') and self.relax.data.diff.has_key(self.run):
4641
4642 if self.relax.data.diff[self.run].type == 'iso':
4643 diff_params = [None]
4644
4645
4646 elif self.relax.data.diff[self.run].type == 'axial':
4647 diff_params = [None, None, None, None]
4648
4649
4650 elif self.relax.data.diff[self.run].type == 'aniso':
4651 diff_params = [None, None, None, None, None, None]
4652
4653
4654 if self.param_set == 'diff' or self.param_set == 'all':
4655
4656 if self.relax.data.diff[self.run].type == 'iso' and hasattr(self.relax.data.diff[self.run], 'tm_err'):
4657 diff_params = [`self.relax.data.diff[self.run].tm_err`]
4658
4659
4660 elif self.relax.data.diff[self.run].type == 'axial' and hasattr(self.relax.data.diff[self.run], 'tm_err'):
4661 diff_params = [`self.relax.data.diff[self.run].tm_err`, `self.relax.data.diff[self.run].Da_err`, `self.relax.data.diff[self.run].theta_err * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].phi_err * 360 / (2.0 * pi)`]
4662
4663
4664 elif self.relax.data.diff[self.run].type == 'aniso' and hasattr(self.relax.data.diff[self.run], 'tm_err'):
4665 diff_params = [`self.relax.data.diff[self.run].tm_err`, `self.relax.data.diff[self.run].Da_err`, `self.relax.data.diff[self.run].Dr_err`, `self.relax.data.diff[self.run].alpha_err * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].beta_err * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].gamma_err * 360 / (2.0 * pi)`]
4666
4667
4668 for i in xrange(len(self.relax.data.res[self.run])):
4669
4670 data = self.relax.data.res[self.run][i]
4671
4672
4673 if not data.select:
4674 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='error')
4675 continue
4676
4677
4678 model = None
4679 if hasattr(data, 'model'):
4680 model = data.model
4681
4682 equation = None
4683 if hasattr(data, 'equation'):
4684 equation = data.equation
4685
4686 params = None
4687 if hasattr(data, 'params'):
4688 params = replace(`data.params`, ' ', '')
4689
4690
4691 s2 = None
4692 if hasattr(data, 's2_err'):
4693 s2 = data.s2_err
4694
4695
4696 s2f = None
4697 if hasattr(data, 's2f_err'):
4698 s2f = data.s2f_err
4699
4700
4701 s2s = None
4702 if hasattr(data, 's2s_err'):
4703 s2s = data.s2s_err
4704
4705
4706 local_tm = None
4707 if hasattr(data, 'tm_err') and data.tm_err != None:
4708 local_tm = data.tm_err / 1e-9
4709
4710
4711 te = None
4712 if hasattr(data, 'te_err') and data.te_err != None:
4713 te = data.te_err / 1e-12
4714
4715
4716 tf = None
4717 if hasattr(data, 'tf_err') and data.tf_err != None:
4718 tf = data.tf_err / 1e-12
4719
4720
4721 ts = None
4722 if hasattr(data, 'ts_err') and data.ts_err != None:
4723 ts = data.ts_err / 1e-12
4724
4725
4726 rex = None
4727 if hasattr(data, 'rex_err') and data.rex_err != None:
4728 rex = data.rex_err * (2.0 * pi * data.frq[0])**2
4729
4730
4731 r = None
4732 if hasattr(data, 'r_err') and data.r_err != None:
4733 r = data.r_err / 1e-10
4734
4735
4736 csa = None
4737 if hasattr(data, 'csa_err') and data.csa_err != None:
4738 csa = data.csa_err / 1e-6
4739
4740
4741 ri = []
4742 ri_error = []
4743 for i in xrange(self.relax.data.num_ri[self.run]):
4744 ri.append(None)
4745 ri_error.append(None)
4746
4747
4748 xh_vect = None
4749 if hasattr(data, 'xh_vect'):
4750 xh_vect = replace(`data.xh_vect.tolist()`, ' ', '')
4751
4752
4753 self.write_columnar_line(file=file, num=data.num, name=data.name, select=data.select, data_set='error', nucleus=nucleus, model=model, equation=equation, params=params, param_set=self.param_set, s2=`s2`, s2f=`s2f`, s2s=`s2s`, local_tm=`local_tm`, te=`te`, tf=`tf`, ts=`ts`, rex=`rex`, r=`r`, csa=`csa`, diff_type=diff_type, diff_params=diff_params, pdb=pdb, pdb_model=pdb_model, pdb_heteronuc=pdb_heteronuc, pdb_proton=pdb_proton, xh_vect=xh_vect, ri_labels=ri_labels, remap_table=remap_table, frq_labels=frq_labels, frq=frq, ri=ri, ri_error=ri_error)
4754
4755
4756
4757
4758
4759
4760 for i in xrange(self.relax.data.sim_number[self.run]):
4761
4762 diff_params = None
4763 if self.param_set != 'local_tm' and hasattr(self.relax.data, 'diff') and self.relax.data.diff.has_key(self.run):
4764
4765 if self.param_set == 'diff' or self.param_set == 'all':
4766
4767 if self.relax.data.diff[self.run].type == 'iso':
4768 diff_params = [`self.relax.data.diff[self.run].tm_sim[i]`]
4769
4770
4771 elif self.relax.data.diff[self.run].type == 'axial':
4772 diff_params = [`self.relax.data.diff[self.run].tm_sim[i]`, `self.relax.data.diff[self.run].Da_sim[i]`, `self.relax.data.diff[self.run].theta_sim[i] * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].phi_sim[i] * 360 / (2.0 * pi)`]
4773
4774
4775 elif self.relax.data.diff[self.run].type == 'aniso':
4776 diff_params = [`self.relax.data.diff[self.run].tm_sim[i]`, `self.relax.data.diff[self.run].Da_sim[i]`, `self.relax.data.diff[self.run].Dr_sim[i]`, `self.relax.data.diff[self.run].alpha_sim[i] * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].beta_sim[i] * 360 / (2.0 * pi)`, `self.relax.data.diff[self.run].gamma_sim[i] * 360 / (2.0 * pi)`]
4777
4778
4779 else:
4780
4781 if self.relax.data.diff[self.run].type == 'iso':
4782 diff_params = [None]
4783
4784
4785 elif self.relax.data.diff[self.run].type == 'axial':
4786 diff_params = [None, None, None, None]
4787
4788
4789 elif self.relax.data.diff[self.run].type == 'aniso':
4790 diff_params = [None, None, None, None, None, None]
4791
4792
4793 for j in xrange(len(self.relax.data.res[self.run])):
4794
4795 data = self.relax.data.res[self.run][j]
4796
4797
4798 if not data.select:
4799 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='sim_'+`i`)
4800 continue
4801
4802
4803 model = None
4804 if hasattr(data, 'model'):
4805 model = data.model
4806
4807 equation = None
4808 if hasattr(data, 'equation'):
4809 equation = data.equation
4810
4811 params = None
4812 if hasattr(data, 'params'):
4813 params = replace(`data.params`, ' ', '')
4814
4815
4816 s2 = None
4817 if hasattr(data, 's2_sim'):
4818 s2 = data.s2_sim[i]
4819
4820
4821 s2f = None
4822 if hasattr(data, 's2f_sim'):
4823 s2f = data.s2f_sim[i]
4824
4825
4826 s2s = None
4827 if hasattr(data, 's2s_sim'):
4828 s2s = data.s2s_sim[i]
4829
4830
4831 local_tm = None
4832 if hasattr(data, 'tm_sim') and data.tm_sim[i] != None:
4833 local_tm = data.tm_sim[i] / 1e-9
4834
4835
4836 te = None
4837 if hasattr(data, 'te_sim') and data.te_sim[i] != None:
4838 te = data.te_sim[i] / 1e-12
4839
4840
4841 tf = None
4842 if hasattr(data, 'tf_sim') and data.tf_sim[i] != None:
4843 tf = data.tf_sim[i] / 1e-12
4844
4845
4846 ts = None
4847 if hasattr(data, 'ts_sim') and data.ts_sim[i] != None:
4848 ts = data.ts_sim[i] / 1e-12
4849
4850
4851 rex = None
4852 if hasattr(data, 'rex_sim') and data.rex_sim[i] != None:
4853 rex = data.rex_sim[i] * (2.0 * pi * data.frq[0])**2
4854
4855
4856 r = None
4857 if hasattr(data, 'r_sim') and data.r_sim[i] != None:
4858 r = data.r_sim[i] / 1e-10
4859
4860
4861 csa = None
4862 if hasattr(data, 'csa_sim') and data.csa_sim[i] != None:
4863 csa = data.csa_sim[i] / 1e-6
4864
4865
4866 try:
4867
4868 if self.param_set == 'diff' or self.param_set == 'all':
4869 chi2 = self.relax.data.chi2_sim[self.run][i]
4870 iter = self.relax.data.iter_sim[self.run][i]
4871 f = self.relax.data.f_count_sim[self.run][i]
4872 g = self.relax.data.g_count_sim[self.run][i]
4873 h = self.relax.data.h_count_sim[self.run][i]
4874 if type(self.relax.data.warning_sim[self.run][i]) == str:
4875 warn = replace(self.relax.data.warning_sim[self.run][i], ' ', '_')
4876 else:
4877 warn = self.relax.data.warning_sim[self.run][i]
4878
4879
4880 else:
4881 chi2 = data.chi2_sim[i]
4882 iter = data.iter_sim[i]
4883 f = data.f_count_sim[i]
4884 g = data.g_count_sim[i]
4885 h = data.h_count_sim[i]
4886 if type(data.warning_sim[i]) == str:
4887 warn = replace(data.warning_sim[i], ' ', '_')
4888 else:
4889 warn = data.warning_sim[i]
4890
4891
4892 except AttributeError:
4893 chi2 = None
4894 iter = None
4895 f = None
4896 g = None
4897 h = None
4898 warn = None
4899
4900
4901 ri = []
4902 ri_error = []
4903 for k in xrange(self.relax.data.num_ri[self.run]):
4904
4905 index = None
4906 for l in xrange(data.num_ri):
4907 if data.ri_labels[l] == self.relax.data.ri_labels[self.run][k] and data.frq_labels[data.remap_table[l]] == self.relax.data.frq_labels[self.run][self.relax.data.remap_table[self.run][k]]:
4908 index = l
4909
4910
4911 try:
4912 ri.append(`data.relax_sim_data[i][index]`)
4913 ri_error.append(`data.relax_error[index]`)
4914 except:
4915 ri.append(None)
4916 ri_error.append(None)
4917
4918
4919 xh_vect = None
4920 if hasattr(data, 'xh_vect'):
4921 xh_vect = replace(`data.xh_vect.tolist()`, ' ', '')
4922
4923
4924 self.write_columnar_line(file=file, num=data.num, name=data.name, select=data.select, data_set='sim_'+`i`, nucleus=nucleus, model=model, equation=equation, params=params, param_set=self.param_set, s2=`s2`, s2f=`s2f`, s2s=`s2s`, local_tm=`local_tm`, te=`te`, tf=`tf`, ts=`ts`, rex=`rex`, r=`r`, csa=`csa`, chi2=`chi2`, i=iter, f=f, g=g, h=h, warn=warn, diff_type=diff_type, diff_params=diff_params, pdb=pdb, pdb_model=pdb_model, pdb_heteronuc=pdb_heteronuc, pdb_proton=pdb_proton, xh_vect=xh_vect, ri_labels=ri_labels, remap_table=remap_table, frq_labels=frq_labels, frq=frq, ri=ri, ri_error=ri_error)
4925