1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 from re import search
24 from string import replace
25
26 from base_class import Common_functions
27 from maths_fns.jw_mapping import Mapping
28
29
32 """Class containing functions specific to reduced spectral density mapping."""
33
34 self.relax = relax
35
36
37 - def calculate(self, run=None, print_flag=1, sim_index=None):
38 """Calculation of the spectral density values."""
39
40
41 self.run = run
42
43
44 if not hasattr(self.relax.data, 'jw_frq') or not self.relax.data.jw_frq.has_key(self.run) or type(self.relax.data.jw_frq[self.run]) != float:
45 raise RelaxError, "The frequency for the run " + `self.run` + " has not been set up."
46
47
48 if not hasattr(self.relax.data, 'gx'):
49 raise RelaxNucleusError
50
51
52 if not self.relax.data.res.has_key(self.run):
53 raise RelaxNoSequenceError, self.run
54
55
56 for i in xrange(len(self.relax.data.res[self.run])):
57
58 if not self.relax.data.res[self.run][i].select:
59 continue
60
61
62 if not hasattr(self.relax.data.res[self.run][i], 'csa') or self.relax.data.res[self.run][i].csa == None:
63 raise RelaxNoValueError, "CSA"
64
65
66 if not hasattr(self.relax.data.res[self.run][i], 'r') or self.relax.data.res[self.run][i].r == None:
67 raise RelaxNoValueError, "bond length"
68
69
70 if self.relax.data.jw_frq[self.run] not in self.relax.data.frq[self.run]:
71 raise RelaxError, "No relaxation data corresponding to the frequency " + `self.relax.data.jw_frq[self.run]` + " has been loaded."
72
73
74 for i in xrange(len(self.relax.data.res[self.run])):
75
76 data = self.relax.data.res[self.run][i]
77
78
79 if not data.select:
80 continue
81
82
83 frq_index = None
84 for j in xrange(data.num_frq):
85 if data.frq[j] == self.relax.data.jw_frq[self.run]:
86 frq_index = j
87 if frq_index == None:
88 continue
89
90
91 r1 = None
92 r2 = None
93 noe = None
94
95
96 for j in xrange(data.num_ri):
97
98 if data.remap_table[j] == frq_index and data.ri_labels[j] == 'R1':
99 if sim_index == None:
100 r1 = data.relax_data[j]
101 else:
102 r1 = data.relax_sim_data[sim_index][j]
103
104
105 if data.remap_table[j] == frq_index and data.ri_labels[j] == 'R2':
106 if sim_index == None:
107 r2 = data.relax_data[j]
108 else:
109 r2 = data.relax_sim_data[sim_index][j]
110
111
112 if data.remap_table[j] == frq_index and data.ri_labels[j] == 'NOE':
113 if sim_index == None:
114 noe = data.relax_data[j]
115 else:
116 noe = data.relax_sim_data[sim_index][j]
117
118
119 if r1 == None or r2 == None or noe == None:
120 continue
121
122
123 self.jw = Mapping(frq=self.relax.data.jw_frq[self.run], gx=self.relax.data.gx, gh=self.relax.data.gh, mu0=self.relax.data.mu0, h_bar=self.relax.data.h_bar)
124
125
126 j0, jwx, jwh = self.jw.func(r=data.r, csa=data.csa, r1=r1, r2=r2, noe=noe)
127
128
129 if sim_index == None:
130 data.j0 = j0
131 data.jwx = jwx
132 data.jwh = jwh
133
134
135 else:
136
137 self.data_init(data, sim=1)
138 if data.j0_sim == None:
139 data.j0_sim = []
140 data.jwx_sim = []
141 data.jwh_sim = []
142
143
144 data.j0_sim.append(j0)
145 data.jwx_sim.append(jwx)
146 data.jwh_sim.append(jwh)
147
148
150 """Function for initialising the data structures."""
151
152
153 data_names = self.data_names()
154
155
156 for name in data_names:
157
158 if sim:
159
160 name = name + '_sim'
161
162
163 if not hasattr(data, name):
164
165 setattr(data, name, None)
166
167
169 """Function for returning a list of names of data structures.
170
171 Description
172 ~~~~~~~~~~~
173
174 r: Bond length.
175
176 csa: CSA value.
177
178 j0: Spectral density value at 0 MHz.
179
180 jwx: Spectral density value at the frequency of the heteronucleus.
181
182 jwh: Spectral density value at the frequency of the heteronucleus.
183 """
184
185
186 names = []
187
188
189 names.append('r')
190 names.append('csa')
191
192
193 names.append('j0')
194 names.append('jwx')
195 names.append('jwh')
196
197 return names
198
199
201 """
202 Reduced spectral density mapping default values
203 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
204
205 _______________________________________________________________________________________
206 | | | |
207 | Data type | Object name | Value |
208 |_______________________________________|______________|______________________________|
209 | | | |
210 | Bond length | 'r' | 1.02 * 1e-10 |
211 | | | |
212 | CSA | 'csa' | -172 * 1e-6 |
213 |_______________________________________|______________|______________________________|
214
215 """
216
217
218 if param == 'r':
219 return 1.02 * 1e-10
220
221
222 if param == 'CSA':
223 return -172 * 1e-6
224
225
227 """Function for returning the number of instances."""
228
229
230 self.run = run
231
232
233 if not self.relax.data.res.has_key(self.run):
234 return 0
235
236
237 return len(self.relax.data.res[self.run])
238
239
241 """Function for deselecting residues without sufficient data to support calculation"""
242
243
244 if not self.relax.data.res.has_key(run):
245 raise RelaxNoSequenceError, run
246
247
248 for residue in self.relax.data.res[run]:
249
250
251 if not hasattr(residue, 'relax_data'):
252 residue.select = 0
253 continue
254
255
256 if len(residue.relax_data) < 3:
257 residue.select = 0
258 continue
259
260
262 """Dummy function for returning 1.0."""
263
264 return 1.0
265
266
268 """
269 Reduced spectral density mapping data type string matching patterns
270 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
271
272 ____________________________________________________________________________________________
273 | | | |
274 | Data type | Object name | Patterns |
275 |________________________|______________|__________________________________________________|
276 | | | |
277 | J(0) | 'j0' | '^[Jj]0$' or '[Jj]\(0\)' |
278 | | | |
279 | J(wX) | 'jwx' | '^[Jj]w[Xx]$' or '[Jj]\(w[Xx]\)' |
280 | | | |
281 | J(wH) | 'jwh' | '^[Jj]w[Hh]$' or '[Jj]\(w[Hh]\)' |
282 | | | |
283 | Bond length | 'r' | '^r$' or '[Bb]ond[ -_][Ll]ength' |
284 | | | |
285 | CSA | 'csa' | '^[Cc][Ss][Aa]$' |
286 |________________________|______________|__________________________________________________|
287
288 """
289
290
291 if search('^[Jj]0$', name) or search('[Jj]\(0\)', name):
292 return 'j0'
293
294
295 if search('^[Jj]w[Xx]$', name) or search('[Jj]\(w[Xx]\)', name):
296 return 'jwx'
297
298
299 if search('^[Jj]w[Hh]$', name) or search('[Jj]\(w[Hh]\)', name):
300 return 'jwh'
301
302
303 if search('^r$', name) or search('[Bb]ond[ -_][Ll]ength', name):
304 return 'r'
305
306
307 if search('^[Cc][Ss][Aa]$', name):
308 return 'csa'
309
310
312 """Function for returning the Grace string representing the data type for axis labelling."""
313
314
315 object_name = self.return_data_name(data_type)
316
317
318 if object_name == 'j0':
319 return '\\qJ(0)\\Q'
320
321
322 elif object_name == 'jwx':
323 return '\\qJ(\\xw\\f{}\\sX\\N)\\Q'
324
325
326 elif object_name == 'jwh':
327 return '\\qJ(\\xw\\f{}\\sH\\N)\\Q'
328
329
330 elif object_name == 'r':
331 return 'Bond length'
332
333
334 elif object_name == 'csa':
335 return '\\qCSA\\Q'
336
337
339 """Function for returning a string representing the parameters units.
340
341 For example, the internal representation of te is in seconds, whereas the external
342 representation is in picoseconds, therefore this function will return the string
343 'picoseconds' for te.
344 """
345
346
347 object_name = self.return_data_name(data_type)
348
349
350 if object_name == 'r':
351 return 'Angstrom'
352
353
354 elif object_name == 'csa':
355 return 'ppm'
356
357
358 - def set(self, run=None, value=None, error=None, param=None, index=None):
359 """
360 Reduced spectral density mapping set details
361 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
362
363 In reduced spectral density mapping, only two values can be set, the bond length and CSA
364 value. These must be set prior to the calculation of spectral density values.
365
366 """
367
368
369 self.run = run
370
371
372
373
374 if param == None:
375
376 if value:
377
378 if len(value) != 2:
379 raise RelaxError, "The length of " + `len(value)` + " of the value array must be equal to two."
380
381
382 else:
383
384 value = []
385
386
387 value.append(self.default_value('csa'))
388 value.append(self.default_value('r'))
389
390
391 if not hasattr(self.relax.data.res[self.run][index], 'csa') or not hasattr(self.relax.data.res[self.run][index], 'r'):
392 self.data_init(self.relax.data.res[self.run][index])
393
394
395 setattr(self.relax.data.res[self.run][index], 'csa', float(value[0]))
396 setattr(self.relax.data.res[self.run][index], 'r', float(value[1]))
397
398
399
400
401
402 else:
403
404 object_name = self.return_data_name(param)
405 if not object_name:
406 raise RelaxError, "The reduced spectral density mapping data type " + `param` + " does not exist."
407
408
409 if not hasattr(self.relax.data.res[self.run][index], object_name):
410 self.data_init(self.relax.data.res[self.run][index])
411
412
413 if value == None:
414 value = self.default_value(object_name)
415
416
417 setattr(self.relax.data.res[self.run][index], object_name, float(value))
418
419
420 if error != None:
421 setattr(self.relax.data.res[self.run][index], object_name+'_err', float(error))
422
423
424 - def set_frq(self, run=None, frq=None):
425 """Function for selecting which relaxation data to use in the J(w) mapping."""
426
427
428 self.run = run
429
430
431 if not self.run in self.relax.data.run_names:
432 raise RelaxNoRunError, self.run
433
434
435 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
436 if function_type != 'jw':
437 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
438
439
440 if hasattr(self.relax.data, 'jw_frq') and self.relax.data.jw_frq.has_key(self.run):
441 raise RelaxError, "The frequency for the run " + `self.run` + " has already been set."
442
443
444 if not hasattr(self.relax.data, 'jw_frq'):
445 self.relax.data.jw_frq = {}
446
447
448 self.relax.data.jw_frq[self.run] = frq
449
450
451 - def set_error(self, run, instance, index, error):
452 """Function for setting parameter errors."""
453
454
455 self.run = run
456
457
458 if index == 0:
459 self.relax.data.res[self.run][instance].j0_err = error
460
461
462 if index == 1:
463 self.relax.data.res[self.run][instance].jwx_err = error
464
465
466 if index == 2:
467 self.relax.data.res[self.run][instance].jwh_err = error
468
469
471 """Function for returning the array of simulation parameter values."""
472
473
474 self.run = run
475
476
477 if not self.relax.data.res[self.run][instance].select:
478 return
479
480
481 if index == 0:
482 return self.relax.data.res[self.run][instance].j0_sim
483
484
485 if index == 1:
486 return self.relax.data.res[self.run][instance].jwx_sim
487
488
489 if index == 2:
490 return self.relax.data.res[self.run][instance].jwh_sim
491
492
494 """Function for returning the array of selected simulation flags."""
495
496
497 self.run = run
498
499
500 return self.relax.data.res[self.run][instance].select_sim
501
502
504 """Function for returning the array of selected simulation flags."""
505
506
507 self.run = run
508
509
510 self.relax.data.res[self.run][instance].select_sim = select_sim
511
512
514 """Function for packing Monte Carlo simulation data."""
515
516
517 if hasattr(self.relax.data.res[run][i], 'relax_sim_data'):
518 raise RelaxError, "Monte Carlo simulation data already exists."
519
520
521 self.relax.data.res[run][i].relax_sim_data = sim_data
522
523
524 - def write_columnar_line(self, file=None, num=None, name=None, select=None, data_set=None, nucleus=None, wH=None, j0=None, jwx=None, jwh=None, r=None, csa=None, ri_labels=None, remap_table=None, frq_labels=None, frq=None, ri=None, ri_error=None):
525 """Function for printing a single line of the columnar formatted results."""
526
527
528 file.write("%-4s %-5s " % (num, name))
529
530
531 file.write("%-9s %-9s " % (select, data_set))
532
533
534 file.write("%-7s " % nucleus)
535
536
537 file.write("%-25s " % wH)
538
539
540 file.write("%-25s " % j0)
541 file.write("%-25s " % jwx)
542 file.write("%-25s " % jwh)
543 file.write("%-25s " % r)
544 file.write("%-25s " % csa)
545
546
547 if ri_labels:
548 file.write("%-40s " % ri_labels)
549 file.write("%-25s " % remap_table)
550 file.write("%-25s " % frq_labels)
551 file.write("%-30s " % frq)
552
553
554 if ri:
555 for i in xrange(len(ri)):
556 if ri[i] == None:
557 file.write("%-25s " % 'None')
558 else:
559 file.write("%-25s " % ri[i])
560
561
562 if ri_error:
563 for i in xrange(len(ri_error)):
564 if ri_error[i] == None:
565 file.write("%-25s " % 'None')
566 else:
567 file.write("%-25s " % ri_error[i])
568
569
570 file.write("\n")
571
572
574 """Function for printing the results into a file."""
575
576
577 self.run = run
578
579
580 if not self.run in self.relax.data.run_names:
581 raise RelaxNoRunError, self.run
582
583
584 if not self.relax.data.res.has_key(self.run):
585 raise RelaxNoSequenceError, self.run
586
587
588
589
590
591
592 ri = []
593 ri_error = []
594 if hasattr(self.relax.data, 'num_ri'):
595 for i in xrange(self.relax.data.num_ri[self.run]):
596 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]] + ")")
597 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]] + ")")
598
599
600 self.write_columnar_line(file=file, num='Num', name='Name', select='Selected', data_set='Data_set', nucleus='Nucleus', wH='Proton_frq_(MHz)', j0='J(0)', jwx='J(wX)', jwh='J(wH)', r='Bond_length_(A)', csa='CSA_(ppm)', ri_labels='Ri_labels', remap_table='Remap_table', frq_labels='Frq_labels', frq='Frequencies', ri=ri, ri_error=ri_error)
601
602
603
604
605
606
607 nucleus = self.relax.generic.nuclei.find_nucleus()
608
609
610 wH = self.relax.data.jw_frq[self.run] / 1e6
611
612
613 try:
614 ri_labels = replace(`self.relax.data.ri_labels[self.run]`, ' ', '')
615 remap_table = replace(`self.relax.data.remap_table[self.run]`, ' ', '')
616 frq_labels = replace(`self.relax.data.frq_labels[self.run]`, ' ', '')
617 frq = replace(`self.relax.data.frq[self.run]`, ' ', '')
618 except AttributeError:
619 ri_labels = `None`
620 remap_table = `None`
621 frq_labels = `None`
622 frq = `None`
623
624
625 for i in xrange(len(self.relax.data.res[self.run])):
626
627 data = self.relax.data.res[self.run][i]
628
629
630 j0 = None
631 if hasattr(data, 'j0'):
632 j0 = data.j0
633
634
635 jwx = None
636 if hasattr(data, 'jwx'):
637 jwx = data.jwx
638
639
640 jwh = None
641 if hasattr(data, 'jwh'):
642 jwh = data.jwh
643
644
645 r = None
646 if hasattr(data, 'r') and data.r != None:
647 r = data.r / 1e-10
648
649
650 csa = None
651 if hasattr(data, 'csa') and data.csa != None:
652 csa = data.csa / 1e-6
653
654
655 ri = []
656 ri_error = []
657 if hasattr(self.relax.data, 'num_ri'):
658 for i in xrange(self.relax.data.num_ri[self.run]):
659 try:
660
661 index = None
662 for j in xrange(data.num_ri):
663 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]]:
664 index = j
665
666
667 ri.append(`data.relax_data[index]`)
668 ri_error.append(`data.relax_error[index]`)
669
670
671 except:
672 ri.append(None)
673 ri_error.append(None)
674
675
676 self.write_columnar_line(file=file, num=data.num, name=data.name, select=data.select, data_set='value', nucleus=nucleus, wH=`wH`, j0=`j0`, jwx=`jwx`, jwh=`jwh`, r=`r`, csa=`csa`, ri_labels=ri_labels, remap_table=remap_table, frq_labels=frq_labels, frq=frq, ri=ri, ri_error=ri_error)
677
678
679
680
681
682
683 if not hasattr(self.relax.data, 'sim_state'):
684 return
685 elif self.relax.data.sim_state[self.run] == 0:
686 return
687
688
689 for i in xrange(len(self.relax.data.res[self.run])):
690
691 data = self.relax.data.res[self.run][i]
692
693
694 j0 = None
695 if hasattr(data, 'j0_err'):
696 j0 = data.j0_err
697
698
699 jwx = None
700 if hasattr(data, 'jwx_err'):
701 jwx = data.jwx_err
702
703
704 jwh = None
705 if hasattr(data, 'jwh_err'):
706 jwh = data.jwh_err
707
708
709 r = None
710 if hasattr(data, 'r_err') and data.r_err != None:
711 r = data.r_err / 1e-10
712
713
714 csa = None
715 if hasattr(data, 'csa_err') and data.csa_err != None:
716 csa = data.csa_err / 1e-6
717
718
719 ri = []
720 ri_error = []
721 for i in xrange(self.relax.data.num_ri[self.run]):
722 ri.append(None)
723 ri_error.append(None)
724
725
726 self.write_columnar_line(file=file, num=data.num, name=data.name, select=data.select, data_set='error', nucleus=nucleus, wH=`wH`, j0=`j0`, jwx=`jwx`, jwh=`jwh`, r=`r`, csa=`csa`, ri_labels=ri_labels, remap_table=remap_table, frq_labels=frq_labels, frq=frq, ri=ri, ri_error=ri_error)
727
728
729
730
731
732
733 for i in xrange(self.relax.data.sim_number[self.run]):
734
735 for j in xrange(len(self.relax.data.res[self.run])):
736
737 data = self.relax.data.res[self.run][j]
738
739
740 j0 = None
741 if hasattr(data, 'j0_sim'):
742 j0 = data.j0_sim[i]
743
744
745 jwx = None
746 if hasattr(data, 'jwx_sim'):
747 jwx = data.jwx_sim[i]
748
749
750 jwh = None
751 if hasattr(data, 'jwh_sim'):
752 jwh = data.jwh_sim[i]
753
754
755 r = None
756 if hasattr(data, 'r_sim') and data.r_sim != None and data.r_sim[i] != None:
757 r = data.r_sim[i] / 1e-10
758
759
760 csa = None
761 if hasattr(data, 'csa_sim') and data.csa_sim != None and data.csa_sim[i] != None:
762 csa = data.csa_sim[i] / 1e-6
763
764
765 ri = []
766 ri_error = []
767 if hasattr(self.relax.data, 'num_ri'):
768 for k in xrange(self.relax.data.num_ri[self.run]):
769 try:
770
771 index = None
772 for l in xrange(data.num_ri):
773 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]]:
774 index = l
775
776
777 ri.append(`data.relax_sim_data[i][index]`)
778 ri_error.append(`data.relax_error[index]`)
779
780
781 except:
782 ri.append(None)
783 ri_error.append(None)
784
785
786 self.write_columnar_line(file=file, num=data.num, name=data.name, select=data.select, data_set='sim_'+`i`, nucleus=nucleus, wH=`wH`, j0=`j0`, jwx=`jwx`, jwh=`jwh`, r=`r`, csa=`csa`, ri_labels=ri_labels, remap_table=remap_table, frq_labels=frq_labels, frq=frq, ri=ri, ri_error=ri_error)
787