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' | -170 * 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 -170 * 1e-6
224
225
227 """Function for returning the number of instances."""
228
229
230 self.run = run
231
232 return len(self.relax.data.res[self.run])
233
234
236 """Dummy function for returning 1.0."""
237
238 return 1.0
239
240
242 """
243 Reduced spectral density mapping data type string matching patterns
244 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
245
246 ____________________________________________________________________________________________
247 | | | |
248 | Data type | Object name | Patterns |
249 |________________________|______________|__________________________________________________|
250 | | | |
251 | J(0) | 'j0' | '^[Jj]0$' or '[Jj](0)' |
252 | | | |
253 | J(wX) | 'jwx' | '^[Jj]w[Xx]$' or '[Jj](w[Xx])' |
254 | | | |
255 | J(wH) | 'jwh' | '^[Jj]w[Hh]$' or '[Jj](w[Hh])' |
256 | | | |
257 | Bond length | 'r' | '^r$' or '[Bb]ond[ -_][Ll]ength' |
258 | | | |
259 | CSA | 'csa' | '^[Cc][Ss][Aa]$' |
260 |________________________|______________|__________________________________________________|
261
262 """
263
264
265 if search('^[Jj]0$', name) or search('[Jj](0)', name):
266 return 'j0'
267
268
269 if search('^[Jj]w[Xx]$', name) or search('[Jj](w[Xx])', name):
270 return 'jwx'
271
272
273 if search('^[Jj]w[Hh]$', name) or search('[Jj](w[Hh])', name):
274 return 'jwh'
275
276
277 if search('^r$', name) or search('[Bb]ond[ -_][Ll]ength', name):
278 return 'r'
279
280
281 if search('^[Cc][Ss][Aa]$', name):
282 return 'csa'
283
284
286 """Function for returning the Grace string representing the data type for axis labelling."""
287
288
289 object_name = self.return_data_name(data_type)
290
291
292 if object_name == 'j0':
293 return '\\qJ(0)\\Q'
294
295
296 elif object_name == 'jwx':
297 return '\\qJ(\\xw\\f{}\\sX\\N)\\Q'
298
299
300 elif object_name == 'jwh':
301 return '\\qJ(\\xw\\f{}\\sH\\N)\\Q'
302
303
304 elif object_name == 'r':
305 return 'Bond length'
306
307
308 elif object_name == 'csa':
309 return '\\qCSA\\Q'
310
311
313 """Function for returning a string representing the parameters units.
314
315 For example, the internal representation of te is in seconds, whereas the external
316 representation is in picoseconds, therefore this function will return the string
317 'picoseconds' for te.
318 """
319
320
321 object_name = self.return_data_name(data_type)
322
323
324 if object_name == 'r':
325 return 'Angstrom'
326
327
328 elif object_name == 'csa':
329 return 'ppm'
330
331
333 """Function for returning the value and error corresponding to 'data_type'."""
334
335
336 self.run = run
337
338
339 data = self.relax.data.res[run][i]
340
341
342 object_name = self.return_data_name(data_type)
343 if not object_name:
344 raise RelaxError, "The reduced spectral density mapping data type " + `data_type` + " does not exist."
345 object_error = object_name + "_err"
346
347
348 value = None
349 if hasattr(data, object_name):
350 value = getattr(data, object_name)
351
352
353 error = None
354 if hasattr(data, object_error):
355 error = getattr(data, object_error)
356
357
358 return value, error
359
360
361 - def set(self, run=None, value=None, error=None, data_type=None, index=None):
362 """
363 Reduced spectral density mapping set details
364 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
365
366 In reduced spectral density mapping, only two values can be set, the bond length and CSA
367 value. These must be set prior to the calculation of spectral density values.
368
369 """
370
371
372 self.run = run
373
374
375
376
377 if data_type == None:
378
379 if value:
380
381 if len(value) != 2:
382 raise RelaxError, "The length of " + `len(value)` + " of the value array must be equal to two."
383
384
385 else:
386
387 value = []
388
389
390 value.append(self.default_value('csa'))
391 value.append(self.default_value('r'))
392
393
394 if not hasattr(self.relax.data.res[self.run][index], 'csa') or not hasattr(self.relax.data.res[self.run][index], 'csa'):
395 self.data_init(self.relax.data.res[self.run][index])
396
397
398 setattr(self.relax.data.res[self.run][index], 'csa', float(value[0]))
399 setattr(self.relax.data.res[self.run][index], 'r', float(value[1]))
400
401
402
403
404
405 else:
406
407 object_name = self.return_data_name(data_type)
408 if not object_name:
409 raise RelaxError, "The reduced spectral density mapping data type " + `data_type` + " does not exist."
410
411
412 if not hasattr(self.relax.data.res[self.run][index], object_name):
413 self.data_init(self.relax.data.res[self.run][index])
414
415
416 if value == None:
417 value = self.default_value(object_name)
418
419
420 setattr(self.relax.data.res[self.run][index], object_name, float(value))
421
422
423 if error != None:
424 setattr(self.relax.data.res[self.run][index], object_name+'_error', float(error))
425
426
427 - def set_frq(self, run=None, frq=None):
428 """Function for selecting which relaxation data to use in the J(w) mapping."""
429
430
431 self.run = run
432
433
434 if not self.run in self.relax.data.run_names:
435 raise RelaxNoRunError, self.run
436
437
438 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
439 if function_type != 'jw':
440 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
441
442
443 if hasattr(self.relax.data, 'jw_frq') and self.relax.data.jw_frq.has_key(self.run):
444 raise RelaxError, "The frequency for the run " + `self.run` + " has already been set."
445
446
447 if not hasattr(self.relax.data, 'jw_frq'):
448 self.relax.data.jw_frq = {}
449
450
451 self.relax.data.jw_frq[self.run] = frq
452
453
454 - def set_error(self, run, instance, index, error):
455 """Function for setting parameter errors."""
456
457
458 self.run = run
459
460
461 if index == 0:
462 self.relax.data.res[self.run][instance].j0_err = error
463
464
465 if index == 1:
466 self.relax.data.res[self.run][instance].jwx_err = error
467
468
469 if index == 2:
470 self.relax.data.res[self.run][instance].jwh_err = error
471
472
474 """Function for returning the array of simulation parameter values."""
475
476
477 self.run = run
478
479
480 if index == 0:
481 return self.relax.data.res[self.run][instance].j0_sim
482
483
484 if index == 1:
485 return self.relax.data.res[self.run][instance].jwx_sim
486
487
488 if index == 2:
489 return self.relax.data.res[self.run][instance].jwh_sim
490
491
492 - 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):
493 """Function for printing a single line of the columnar formatted results."""
494
495
496 file.write("%-4s %-5s " % (num, name))
497
498
499 file.write("%-9s %-9s " % (select, data_set))
500 if not select:
501 file.write("\n")
502 return
503
504
505 file.write("%-7s " % nucleus)
506
507
508 file.write("%-25s " % wH)
509
510
511 file.write("%-25s " % j0)
512 file.write("%-25s " % jwx)
513 file.write("%-25s " % jwh)
514 file.write("%-25s " % r)
515 file.write("%-25s " % csa)
516
517
518 if ri_labels:
519 file.write("%-40s " % ri_labels)
520 file.write("%-25s " % remap_table)
521 file.write("%-25s " % frq_labels)
522 file.write("%-30s " % frq)
523
524
525 if ri:
526 for i in xrange(len(ri)):
527 if ri[i] == None:
528 file.write("%-25s " % 'None')
529 else:
530 file.write("%-25s " % ri[i])
531
532
533 if ri_error:
534 for i in xrange(len(ri_error)):
535 if ri_error[i] == None:
536 file.write("%-25s " % 'None')
537 else:
538 file.write("%-25s " % ri_error[i])
539
540
541 file.write("\n")
542
543
545 """Function for printing the results into a file."""
546
547
548 self.run = run
549
550
551 if not self.run in self.relax.data.run_names:
552 raise RelaxNoRunError, self.run
553
554
555 if not self.relax.data.res.has_key(self.run):
556 raise RelaxNoSequenceError, self.run
557
558
559
560
561
562
563 ri = []
564 ri_error = []
565 if hasattr(self.relax.data, 'num_ri'):
566 for i in xrange(self.relax.data.num_ri[self.run]):
567 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]] + ")")
568 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]] + ")")
569
570
571 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)
572
573
574
575
576
577
578 nucleus = self.relax.generic.nuclei.find_nucleus()
579
580
581 wH = self.relax.data.jw_frq[self.run] / 1e6
582
583
584 try:
585 ri_labels = replace(`self.relax.data.ri_labels[self.run]`, ' ', '')
586 remap_table = replace(`self.relax.data.remap_table[self.run]`, ' ', '')
587 frq_labels = replace(`self.relax.data.frq_labels[self.run]`, ' ', '')
588 frq = replace(`self.relax.data.frq[self.run]`, ' ', '')
589 except AttributeError:
590 ri_labels = `None`
591 remap_table = `None`
592 frq_labels = `None`
593 frq = `None`
594
595
596 for i in xrange(len(self.relax.data.res[self.run])):
597
598 data = self.relax.data.res[self.run][i]
599
600
601 if not data.select:
602 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='value')
603 continue
604
605
606 j0 = None
607 if hasattr(data, 'j0'):
608 j0 = data.j0
609
610
611 jwx = None
612 if hasattr(data, 'jwx'):
613 jwx = data.jwx
614
615
616 jwh = None
617 if hasattr(data, 'jwh'):
618 jwh = data.jwh
619
620
621 r = None
622 if hasattr(data, 'r') and data.r != None:
623 r = data.r / 1e-10
624
625
626 csa = None
627 if hasattr(data, 'csa') and data.csa != None:
628 csa = data.csa / 1e-6
629
630
631 ri = []
632 ri_error = []
633 if hasattr(self.relax.data, 'num_ri'):
634 for i in xrange(self.relax.data.num_ri[self.run]):
635
636 index = None
637 for j in xrange(data.num_ri):
638 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]]:
639 index = j
640
641
642 try:
643 ri.append(`data.relax_data[index]`)
644 ri_error.append(`data.relax_error[index]`)
645 except:
646 ri.append(None)
647 ri_error.append(None)
648
649
650 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)
651
652
653
654
655
656
657 if not hasattr(self.relax.data, 'sim_state'):
658 return
659 elif self.relax.data.sim_state[self.run] == 0:
660 return
661
662
663 for i in xrange(len(self.relax.data.res[self.run])):
664
665 data = self.relax.data.res[self.run][i]
666
667
668 if not data.select:
669 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='error')
670 continue
671
672
673 j0 = None
674 if hasattr(data, 'j0_err'):
675 j0 = data.j0_err
676
677
678 jwx = None
679 if hasattr(data, 'jwx_err'):
680 jwx = data.jwx_err
681
682
683 jwh = None
684 if hasattr(data, 'jwh_err'):
685 jwh = data.jwh_err
686
687
688 r = None
689 if hasattr(data, 'r_err') and data.r_err != None:
690 r = data.r_err / 1e-10
691
692
693 csa = None
694 if hasattr(data, 'csa_err') and data.csa_err != None:
695 csa = data.csa_err / 1e-6
696
697
698 ri = []
699 ri_error = []
700 for i in xrange(self.relax.data.num_ri[self.run]):
701 ri.append(None)
702 ri_error.append(None)
703
704
705 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)
706
707
708
709
710
711
712 for i in xrange(self.relax.data.sim_number[self.run]):
713
714 for j in xrange(len(self.relax.data.res[self.run])):
715
716 data = self.relax.data.res[self.run][j]
717
718
719 if not data.select:
720 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='sim_'+`i`)
721 continue
722
723
724 j0 = None
725 if hasattr(data, 'j0_sim'):
726 j0 = data.j0_sim[i]
727
728
729 jwx = None
730 if hasattr(data, 'jwx_sim'):
731 jwx = data.jwx_sim[i]
732
733
734 jwh = None
735 if hasattr(data, 'jwh_sim'):
736 jwh = data.jwh_sim[i]
737
738
739 r = None
740 if hasattr(data, 'r_sim') and data.r_sim != None and data.r_sim[i] != None:
741 r = data.r_sim[i] / 1e-10
742
743
744 csa = None
745 if hasattr(data, 'csa_sim') and data.csa_sim != None and data.csa_sim[i] != None:
746 csa = data.csa_sim[i] / 1e-6
747
748
749 ri = []
750 ri_error = []
751 for k in xrange(self.relax.data.num_ri[self.run]):
752
753 index = None
754 for l in xrange(data.num_ri):
755 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]]:
756 index = l
757
758
759 try:
760 ri.append(`data.relax_sim_data[i][index]`)
761 ri_error.append(`data.relax_error[index]`)
762 except:
763 ri.append(None)
764 ri_error.append(None)
765
766
767 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)
768