def sherekhan_input(spin_id=None, force=False, dir='ShereKhan'): """Create the ShereKhan input files. @keyword spin_id: The spin ID string to restrict the file creation to. @type spin_id: str @keyword force: A flag which if True will cause all pre-existing files to be overwritten. @type force: bool @keyword dir: The optional directory to place the files into. If None, then the files will be placed into the current directory. @type dir: str or None """ # Test if the current pipe exists. check_pipe() # Test if sequence data is loaded. if not exists_mol_res_spin_data(): raise RelaxNoSequenceError # Test if the experiment type has been set. if not hasattr(cdp, 'exp_type'): raise RelaxError("The relaxation dispersion experiment type has not been specified.") # Test if the model has been set. if not hasattr(cdp, 'model_type'): raise RelaxError("The relaxation dispersion model has not been specified.") # Directory creation. if dir != None: mkdir_nofail(dir, verbosity=0) # Loop over the spin blocks. cluster_index = 0 for spin_ids in loop_cluster(): # The spin containers. spins = spin_ids_to_containers(spin_ids) # Loop over the magnetic fields. for exp_type, frq, ei, mi in loop_exp_frq(return_indices=True): # Loop over the time, and count it. time_i = 0 for time, ti in loop_time(exp_type=exp_type, frq=frq, return_indices=True): time_i += 1 # Check that not more than one time point is returned. if time_i > 1: raise RelaxError("Number of returned time poins is %i. Only 1 time point is expected."%time_i) # The ShereKhan input file for the spin cluster. file_name = 'sherekhan_frq%s.in' % (mi+1) if dir != None: dir_name = dir + sep + 'cluster%s' % (cluster_index+1) else: dir_name = 'cluster%s' % (cluster_index+1) file = open_write_file(file_name=file_name, dir=dir_name, force=force) # The B0 field for the nuclei of interest in MHz (must be positive to be accepted by the server). file.write("%.10f\n" % abs(frq / periodic_table.gyromagnetic_ratio('1H') * periodic_table.gyromagnetic_ratio('15N') / 1e6)) # The constant relaxation time for the CPMG experiment in seconds. file.write("%s\n" % (time)) # The comment line. file.write("# %-18s %-20s %-20s\n" % ("nu_cpmg (Hz)", "R2eff (rad/s)", "Error")) # Loop over the spins of the cluster. for i in range(len(spins)): # Get the residue container. res = return_residue(spin_ids[i]) # Name the residue if needed. res_name = res.name if res_name == None: res_name = 'X' # Initialise the lines to output (to be able to catch missing data). lines = [] # The residue ID line. lines.append("# %s%s\n" % (res_name, res.num)) # Loop over the dispersion points. for offset, point in loop_offset_point(exp_type=exp_type, frq=frq, skip_ref=True): # The parameter key. param_key = return_param_key_from_data(exp_type=exp_type, frq=frq, offset=offset, point=point) # No data. if param_key not in spins[i].r2eff: continue # Store the data. lines.append("%20.15g %20.13g %20.13g\n" % (point, spins[i].r2eff[param_key], spins[i].r2eff_err[param_key])) # No data. if len(lines) == 1: continue # Write out the data. for line in lines: file.write(line) # Close the file. file.close() # Increment the cluster index. cluster_index += 1
def copy(pipe_from=None, pipe_to=None): """Copy dispersion parameters from one data pipe to another, taking the median of previous values to a start value for clusters. Taking the median prevent averaging extreme outliers. @param pipe_from: The data pipe to copy the value from. This defaults to the current data pipe. @type pipe_from: str @param pipe_to: The data pipe to copy the value to. This defaults to the current data pipe. @type pipe_to: str """ # The current data pipe. pipe_orig = pipes.cdp_name() if pipe_from == None: pipe_from = pipe_orig if pipe_to == None: pipe_to = pipe_orig # Test that the pipes exist. check_pipe(pipe_from) check_pipe(pipe_to) # Test that the pipes are not the same. if pipe_from == pipe_to: raise RelaxError("The source and destination pipes cannot be the same.") # Test if the sequence data for pipe_from is loaded. if not exists_mol_res_spin_data(pipe_from): raise RelaxNoSequenceError(pipe_from) # Test if the sequence data for pipe_to is loaded. if not exists_mol_res_spin_data(pipe_to): raise RelaxNoSequenceError(pipe_to) # Switch to the destination data pipe. pipes.switch(pipe_to) # Loop over the clusters. for spin_ids in loop_cluster(): # Initialise some variables. model = None pA = [] pB = [] pC = [] kex = [] kex_AB = [] kex_AC = [] kex_BC = [] k_AB = [] kB = [] kC = [] tex = [] count = 0 spins_from = [] spins_to = [] selected_cluster = False # Loop over the spins, adding parameters to a list, which in the end will be used to find the median. for id in spin_ids: # Get the spins, then store them. spin_from = return_spin(spin_id=id, pipe=pipe_from) spin_to = return_spin(spin_id=id, pipe=pipe_to) spins_from.append(spin_from) spins_to.append(spin_to) # Skip deselected spins. if not spin_from.select or not spin_to.select: continue # The first printout. if not selected_cluster: subsection(file=sys.stdout, text="Copying parameters for the spin block %s"%spin_ids, prespace=2) # Change the cluster selection flag. selected_cluster = True # The model. if not model: model = spin_from.model # Check that the models match for all spins of the cluster. if spin_from.model != model: raise RelaxError("The model '%s' of spin '%s' from the source data pipe does not match the '%s' model of previous spins of the cluster." % (spin_from.model, id, model)) if spin_to.model != model: raise RelaxError("The model '%s' of spin '%s' from the destination data pipe does not match the '%s' model of previous spins of the cluster." % (spin_from.model, id, model)) # Sum the source parameters. if 'pA' in spin_from.params: pA.append(spin_from.pA) if 'pB' in spin_from.params: pB.append(spin_from.pB) if 'pC' in spin_from.params: pC.append(spin_from.pC) if 'kex' in spin_from.params: kex.append(spin_from.kex) if 'kex_AB' in spin_from.params: kex_AB.append(spin_from.kex_AB) if 'kex_AC' in spin_from.params: kex_AC.append(spin_from.kex_AC) if 'kex_BC' in spin_from.params: kex_BC.append(spin_from.kex_BC) if 'k_AB' in spin_from.params: k_AB.append(spin_from.k_AB) if 'kB' in spin_from.params: kB.append(spin_from.kB) if 'kC' in spin_from.params: kC.append(spin_from.kC) if 'tex' in spin_from.params: tex.append(spin_from.tex) # Increment the spin count. count += 1 # The cluster is not selected, so move to the next. if not selected_cluster: continue # Take median of parameters. if len(pA) > 0: pA = median(pA) print("Median pA value: %.15f" % pA) if len(pB) > 0: pB = median(pB) print("Median pB value: %.15f" % pB) if len(pC) > 0: pC = median(pC) print("Median pC value: %.15f" % pC) if len(kex) > 0: kex = median(kex) print("Median kex value: %.15f" % kex) if len(kex_AB) > 0: kex_AB = median(kex_AB) print("Median k_AB value: %.15f" % kex_AB) if len(kex_AC) > 0: kex_AC = median(kex_AC) print("Median k_AC value: %.15f" % kex_AC) if len(kex_BC) > 0: kex_BC = median(kex_BC) print("Median k_BC value: %.15f" % kex_BC) if len(k_AB) > 0: k_AB = median(k_AB) print("Median k_AB value: %.15f" % k_AB) if len(kB) > 0: kB = median(kB) print("Median kB value: %.15f" % kB) if len(kC) > 0: kC = median(kC) print("Median kC value: %.15f" % kC) if len(tex) > 0: tex = median(tex) print("Median tex value: %.15f" % tex) # Loop over the spins, this time copying the parameters. for i in range(len(spin_ids)): # Alias the containers. spin_from = spins_from[i] spin_to = spins_to[i] # Skip deselected spins. if not spin_from.select or not spin_to.select: continue # The R20 parameters. if 'r2' in spin_from.params: spin_to.r2 = deepcopy(spin_from.r2) if 'r2a' in spin_from.params: spin_to.r2a = deepcopy(spin_from.r2a) if 'r2b' in spin_from.params: spin_to.r2b = deepcopy(spin_from.r2b) # The median parameters. if 'pB' in spin_from.params and 'pC' not in spin_from.params: spin_to.pA = pA spin_to.pB = pB spin_to.pC = 1.0 - pA - pB elif 'pA' in spin_from.params: spin_to.pA = pA spin_to.pB = 1.0 - pA if 'kex' in spin_from.params: spin_to.kex = kex if 'kex_AB' in spin_from.params: spin_to.kex_AB = kex_AB if 'kex_AC' in spin_from.params: spin_to.kex_AC = kex_AC if 'kex_BC' in spin_from.params: spin_to.kex_BC = kex_BC if 'k_AB' in spin_from.params: spin_to.k_AB = k_AB if 'kB' in spin_from.params: spin_to.kB = kB if 'kC' in spin_from.params: spin_to.kC = kC if 'tex' in spin_from.params: spin_to.tex = tex # All other spin specific parameters. for param in spin_from.params: if param in ['r2', 'r2a', 'r2b', 'pA', 'pB', 'pC', 'kex', 'kex_AB', 'kex_AC', 'kex_BC', 'k_AB', 'kB', 'kC', 'tex']: continue # Copy the value. setattr(spin_to, param, deepcopy(getattr(spin_from, param))) # Switch back to the original data pipe. pipes.switch(pipe_orig)
def copy(pipe_from=None, pipe_to=None): """Copy dispersion parameters from one data pipe to another, taking the median of previous values to a start value for clusters. Taking the median prevent averaging extreme outliers. @param pipe_from: The data pipe to copy the value from. This defaults to the current data pipe. @type pipe_from: str @param pipe_to: The data pipe to copy the value to. This defaults to the current data pipe. @type pipe_to: str """ # The current data pipe. pipe_orig = pipes.cdp_name() if pipe_from == None: pipe_from = pipe_orig if pipe_to == None: pipe_to = pipe_orig # Test that the pipes exist. check_pipe(pipe_from) check_pipe(pipe_to) # Test that the pipes are not the same. if pipe_from == pipe_to: raise RelaxError("The source and destination pipes cannot be the same.") # Test if the sequence data for pipe_from is loaded. if not exists_mol_res_spin_data(pipe_from): raise RelaxNoSequenceError(pipe_from) # Test if the sequence data for pipe_to is loaded. if not exists_mol_res_spin_data(pipe_to): raise RelaxNoSequenceError(pipe_to) # Switch to the destination data pipe. pipes.switch(pipe_to) # Loop over the clusters. for spin_ids in loop_cluster(): # Initialise some variables. model = None pA = [] pB = [] pC = [] kex = [] kex_AB = [] kex_AC = [] kex_BC = [] k_AB = [] kB = [] kC = [] tex = [] count = 0 spins_from = [] spins_to = [] selected_cluster = False # Loop over the spins, adding parameters to a list, which in the end will be used to find the median. for id in spin_ids: # Get the spins, then store them. spin_from = return_spin(id, pipe=pipe_from) spin_to = return_spin(id, pipe=pipe_to) spins_from.append(spin_from) spins_to.append(spin_to) # Skip deselected spins. if not spin_from.select or not spin_to.select: continue # The first printout. if not selected_cluster: subsection(file=sys.stdout, text="Copying parameters for the spin block %s"%spin_ids, prespace=2) # Change the cluster selection flag. selected_cluster = True # The model. if not model: model = spin_from.model # Check that the models match for all spins of the cluster. if spin_from.model != model: raise RelaxError("The model '%s' of spin '%s' from the source data pipe does not match the '%s' model of previous spins of the cluster." % (spin_from.model, id, model)) if spin_to.model != model: raise RelaxError("The model '%s' of spin '%s' from the destination data pipe does not match the '%s' model of previous spins of the cluster." % (spin_from.model, id, model)) # Sum the source parameters. if 'pA' in spin_from.params: pA.append(spin_from.pA) if 'pB' in spin_from.params: pB.append(spin_from.pB) if 'pC' in spin_from.params: pC.append(spin_from.pC) if 'kex' in spin_from.params: kex.append(spin_from.kex) if 'kex_AB' in spin_from.params: kex_AB.append(spin_from.kex_AB) if 'kex_AC' in spin_from.params: kex_AC.append(spin_from.kex_AC) if 'kex_BC' in spin_from.params: kex_BC.append(spin_from.kex_BC) if 'k_AB' in spin_from.params: k_AB.append(spin_from.k_AB) if 'kB' in spin_from.params: kB.append(spin_from.kB) if 'kC' in spin_from.params: kC.append(spin_from.kC) if 'tex' in spin_from.params: tex.append(spin_from.tex) # Increment the spin count. count += 1 # The cluster is not selected, so move to the next. if not selected_cluster: continue # Take median of parameters. if len(pA) > 0: pA = median(pA) print("Median pA value: %.15f" % pA) if len(pB) > 0: pB = median(pB) print("Median pB value: %.15f" % pB) if len(pC) > 0: pC = median(pC) print("Median pC value: %.15f" % pC) if len(kex) > 0: kex = median(kex) print("Median kex value: %.15f" % kex) if len(kex_AB) > 0: kex_AB = median(kex_AB) print("Median k_AB value: %.15f" % kex_AB) if len(kex_AC) > 0: kex_AC = median(kex_AC) print("Median k_AC value: %.15f" % kex_AC) if len(kex_BC) > 0: kex_BC = median(kex_BC) print("Median k_BC value: %.15f" % kex_BC) if len(k_AB) > 0: k_AB = median(k_AB) print("Median k_AB value: %.15f" % k_AB) if len(kB) > 0: kB = median(kB) print("Median kB value: %.15f" % kB) if len(kC) > 0: kC = median(kC) print("Median kC value: %.15f" % kC) if len(tex) > 0: tex = median(tex) print("Median tex value: %.15f" % tex) # Loop over the spins, this time copying the parameters. for i in range(len(spin_ids)): # Alias the containers. spin_from = spins_from[i] spin_to = spins_to[i] # Skip deselected spins. if not spin_from.select or not spin_to.select: continue # The R20 parameters. if 'r2' in spin_from.params: spin_to.r2 = deepcopy(spin_from.r2) if 'r2a' in spin_from.params: spin_to.r2a = deepcopy(spin_from.r2a) if 'r2b' in spin_from.params: spin_to.r2b = deepcopy(spin_from.r2b) # The median parameters. if 'pB' in spin_from.params and 'pC' not in spin_from.params: spin_to.pA = pA spin_to.pB = pB spin_to.pC = 1.0 - pA - pB elif 'pA' in spin_from.params: spin_to.pA = pA spin_to.pB = 1.0 - pA if 'kex' in spin_from.params: spin_to.kex = kex if 'kex_AB' in spin_from.params: spin_to.kex_AB = kex_AB if 'kex_AC' in spin_from.params: spin_to.kex_AC = kex_AC if 'kex_BC' in spin_from.params: spin_to.kex_BC = kex_BC if 'k_AB' in spin_from.params: spin_to.k_AB = k_AB if 'kB' in spin_from.params: spin_to.kB = kB if 'kC' in spin_from.params: spin_to.kC = kC if 'tex' in spin_from.params: spin_to.tex = tex # All other spin specific parameters. for param in spin_from.params: if param in ['r2', 'r2a', 'r2b', 'pA', 'pB', 'pC', 'kex', 'kex_AB', 'kex_AC', 'kex_BC', 'k_AB', 'kB', 'kC', 'tex']: continue # Copy the value. setattr(spin_to, param, deepcopy(getattr(spin_from, param))) # Switch back to the original data pipe. pipes.switch(pipe_orig)