* Added support for <sup>1</sup>H SQ CPMG data for the [[:Category:MMQ CPMG data|MMQ-type]] dispersion models. The key is to skip the protons in the spin cluster loops and to instead find the proton spin containers attached to the heteronuclei of the spins of the cluster. The EXP_TYPE_PROTON_SQ_CPMG and EXP_TYPE_PROTON_MQ_CPMG experiment type variables have been created to aid this. The MODEL_LIST_MMQ list variable has also been created to more consistently identify the [[:Category:MMQ CPMG data|MMQ-type]] dispersion models. The has_disp_data() function has been created to simplify the finding of dispersion data for a given cluster, experiment type, spectrometer frequency and dispersion point. The has_proton_sq_cpmg() and has_proton_mq_cpmg() are used to determine if there is proton dispersion data for the given heteronucleus. The loop_exp() function has been modified to yield the proton SQ and MQ data if present. Similarly the num_exp_types() and return_index_from_exp_type() functions exhibit different behaviour if this data is present. The return_r2eff_arrays() function now assembles all of the proton data on top of the heteronuclear data by fetching the protons attached to the heteronuclei and aliasing the correct spin for the given experiment type.
* Updated the relaxation dispersion target functions. The input data structures have changed type.
* Implemented the [[MMQ 2-site]] CPMG model equations from the [Korzhnev et al., 2005 reference. The paper reference is "Dmitry M. Korzhnev, Philipp Neudecker, Anthony Mittermaier, Vladislav Yu. Orekhov, and Lewis E. Kay (2005). Multiple-site exchange in proteins studied with a suite of six NMR relaxation dispersion experiments: An application to the folding of a Fyn SH3 domain mutant. J. Am. Chem. Soc., 127, 15602-15611. (doi: http://dx.doi.org/10.1021/ja054550e)"2005a]. The original code from Mathilde Lescanne and Dominique Marion has only slightly been modified for this change as the MQ data treatment in the Korzhnev et al., 2004 reference is the same as in the 2005 reference, but using a different notation. This has been renamed to r2eff_mmq_2site_mq(). The new r2eff_mmq_2site_sq_dq_zq() function has been added to the lib.dispersion.mmq_2site module to allows the SQ, DQ, and ZQ R<sub>2eff</sub> data to be calculated. This function follows the notation of the 2005 paper. The populate_matrix() function has been modified to only accept one combined chemical shift difference value. It can now also accept different values for R<sub>2A</sub><sup>0</sup> and R<sub>2B</sub><sup>0</sup>, though the mmq_2site module defaults to R<sub>2A</sub><sup>0</sup>=R<sub>2B</sub><sup>0</sup>.
* The r2eff_mmq_*() functions of lib.dispersion.mmq_2site now accept different R<sub>2A</sub><sup>0</sup> and R<sub>2B</sub><sup>0</sup> arguments. These are set to the same thing within the dispersion target function.
* Converted the spin specific 'r2', 'r2a', and 'r2b' dispersion parameters from lists to dictionaries. The new parameter keys are based on the experiment type and the spectrometer frequency. These keys are supported by the generate_r20_key() and decompose_r20_key() pair of functions in the specific_analyses.relax_disp.disp_data module. This enables support for different R<sub>2</sub><sup>0</sup> parameters for each experiment type - a key piece of infrastructure for the [[:Category:MMQ CPMG data|MMQ]] models. The [http://www.nmr-relax.com/manual/relax_disp_select_model.html relax_disp.select_model user function] backend was modified so the parameter list only contains one instance for each of the 'r2', 'r2a', or 'r2b' strings. The specific_analyses.relax_disp.parameters.loop_parameters() function was modified so that the R<sub>2</sub><sup>0</sup>key rather than frequency index is returned for the R<sub>2</sub><sup>0</sup> parameters. Many other code changes were required.