Re: Most efficient way to compare spin.X values between pipes
Hi Edward. Thank you for your suggestion. I will keep this possibility in mind. :-) I think I aim at exporting to a flat text files. Here the value.write function actually fulfil my needs. The loading and saving of state files is to slow for me, and I prefer to also be able to inspect text files quickly. :-) This seems to be a good way to handle the value.write files: - # Importing this to prepare for python 3.x #from __future__ import print_function # Import other import os, re import itertools import numpy as np import matplotlib.pyplot as plt # Loop through methods. METHODS = ['XXX'] for METHOD in METHODS: # Open pipe names file pipes_r2eff_filename = 'pipes_r2eff_%s.txt'%(METHOD) pipes_r2eff_file = open(pipes_r2eff_filename,'r') pipes_r2eff_filelines = pipes_r2eff_file.readlines() pipes_r2eff_file.close() # Extract pipe names setup_pipe_bundle = "%s"%pipes_r2eff_filelines[0].strip() state_save_name = "%s.bz2"%pipes_r2eff_filelines[1].strip() # Extract which to compare to compare_ni_pipe_name_r2eff = pipes_r2eff_filelines[2].strip() # Get index of file with open(os.path.join('r2eff', compare_ni_pipe_name_r2eff), 'r') as f: for line in f: if line.startswith('# mol_name'): fileindex = line.split()[1:] # Remove not allowed letters fileindex = [w.replace('(', '') for w in fileindex] fileindex = [w.replace(')', '') for w in fileindex] fileindex = [w.replace('.', '') for w in fileindex] # Prepare to define what file exist of fdtype="S20,i,S3,i,S5" for item in fileindex[5:]: fdtype += ",f8" print fdtype data = np.genfromtxt(fname=os.path.join('r2eff', compare_ni_pipe_name_r2eff), dtype=fdtype, names=fileindex) print(data.dtype) print(data.dtype.names) print data['%s'%fileindex[0]] print data['%s'%fileindex[6]] 2014-02-14 14:21 GMT+01:00 Edward d'Auvergne : > Hi, > > This is a difficult question as efficiency changes with any change to > the pipe_control.mol_res_spin module, as well as the data set up and > specific questions you have. You should browse the functions in that > module to see what you have access to: > > $ grep "def " pipe_control/mol_res_spin.py > > You may even find that implementing your own custom function in that > module would be the best. I think for your purposes though, that the > spin_index_loop() function is what you need. This loops over the > molecule, residue, and spin indices. From what I understand of your > aims, you will have the same sequence data for all the data pipes you > would like to compare. Is this correct? If this is the case, then > the molecule, residue, and spin indices will be the same for all > pipes. So you could use code in your script such as: > > # relax module imports. > from pipe_control.mol_res_spin import spin_index_loop > from pipe_control.pipes import get_pipe > > # Get the two pipes. > dp1 = get_pipe('first pipe') > dp2 = get_pipe('second pipe') > > # Loop over the sequence data. > for mol_index, res_index, spin_index in spin_index_loop(): > # Alias the spins for the two pipes. > spin1 = dp1.mol[mol_index].res[res_index].spin[spin_index] > spin2 = dp2.mol[mol_index].res[res_index].spin[spin_index] > > # Sanity check. > if spin1.x != spin2.x: > raise RelaxError("X is not X?!?") > > > That should be the absolute fastest implementation. But have a look > at the code to get a better idea. As I know you are after the fastest > possible solution to be able to scan lots of data, looking at the > relax code would give you an idea of what the best solution is. You > may find inefficiencies that can be fixed in the relax code too. > > Regards, > > Edward > > > > On 14 February 2014 12:50, Troels Emtekær Linnet > wrote: > > Hi, > > > > I need an efficient way to compare spin.X values between pipes. > > Here X could be: > > > > - spin.r2eff > > - spin.chi2 > > - spin.kex > > etc. > > > > I have tried implementing the following: > > > > for spin, mol_name, res_num, res_name, spin_id in > spin_loop(full_info=True, > > return_id=True, skip_desel=True): > > cur_r2eff = spin.r2eff[index_str] > > > > The problem is that r2eff is a saved as a dictionary, with a current name > > convention of: > > sq_cpmg_599.%8f_0.000_100.000 > > sq_cpmg_599.%8f_0.000_133.333 > > sq_cpmg_599.%8f_0.000_133.%3f > > > > This naming convention is likely to change pattern. > > > > Do there exist a efficient way to compare data values between two pipes? > > > > I would need to compare one pipe to about 50 other pipes, where each > > pipe contains about 80 spins recorded at 10-15 v_cpmg frequencies. > > > > The difference between pipe data would undergo standard statistics as RMS > > etc. > > > > Best > > Troels > > > > ___ > > relax (http://www.nmr-relax.com) > > > > This is the relax-users mailing list > > relax-users@gna.org > > >
Re: Most efficient way to compare spin.X values between pipes
Hi, This is a difficult question as efficiency changes with any change to the pipe_control.mol_res_spin module, as well as the data set up and specific questions you have. You should browse the functions in that module to see what you have access to: $ grep "def " pipe_control/mol_res_spin.py You may even find that implementing your own custom function in that module would be the best. I think for your purposes though, that the spin_index_loop() function is what you need. This loops over the molecule, residue, and spin indices. From what I understand of your aims, you will have the same sequence data for all the data pipes you would like to compare. Is this correct? If this is the case, then the molecule, residue, and spin indices will be the same for all pipes. So you could use code in your script such as: # relax module imports. from pipe_control.mol_res_spin import spin_index_loop from pipe_control.pipes import get_pipe # Get the two pipes. dp1 = get_pipe('first pipe') dp2 = get_pipe('second pipe') # Loop over the sequence data. for mol_index, res_index, spin_index in spin_index_loop(): # Alias the spins for the two pipes. spin1 = dp1.mol[mol_index].res[res_index].spin[spin_index] spin2 = dp2.mol[mol_index].res[res_index].spin[spin_index] # Sanity check. if spin1.x != spin2.x: raise RelaxError("X is not X?!?") That should be the absolute fastest implementation. But have a look at the code to get a better idea. As I know you are after the fastest possible solution to be able to scan lots of data, looking at the relax code would give you an idea of what the best solution is. You may find inefficiencies that can be fixed in the relax code too. Regards, Edward On 14 February 2014 12:50, Troels Emtekær Linnet wrote: > Hi, > > I need an efficient way to compare spin.X values between pipes. > Here X could be: > > - spin.r2eff > - spin.chi2 > - spin.kex > etc. > > I have tried implementing the following: > > for spin, mol_name, res_num, res_name, spin_id in spin_loop(full_info=True, > return_id=True, skip_desel=True): > cur_r2eff = spin.r2eff[index_str] > > The problem is that r2eff is a saved as a dictionary, with a current name > convention of: > sq_cpmg_599.%8f_0.000_100.000 > sq_cpmg_599.%8f_0.000_133.333 > sq_cpmg_599.%8f_0.000_133.%3f > > This naming convention is likely to change pattern. > > Do there exist a efficient way to compare data values between two pipes? > > I would need to compare one pipe to about 50 other pipes, where each > pipe contains about 80 spins recorded at 10-15 v_cpmg frequencies. > > The difference between pipe data would undergo standard statistics as RMS > etc. > > Best > Troels > > ___ > relax (http://www.nmr-relax.com) > > This is the relax-users mailing list > relax-users@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-users > ___ relax (http://www.nmr-relax.com) This is the relax-users mailing list relax-users@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-users
Re: Most efficient way to compare spin.X values between pipes
I think the most efficient way would be writing out the values to flat files, and then do the analysis on a later point: This would be the value.write function http://www.nmr-relax.com/manual/index.html value.write(param="r2eff", comment="My comment", file="test.txt", force=True) 2014-02-14 12:50 GMT+01:00 Troels Emtekær Linnet : > Hi, > > I need an efficient way to compare spin.X values between pipes. > Here X could be: > > - spin.r2eff > - spin.chi2 > - spin.kex > etc. > > I have tried implementing the following: > > for spin, mol_name, res_num, res_name, spin_id in > spin_loop(full_info=True, return_id=True, skip_desel=True): > cur_r2eff = spin.r2eff[index_str] > > The problem is that r2eff is a saved as a dictionary, with a current name > convention of: > sq_cpmg_599.%8f_0.000_100.000 > sq_cpmg_599.%8f_0.000_133.333 > sq_cpmg_599.%8f_0.000_133.%3f > > This naming convention is likely to change pattern. > > Do there exist a efficient way to compare data values between two pipes? > > I would need to compare one pipe to about 50 other pipes, where each > pipe contains about 80 spins recorded at 10-15 v_cpmg frequencies. > > The difference between pipe data would undergo standard statistics as RMS > etc. > > Best > Troels > ___ relax (http://www.nmr-relax.com) This is the relax-users mailing list relax-users@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-users