1   
  2   
  3   
  4   
  5   
  6   
  7   
  8   
  9   
 10   
 11   
 12   
 13   
 14   
 15   
 16   
 17   
 18   
 19   
 20   
 21   
 22   
 23  """The automatic relaxation dispersion protocol.""" 
 24   
 25   
 26  from copy import deepcopy 
 27  from os import F_OK, access, getcwd, sep 
 28  import sys 
 29  from warnings import warn 
 30   
 31   
 32  from lib.errors import RelaxError, RelaxNoPipeError 
 33  from lib.text.sectioning import section, subsection, subtitle, title 
 34  from lib.warnings import RelaxWarning 
 35  from pipe_control.mol_res_spin import return_spin, spin_loop 
 36  from pipe_control.pipes import has_pipe 
 37  from prompt.interpreter import Interpreter 
 38  from specific_analyses.relax_disp.data import has_exponential_exp_type, has_cpmg_exp_type, has_fixed_time_exp_type, has_r1rho_exp_type, loop_frq 
 39  from specific_analyses.relax_disp.variables import MODEL_B14, MODEL_B14_FULL, MODEL_CR72, MODEL_CR72_FULL, MODEL_DPL94, MODEL_IT99, MODEL_LIST_ANALYTIC, MODEL_LIST_R1RHO, MODEL_LIST_R1RHO_FULL, MODEL_LM63, MODEL_LM63_3SITE, MODEL_M61, MODEL_M61B, MODEL_MP05, MODEL_MMQ_CR72, MODEL_NS_CPMG_2SITE_3D, MODEL_NS_CPMG_2SITE_3D_FULL, MODEL_NS_CPMG_2SITE_EXPANDED, MODEL_NS_CPMG_2SITE_STAR, MODEL_NS_CPMG_2SITE_STAR_FULL, MODEL_NS_MMQ_2SITE, MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR, MODEL_NS_R1RHO_2SITE, MODEL_NS_R1RHO_3SITE, MODEL_NS_R1RHO_3SITE_LINEAR, MODEL_PARAMS, MODEL_R2EFF, MODEL_TAP03, MODEL_TP02, MODEL_TSMFK01 
 40  from status import Status; status = Status() 
 41   
 42   
 44      """The relaxation dispersion auto-analysis.""" 
 45   
 46       
 47      opt_func_tol = 1e-25 
 48      opt_max_iterations = int(1e7) 
 49   
 50 -    def __init__(self, pipe_name=None, pipe_bundle=None, results_dir=None, models=[MODEL_R2EFF], grid_inc=11, mc_sim_num=500, exp_mc_sim_num=None, modsel='AIC', pre_run_dir=None, insignificance=0.0, numeric_only=False, mc_sim_all_models=False, eliminate=True, set_grid_r20=False): 
  51          """Perform a full relaxation dispersion analysis for the given list of models. 
 52   
 53          @keyword pipe_name:         The name of the data pipe containing all of the data for the analysis. 
 54          @type pipe_name:            str 
 55          @keyword pipe_bundle:       The data pipe bundle to associate all spawned data pipes with. 
 56          @type pipe_bundle:          str 
 57          @keyword results_dir:       The directory where results files are saved. 
 58          @type results_dir:          str 
 59          @keyword models:            The list of relaxation dispersion models to optimise. 
 60          @type models:               list of str 
 61          @keyword grid_inc:          Number of grid search increments.  If set to None, then the grid search will be turned off and the default parameter values will be used instead. 
 62          @type grid_inc:             int or None 
 63          @keyword mc_sim_num:        The number of Monte Carlo simulations to be used for error analysis at the end of the analysis. 
 64          @type mc_sim_num:           int 
 65          @keyword exp_mc_sim_num:    The number of Monte Carlo simulations for the error analysis in the 'R2eff' model when exponential curves are fitted.  This defaults to the value of the mc_sim_num argument when not given.  For the 2-point fixed-time calculation for the 'R2eff' model, this argument is ignored. 
 66          @type exp_mc_sim_num:       int or None 
 67          @type 
 68          @keyword modsel:            The model selection technique to use in the analysis to determine which model is the best for each spin cluster.  This can currently be one of 'AIC', 'AICc', and 'BIC'. 
 69          @type modsel:               str 
 70          @keyword pre_run_dir:       The optional directory containing the dispersion auto-analysis results from a previous run.  The optimised parameters from these previous results will be used as the starting point for optimisation rather than performing a grid search.  This is essential for when large spin clusters are specified, as a grid search becomes prohibitively expensive with clusters of three or more spins.  At some point a RelaxError will occur because the grid search is impossibly large.  For the cluster specific parameters, i.e. the populations of the states and the exchange parameters, an average value will be used as the starting point.  For all other parameters, the R20 values for each spin and magnetic field, as well as the parameters related to the chemical shift difference dw, the optimised values of the previous run will be directly copied. 
 71          @type pre_run_dir:          None or str 
 72          @keyword insignificance:    The R2eff/R1rho value in rad/s by which to judge insignificance.  If the maximum difference between two points on all dispersion curves for a spin is less than this value, that spin will be deselected.  This does not affect the 'No Rex' model.  Set this value to 0.0 to use all data.  The value will be passed on to the relax_disp.insignificance user function. 
 73          @type insignificance:       float 
 74          @keyword numeric_only:      The class of models to use in the model selection.  The default of False allows all dispersion models to be used in the analysis (no exchange, the analytic models and the numeric models).  The value of True will activate a pure numeric solution - the analytic models will be optimised, as they are very useful for replacing the grid search for the numeric models, but the final model selection will not include them. 
 75          @type numeric_only:         bool 
 76          @keyword mc_sim_all_models: A flag which if True will cause Monte Carlo simulations to be performed for each individual model.  Otherwise Monte Carlo simulations will be reserved for the final model. 
 77          @type mc_sim_all_models:    bool 
 78          @keyword eliminate:         A flag which if True will enable the elimination of failed models and failed Monte Carlo simulations through the eliminate user function. 
 79          @type eliminate:            bool 
 80          @keyword set_grid_r20:      A flag which if True will set the grid R20 values from the minimum R2eff values through the r20_from_min_r2eff user function. This will speed up the grid search with a factor GRID_INC^(Nr_spec_freq). For a CPMG experiment with two fields and standard GRID_INC=21, the speed-up is a factor 441. 
 81          @type set_grid_r20:         bool 
 82          """ 
 83   
 84           
 85          title(file=sys.stdout, text="Relaxation dispersion auto-analysis", prespace=4) 
 86   
 87           
 88          status.exec_lock.acquire(pipe_bundle, mode='auto-analysis') 
 89   
 90           
 91          status.init_auto_analysis(pipe_bundle, type='relax_disp') 
 92          status.current_analysis = pipe_bundle 
 93   
 94           
 95          self.pipe_name = pipe_name 
 96          self.pipe_bundle = pipe_bundle 
 97          self.results_dir = results_dir 
 98          self.models = models 
 99          self.grid_inc = grid_inc 
