1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23   
 24   
 25  """The module for the relaxation dispersion parameter list object.""" 
 26   
 27   
 28  from lib.dispersion.variables import MODEL_LIST_MMQ, MODEL_M61B 
 29  from lib.mathematics import round_to_next_order 
 30  from pipe_control.mol_res_spin import return_spin 
 31  from specific_analyses.parameter_object import Param_list 
 32   
 33   
 34 -def dw_lower(incs=None, model_info=None): 
  35      """Determine the lower grid bound for the dw parameters. 
 36   
 37      @keyword incs:          The number of grid search increments. 
 38      @type incs:             int 
 39      @keyword model_info:    The spin ID strings from the model_loop() specific API method. 
 40      @type model_info:       list of str 
 41      @return:                The lower grid search bound for the dw parameters. 
 42      @rtype:                 float 
 43      """ 
 44   
 45       
 46      spin0 = return_spin(model_info[0]) 
 47   
 48       
 49      if spin0.model in MODEL_LIST_MMQ: 
 50          return -10.0 
 51   
 52       
 53      else: 
 54          return 0.0 
  55   
 56   
 58      """Determine the lower grid bound for the dwH parameters. 
 59   
 60      @keyword incs:          The number of grid search increments. 
 61      @type incs:             int 
 62      @keyword model_info:    The spin ID strings from the model_loop() specific API method. 
 63      @type model_info:       list of str 
 64      @return:                The lower grid search bound for the dwH parameters. 
 65      @rtype:                 float 
 66      """ 
 67   
 68       
 69      spin0 = return_spin(model_info[0]) 
 70   
 71       
 72      if spin0.model in MODEL_LIST_MMQ: 
 73          return -3.0 
 74   
 75       
 76      else: 
 77          return 0.0 
  78   
 79   
 80 -def pA_lower(incs=None, model_info=None): 
  81      """Determine the lower grid bound for the pA parameter. 
 82   
 83      @keyword incs:          The number of grid search increments. 
 84      @type incs:             int 
 85      @keyword model_info:    The spin containers and the spin ID strings from the model_loop() specific API method. 
 86      @type model_info:       list of SpinContainer instances, list of str 
 87      @return:                The lower grid search bound for the pA parameter. 
 88      @rtype:                 float 
 89      """ 
 90   
 91       
 92      spin0 = return_spin(model_info[0]) 
 93   
 94       
 95      if spin0.model == MODEL_M61B: 
 96          return 0.85 
 97   
 98       
 99      else: 
100          return 0.5 
 101   
102   
103 -def i0_upper(incs=None, model_info=None): 
 104      """Find the maximum peak intensity for the cluster. 
105   
106      This is for the grid search upper bound for the I0 parameter. 
107   
108   
109      @keyword incs:          The number of grid search increments. 
110      @type incs:             int 
111      @keyword model_info:    The spin containers and the spin ID strings from the model_loop() specific API method. 
112      @type model_info:       list of SpinContainer instances, list of str 
113      @return:                The maximum peak intensity of all spins and time points. 
114      @rtype:                 float 
115      """ 
116   
117       
118      spin_ids = model_info 
119   
120       
121      upper = 0.0 
122      for si in range(len(spin_ids)): 
123          spin = return_spin(spin_ids[si]) 
124          upper = max(upper, max(spin.peak_intensity.values())) 
125   
126       
127      return round_to_next_order(upper * 2.0) 
 128   
