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 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.