100          self.mc_sim_num = mc_sim_num 
101          self.exp_mc_sim_num = exp_mc_sim_num 
102          self.modsel = modsel 
103          self.pre_run_dir = pre_run_dir 
104          self.insignificance = insignificance 
105          self.set_grid_r20 = set_grid_r20 
106          self.numeric_only = numeric_only 
107          self.mc_sim_all_models = mc_sim_all_models 
108          self.eliminate = eliminate 
109   
110           
111          if not self.results_dir: 
112              self.results_dir = getcwd() 
113   
114           
115          self.check_vars() 
116   
117           
118          self.interpreter = Interpreter(show_script=False, raise_relax_error=True) 
119          self.interpreter.populate_self() 
120          self.interpreter.on(verbose=False) 
121   
122           
123          try: 
124              self.run() 
125   
126           
127          finally: 
128              status.auto_analysis[self.pipe_bundle].fin = True 
129              status.current_analysis = None 
130              status.exec_lock.release() 
 131   
132   
134          """Determine if the model should be used for model selection. 
135   
136          @keyword model: The model to check. 
137          @type model:    str 
138          @return:        True if the model should be included in the model selection list, False if not. 
139          @rtype:         bool 
140          """ 
141   
142           
143          if model == 'R2eff': 
144              return False 
145   
146           
147          if self.numeric_only and model in MODEL_LIST_ANALYTIC: 
148              return False 
149   
150           
151          return True 
 152   
