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 match
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.initialise_data(data, self.run, 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 returning an initial data structure corresponding to 'name'."""
151
152 return None
153
154
156 """Function for returning a list of names of data structures.
157
158 Description
159 ~~~~~~~~~~~
160
161 r: Bond length.
162
163 csa: CSA value.
164
165 j0: Spectral density value at 0 MHz.
166
167 jwx: Spectral density value at the frequency of the heteronucleus.
168
169 jwh: Spectral density value at the frequency of the heteronucleus.
170 """
171
172
173 names = []
174
175
176 names.append('r')
177 names.append('csa')
178
179
180 names.append('j0')
181 names.append('jwx')
182 names.append('jwh')
183
184 return names
185
186
188 """
189 Reduced spectral density mapping default values
190 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
191
192 _______________________________________________________________________________________
193 | | | |
194 | Data type | Object name | Value |
195 |_______________________________________|______________|______________________________|
196 | | | |
197 | Bond length | r | 1.02 * 1e-10 |
198 |_______________________________________|______________|______________________________|
199 | | | |
200 | CSA | csa | -170 * 1e-6 |
201 |_______________________________________|______________|______________________________|
202
203 """
204
205
206 if param == 'r':
207 return 1.02 * 1e-10
208
209
210 if param == 'CSA':
211 return -170 * 1e-6
212
213
215 """
216 Reduced spectral density mapping data type string matching patterns
217 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
218
219 ____________________________________________________________________________________________
220 | | | |
221 | Data type | Object name | Patterns |
222 |________________________|______________|__________________________________________________|
223 | | | |
224 | Bond length | r | '^r$' or '[Bb]ond[ -_][Ll]ength' |
225 |________________________|______________|__________________________________________________|
226 | | | |
227 | CSA | csa | '^[Cc][Ss][Aa]$' |
228 |________________________|______________|__________________________________________________|
229
230 """
231
232
233 if match('^r$', name) or match('[Bb]ond[ -_][Ll]ength', name):
234 return 'r'
235
236
237 if match('^[Cc][Ss][Aa]$', name):
238 return 'csa'
239
240
242 """Function for returning the number of instances."""
243
244
245 self.run = run
246
247 return len(self.relax.data.res[self.run])
248
249
251 """Function for returning the value and error corresponding to 'data_type'."""
252
253
254 self.run = run
255
256
257 data = self.relax.data.res[run][i]
258
259
260 object_name = self.get_data_name(data_type)
261 if not object_name:
262 raise RelaxError, "The reduced spectral density mapping data type " + `data_type` + " does not exist."
263 object_error = object_name + "_err"
264
265
266 value = None
267 if hasattr(data, object_name):
268 value = getattr(data, object_name)
269
270
271 error = None
272 if hasattr(data, object_error):
273 error = getattr(data, object_error)
274
275
276 return value, error
277
278
279 - def set(self, run=None, value=None, error=None, data_type=None, index=None):
280 """
281 Reduced spectral density mapping set details
282 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
283
284 In reduced spectral density mapping, only two values can be set, the bond length and CSA
285 value. These must be set prior to the calculation of spectral density values.
286
287 """
288
289
290 self.run = run
291
292
293
294
295 if data_type == None:
296
297 if value:
298
299 if len(value) != 2:
300 raise RelaxError, "The length of " + `len(value)` + " of the value array must be equal to two."
301
302
303 else:
304
305 value = []
306
307
308 value.append(self.default_value('csa'))
309 value.append(self.default_value('r'))
310
311
312 if not hasattr(self.relax.data.res[self.run][index], 'csa') or not hasattr(self.relax.data.res[self.run][index], 'csa'):
313 self.initialise_data(self.relax.data.res[self.run][index], self.run)
314
315
316 setattr(self.relax.data.res[self.run][index], 'csa', float(value[0]))
317 setattr(self.relax.data.res[self.run][index], 'r', float(value[1]))
318
319
320
321
322
323 else:
324
325 object_name = self.get_data_name(data_type)
326 if not object_name:
327 raise RelaxError, "The reduced spectral density mapping data type " + `data_type` + " does not exist."
328
329
330 if not hasattr(self.relax.data.res[self.run][index], object_name):
331 self.initialise_data(self.relax.data.res[self.run][index], self.run)
332
333
334 if value == None:
335 value = self.default_value(object_name)
336
337
338 setattr(self.relax.data.res[self.run][index], object_name, float(value))
339
340
341 if error != None:
342 setattr(self.relax.data.res[self.run][index], object_name+'_error', float(error))
343
344
345 - def set_frq(self, run=None, frq=None):
346 """Function for selecting which relaxation data to use in the J(w) mapping."""
347
348
349 self.run = run
350
351
352 if not self.run in self.relax.data.run_names:
353 raise RelaxNoRunError, self.run
354
355
356 function_type = self.relax.data.run_types[self.relax.data.run_names.index(self.run)]
357 if function_type != 'jw':
358 raise RelaxFuncSetupError, self.relax.specific_setup.get_string(function_type)
359
360
361 if hasattr(self.relax.data, 'jw_frq') and self.relax.data.jw_frq.has_key(self.run):
362 raise RelaxError, "The frequency for the run " + `self.run` + " has already been set."
363
364
365 if not hasattr(self.relax.data, 'jw_frq'):
366 self.relax.data.jw_frq = {}
367
368
369 self.relax.data.jw_frq[self.run] = frq
370
371
372 - def set_error(self, run, instance, index, error):
373 """Function for setting parameter errors."""
374
375
376 self.run = run
377
378
379 if index == 0:
380 self.relax.data.res[self.run][instance].j0_err = error
381
382
383 if index == 1:
384 self.relax.data.res[self.run][instance].jwx_err = error
385
386
387 if index == 2:
388 self.relax.data.res[self.run][instance].jwh_err = error
389
390
392 """Function for returning the array of simulation parameter values."""
393
394
395 self.run = run
396
397
398 if index == 0:
399 return self.relax.data.res[self.run][instance].j0_sim
400
401
402 if index == 1:
403 return self.relax.data.res[self.run][instance].jwx_sim
404
405
406 if index == 2:
407 return self.relax.data.res[self.run][instance].jwh_sim
408
409
410 - 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):
411 """Function for printing a single line of the columnar formatted results."""
412
413
414 file.write("%-4s %-5s " % (num, name))
415
416
417 file.write("%-9s %-9s " % (select, data_set))
418 if not select:
419 file.write("\n")
420 return
421
422
423 file.write("%-7s " % nucleus)
424
425
426 file.write("%-25s " % wH)
427
428
429 file.write("%-25s " % j0)
430 file.write("%-25s " % jwx)
431 file.write("%-25s " % jwh)
432 file.write("%-25s " % r)
433 file.write("%-25s " % csa)
434
435
436 if ri_labels:
437 file.write("%-40s " % ri_labels)
438 file.write("%-25s " % remap_table)
439 file.write("%-25s " % frq_labels)
440 file.write("%-30s " % frq)
441
442
443 if ri:
444 for i in xrange(len(ri)):
445 if ri[i] == None:
446 file.write("%-25s " % 'None')
447 else:
448 file.write("%-25s " % ri[i])
449
450
451 if ri_error:
452 for i in xrange(len(ri_error)):
453 if ri_error[i] == None:
454 file.write("%-25s " % 'None')
455 else:
456 file.write("%-25s " % ri_error[i])
457
458
459 file.write("\n")
460
461
463 """Function for printing the results into a file."""
464
465
466 self.run = run
467
468
469 if not self.run in self.relax.data.run_names:
470 raise RelaxNoRunError, self.run
471
472
473 if not self.relax.data.res.has_key(self.run):
474 raise RelaxNoSequenceError, self.run
475
476
477
478
479
480
481 ri = []
482 ri_error = []
483 if hasattr(self.relax.data, 'num_ri'):
484 for i in xrange(self.relax.data.num_ri[self.run]):
485 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]] + ")")
486 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]] + ")")
487
488
489 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)
490
491
492
493
494
495
496 nucleus = self.relax.generic.nuclei.find_nucleus()
497
498
499 wH = self.relax.data.jw_frq[self.run] / 1e6
500
501
502 try:
503 ri_labels = replace(`self.relax.data.ri_labels[self.run]`, ' ', '')
504 remap_table = replace(`self.relax.data.remap_table[self.run]`, ' ', '')
505 frq_labels = replace(`self.relax.data.frq_labels[self.run]`, ' ', '')
506 frq = replace(`self.relax.data.frq[self.run]`, ' ', '')
507 except AttributeError:
508 ri_labels = `None`
509 remap_table = `None`
510 frq_labels = `None`
511 frq = `None`
512
513
514 for i in xrange(len(self.relax.data.res[self.run])):
515
516 data = self.relax.data.res[self.run][i]
517
518
519 if not data.select:
520 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='value')
521 continue
522
523
524 j0 = None
525 if hasattr(data, 'j0'):
526 j0 = data.j0
527
528
529 jwx = None
530 if hasattr(data, 'jwx'):
531 jwx = data.jwx
532
533
534 jwh = None
535 if hasattr(data, 'jwh'):
536 jwh = data.jwh
537
538
539 r = None
540 if hasattr(data, 'r') and data.r != None:
541 r = data.r / 1e-10
542
543
544 csa = None
545 if hasattr(data, 'csa') and data.csa != None:
546 csa = data.csa / 1e-6
547
548
549 ri = []
550 ri_error = []
551 if hasattr(self.relax.data, 'num_ri'):
552 for i in xrange(self.relax.data.num_ri[self.run]):
553
554 index = None
555 for j in xrange(data.num_ri):
556 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]]:
557 index = j
558
559
560 try:
561 ri.append(`data.relax_data[index]`)
562 ri_error.append(`data.relax_error[index]`)
563 except:
564 ri.append(None)
565 ri_error.append(None)
566
567
568 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)
569
570
571
572
573
574
575 if not hasattr(self.relax.data, 'sim_state'):
576 return
577 elif self.relax.data.sim_state[self.run] == 0:
578 return
579
580
581 for i in xrange(len(self.relax.data.res[self.run])):
582
583 data = self.relax.data.res[self.run][i]
584
585
586 if not data.select:
587 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='error')
588 continue
589
590
591 j0 = None
592 if hasattr(data, 'j0_err'):
593 j0 = data.j0_err
594
595
596 jwx = None
597 if hasattr(data, 'jwx_err'):
598 jwx = data.jwx_err
599
600
601 jwh = None
602 if hasattr(data, 'jwh_err'):
603 jwh = data.jwh_err
604
605
606 r = None
607 if hasattr(data, 'r_err') and data.r_err != None:
608 r = data.r_err / 1e-10
609
610
611 csa = None
612 if hasattr(data, 'csa_err') and data.csa_err != None:
613 csa = data.csa_err / 1e-6
614
615
616 ri = []
617 ri_error = []
618 for i in xrange(self.relax.data.num_ri[self.run]):
619 ri.append(None)
620 ri_error.append(None)
621
622
623 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)
624
625
626
627
628
629
630 for i in xrange(self.relax.data.sim_number[self.run]):
631
632 for j in xrange(len(self.relax.data.res[self.run])):
633
634 data = self.relax.data.res[self.run][j]
635
636
637 if not data.select:
638 self.write_columnar_line(file=file, num=data.num, name=data.name, select=0, data_set='sim_'+`i`)
639 continue
640
641
642 j0 = None
643 if hasattr(data, 'j0_sim'):
644 j0 = data.j0_sim[i]
645
646
647 jwx = None
648 if hasattr(data, 'jwx_sim'):
649 jwx = data.jwx_sim[i]
650
651
652 jwh = None
653 if hasattr(data, 'jwh_sim'):
654 jwh = data.jwh_sim[i]
655
656
657 r = None
658 if hasattr(data, 'r_sim') and data.r_sim != None and data.r_sim[i] != None:
659 r = data.r_sim[i] / 1e-10
660
661
662 csa = None
663 if hasattr(data, 'csa_sim') and data.csa_sim != None and data.csa_sim[i] != None:
664 csa = data.csa_sim[i] / 1e-6
665
666
667 ri = []
668 ri_error = []
669 for k in xrange(self.relax.data.num_ri[self.run]):
670
671 index = None
672 for l in xrange(data.num_ri):
673 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]]:
674 index = l
675
676
677 try:
678 ri.append(`data.relax_sim_data[i][index]`)
679 ri_error.append(`data.relax_error[index]`)
680 except:
681 ri.append(None)
682 ri_error.append(None)
683
684
685 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)
686