Hi Troels, This all looks great. I was just wondering what the relaxation time interpolation is for? Is this interpolation or simply zero-filling the end of the relaxation time lists? I don't fully understand what is happening with the concatenate() and unique() section and what is created.
Cheers, Edward On 22 August 2014 14:48, <tlin...@nmr-relax.com> wrote: > Author: tlinnet > Date: Fri Aug 22 14:48:11 2014 > New Revision: 25214 > > URL: http://svn.gna.org/viewcvs/relax?rev=25214&view=rev > Log: > Modified following functions: > > Time points are now saved at the [ei][mi][oi][di] index level. > At this index Ãlevelall time points are saved for the R2eff point. > > - interpolate_disp() > To interpolate time points, all time points through the original dispersion > points di, are > collected and then made unique. This time list can potentially be the largest > of all time lists. > > - interpolate_offset() > To interpolate time points, all time points through the original offset > points, and then dispersion points di, are > collected and then made unique. This time list can potentially be the largest > of all time lists. > > - plot_disp_curves_to_file() > To acquire the original relax_times points. > > - return_r2eff_arrays() > To save all time points on the level of [ei][mi][oi][di]. > At this index level, it will be a numpy array list with all time values used > for fitting. > > bug #22461(https://gna.org/bugs/?22461): NS R1rho 2-site_fit_r1 has extremely > high chi2 value in systemtest Relax_disp.test_r1rho_kjaergaard_missing_r1. > > Modified: > trunk/specific_analyses/relax_disp/data.py > > Modified: trunk/specific_analyses/relax_disp/data.py > URL: > http://svn.gna.org/viewcvs/relax/trunk/specific_analyses/relax_disp/data.py?rev=25214&r1=25213&r2=25214&view=diff > ============================================================================== > --- trunk/specific_analyses/relax_disp/data.py (original) > +++ trunk/specific_analyses/relax_disp/data.py Fri Aug 22 14:48:11 2014 > @@ -52,7 +52,7 @@ > > # Python module imports. > from math import cos, pi, sin, sqrt > -from numpy import array, float64, int32, ones, zeros > +from numpy import array, concatenate, float64, int32, ones, unique, zeros > from os import F_OK, access > from os.path import expanduser > from random import gauss > @@ -775,7 +775,7 @@ > desel_spin(spin_id) > > > -def interpolate_disp(spin=None, spin_id=None, si=None, num_points=None, > extend_hz=None): > +def interpolate_disp(spin=None, spin_id=None, si=None, num_points=None, > extend_hz=None, relax_times=None): > """Interpolate function for 2D Grace plotting function for the > dispersion curves. > > @keyword spin: The specific spin data container. > @@ -788,6 +788,8 @@ > @type num_points: int > @keyword extend_hz: How far to extend the interpolated fitted curves > to (in Hz). > @type extend_hz: float > + @keyword relax_times: The experiment specific fixed time period for > relaxation (in seconds). The dimensions are {Ei, Mi, Oi, Di, Ti}. > + @type relax_times: rank-4 list of floats > @return: The interpolated_flag, list of back calculated > R2eff/R1rho values in rad/s {Ei, Si, Mi, Oi, Di}, list of interpolated > frequencies for cpmg_frqs in Hz {Ei, Si, Mi, Oi, Di}, interpolated spin-lock > offsets in rad/s {Ei, Si, Mi, Oi}, list of interpolated spin-lock field > strength frequencies for spin_lock_nu1_new in Hz {Ei, Si, Mi, Oi, Di}, > chemical shifts in rad/s {Ei, Si, Mi}, interpolated rotating frame tilt > angles theta {Ei, Si, Mi, Oi, Di}, interpolated average resonance offset in > the rotating frame Omega in rad/s {Ei, Si, Mi, Oi, Di} and the interpolated > effective field in rotating frame w_eff in rad/s {Ei, Si, Mi, Oi, Di}. > @rtype: boolean, rank-4 list of numpy rank-1 float > arrays, rank-4 list of numpy rank-1 float arrays, rank-3 list of numpy rank-1 > float arrays, rank-4 list of numpy rank-1 float arrays, rank-2 list of numpy > rank-1 float arrays, rank-4 list of numpy rank-1 float arrays, rank-4 list of > numpy rank-1 float arrays, rank-4 list of numpy rank-1 float arrays > """ > @@ -797,6 +799,7 @@ > # Initialise some structures. > cpmg_frqs_new = None > spin_lock_nu1_new = None > + relax_times_new = None > > # Interpolate the CPMG frequencies (numeric models). > if spin.model in MODEL_LIST_NUMERIC_CPMG or spin.model in [MODEL_B14, > MODEL_B14_FULL]: > @@ -871,28 +874,42 @@ > > if spin_lock_nu1 != None and len(spin_lock_nu1[0][0][0]): > spin_lock_nu1_new = [] > + relax_times_new = [] > for ei in range(len(spin_lock_nu1)): > # Add a new dimension. > spin_lock_nu1_new.append([]) > + relax_times_new.append([]) > > # Then loop over the spectrometer frequencies. > for mi in range(len(spin_lock_nu1[ei])): > # Add a new dimension. > spin_lock_nu1_new[ei].append([]) > + relax_times_new[ei].append([]) > > # Finally the offsets. > for oi in range(len(spin_lock_nu1[ei][mi])): > # Add a new dimension. > spin_lock_nu1_new[ei][mi].append([]) > + relax_times_new[ei][mi].append([]) > > # No data. > if not len(spin_lock_nu1[ei][mi][oi]): > continue > + > + # There is no way to interpolate the time points correct. > + # The best suggestion is to concatenate all values at > original offset, and then make a unique list. > + relax_time_temp = array([]) > + for di_o, times in enumerate(relax_times[ei][mi][oi]): > + relax_time_temp = concatenate( (relax_time_temp, > times) ) > + > + # Make a unique list. > + relax_time_temp = unique(relax_time_temp) > > # Interpolate (adding the extended amount to the end). > for di in range(num_points): > point = (di + 1) * > (max(spin_lock_nu1[ei][mi][oi])+extend_hz) / num_points > spin_lock_nu1_new[ei][mi][oi].append(point) > + relax_times_new[ei][mi][oi].append(relax_time_temp) > > # Convert to a numpy array. > spin_lock_nu1_new[ei][mi][oi] = > array(spin_lock_nu1_new[ei][mi][oi], float64) > @@ -914,12 +931,12 @@ > back_calc = None > else: > # Back calculate R2eff data for the second sets of plots. > - back_calc = > specific_analyses.relax_disp.optimisation.back_calc_r2eff(spin=spin, > spin_id=spin_id, cpmg_frqs=cpmg_frqs_new, spin_lock_nu1=spin_lock_nu1_new) > + back_calc = > specific_analyses.relax_disp.optimisation.back_calc_r2eff(spin=spin, > spin_id=spin_id, cpmg_frqs=cpmg_frqs_new, spin_lock_nu1=spin_lock_nu1_new, > relax_times_new=relax_times_new) > > return interpolated_flag, back_calc, cpmg_frqs_new, offsets, > spin_lock_fields_inter, chemical_shifts, tilt_angles, Delta_omega, w_eff > > > -def interpolate_offset(spin=None, spin_id=None, si=None, num_points=None, > extend_ppm=None): > +def interpolate_offset(spin=None, spin_id=None, si=None, num_points=None, > extend_ppm=None, relax_times=None): > """Interpolate function for 2D Grace plotting function for the > dispersion curves, interpolating through spin-lock offset in rad/s. > > @keyword spin: The specific spin data container. > @@ -932,6 +949,8 @@ > @type num_points: int > @keyword extend_ppm: How far to extend the interpolated fitted curves > to in offset ppm. > @type extend_ppm: float > + @keyword relax_times: The experiment specific fixed time period for > relaxation (in seconds). The dimensions are {Ei, Mi, Oi, Di, Ti}. > + @type relax_times: rank-4 list of floats > @return: The interpolated_flag, list of back calculated > R2eff/R1rho values in rad/s {Ei, Si, Mi, Oi, Di}, list of interpolated > frequencies for cpmg_frqs in Hz {Ei, Si, Mi, Oi, Di}, interpolated spin-lock > offsets in rad/s {Ei, Si, Mi, Oi}, list of interpolated spin-lock field > strength frequencies for spin_lock_nu1_new in Hz {Ei, Si, Mi, Oi, Di}, > chemical shifts in rad/s {Ei, Si, Mi}, interpolated rotating frame tilt > angles theta {Ei, Si, Mi, Oi, Di}, interpolated average resonance offset in > the rotating frame Omega in rad/s {Ei, Si, Mi, Oi, Di} and the interpolated > effective field in rotating frame w_eff in rad/s {Ei, Si, Mi, Oi, Di}. > @rtype: boolean, rank-4 list of numpy rank-1 float > arrays, rank-4 list of numpy rank-1 float arrays, rank-3 list of numpy rank-1 > float arrays, rank-4 list of numpy rank-1 float arrays, rank-2 list of numpy > rank-1 float arrays, rank-4 list of numpy rank-1 float arrays, rank-4 list of > numpy rank-1 float arrays, rank-4 list of numpy rank-1 float arrays > """ > @@ -941,6 +960,7 @@ > > # Initialise some structures. > spin_lock_offset_new = [] > + relax_times_new = None > > # Get the spin-lock field strengths. > spin_lock_nu1 = return_spin_lock_nu1(ref_flag=False) > @@ -985,11 +1005,42 @@ > # The offset data. > offsets, spin_lock_fields_inter, chemical_shifts, tilt_angles, > Delta_omega, w_eff = return_offset_data(spins=[spin], spin_ids=[spin_id], > field_count=field_count, spin_lock_offset=spin_lock_offset_new, > fields=spin_lock_nu1) > > + # Interpolated relaxation time. > + if tilt_angles != None and len(tilt_angles[0][0][0]): > + relax_times_new = [] > + for ei in range(len(tilt_angles)): > + # Add a new dimension. > + relax_times_new.append([]) > + > + # Then loop over the spectrometer frequencies. > + for mi in range(len(tilt_angles[ei])): > + # Add a new dimension. > + relax_times_new[ei].append([]) > + > + # There is no way to interpolate the time points correct. > + # The best suggestion is to concatenate all values at > original offset and dispersion point, and then make a unique list. > + relax_time_temp = array([]) > + for oi_o, relax_times_oi in enumerate(relax_times[ei][mi]): > + for di_o, times in enumerate(relax_times_oi): > + relax_time_temp = concatenate( (relax_time_temp, > times) ) > + > + # Make a unique list. > + relax_time_temp = unique(relax_time_temp) > + > + # Finally the offsets. > + for oi in range(len(tilt_angles[ei][0][mi])): > + # Add a new dimension. > + relax_times_new[ei][mi].append([]) > + > + # Interpolate (adding the extended amount to the end). > + for di in range(len(tilt_angles[ei][0][mi][oi])): > + relax_times_new[ei][mi][oi].append(relax_time_temp) > + > if spin.model == MODEL_R2EFF: > back_calc = None > else: > # Back calculate R2eff data for the second sets of plots. > - back_calc = > specific_analyses.relax_disp.optimisation.back_calc_r2eff(spin=spin, > spin_id=spin_id, spin_lock_offset=spin_lock_offset_new, > spin_lock_nu1=spin_lock_fields_inter) > + back_calc = > specific_analyses.relax_disp.optimisation.back_calc_r2eff(spin=spin, > spin_id=spin_id, spin_lock_offset=spin_lock_offset_new, > spin_lock_nu1=spin_lock_fields_inter, relax_times_new=relax_times_new) > > # cpmg_frqs are not interpolated. > cpmg_frqs_new = None > @@ -1912,6 +1963,16 @@ > linetype = [] > linestyle = [] > > + # Number of spectrometer fields. > + fields = [None] > + field_count = 1 > + if hasattr(cdp, 'spectrometer_frq_count'): > + fields = cdp.spectrometer_frq_list > + field_count = cdp.spectrometer_frq_count > + > + # Get the relax_times. > + values, errors, missing, frqs, frqs_H, exp_types, relax_times = > return_r2eff_arrays(spins=[spin], spin_ids=[spin_id], fields=fields, > field_count=field_count) > + > # Set up the interpolated curve data structures. > interpolated_flag = False > > @@ -1920,11 +1981,11 @@ > > if interpolate == INTERPOLATE_DISP: > # Interpolate through disp points. > - interpolated_flag, back_calc, cpmg_frqs_new, offsets_inter, > spin_lock_nu1_new, chemical_shifts, tilt_angles_inter, Delta_omega_inter, > w_eff_inter = interpolate_disp(spin=spin, spin_id=spin_id, si=si, > num_points=num_points, extend_hz=extend_hz) > + interpolated_flag, back_calc, cpmg_frqs_new, offsets_inter, > spin_lock_nu1_new, chemical_shifts, tilt_angles_inter, Delta_omega_inter, > w_eff_inter = interpolate_disp(spin=spin, spin_id=spin_id, si=si, > num_points=num_points, extend_hz=extend_hz, relax_times=relax_times) > > elif interpolate == INTERPOLATE_OFFSET: > # Interpolate through disp points. > - interpolated_flag, back_calc, cpmg_frqs_new, offsets_inter, > spin_lock_nu1_new, chemical_shifts, tilt_angles_inter, Delta_omega_inter, > w_eff_inter = interpolate_offset(spin=spin, spin_id=spin_id, si=si, > num_points=num_points, extend_ppm=extend_ppm) > + interpolated_flag, back_calc, cpmg_frqs_new, offsets_inter, > spin_lock_nu1_new, chemical_shifts, tilt_angles_inter, Delta_omega_inter, > w_eff_inter = interpolate_offset(spin=spin, spin_id=spin_id, si=si, > num_points=num_points, extend_ppm=extend_ppm, relax_times=relax_times) > > # Do not interpolate, if model is R2eff. > if spin.model == MODEL_R2EFF: > @@ -4318,12 +4379,14 @@ > missing[ei][si].append([]) > frqs[ei][si].append(0.0) > frqs_H[ei][si].append(0.0) > + relax_times[ei].append([]) > for offset, oi in loop_offset(exp_type=exp_type, frq=frq, > return_indices=True): > values[ei][si][mi].append([]) > errors[ei][si][mi].append([]) > missing[ei][si][mi].append([]) > - for mi in range(field_count): > - relax_times[ei].append(None) > + relax_times[ei][mi].append([]) > + for point, di in loop_point(exp_type=exp_type, frq=frq, > offset=offset, return_indices=True): > + relax_times[ei][mi][oi].append([]) > > # Pack the R2eff/R1rho data. > data_flag = False > @@ -4405,34 +4468,8 @@ > errors[ei][si][mi][oi].append(current_spin.r2eff_err[key]) > > # The relaxation times. > - relax_time = [] > - for id in cdp.spectrum_ids: > - # Non-matching data. > - if cdp.spectrometer_frq[id] != frq: > - continue > - if cdp.exp_type[id] != exp_type: > - continue > - if exp_type in EXP_TYPE_LIST_CPMG: > - if id not in cdp.cpmg_frqs.keys() or cdp.cpmg_frqs[id] > != point: > - continue > - else: > - if id not in cdp.spin_lock_nu1.keys() or > cdp.spin_lock_nu1[id] != point: > - continue > - > - # Found. > - relax_time.append(cdp.relax_times[id]) > - > - # Use the maximum time value found. > - relax_time = max(relax_time) > - > - # Check the value if already set. > - if relax_times[ei][mi] != None: > - if relax_times[ei][mi] != relax_time: > - raise RelaxError("The relaxation times do not match for > all experiments.") > - continue > - > - # Store the time. > - relax_times[ei][mi] = relax_time > + for time, ti in loop_time(exp_type=exp_type, frq=frq, > offset=offset, point=point, return_indices=True): > + relax_times[ei][mi][oi][di].append(time) > > # Increment the spin index. > si += 1 > @@ -4442,7 +4479,6 @@ > raise RelaxError("No R2eff/R1rho data could be found for the spin > cluster %s." % spin_ids) > > # Convert to numpy arrays. > - relax_times = array(relax_times, float64) > for exp_type, ei in loop_exp(return_indices=True): > for si in range(spin_num): > for frq, mi in loop_frq(return_indices=True): > @@ -4450,6 +4486,8 @@ > values[ei][si][mi][oi] = array(values[ei][si][mi][oi], > float64) > errors[ei][si][mi][oi] = array(errors[ei][si][mi][oi], > float64) > missing[ei][si][mi][oi] = array(missing[ei][si][mi][oi], > int32) > + for point, di in loop_point(exp_type=exp_type, frq=frq, > offset=offset, return_indices=True): > + relax_times[ei][mi][oi][di] = > array(relax_times[ei][mi][oi][di], float64) > > # Return the structures. > return values, errors, missing, frqs, frqs_H, exp_types, relax_times > > > _______________________________________________ > relax (http://www.nmr-relax.com) > > This is the relax-commits mailing list > relax-comm...@gna.org > > To unsubscribe from this list, get a password > reminder, or change your subscription options, > visit the list information page at > https://mail.gna.org/listinfo/relax-commits _______________________________________________ relax (http://www.nmr-relax.com) This is the relax-devel mailing list relax-devel@gna.org To unsubscribe from this list, get a password reminder, or change your subscription options, visit the list information page at https://mail.gna.org/listinfo/relax-devel