153   
155          """Check that the user has set the variables correctly.""" 
156   
157           
158          section(file=sys.stdout, text="Variable checking", prespace=2) 
159   
160           
161          if not has_pipe(self.pipe_name): 
162              raise RelaxNoPipeError(self.pipe_name) 
163   
164           
165          allowed = ['AIC', 'AICc', 'BIC'] 
166          if self.modsel not in allowed: 
167              raise RelaxError("The model selection technique '%s' is not in the allowed list of %s." % (self.modsel, allowed)) 
168   
169           
170          if self.numeric_only: 
171               
172              for model in self.models: 
173                   
174                  if model in [MODEL_CR72, MODEL_MMQ_CR72, MODEL_MP05]: 
175                      continue 
176   
177                   
178                  if model in MODEL_LIST_ANALYTIC: 
179                      warn(RelaxWarning("The analytic model '%s' will be optimised but will not be used in any way in this numeric model only auto-analysis." % model)) 
180   
181           
182          print("The dispersion auto-analysis variables are OK.") 
 183   
184   
186          """Perform an error analysis of the peak intensities for each field strength separately.""" 
187   
188           
189          section(file=sys.stdout, text="Error analysis", prespace=2) 
190   
191           
192          precalc = True 
193          for spin in spin_loop(skip_desel=True): 
194               
195              if not hasattr(spin, 'peak_intensity_err'): 
196                  precalc = False 
197                  break 
198   
199               
200              for id in cdp.spectrum_ids: 
201                  if id not in spin.peak_intensity_err: 
202                      precalc = False 
203                      break 
204   
205           
206          if precalc: 
207              print("Skipping the error analysis as it has already been performed.") 
208              return 
209   
210           
211          for frq in loop_frq(): 
212               
213              ids = [] 
214              for id in cdp.spectrum_ids: 
215                   
216                  match_frq = True 
217                  if frq != None and cdp.spectrometer_frq[id] != frq: 
218                      match_frq = False 
219   
220                   
221                  if match_frq: 
222                      ids.append(id) 
223   
224               
225              self.interpreter.spectrum.error_analysis(subset=ids) 
 226   
227   
229          """Generate a unique name for the data pipe. 
230   
231          @param prefix:  The prefix of the data pipe name. 
232          @type prefix:   str 
233          """ 
234   
235           
236          name = "%s - %s" % (prefix, self.pipe_bundle) 
237   
238           
239          return name 
 240   