129   
130   
132      """The relaxation dispersion parameter list singleton.""" 
133   
134       
135      _instance = None 
136   
138          """Define all the parameters of the analysis.""" 
139   
140           
141          if self._initialised: return 
142   
143           
144          Param_list.__init__(self) 
145   
146           
147          self._add_peak_intensity() 
148   
149           
150          self._add_sn_ratio() 
151   
152           
153          self._add( 
154              'relax_times', 
155              scope = 'spin', 
156              py_type = dict, 
157              grace_string = '\\qRelaxation time period (s)\\Q' 
158          ) 
159          self._add( 
160              'cpmg_frqs', 
161              scope = 'spin', 
162              py_type = dict, 
163              grace_string = '\\qCPMG pulse train frequency (Hz)\\Q' 
164          ) 
165          self._add( 
166              'spin_lock_nu1', 
167              scope = 'spin', 
168              py_type = dict, 
169              grace_string = '\\qSpin-lock field strength (Hz)\\Q' 
170          ) 
171   
172           
173          self._add_model_info() 
174   
175           
176          self._add( 
177              'r2eff', 
178              scope = 'spin', 
179              default = 10.0, 
180              desc = 'The effective transversal relaxation rate', 
181              py_type = dict, 
182              set = 'params', 
183              grid_lower = 1.0, 
184              grid_upper = 40.0, 
185              grace_string = '\\qR\\s2,eff\\N\\Q (rad.s\\S-1\\N)', 
186              err = True, 
187              sim = True 
188          ) 
189          self._add( 
190              'i0', 
191              scope = 'spin', 
192              default = 10000.0, 
193              desc = 'The initial intensity', 
194              py_type = dict, 
195              set = 'params', 
196              grid_lower = 0.0001, 
197              grid_upper = i0_upper, 
198              grace_string = '\\qI\\s0\\Q', 
199              err = True, 
200              sim = True 
201          ) 
202   
203           
204          self._add( 
205              'r1', 
206              scope = 'spin', 
207              default = 2.0, 
208              desc = 'The longitudinal relaxation rate', 
209              py_type = dict, 
210              set = 'params', 
211              scaling = 10, 
212              grid_lower = 0.1, 
213              grid_upper = 20.0, 
214              grace_string = '\\qR\\s1\\N\\Q (rad.s\\S-1\\N)', 
215              err = True, 
216              sim = True 
217          ) 
218          self._add( 
219              'r2', 
220              scope = 'spin', 
221              default = 10.0, 
222              desc = 'The transversal relaxation rate', 
223              py_type = dict, 
224              set = 'params', 
225              scaling = 10, 
226              grid_lower = 5.0, 
227              grid_upper = 20.0, 
228              grace_string = '\\qR\\s2\\N\\Q (rad.s\\S-1\\N)', 
229              err = True, 
230              sim = True 
231          ) 
232          self._add( 
233              'r2a', 
234              scope = 'spin', 
235              default = 10.0, 
236              desc = 'The transversal relaxation rate for state A in the absence of exchange', 
237              py_type = dict, 
238              set = 'params', 
239              scaling = 10, 
240              grid_lower = 5.0, 
241              grid_upper = 20.0, 
242              grace_string = '\\qR\\s2,A\\N\\Q (rad.s\\S-1\\N)', 
243              err = True, 
244              sim = True 
245          ) 
246          self._add( 
247              'r2b', 
248              scope = 'spin', 
249              default = 10.0, 
250              desc = 'The transversal relaxation rate for state B in the absence of exchange', 
251              py_type = dict, 
252              set = 'params', 
253              scaling = 10, 
254              grid_lower = 5.0, 
255              grid_upper = 20.0, 
256              grace_string = '\\qR\\s2,B\\N\\Q (rad.s\\S-1\\N)', 
257              err = True, 
258              sim = True 
259          ) 
260          self._add( 
261              'pA', 
262              scope = 'spin', 
263              default = 0.90, 
264              desc = 'The population for state A', 
265              py_type = float, 
266              set = 'params', 
267              grid_lower = pA_lower, 
268              grid_upper = 1.0, 
269              grace_string = '\\qp\\sA\\N\\Q', 
270              err = True, 
271              sim = True 
272          ) 
273          self._add( 
274              'pB', 
275              scope = 'spin', 
276              default = 0.5, 
277              desc = 'The population for state B', 
278              py_type = float, 
279              set = 'params', 
280              grid_lower = 0.0, 
281              grid_upper = 0.5, 
282              grace_string = '\\qp\\sB\\N\\Q', 
283              err = True, 
284              sim = True 
285          ) 
286          self._add( 
287              'pC', 
288              scope = 'spin', 
289              default = 0.5, 
290              desc = 'The population for state C', 
291              py_type = float, 
292              set = 'params', 
293              grace_string = '\\qp\\sC\\N\\Q', 
294              err = True, 
295              sim = True 
296          ) 
297          self._add( 
298              'phi_ex', 
299              scope = 'spin', 
300              default = 5.0, 
301              desc = 'The phi_ex = pA.pB.dw**2 value (ppm^2)', 
302              py_type = float, 
303              set = 'params', 
304              grid_lower = 0.0, 
305              grid_upper = 10.0, 
306              grace_string = '\\xF\\B\\sex\\N = \\q p\\sA\\N.p\\sB\\N.\\xDw\\B\\S2\\N\\Q  (ppm\\S2\\N)', 
307              err = True, 
308              sim = True 
309          ) 
310          self._add( 
311              'phi_ex_B', 
312              scope = 'spin', 
313              default = 5.0, 
314              desc = 'The fast exchange factor between sites A and B (ppm^2)', 
315              py_type = float, 
316              set = 'params', 
317              grid_lower = 0.0, 
318              grid_upper = 10.0, 
319              grace_string = '\\xF\\B\\sex,B\\N (ppm\\S2\\N)', 
320              err = True, 
321              sim = True 
322          ) 
323          self._add( 
324              'phi_ex_C', 
325              scope = 'spin', 
326              default = 5.0, 
327              desc = 'The fast exchange factor between sites A and C (ppm^2)', 
328              py_type = float, 
329              set = 'params', 
330              grid_lower = 0.0, 
331              grid_upper = 10.0, 
332              grace_string = '\\xF\\B\\sex,C\\N (ppm\\S2\\N)', 
333              err = True, 
334              sim = True 
335          ) 
336          self._add( 
337              'padw2', 
338              scope = 'spin', 
339              default = 1.0, 
340              desc = 'The pA.dw**2 value (ppm^2)', 
341              py_type = float, 
342              set = 'params', 
343              grid_lower = 0.0, 
344              grid_upper = 10.0, 
345              grace_string = '\\qp\\sA\\N.\\xDw\\B\\S2\\N\\Q  (ppm\\S2\\N)', 
346              err = True, 
347              sim = True 
348          ) 
349          self._add( 
350              'dw', 
351              scope = 'spin', 
352              default = 1.0, 
353              desc = 'The chemical shift difference between states A and B (in ppm)', 
354              py_type = float, 
355              set = 'params', 
356              grid_lower = dw_lower, 
357              grid_upper = 10.0, 
358              grace_string = '\\q\\xDw\\B\\Q (ppm)', 
359              err = True, 
360              sim = True 
361          ) 
362          self._add( 
363              'dw_AB', 
364              scope = 'spin', 
365              default = 1.0, 
366              desc = 'The chemical shift difference between states A and B for 3-site exchange (in ppm)', 
367              py_type = float, 
368              set = 'params', 
369              grid_lower = dw_lower, 
370              grid_upper = 10.0, 
371              grace_string = '\\q\\xDw\\B\\Q\\SAB\\N (ppm)', 
372              err = True, 
373              sim = True 
374          ) 
375          self._add( 
376              'dw_AC', 
377              scope = 'spin', 
378              default = 1.0, 
379              desc = 'The chemical shift difference between states A and C for 3-site exchange (in ppm)', 
380              py_type = float, 
381              set = 'params', 
382              grid_lower = dw_lower, 
383              grid_upper = 10.0, 
384              grace_string = '\\q\\xDw\\B\\Q\\SAC\\N (ppm)', 
385              err = True, 
386              sim = True 
387          ) 
388          self._add( 
389              'dw_BC', 
390              scope = 'spin', 
391              default = 1.0, 
392              desc = 'The chemical shift difference between states B and C for 3-site exchange (in ppm)', 
393              py_type = float, 
394              set = 'params', 
395              grid_lower = dw_lower, 
396              grid_upper = 10.0, 
397              grace_string = '\\q\\xDw\\B\\Q\\SBC\\N (ppm)', 
398              err = True, 
399              sim = True 
400          ) 
401          self._add( 
402              'dwH', 
403              scope = 'spin', 
404              default = 1.0, 
405              desc = 'The proton chemical shift difference between states A and B (in ppm)', 
406              py_type = float, 
407              set = 'params', 
408              grid_lower = dwH_lower, 
409              grid_upper = 3.0, 
410              grace_string = '\\q\\xDw\\B\\sH\\N\\Q (ppm)', 
411              err = True, 
412              sim = True 
413          ) 
414          self._add( 
415              'dwH_AB', 
416              scope = 'spin', 
417              default = 1.0, 
418              desc = 'The proton chemical shift difference between states A and B for 3-site exchange (in ppm)', 
419              py_type = float, 
420              set = 'params', 
421              grid_lower = dwH_lower, 
422              grid_upper = 3.0, 
423              grace_string = '\\q\\xDw\\B\\sH\\N\\Q\\SAB\\N (ppm)', 
424              err = True, 
425              sim = True 
426          ) 
427          self._add( 
428              'dwH_AC', 
429              scope = 'spin', 
430              default = 1.0, 
431              desc = 'The proton chemical shift difference between states A and C for 3-site exchange (in ppm)', 
432              py_type = float, 
433              set = 'params', 
434              grid_lower = dwH_lower, 
435              grid_upper = 3.0, 
436              grace_string = '\\q\\xDw\\B\\sH\\N\\Q\\SAC\\N (ppm)', 
437              err = True, 
438              sim = True 
439          ) 
440          self._add( 
441              'dwH_BC', 
442              scope = 'spin', 
443              default = 1.0, 
444              desc = 'The proton chemical shift difference between states B and C for 3-site exchange (in ppm)', 
445              py_type = float, 
446              set = 'params', 
447              grid_lower = dwH_lower, 
448              grid_upper = 3.0, 
449              grace_string = '\\q\\xDw\\B\\sH\\N\\Q\\SBC\\N (ppm)', 
450              err = True, 
451              sim = True 
452          ) 
453          self._add( 
454              'kex', 
455              scope = 'spin', 
456              default = 1000.0, 
457              desc = 'The exchange rate', 
458              py_type = float, 
459              set = 'params', 
460              scaling = 10000, 
461              grid_lower = 1.0, 
462              grid_upper = 10000.0, 
463              grace_string = '\\qk\\sex\\N\\Q (rad.s\\S-1\\N)', 
464              err = True, 
465              sim = True 
466          ) 
467          self._add( 
468              'kex_AB', 
469              scope = 'spin', 
470              default = 1000.0, 
471              desc = 'The exchange rate between sites A and B for 3-site exchange with kex_AB = k_AB + k_BA (rad.s^-1)', 
472              py_type = float, 
473              set = 'params', 
474              scaling = 10000, 
475              grid_lower = 1.0, 
476              grid_upper = 10000.0, 
477              grace_string = '\\qk\\sex\\N\\Q\\SAB\\N (rad.s\\S-1\\N)', 
478              err = True, 
479              sim = True 
480          ) 
481          self._add( 
482              'kex_AC', 
483              scope = 'spin', 
484              default = 1000.0, 
485              desc = 'The exchange rate between sites A and C for 3-site exchange with kex_AC = k_AC + k_CA (rad.s^-1)', 
486              py_type = float, 
487              set = 'params', 
488              scaling = 10000, 
489              grid_lower = 1.0, 
490              grid_upper = 10000.0, 
491              grace_string = '\\qk\\sex\\N\\Q\\SAC\\N (rad.s\\S-1\\N)', 
492              err = True, 
493              sim = True 
494          ) 
495          self._add( 
496              'kex_BC', 
497              scope = 'spin', 
498              default = 1000.0, 
499              desc = 'The exchange rate between sites B and C for 3-site exchange with kex_BC = k_BC + k_CB (rad.s^-1)', 
500              py_type = float, 
501              set = 'params', 
502              scaling = 10000, 
503              grid_lower = 1.0, 
504              grid_upper = 10000.0, 
505              grace_string = '\\qk\\sex\\N\\Q\\SBC\\N (rad.s\\S-1\\N)', 
506              err = True, 
507              sim = True 
508          ) 
509          self._add( 
510              'kB', 
511              scope = 'spin', 
512              default = 1000.0, 
513              desc = 'Approximate chemical exchange rate constant between sites A and B (rad.s^-1)', 
514              py_type = float, 
515              set = 'params', 
516              scaling = 10000, 
517              grid_lower = 1.0, 
518              grid_upper = 10000.0, 
519              grace_string = '\\qk\\sB\\N\\Q (rad.s\\S-1\\N)', 
520              err = True, 
521              sim = True 
522          ) 
523          self._add( 
524              'kC', 
525              scope = 'spin', 
526              default = 1000.0, 
527              desc = 'Approximate chemical exchange rate constant between sites A and C (rad.s^-1)', 
528              py_type = float, 
529              set = 'params', 
530              scaling = 10000, 
531              grid_lower = 1.0, 
532              grid_upper = 10000.0, 
533              grace_string = '\\qk\\sC\\N\\Q (rad.s\\S-1\\N)', 
534              err = True, 
535              sim = True 
536          ) 
537          self._add( 
538              'tex', 
539              scope = 'spin', 
540              default = 1.0/1000.0, 
541              desc = 'The time of exchange (tex = 1/kex)', 
542              py_type = float, 
543              set = 'params', 
544              scaling = 1e-4, 
545              grid_lower = 1/10000.0, 
546              grid_upper = 1.0, 
547              grace_string = '\\q\\xt\\B\\sex\\N\\Q (s.rad\\S-1\\N)', 
548              err = True, 
549              sim = True 
550          ) 
551          self._add( 
552              'theta', 
553              scope = 'spin', 
554              desc = 'Rotating frame tilt angle : ( theta = arctan(w_1 / Omega) ) (rad)', 
555              grace_string = 'Rotating frame tilt angle (rad)', 
556              py_type = dict, 
557              set = 'all', 
558              err = False, 
559              sim = False 
560          ) 
561          self._add( 
562              'w_eff', 
563              scope = 'spin', 
564              desc = 'Effective field in rotating frame : ( w_eff = sqrt(Omega^2 + w_1^2) ) (rad.s^-1)', 
565              grace_string = 'Effective field in rotating frame (rad.s\\S-1\\N)', 
566              py_type = dict, 
567              set = 'all', 
568              err = False, 
569              sim = False 
570          ) 
571          self._add( 
572              'k_AB', 
573              scope = 'spin', 
574              default = 2.0, 
575              desc = 'The exchange rate from state A to state B', 
576              py_type = float, 
577              set = 'params', 
578              scaling = 20, 
579              grid_lower = 0.1, 
580              grid_upper = 20.0, 
581              grace_string = '\\qk\\sAB\\N\\Q (rad.s\\S-1\\N)', 
582              err = True, 
583              sim = True 
584          ) 
585          self._add( 
586              'k_BA', 
587              scope = 'spin', 
588              default = 1000.0, 
589              desc = 'The exchange rate from state B to state A', 
590              py_type = float, 
591              set = 'params', 
592              scaling = 10000, 
593              grid_lower = 1.0, 
594              grid_upper = 10000.0, 
595              grace_string = '\\qk\\sBA\\N\\Q (rad.s\\S-1\\N)', 
596              err = True, 
597              sim = True 
598          ) 
599   
600           
601          self._add_min_data(min_stats_global=False, min_stats_spin=True) 
602   
603           
604          self._set_uf_title("Relaxation dispersion parameters") 
605          self._uf_param_table(label="table: dispersion parameters", caption="Relaxation dispersion parameters.", type=True) 
606          self._uf_param_table(label="table: dispersion parameters and min stats", caption="Relaxation dispersion parameters and minimisation statistics.", sets=['params', 'fixed', 'min']) 
607          self._uf_param_table(label="table: dispersion parameter value setting", caption="Relaxation dispersion parameters.", type=True) 
608          self._uf_param_table(label="table: dispersion parameter value setting with defaults", caption="Relaxation dispersion parameter value setting.", default=True, type=True) 
609   
610           
611          for doc in self._uf_doc_loop(["table: dispersion parameter value setting", "table: dispersion parameter value setting with defaults"]): 
612              doc.add_paragraph("Any of the relaxation dispersion parameters which are of the 'float' type can be set.  Note that setting values for parameters which are not part of the model will have no effect.") 
  613