def back_calc_peak_intensities(spin=None, exp_type=None, frq=None, offset=None, point=None): """Back-calculation of peak intensity for the given relaxation time. @keyword spin: The specific spin data container. @type spin: SpinContainer instance @keyword exp_type: The experiment type. @type exp_type: str @keyword frq: The spectrometer frequency. @type frq: float @keyword offset: For R1rho-type data, the spin-lock offset value in ppm. @type offset: None or float @keyword point: The dispersion point data (either the spin-lock field strength in Hz or the nu_CPMG frequency in Hz). @type point: float @return: The back-calculated peak intensities for the given exponential curve. @rtype: numpy rank-1 float array """ # Check. if not has_exponential_exp_type(): raise RelaxError("Back-calculation is not allowed for the fixed time experiment types.") # The key. param_key = return_param_key_from_data(exp_type=exp_type, frq=frq, offset=offset, point=point) # Create the initial parameter vector. param_vector = assemble_param_vector(spins=[spin], key=param_key) # The peak intensities and times. values = [] errors = [] times = [] for time in loop_time(exp_type=exp_type, frq=frq, offset=offset, point=point): # The data. values.append(average_intensity(spin=spin, exp_type=exp_type, frq=frq, offset=offset, point=point, time=time)) errors.append(average_intensity(spin=spin, exp_type=exp_type, frq=frq, offset=offset, point=point, time=time, error=True)) times.append(time) # The scaling matrix in a diagonalised list form. scaling_list = [] for i in range(len(param_vector)): scaling_list.append(1.0) # Initialise the relaxation fit functions. model = Relax_fit_opt(model='exp', num_params=len(spin.params), values=values, errors=errors, relax_times=times, scaling_matrix=scaling_list) # Make a single function call. This will cause back calculation and the data will be stored in the C module. model.func(param_vector) # Get the data back. results = model.back_calc_data() # Return the correct peak height. return results
def back_calc(spin=None, relax_time_id=None): """Back-calculation of peak intensity for the given relaxation time. @keyword spin: The spin container. @type spin: SpinContainer instance @keyword relax_time_id: The ID string for the desired relaxation time. @type relax_time_id: str @return: The peak intensity for the desired relaxation time. @rtype: float """ # Create the initial parameter vector. param_vector = assemble_param_vector(spin=spin) # The keys. keys = list(spin.peak_intensity.keys()) # The peak intensities and times. values = [] errors = [] times = [] for key in keys: values.append(spin.peak_intensity[key]) errors.append(spin.peak_intensity_err[key]) times.append(cdp.relax_times[key]) # A fake scaling matrix in a diagonalised list form. scaling_list = [] for i in range(len(param_vector)): scaling_list.append(1.0) # Initialise the relaxation fit functions. model = Relax_fit_opt(model=spin.model, num_params=len(spin.params), values=values, errors=errors, relax_times=times, scaling_matrix=scaling_list) # Make a single function call. This will cause back calculation and the data will be stored in the C module. model.func(param_vector) # Get the data back. results = model.back_calc_data() # Return the correct peak height. return results[keys.index(relax_time_id)]
def back_calc_peak_intensities(spin=None, spin_id=None, exp_type=None, frq=None, offset=None, point=None): """Back-calculation of peak intensity for the given relaxation time. @keyword spin: The specific spin data container. @type spin: SpinContainer instance @keyword spin_id: The optional spin ID string for use in warning messages. @type spin_id: str or None @keyword exp_type: The experiment type. @type exp_type: str @keyword frq: The spectrometer frequency. @type frq: float @keyword offset: For R1rho-type data, the spin-lock offset value in ppm. @type offset: None or float @keyword point: The dispersion point data (either the spin-lock field strength in Hz or the nu_CPMG frequency in Hz). @type point: float @return: The back-calculated peak intensities for the given exponential curve. @rtype: numpy rank-1 float array """ # Check. if not has_exponential_exp_type(): raise RelaxError("Back-calculation is not allowed for the fixed time experiment types.") # The key. param_key = return_param_key_from_data(exp_type=exp_type, frq=frq, offset=offset, point=point) # Create the initial parameter vector. param_vector = assemble_param_vector(spins=[spin], key=param_key) # The peak intensities and times. values = [] errors = [] times = [] for time in loop_time(exp_type=exp_type, frq=frq, offset=offset, point=point): # Check the peak intensity keys. int_keys = find_intensity_keys(exp_type=exp_type, frq=frq, offset=offset, point=point, time=time) for i in range(len(int_keys)): if int_keys[i] not in spin.peak_intensity: if spin_id: warn(RelaxWarning("The spin %s peak intensity key '%s' is not present, skipping the back-calculation." % (spin_id, int_keys[i]))) else: warn(RelaxWarning("The peak intensity key '%s' is not present, skipping the back-calculation." % int_keys[i])) return # The data. values.append(average_intensity(spin=spin, exp_type=exp_type, frq=frq, offset=offset, point=point, time=time)) errors.append(average_intensity(spin=spin, exp_type=exp_type, frq=frq, offset=offset, point=point, time=time, error=True)) times.append(time) # The scaling matrix in a diagonalised list form. scaling_list = [] for i in range(len(param_vector)): scaling_list.append(1.0) # Initialise the relaxation fit functions. model = Relax_fit_opt(model='exp', num_params=len(spin.params), values=values, errors=errors, relax_times=times, scaling_matrix=scaling_list) # Make a single function call. This will cause back calculation and the data will be stored in the C module. model.func(param_vector) # Get the data back. results = model.back_calc_data() # Return the correct peak height. return results