241   
243          """Support for model nesting. 
244   
245          If model nesting is detected, the optimised parameters from the simpler model will be used for the more complex model.  The method will then signal if the nesting condition is met for the model, allowing the grid search to be skipped. 
246   
247   
248          @keyword model: The model to be optimised. 
249          @type model:    str 
250          @return:        True if the model is the more complex model in a nested pair and the parameters of the simpler model have been copied.  False otherwise. 
251          @rtype:         bool 
252          """ 
253   
254           
255          subsection(file=sys.stdout, text="Nesting and model equivalence checks", prespace=1) 
256   
257           
258          nested_pipe = None 
259          if model == MODEL_LM63_3SITE and MODEL_LM63 in self.models: 
260              nested_pipe = self.name_pipe(MODEL_LM63) 
261          if model == MODEL_CR72_FULL and MODEL_CR72 in self.models: 
262              nested_pipe = self.name_pipe(MODEL_CR72) 
263          if model == MODEL_MMQ_CR72 and MODEL_CR72 in self.models: 
264              nested_pipe = self.name_pipe(MODEL_CR72) 
265          if model == MODEL_NS_CPMG_2SITE_3D_FULL and MODEL_NS_CPMG_2SITE_3D in self.models: 
266              nested_pipe = self.name_pipe(MODEL_NS_CPMG_2SITE_3D) 
267          if model == MODEL_NS_CPMG_2SITE_STAR_FULL and MODEL_NS_CPMG_2SITE_STAR in self.models: 
268              nested_pipe = self.name_pipe(MODEL_NS_CPMG_2SITE_STAR) 
269          if model == MODEL_NS_MMQ_3SITE_LINEAR and MODEL_NS_MMQ_2SITE in self.models: 
270              nested_pipe = self.name_pipe(MODEL_NS_MMQ_2SITE) 
271          if model == MODEL_NS_MMQ_3SITE: 
272              if MODEL_NS_MMQ_3SITE_LINEAR in self.models: 
273                  nested_pipe = self.name_pipe(MODEL_NS_MMQ_3SITE_LINEAR) 
274              elif MODEL_NS_MMQ_2SITE in self.models: 
275                  nested_pipe = self.name_pipe(MODEL_NS_MMQ_2SITE) 
276          if model == MODEL_NS_R1RHO_3SITE_LINEAR and MODEL_NS_R1RHO_2SITE in self.models: 
277              nested_pipe = self.name_pipe(MODEL_NS_R1RHO_2SITE) 
278          if model == MODEL_NS_R1RHO_3SITE: 
279              if MODEL_NS_R1RHO_3SITE_LINEAR in self.models: 
280                  nested_pipe = self.name_pipe(MODEL_NS_R1RHO_3SITE_LINEAR) 
281              elif MODEL_NS_R1RHO_2SITE in self.models: 
282                  nested_pipe = self.name_pipe(MODEL_NS_R1RHO_2SITE) 
283   
284   
285           
286          analytic = False 
287          if model in [MODEL_NS_CPMG_2SITE_3D, MODEL_NS_CPMG_2SITE_EXPANDED, MODEL_NS_CPMG_2SITE_STAR] and MODEL_CR72 in self.models: 
288              nested_pipe = self.name_pipe(MODEL_CR72) 
289              analytic = True 
290          elif model == MODEL_NS_MMQ_2SITE and MODEL_MMQ_CR72 in self.models: 
291              nested_pipe = self.name_pipe(MODEL_MMQ_CR72) 
292              analytic = True 
293          if model == MODEL_NS_R1RHO_2SITE and MODEL_MP05 in self.models: 
294              nested_pipe = self.name_pipe(MODEL_MP05) 
295              analytic = True 
296   
297           
298          if not nested_pipe: 
299              print("No model nesting or model equivalence detected.") 
300              return False 
301   
302           
303          if analytic: 
304              print("Model equivalence detected, copying the optimised parameters from the analytic '%s' model rather than performing a grid search." % nested_pipe) 
305          else: 
306              print("Model nesting detected, copying the optimised parameters from the '%s' model rather than performing a grid search." % nested_pipe) 
307   
308           
309          for spin, spin_id in spin_loop(return_id=True, skip_desel=True): 
310               
311              nested_spin = return_spin(spin_id=spin_id, pipe=nested_pipe) 
312   
313               
314              if hasattr(nested_spin, 'r2'): 
315                  if model in [MODEL_CR72_FULL, MODEL_NS_CPMG_2SITE_3D_FULL, MODEL_NS_CPMG_2SITE_STAR_FULL]: 
316                      setattr(spin, 'r2a', deepcopy(nested_spin.r2)) 
317                      setattr(spin, 'r2b', deepcopy(nested_spin.r2)) 
318                  else: 
319                      setattr(spin, 'r2', deepcopy(nested_spin.r2)) 
320   
321               
322              if model == MODEL_LM63_3SITE: 
323                  setattr(spin, 'phi_ex_B', deepcopy(nested_spin.phi_ex)) 
324                  setattr(spin, 'phi_ex_C', deepcopy(nested_spin.phi_ex)) 
325                  setattr(spin, 'kB', deepcopy(nested_spin.kex)) 
326                  setattr(spin, 'kC', deepcopy(nested_spin.kex)) 
327   
328               
329              for param in spin.params: 
330                  if param in ['r2', 'r2a', 'r2b']: 
331                      continue 
332   
333                   
334                  if not hasattr(nested_spin, param): 
335                      continue 
336   
337                   
338                  if model == MODEL_LM63_3SITE and param in ['phi_ex', 'kex']: 
339                      continue 
340   
341                   
342                  setattr(spin, param, deepcopy(getattr(nested_spin, param))) 
343   
344           
345          return True 
 346   
