def display(sort=False, rev=False): """Print the details of all the data pipes.""" # Acquire the pipe lock, and make sure it is finally released. status.pipe_lock.acquire(sys._getframe().f_code.co_name) try: # Loop over the data pipes. pipe_names = [] for pipe_name_i in ds: pipe_names.append(pipe_name_i) if sort: pipe_names = sort_filenames(filenames=pipe_names, rev=rev) data = [] for pipe_name in pipe_names: # The current data pipe. current = '' if pipe_name == cdp_name(): current = '*' # Store the data for the print out. data.append([ repr(pipe_name), get_type(pipe_name), repr(get_bundle(pipe_name)), current ]) # Release the lock. finally: status.pipe_lock.release(sys._getframe().f_code.co_name) # Print out. write_data( out=sys.stdout, headings=["Data pipe name", "Data pipe type", "Bundle", "Current"], data=data) # Return data return data
def show_apod_rmsd_dir_to_files(file_ext='.ft2', dir=None, path_to_command='showApod', outdir=None, force=False): """Searches 'dir' for files with extension 'file_ext'. Extract showApod 'Noise Std Dev' from showApod, and write to file with same filename and ending '.rmsd'. @keyword file_ext: The extension for files which is NMRPipe fourier transformed file. @type file_ext: str @keyword dir: The directory where the files is located. @type dir: str @keyword path_to_command: If showApod not in PATH, then specify absolute path as: /path/to/showApod @type path_to_command: str @keyword outdir: The directory where to write the files. If 'None', then write in same directory. @type outdir: str @param force: Boolean argument which if True causes the file to be overwritten if it already exists. @type force: bool @return: Write the 'Noise Std Dev' from showApod to a file with same file filename, with ending '.rmsd'. This will be a list of file paths. @rtype: list of str """ # First get correct dir, no matter if dir is specified with or without system folder separator. dir_files = abspath(dir) # Define glop pattern. glob_pat = '*%s' % file_ext # Get a list of files which math the file extension. file_list = glob(dir_files + sep + glob_pat) # Now sort into Alphanumeric order. file_list_sorted = sort_filenames(filenames=file_list, rev=False) # Loop over the files. rmsd_files = [] for ft_file in file_list_sorted: # Write rmsd to file, and get file path to file. rmsd_file = show_apod_rmsd_to_file(file_name=ft_file, path_to_command=path_to_command, outdir=outdir, force=force) # Collect file path. rmsd_files.append(rmsd_file) return rmsd_files
def signal_noise_ratio(verbose=True): """Calculate the signal to noise ratio per spin. @keyword verbose: A flag which if True will print additional information out. @type verbose: bool """ # Tests. check_pipe() check_mol_res_spin_data() # Test if spectra have been loaded. if not hasattr(cdp, 'spectrum_ids'): raise RelaxError("No spectra have been loaded.") # Possible print. if verbose: print("\nThe following signal to noise ratios has been calculated:\n") # Set the spin specific signal to noise ratio. for spin, spin_id in spin_loop(return_id=True): # Skip deselected spins. if not spin.select: continue # Skip spins missing intensity data. if not hasattr(spin, 'peak_intensity'): continue # Test if error analysis has been performed. if not hasattr(spin, 'peak_intensity_err'): raise RelaxError( "Intensity error analysis has not been performed. Please see spectrum.error_analysis()." ) # If necessary, create the dictionary. if not hasattr(spin, 'sn_ratio'): spin.sn_ratio = {} # Loop over the ID. ids = [] for id in spin.peak_intensity: # Append the ID to the list. ids.append(id) # Calculate the sn_ratio. pint = float(spin.peak_intensity[id]) pint_err = float(spin.peak_intensity_err[id]) sn_ratio = pint / pint_err # Assign the sn_ratio. spin.sn_ratio[id] = sn_ratio # Sort the ids alphanumeric. ids = sort_filenames(filenames=ids, rev=False) # Collect the data under sorted ids. data_i = [] for id in ids: # Get the values. pint = spin.peak_intensity[id] pint_err = spin.peak_intensity_err[id] sn_ratio = spin.sn_ratio[id] # Store the data. data_i.append([id, repr(pint), repr(pint_err), repr(sn_ratio)]) if verbose: section(file=sys.stdout, text="Signal to noise ratio for spin ID '%s'" % spin_id, prespace=1) write_data(out=sys.stdout, headings=["Spectrum ID", "Signal", "Noise", "S/N"], data=data_i)
def sn_ratio_deselection(ratio=10.0, operation='<', all_sn=False, select=False, verbose=True): """Use user function deselect.spin on spins with signal to noise ratio higher or lower than ratio. The operation determines the selection operation. @keyword ratio: The ratio to compare to. @type ratio: float @keyword operation: The comparison operation by which to select the spins. Of the operation(sn_ratio, ratio), where operation can either be: '<', '<=', '>', '>=', '==', '!='. @type operation: str @keyword all_sn: A flag specifying if all the signal to noise ratios per spin should match the comparison operator, of if just a single comparison match is enough. @type all_sn: bool @keyword select: A flag specifying if the user function select.spin should be used instead. @type select: bool @keyword verbose: A flag which if True will print additional information out. @type verbose: bool """ # Tests. check_pipe() check_mol_res_spin_data() # Test if spectra have been loaded. if not hasattr(cdp, 'spectrum_ids'): raise RelaxError("No spectra have been loaded.") # Assign the comparison operator. # "'<' : strictly less than" if operation == '<': op = operator.lt # "'<=' : less than or equal" elif operation == '<=': op = operator.le # "'>' : strictly greater than" elif operation == '>': op = operator.gt # "'>=' : greater than or equal" elif operation == '>=': op = operator.ge # "'==' : equal" elif operation == '==': op = operator.eq # "'!=' : not equal", elif operation == '!=': op = operator.ne # If not assigned, raise error. else: raise RelaxError( "The compare operation does not belong to the allowed list of methods: ['<', '<=', '>', '>=', '==', '!=']" ) # Assign text for print out. if all_sn: text_all_sn = "all" else: text_all_sn = "any" if select: text_sel = "selected" sel_func = sel_spin else: text_sel = "deselected" sel_func = desel_spin # Print section(file=sys.stdout, text="Signal to noise ratio comparison selection", prespace=1, postspace=0) print("For the comparion test: S/N %s %1.1f" % (operation, ratio)) # Loop over the spins. spin_ids = [] for spin, spin_id in spin_loop(return_id=True): # Skip spins missing sn_ratio. if not hasattr(spin, 'sn_ratio'): # Skip warning for deselected spins. if spin.select: warn( RelaxWarning( "Spin '%s' does not contain Signal to Noise calculations. Perform the user function 'spectrum.sn_ratio'. This spin is skipped." % spin_id)) continue # Loop over the ID, collect and sort. ids = [] for id in spin.peak_intensity: # Append the ID to the list. ids.append(id) # Sort the ids alphanumeric. ids = sort_filenames(filenames=ids, rev=False) # Loop over the sorted ids. sn_val = [] for id in ids: # Append the Signal to Noise in the list. sn_val.append(spin.sn_ratio[id]) # Convert the list to array. sn_val = asarray(sn_val) # Make the comparison for the whole array. test_arr = op(sn_val, ratio) # Determine how the test should evaluate. if all_sn: test = test_arr.all() else: test = test_arr.any() # Make an numpy array for the ids, an extract id which failed the test. ids_arr = asarray(ids) ids_test_arr = ids_arr[test_arr] # Make inversion of bool test_arr_inv = test_arr == False ids_test_arr_inv = ids_arr[test_arr_inv] # print if verbose: subsection( file=sys.stdout, text="Signal to noise ratio comparison for spin ID '%s'" % spin_id, prespace=1, postspace=0) print("Following spectra ID evaluated to True: %s" % ids_test_arr) print("Following spectra ID evaluated to False: %s" % ids_test_arr_inv) print( "'%s' comparisons have been used for evaluation, which evaluated to: %s" % (text_all_sn, test)) if test: print("The spin ID '%s' is %s" % (spin_id, text_sel)) else: print("The spin ID '%s' is skipped" % spin_id) # If the test evaluates to True, then do selection action. if test: # Select/Deselect the spin. sel_func(spin_id=spin_id) # Assign spin_id to list, for printing. spin_ids.append(spin_id) # Make summary if verbose: if len(spin_ids) > 0: subsection( file=sys.stdout, text= "For all of the S/N comparion test, the following spin ID's was %s" % text_sel, prespace=1, postspace=0) print(spin_ids)
def sn_ratio_deselection(ratio=10.0, operation='<', all_sn=False, select=False, verbose=True): """Use user function deselect.spin on spins with signal to noise ratio higher or lower than ratio. The operation determines the selection operation. @keyword ratio: The ratio to compare to. @type ratio: float @keyword operation: The comparison operation by which to select the spins. Of the operation(sn_ratio, ratio), where operation can either be: '<', '<=', '>', '>=', '==', '!='. @type operation: str @keyword all_sn: A flag specifying if all the signal to noise ratios per spin should match the comparison operator, of if just a single comparison match is enough. @type all_sn: bool @keyword select: A flag specifying if the user function select.spin should be used instead. @type select: bool @keyword verbose: A flag which if True will print additional information out. @type verbose: bool """ # Tests. check_pipe() check_mol_res_spin_data() # Test if spectra have been loaded. if not hasattr(cdp, 'spectrum_ids'): raise RelaxError("No spectra have been loaded.") # Assign the comparison operator. # "'<' : strictly less than" if operation == '<': op = operator.lt # "'<=' : less than or equal" elif operation == '<=': op = operator.le # "'>' : strictly greater than" elif operation == '>': op = operator.gt # "'>=' : greater than or equal" elif operation == '>=': op = operator.ge # "'==' : equal" elif operation == '==': op = operator.eq # "'!=' : not equal", elif operation == '!=': op = operator.ne # If not assigned, raise error. else: raise RelaxError("The compare operation does not belong to the allowed list of methods: ['<', '<=', '>', '>=', '==', '!=']") # Assign text for print out. if all_sn: text_all_sn = "all" else: text_all_sn = "any" if select: text_sel = "selected" sel_func = sel_spin else: text_sel = "deselected" sel_func = desel_spin # Print section(file=sys.stdout, text="Signal to noise ratio comparison selection", prespace=1, postspace=0) print("For the comparion test: S/N %s %1.1f"%(operation, ratio)) # Loop over the spins. spin_ids = [] for spin, spin_id in spin_loop(return_id=True): # Skip spins missing sn_ratio. if not hasattr(spin, 'sn_ratio'): # Skip warning for deselected spins. if spin.select: warn(RelaxWarning("Spin '%s' does not contain Signal to Noise calculations. Perform the user function 'spectrum.sn_ratio'. This spin is skipped." % spin_id)) continue # Loop over the ID, collect and sort. ids = [] for id in spin.peak_intensity: # Append the ID to the list. ids.append(id) # Sort the ids alphanumeric. ids = sort_filenames(filenames=ids, rev=False) # Loop over the sorted ids. sn_val = [] for id in ids: # Append the Signal to Noise in the list. sn_val.append(spin.sn_ratio[id]) # Convert the list to array. sn_val = asarray(sn_val) # Make the comparison for the whole array. test_arr = op(sn_val, ratio) # Determine how the test should evaluate. if all_sn: test = test_arr.all() else: test = test_arr.any() # Make an numpy array for the ids, an extract id which failed the test. ids_arr = asarray(ids) ids_test_arr = ids_arr[test_arr] # Make inversion of bool test_arr_inv = test_arr == False ids_test_arr_inv = ids_arr[test_arr_inv] # print if verbose: subsection(file=sys.stdout, text="Signal to noise ratio comparison for spin ID '%s'"%spin_id, prespace=1, postspace=0) print("Following spectra ID evaluated to True: %s"%ids_test_arr) print("Following spectra ID evaluated to False: %s"%ids_test_arr_inv) print("'%s' comparisons have been used for evaluation, which evaluated to: %s"%(text_all_sn, test)) if test: print("The spin ID '%s' is %s"%(spin_id, text_sel)) else: print("The spin ID '%s' is skipped"%spin_id) # If the test evaluates to True, then do selection action. if test: # Select/Deselect the spin. sel_func(spin_id=spin_id) # Assign spin_id to list, for printing. spin_ids.append(spin_id) # Make summary if verbose: if len(spin_ids) > 0: subsection(file=sys.stdout, text="For all of the S/N comparion test, the following spin ID's was %s"%text_sel, prespace=1, postspace=0) print(spin_ids)
def signal_noise_ratio(verbose=True): """Calculate the signal to noise ratio per spin. @keyword verbose: A flag which if True will print additional information out. @type verbose: bool """ # Tests. check_pipe() check_mol_res_spin_data() # Test if spectra have been loaded. if not hasattr(cdp, 'spectrum_ids'): raise RelaxError("No spectra have been loaded.") # Possible print. if verbose: print("\nThe following signal to noise ratios has been calculated:\n") # Set the spin specific signal to noise ratio. for spin, spin_id in spin_loop(return_id=True): # Skip deselected spins. if not spin.select: continue # Skip spins missing intensity data. if not hasattr(spin, 'peak_intensity'): continue # Test if error analysis has been performed. if not hasattr(spin, 'peak_intensity_err'): raise RelaxError("Intensity error analysis has not been performed. Please see spectrum.error_analysis().") # If necessary, create the dictionary. if not hasattr(spin, 'sn_ratio'): spin.sn_ratio = {} # Loop over the ID. ids = [] for id in spin.peak_intensity: # Append the ID to the list. ids.append(id) # Calculate the sn_ratio. pint = float(spin.peak_intensity[id]) pint_err = float(spin.peak_intensity_err[id]) sn_ratio = pint / pint_err # Assign the sn_ratio. spin.sn_ratio[id] = sn_ratio # Sort the ids alphanumeric. ids = sort_filenames(filenames=ids, rev=False) # Collect the data under sorted ids. data_i = [] for id in ids: # Get the values. pint = spin.peak_intensity[id] pint_err = spin.peak_intensity_err[id] sn_ratio = spin.sn_ratio[id] # Store the data. data_i.append([id, repr(pint), repr(pint_err), repr(sn_ratio)]) if verbose: section(file=sys.stdout, text="Signal to noise ratio for spin ID '%s'"%spin_id, prespace=1) write_data(out=sys.stdout, headings=["Spectrum ID", "Signal", "Noise", "S/N"], data=data_i)