def read(ri_id=None, ri_type=None, frq=None, file=None, dir=None, file_data=None, spin_id_col=None, mol_name_col=None, res_num_col=None, res_name_col=None, spin_num_col=None, spin_name_col=None, data_col=None, error_col=None, sep=None, spin_id=None): """Read R1, R2, or NOE, or R2eff relaxation data from a file. @param ri_id: The relaxation data ID string. @type ri_id: str @param ri_type: The relaxation data type, ie 'R1', 'R2', 'NOE', or 'R2eff'. @type ri_type: str @param frq: The spectrometer proton frequency in Hz. @type frq: float @param file: The name of the file to open. @type file: str @param dir: The directory containing the file (defaults to the current directory if None). @type dir: str or None @param file_data: An alternative opening a file, if the data already exists in the correct format. The format is a list of lists where the first index corresponds to the row and the second the column. @type file_data: list of lists @keyword spin_id_col: The column containing the spin ID strings. If supplied, the mol_name_col, res_name_col, res_num_col, spin_name_col, and spin_num_col arguments must be none. @type spin_id_col: int or None @keyword mol_name_col: The column containing the molecule name information. If supplied, spin_id_col must be None. @type mol_name_col: int or None @keyword res_name_col: The column containing the residue name information. If supplied, spin_id_col must be None. @type res_name_col: int or None @keyword res_num_col: The column containing the residue number information. If supplied, spin_id_col must be None. @type res_num_col: int or None @keyword spin_name_col: The column containing the spin name information. If supplied, spin_id_col must be None. @type spin_name_col: int or None @keyword spin_num_col: The column containing the spin number information. If supplied, spin_id_col must be None. @type spin_num_col: int or None @keyword data_col: The column containing the relaxation data. @type data_col: int or None @keyword error_col: The column containing the relaxation data errors. @type error_col: int or None @keyword sep: The column separator which, if None, defaults to whitespace. @type sep: str or None @keyword spin_id: The spin ID string used to restrict data loading to a subset of all spins. @type spin_id: None or str """ # Test if the current data pipe exists. pipes.test() # Test if sequence data exists. if not exists_mol_res_spin_data(): raise RelaxNoSequenceError # Test if the ri_id already exists. if hasattr(cdp, 'ri_ids') and ri_id in cdp.ri_ids: raise RelaxError("The relaxation ID string '%s' already exists." % ri_id) # Check if the type is valid. if ri_type not in VALID_TYPES: raise RelaxError("The relaxation data type '%s' must be one of %s." % (ri_type, VALID_TYPES)) # Frequency checks. frequency_checks(frq) # Loop over the file data to create the data structures for packing. values = [] errors = [] mol_names = [] res_nums = [] res_names = [] spin_nums = [] spin_names = [] for data in read_spin_data(file=file, dir=dir, file_data=file_data, spin_id_col=spin_id_col, mol_name_col=mol_name_col, res_num_col=res_num_col, res_name_col=res_name_col, spin_num_col=spin_num_col, spin_name_col=spin_name_col, data_col=data_col, error_col=error_col, sep=sep): # Unpack. if data_col and error_col: mol_name, res_num, res_name, spin_num, spin_name, value, error = data elif data_col: mol_name, res_num, res_name, spin_num, spin_name, value = data error = None else: mol_name, res_num, res_name, spin_num, spin_name, error = data value = None # No data. if value == None and error == None: continue # Store all the info. mol_names.append(mol_name) res_nums.append(res_num) res_names.append(res_name) spin_nums.append(spin_num) spin_names.append(spin_name) values.append(value) errors.append(error) # Pack the data. pack_data(ri_id, ri_type, frq, values, errors, mol_names=mol_names, res_nums=res_nums, res_names=res_names, spin_nums=spin_nums, spin_names=spin_names, spin_id=spin_id)
def back_calc(ri_id=None, ri_type=None, frq=None): """Back calculate the relaxation data. If no relaxation data currently exists, then the ri_id, ri_type, and frq args are required. @keyword ri_id: The relaxation data ID string. If not given, all relaxation data will be back calculated. @type ri_id: None or str @keyword ri_type: The relaxation data type. This should be one of 'R1', 'R2', or 'NOE'. @type ri_type: None or str @keyword frq: The spectrometer proton frequency in Hz. @type frq: None or float """ # Test if the current pipe exists. check_pipe() # Test if sequence data is loaded. if not exists_mol_res_spin_data(): raise RelaxNoSequenceError # Check that ri_type and frq are supplied if no relaxation data exists. if ri_id and (not hasattr(cdp, 'ri_ids') or ri_id not in cdp.ri_ids) and (ri_type == None or frq == None): raise RelaxError( "The 'ri_type' and 'frq' arguments must be supplied as no relaxation data corresponding to '%s' exists." % ri_id) # Check if the type is valid. if ri_type and ri_type not in VALID_TYPES: raise RelaxError("The relaxation data type '%s' must be one of %s." % (ri_type, VALID_TYPES)) # Frequency checks. frequency_checks(frq) # Initialise the global data for the current pipe if necessary. if not hasattr(cdp, 'ri_type'): cdp.ri_type = {} if not hasattr(cdp, 'ri_ids'): cdp.ri_ids = [] # Update the global data if needed. if ri_id and ri_id not in cdp.ri_ids: cdp.ri_ids.append(ri_id) cdp.ri_type[ri_id] = ri_type set_frequency(id=ri_id, frq=frq) # The specific analysis API object. api = return_api() # The IDs to loop over. if ri_id == None: ri_ids = cdp.ri_ids else: ri_ids = [ri_id] # The data types. if ri_type == None: ri_types = cdp.ri_type else: ri_types = {ri_id: ri_type} # The frequencies. if frq == None: frqs = cdp.spectrometer_frq else: frqs = {ri_id: frq} # Loop over the spins. for spin, spin_id in spin_loop(return_id=True): # Skip deselected spins. if not spin.select: continue # The global index. spin_index = find_index(spin_id) # Initialise the spin data if necessary. if not hasattr(spin, 'ri_data_bc'): spin.ri_data_bc = {} # Back-calculate the relaxation value. for ri_id in ri_ids: spin.ri_data_bc[ri_id] = api.back_calc_ri(spin_index=spin_index, ri_id=ri_id, ri_type=ri_types[ri_id], frq=frqs[ri_id])
def back_calc(ri_id=None, ri_type=None, frq=None): """Back calculate the relaxation data. If no relaxation data currently exists, then the ri_id, ri_type, and frq args are required. @keyword ri_id: The relaxation data ID string. If not given, all relaxation data will be back calculated. @type ri_id: None or str @keyword ri_type: The relaxation data type. This should be one of 'R1', 'R2', or 'NOE'. @type ri_type: None or str @keyword frq: The spectrometer proton frequency in Hz. @type frq: None or float """ # Test if the current pipe exists. pipes.test() # Test if sequence data is loaded. if not exists_mol_res_spin_data(): raise RelaxNoSequenceError # Check that ri_type and frq are supplied if no relaxation data exists. if ri_id and (not hasattr(cdp, 'ri_ids') or ri_id not in cdp.ri_ids) and (ri_type == None or frq == None): raise RelaxError("The 'ri_type' and 'frq' arguments must be supplied as no relaxation data corresponding to '%s' exists." % ri_id) # Check if the type is valid. if ri_type and ri_type not in VALID_TYPES: raise RelaxError("The relaxation data type '%s' must be one of %s." % (ri_type, VALID_TYPES)) # Frequency checks. frequency_checks(frq) # Initialise the global data for the current pipe if necessary. if not hasattr(cdp, 'ri_type'): cdp.ri_type = {} if not hasattr(cdp, 'ri_ids'): cdp.ri_ids = [] # Update the global data if needed. if ri_id and ri_id not in cdp.ri_ids: cdp.ri_ids.append(ri_id) cdp.ri_type[ri_id] = ri_type set_frequency(id=ri_id, frq=frq) # Specific Ri back calculate function setup. back_calculate = specific_analyses.setup.get_specific_fn('back_calc_ri', pipes.get_type()) # The IDs to loop over. if ri_id == None: ri_ids = cdp.ri_ids else: ri_ids = [ri_id] # The data types. if ri_type == None: ri_types = cdp.ri_type else: ri_types = {ri_id: ri_type} # The frequencies. if frq == None: frqs = cdp.spectrometer_frq else: frqs = {ri_id: frq} # Loop over the spins. for spin, spin_id in spin_loop(return_id=True): # Skip deselected spins. if not spin.select: continue # The global index. spin_index = find_index(spin_id) # Initialise the spin data if necessary. if not hasattr(spin, 'ri_data_bc'): spin.ri_data_bc = {} # Back-calculate the relaxation value. for ri_id in ri_ids: spin.ri_data_bc[ri_id] = back_calculate(spin_index=spin_index, ri_id=ri_id, ri_type=ri_types[ri_id], frq=frqs[ri_id])