347   
349          """Optimise the model, taking model nesting into account. 
350   
351          @keyword model: The model to be optimised. 
352          @type model:    str 
353          """ 
354   
355           
356          section(file=sys.stdout, text="Optimisation", prespace=2) 
357   
358           
359          if model not in ['R2eff', 'No Rex']: 
360              self.interpreter.relax_disp.insignificance(level=self.insignificance) 
361   
362           
363          if self.set_grid_r20 and model != MODEL_R2EFF: 
364              self.interpreter.relax_disp.r20_from_min_r2eff(force=True) 
365   
366           
367          if self.pre_run_dir: 
368              self.pre_run_parameters(model=model) 
369   
370           
371          else: 
372               
373              nested = self.nesting(model=model) 
374   
375               
376              if not nested: 
377                   
378                  if self.grid_inc: 
379                      self.interpreter.grid_search(inc=self.grid_inc) 
380   
381                   
382                  else: 
383                      for param in MODEL_PARAMS[model]: 
384                          self.interpreter.value.set(param=param, index=None) 
385   
386           
387          self.interpreter.minimise('simplex', func_tol=self.opt_func_tol, max_iter=self.opt_max_iterations, constraints=True) 
388   
389           
390          if self.eliminate: 
391              self.interpreter.eliminate() 
392   
393           
394          if self.mc_sim_all_models or len(self.models) < 2 or model == 'R2eff': 
395              if model == 'R2eff' and self.exp_mc_sim_num != None: 
396                  self.interpreter.monte_carlo.setup(number=self.exp_mc_sim_num) 
397              else: 
398                  self.interpreter.monte_carlo.setup(number=self.mc_sim_num) 
399              self.interpreter.monte_carlo.create_data() 
400              self.interpreter.monte_carlo.initial_values() 
401              self.interpreter.minimise('simplex', func_tol=self.opt_func_tol, max_iter=self.opt_max_iterations, constraints=True) 
402              if self.eliminate: 
403                  self.interpreter.eliminate() 
404              self.interpreter.monte_carlo.error_analysis() 
 405   
406   
433   
434   
436          """Execute the auto-analysis.""" 
437   
438           
439          if MODEL_R2EFF in self.models: 
440              self.error_analysis() 
441   
442           
443          self.model_pipes = [] 
444          for model in self.models: 
445               
446              subtitle(file=sys.stdout, text="The '%s' model" % model, prespace=3) 
447   
448               
449              path = self.results_dir+sep+model 
450   
451               
452              model_pipe = self.name_pipe(model) 
453              if self.is_model_for_selection(model): 
454                  self.model_pipes.append(model_pipe) 
455   
456               
457              path1 = path + sep + 'results' 
458              path2 = path1 + '.bz2' 
459              path3 = path1 + '.gz' 
460              if access(path1, F_OK) or access(path2, F_OK) or access(path2, F_OK): 
461                   
462                  print("Detected the presence of results files for the '%s' model - loading these instead of performing optimisation for a second time." % model) 
463   
464                   
465                  self.interpreter.pipe.create(pipe_name=model_pipe, pipe_type='relax_disp', bundle=self.pipe_bundle) 
466                  self.interpreter.pipe.switch(model_pipe) 
467   
468                   
469                  self.interpreter.results.read(file='results', dir=path) 
470   
471                   
472                  continue 
473   
474               
475              self.interpreter.pipe.copy(pipe_from=self.pipe_name, pipe_to=model_pipe, bundle_to=self.pipe_bundle) 
476              self.interpreter.pipe.switch(model_pipe) 
477   
478               
479              self.interpreter.relax_disp.select_model(model) 
480   
481               
482              if model != MODEL_R2EFF and MODEL_R2EFF in self.models: 
483                  self.interpreter.value.copy(pipe_from=self.name_pipe(MODEL_R2EFF), pipe_to=model_pipe, param='r2eff') 
484   
485               
486              if model == MODEL_R2EFF and not has_exponential_exp_type(): 
487                  self.interpreter.calc() 
488   
489               
490              else: 
491                  self.optimise(model=model) 
492   
493               
494              self.write_results(path=path, model=model) 
495   
496           
497          if len(self.models) >= 2: 
498               
499              section(file=sys.stdout, text="Final results", prespace=2) 
500   
501               
502              self.interpreter.model_selection(method=self.modsel, modsel_pipe=self.name_pipe('final'), bundle=self.pipe_bundle, pipes=self.model_pipes) 
503   
504               
505              if not self.mc_sim_all_models: 
506                  self.interpreter.monte_carlo.setup(number=self.mc_sim_num) 
507                  self.interpreter.monte_carlo.create_data() 
508                  self.interpreter.monte_carlo.initial_values() 
509                  self.interpreter.minimise('simplex', func_tol=self.opt_func_tol, max_iter=self.opt_max_iterations, constraints=True) 
510                  if self.eliminate: 
511                      self.interpreter.eliminate() 
512                  self.interpreter.monte_carlo.error_analysis() 
513   
514               
515              self.write_results(path=self.results_dir+sep+'final') 
516   
517           
518          else: 
519              warn(RelaxWarning("Model selection in the dispersion auto-analysis has been skipped as only %s models have been optimised." % len(self.model_pipes))) 
520   
521           
522          self.interpreter.state.save(state='final_state', dir=self.results_dir, force=True) 
 523   
