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