524   
526          """Create a set of results, text and Grace files for the current data pipe. 
527   
528          @keyword path:  The directory to place the files into. 
529          @type path:     str 
530          """ 
531   
532           
533          section(file=sys.stdout, text="Results writing", prespace=2) 
534   
535           
536          if model == 'R2eff' and has_exponential_exp_type(): 
537              self.interpreter.relax_disp.plot_exp_curves(file='intensities.agr', dir=path, force=True)     
538              self.interpreter.relax_disp.plot_exp_curves(file='intensities_norm.agr', dir=path, force=True, norm=True)     
539   
540           
541          self.interpreter.relax_disp.plot_disp_curves(dir=path, force=True) 
542          self.interpreter.relax_disp.write_disp_curves(dir=path, force=True) 
543   
544           
545          if model == None: 
546              self.interpreter.value.write(param='model', file='model.out', dir=path, force=True) 
547   
548           
549          if model == 'R2eff': 
550              self.interpreter.value.write(param='r2eff', file='r2eff.out', dir=path, force=True) 
551              self.interpreter.grace.write(x_data_type='res_num', y_data_type='r2eff', file='r2eff.agr', dir=path, force=True) 
552   
553           
554          if model == 'R2eff' and has_exponential_exp_type(): 
555              self.interpreter.value.write(param='i0', file='i0.out', dir=path, force=True) 
556              self.interpreter.grace.write(x_data_type='res_num', y_data_type='i0', file='i0.agr', dir=path, force=True) 
557   
558           
559          if model in MODEL_LIST_R1RHO_FULL and has_r1rho_exp_type(): 
560              self.interpreter.value.write(param='theta', file='theta.out', dir=path, force=True) 
561              self.interpreter.value.write(param='w_eff', file='w_eff.out', dir=path, force=True) 
562   
563           
564          if has_cpmg_exp_type() and model in [None, MODEL_LM63, MODEL_B14, MODEL_CR72, MODEL_IT99, MODEL_M61, MODEL_DPL94, MODEL_M61B, MODEL_MMQ_CR72, MODEL_NS_CPMG_2SITE_3D, MODEL_NS_CPMG_2SITE_STAR, MODEL_NS_CPMG_2SITE_EXPANDED, MODEL_NS_MMQ_2SITE, MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR]: 
565              self.interpreter.value.write(param='r2', file='r20.out', dir=path, force=True) 
566              self.interpreter.grace.write(x_data_type='res_num', y_data_type='r2', file='r20.agr', dir=path, force=True) 
567   
568           
569          if has_cpmg_exp_type() and model in [None, MODEL_B14_FULL, MODEL_CR72_FULL, MODEL_NS_CPMG_2SITE_3D_FULL, MODEL_NS_CPMG_2SITE_STAR_FULL]: 
570              self.interpreter.value.write(param='r2a', file='r20a.out', dir=path, force=True) 
571              self.interpreter.value.write(param='r2b', file='r20b.out', dir=path, force=True) 
572              self.interpreter.grace.write(x_data_type='res_num', y_data_type='r2a', file='r20a.agr', dir=path, force=True) 
573              self.interpreter.grace.write(x_data_type='res_num', y_data_type='r2b', file='r20b.agr', dir=path, force=True) 
574   
575           
576          if has_r1rho_exp_type() and model in [None] + MODEL_LIST_R1RHO: 
577              self.interpreter.value.write(param='r2', file='r1rho0.out', dir=path, force=True) 
578              self.interpreter.grace.write(x_data_type='res_num', y_data_type='r2', file='r1rho0.agr', dir=path, force=True) 
579   
580           
581          if model in [None, MODEL_B14, MODEL_B14_FULL, MODEL_CR72, MODEL_CR72_FULL, MODEL_IT99, MODEL_M61B, MODEL_MMQ_CR72, MODEL_NS_CPMG_2SITE_3D, MODEL_NS_CPMG_2SITE_3D_FULL, MODEL_NS_CPMG_2SITE_STAR, MODEL_NS_CPMG_2SITE_STAR_FULL, MODEL_NS_CPMG_2SITE_EXPANDED, MODEL_NS_MMQ_2SITE, MODEL_NS_R1RHO_2SITE, MODEL_NS_R1RHO_3SITE, MODEL_NS_R1RHO_3SITE_LINEAR, MODEL_TP02, MODEL_TAP03, MODEL_MP05, MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR]: 
582              self.interpreter.value.write(param='pA', file='pA.out', dir=path, force=True) 
583              self.interpreter.value.write(param='pB', file='pB.out', dir=path, force=True) 
584              self.interpreter.grace.write(x_data_type='res_num', y_data_type='pA', file='pA.agr', dir=path, force=True) 
585              self.interpreter.grace.write(x_data_type='res_num', y_data_type='pB', file='pB.agr', dir=path, force=True) 
586          if model in [MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR, MODEL_NS_R1RHO_3SITE, MODEL_NS_R1RHO_3SITE_LINEAR]: 
587              self.interpreter.value.write(param='pC', file='pC.out', dir=path, force=True) 
588              self.interpreter.grace.write(x_data_type='res_num', y_data_type='pC', file='pC.agr', dir=path, force=True) 
589   
590           
591          if model in [None, MODEL_LM63, MODEL_M61, MODEL_DPL94]: 
592              self.interpreter.value.write(param='phi_ex', file='phi_ex.out', dir=path, force=True) 
593              self.interpreter.grace.write(x_data_type='res_num', y_data_type='phi_ex', file='phi_ex.agr', dir=path, force=True) 
594   
595           
596          if model in [None, MODEL_LM63_3SITE]: 
597              self.interpreter.value.write(param='phi_ex_B', file='phi_ex_B.out', dir=path, force=True) 
598              self.interpreter.value.write(param='phi_ex_C', file='phi_ex_C.out', dir=path, force=True) 
599              self.interpreter.grace.write(x_data_type='res_num', y_data_type='phi_ex_B', file='phi_ex_B.agr', dir=path, force=True) 
600              self.interpreter.grace.write(x_data_type='res_num', y_data_type='phi_ex_C', file='phi_ex_C.agr', dir=path, force=True) 
601   
602           
603          if model in [None, MODEL_B14, MODEL_B14_FULL, MODEL_CR72, MODEL_CR72_FULL, MODEL_IT99, MODEL_M61B, MODEL_MMQ_CR72, MODEL_NS_CPMG_2SITE_3D, MODEL_NS_CPMG_2SITE_3D_FULL, MODEL_NS_CPMG_2SITE_STAR, MODEL_NS_CPMG_2SITE_STAR_FULL, MODEL_NS_CPMG_2SITE_EXPANDED, MODEL_NS_MMQ_2SITE, MODEL_NS_R1RHO_2SITE, MODEL_TP02, MODEL_TAP03, MODEL_MP05, MODEL_TSMFK01]: 
604              self.interpreter.value.write(param='dw', file='dw.out', dir=path, force=True) 
605              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dw', file='dw.agr', dir=path, force=True) 
606          if model in [MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR, MODEL_NS_R1RHO_3SITE, MODEL_NS_R1RHO_3SITE_LINEAR]: 
607              self.interpreter.value.write(param='dw_AB', file='dw_AB.out', dir=path, force=True) 
608              self.interpreter.value.write(param='dw_BC', file='dw_BC.out', dir=path, force=True) 
609              self.interpreter.value.write(param='dw_AC', file='dw_AC.out', dir=path, force=True) 
610              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dw_AB', file='dw_AB.agr', dir=path, force=True) 
611              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dw_BC', file='dw_BC.agr', dir=path, force=True) 
612              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dw_AC', file='dw_AC.agr', dir=path, force=True) 
613   
614           
615          if model in [None, MODEL_MMQ_CR72, MODEL_NS_MMQ_2SITE]: 
616              self.interpreter.value.write(param='dwH', file='dwH.out', dir=path, force=True) 
617              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dwH', file='dwH.agr', dir=path, force=True) 
618          if model in [MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR]: 
619              self.interpreter.value.write(param='dwH_AB', file='dwH_AB.out', dir=path, force=True) 
620              self.interpreter.value.write(param='dwH_BC', file='dwH_BC.out', dir=path, force=True) 
621              self.interpreter.value.write(param='dwH_AC', file='dwH_AC.out', dir=path, force=True) 
622              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dwH_AB', file='dwH_AB.agr', dir=path, force=True) 
623              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dwH_BC', file='dwH_BC.agr', dir=path, force=True) 
624              self.interpreter.grace.write(x_data_type='res_num', y_data_type='dwH_AC', file='dwH_AC.agr', dir=path, force=True) 
625   
626           
627          if model in [None, MODEL_LM63, MODEL_B14, MODEL_B14_FULL, MODEL_CR72, MODEL_CR72_FULL, MODEL_IT99, MODEL_M61, MODEL_DPL94, MODEL_M61B, MODEL_MMQ_CR72, MODEL_NS_CPMG_2SITE_3D, MODEL_NS_CPMG_2SITE_3D_FULL, MODEL_NS_CPMG_2SITE_STAR, MODEL_NS_CPMG_2SITE_STAR_FULL, MODEL_NS_CPMG_2SITE_EXPANDED, MODEL_NS_MMQ_2SITE, MODEL_NS_R1RHO_2SITE, MODEL_TP02, MODEL_TAP03, MODEL_MP05]: 
628              self.interpreter.value.write(param='k_AB', file='k_AB.out', dir=path, force=True) 
629              self.interpreter.value.write(param='kex', file='kex.out', dir=path, force=True) 
630              self.interpreter.value.write(param='tex', file='tex.out', dir=path, force=True) 
631              self.interpreter.grace.write(x_data_type='res_num', y_data_type='k_AB', file='k_AB.agr', dir=path, force=True) 
632              self.interpreter.grace.write(x_data_type='res_num', y_data_type='kex', file='kex.agr', dir=path, force=True) 
633              self.interpreter.grace.write(x_data_type='res_num', y_data_type='tex', file='tex.agr', dir=path, force=True) 
634          if model in [MODEL_NS_MMQ_3SITE, MODEL_NS_MMQ_3SITE_LINEAR, MODEL_NS_R1RHO_3SITE, MODEL_NS_R1RHO_3SITE_LINEAR]: 
635              self.interpreter.value.write(param='kex_AB', file='kex_AB.out', dir=path, force=True) 
636              self.interpreter.value.write(param='kex_BC', file='kex_BC.out', dir=path, force=True) 
637              self.interpreter.value.write(param='kex_AC', file='kex_AC.out', dir=path, force=True) 
638              self.interpreter.grace.write(x_data_type='res_num', y_data_type='kex_AB', file='kex_AB.agr', dir=path, force=True) 
639              self.interpreter.grace.write(x_data_type='res_num', y_data_type='kex_BC', file='kex_BC.agr', dir=path, force=True) 
640              self.interpreter.grace.write(x_data_type='res_num', y_data_type='kex_AC', file='kex_AC.agr', dir=path, force=True) 
641   
642           
643          if model in [None, MODEL_TSMFK01]: 
644              self.interpreter.value.write(param='k_AB', file='k_AB.out', dir=path, force=True) 
645              self.interpreter.grace.write(x_data_type='res_num', y_data_type='k_AB', file='k_AB.agr', dir=path, force=True) 
646   
647           
648          if model in [None, MODEL_LM63_3SITE]: 
649              self.interpreter.value.write(param='kB', file='kB.out', dir=path, force=True) 
650              self.interpreter.value.write(param='kC', file='kC.out', dir=path, force=True) 
651              self.interpreter.grace.write(x_data_type='res_num', y_data_type='kB', file='kB.agr', dir=path, force=True) 
652              self.interpreter.grace.write(x_data_type='res_num', y_data_type='kC', file='kC.agr', dir=path, force=True) 
653   
654           
655          if not (model == 'R2eff' and has_fixed_time_exp_type()): 
656              self.interpreter.value.write(param='chi2', file='chi2.out', dir=path, force=True) 
657              self.interpreter.grace.write(y_data_type='chi2', file='chi2.agr', dir=path, force=True) 
658   
659           
660          self.interpreter.results.write(file='results', dir=path, force=True) 
  661