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
exp_id = exp_ids[mi] exp = exps[mi] sfrq, time_T2, ncycs, r2eff_errs = exp # Then loop over the spins. for res_name, res_num, spin_name, params in cur_spins: cur_spin_id = ":%i@%s"%(res_num, spin_name) cur_spin = return_spin(spin_id=cur_spin_id) ## First do a fake R2eff structure. # Define file name file_name = "%s%s.txt" % (exp_id, cur_spin_id .replace('#', '_').replace(':', '_').replace('@', '_')) file = open_write_file(file_name=file_name, dir=ds.tmpdir, force=True) # Then loop over the points, make a fake R2eff value. for offset, point, oi, di in loop_offset_point(exp_type=EXP_TYPE_CPMG_SQ, frq=frq, return_indices=True): string = "%.15f 1.0 %.3f\n"%(point, ds.r2eff_err) file.write(string) # Close file. file.close() # Read in the R2eff file to create the structure. # This is a trick, or else relax complains. relax_disp.r2eff_read_spin(id=exp_id, spin_id=cur_spin_id, file=file_name, dir=ds.tmpdir, disp_point_col=1, data_col=2, error_col=3) # Now back-calculate. for exp_type, frq, ei, mi in loop_exp_frq(return_indices=True): exp_id = exp_ids[mi] exp = exps[mi]
exp_id = exp_ids[mi] exp = exps[mi] sfrq, time_T2, ncycs, r2eff_errs = exp # Then loop over the spins. for res_name, res_num, spin_name, params in cur_spins: cur_spin_id = ":%i@%s"%(res_num, spin_name) cur_spin = return_spin(cur_spin_id) ## First do a fake R2eff structure. # Define file name file_name = "%s%s.txt" % (exp_id, cur_spin_id .replace('#', '_').replace(':', '_').replace('@', '_')) file = open_write_file(file_name=file_name, dir=ds.tmpdir, force=True) # Then loop over the points, make a fake R2eff value. for offset, point, oi, di in loop_offset_point(exp_type=EXP_TYPE_CPMG_SQ, frq=frq, return_indices=True): string = "%.15f 1.0 %.3f\n"%(point, ds.r2eff_err) file.write(string) # Close file. file.close() # Read in the R2eff file to create the structure. # This is a trick, or else relax complains. relax_disp.r2eff_read_spin(id=exp_id, spin_id=cur_spin_id, file=file_name, dir=ds.tmpdir, disp_point_col=1, data_col=2, error_col=3) # Now back-calculate. for exp_type, frq, ei, mi in loop_exp_frq(return_indices=True): exp_id = exp_ids[mi] exp = exps[mi]
def write_r2eff_files(input_dir=None, base_dir=None, force=False): """Create the CATIA R2eff input files. @keyword input_dir: The special directory for the R2eff input files. @type input_dir: str @keyword base_dir: The base directory to place the files into. @type base_dir: str @keyword force: A flag which if True will cause a pre-existing file to be overwritten. @type force: bool """ # Create the directory for the R2eff files for each field and spin. dir = base_dir + sep + input_dir mkdir_nofail(dir, verbosity=0) # Determine the isotope information. isotope = None for spin in spin_loop(skip_desel=True): if hasattr(spin, 'isotope'): if isotope == None: isotope = spin.isotope elif spin.isotope != isotope: raise RelaxError("CATIA only supports one spin type.") if isotope == None: raise RelaxError("The spin isotopes have not been specified.") # Isotope translation. if isotope == '1H': isotope = 'H1' elif isotope == '13C': isotope = 'C13' elif isotope == '15N': isotope = 'N15' # Loop over the frequencies. for frq, mi in loop_frq(return_indices=True): # The frequency string in MHz. frq_string = int(frq * 1e-6) # The set files. file_name = "data_set_%i.inp" % frq_string set_file = open_write_file(file_name=file_name, dir=base_dir, force=force) id = frq_string set_file.write("ID=%s\n" % id) set_file.write("Sfrq = %s\n" % frq_string) set_file.write("Temperature = %s\n" % 0.0) set_file.write("Nucleus = %s\n" % isotope) set_file.write("Couplednucleus = %s\n" % 'H1') set_file.write("Time_equil = %s\n" % 0.0) set_file.write("Pwx_cp = %s\n" % 0.0) set_file.write("Taub = %s\n" % 0.0) set_file.write("Time_T2 = %s\n" % cdp.relax_time_list[0]) set_file.write("Xcar = %s\n" % 0.0) set_file.write("Seqfil = %s\n" % 'CW_CPMG') set_file.write("Minerror = %s\n" % "(2.%;0.5/s)") set_file.write("Basis = (%s)\n" % "Iph_7") set_file.write("Format = (%i;%i;%i)\n" % (0, 1, 2)) set_file.write("DataDirectory = %s\n" % (dir + sep)) set_file.write("Data = (\n") # Loop over the spins. for spin, mol_name, res_num, res_name, spin_id in spin_loop( full_info=True, return_id=True, skip_desel=True): # The file. file_name = "spin%s_%i.cpmg" % (spin_id.replace('#', '_').replace( ':', '_').replace('@', '_'), frq_string) spin_file = open_write_file(file_name=file_name, dir=dir, force=force) # Write the header. spin_file.write("# %18s %20s %20s\n" % ("nu_cpmg(Hz)", "R2(1/s)", "Esd(R2)")) # Loop over the dispersion points. for offset, point, oi, di in loop_offset_point( exp_type=EXP_TYPE_CPMG_SQ, frq=frq, return_indices=True): # The key. key = return_param_key_from_data(exp_type=EXP_TYPE_CPMG_SQ, frq=frq, offset=offset, point=point) # No data. if key not in spin.r2eff: continue # Write out the data. spin_file.write("%20.15f %20.15f %20.15f\n" % (point, spin.r2eff[key], spin.r2eff_err[key])) # Close the file. spin_file.close() # Add the file name to the set. catia_spin_id = "%i%s" % (res_num, spin.name) set_file.write(" [%s;%s];\n" % (catia_spin_id, file_name)) # Terminate the set file. set_file.write(")\n") set_file.close()
def write_r2eff_files(input_dir=None, base_dir=None, force=False): """Create the CATIA R2eff input files. @keyword input_dir: The special directory for the R2eff input files. @type input_dir: str @keyword base_dir: The base directory to place the files into. @type base_dir: str @keyword force: A flag which if True will cause a pre-existing file to be overwritten. @type force: bool """ # Create the directory for the R2eff files for each field and spin. dir = base_dir + sep + input_dir mkdir_nofail(dir, verbosity=0) # Determine the isotope information. isotope = None for spin in spin_loop(skip_desel=True): if hasattr(spin, 'isotope'): if isotope == None: isotope = spin.isotope elif spin.isotope != isotope: raise RelaxError("CATIA only supports one spin type.") if isotope == None: raise RelaxError("The spin isotopes have not been specified.") # Isotope translation. if isotope == '1H': isotope = 'H1' elif isotope == '13C': isotope = 'C13' elif isotope == '15N': isotope = 'N15' # Loop over the frequencies. for frq, mi in loop_frq(return_indices=True): # The frequency string in MHz. frq_string = int(frq*1e-6) # The set files. file_name = "data_set_%i.inp" % frq_string set_file = open_write_file(file_name=file_name, dir=base_dir, force=force) id = frq_string set_file.write("ID=%s\n" % id) set_file.write("Sfrq = %s\n" % frq_string) set_file.write("Temperature = %s\n" % 0.0) set_file.write("Nucleus = %s\n" % isotope) set_file.write("Couplednucleus = %s\n" % 'H1') set_file.write("Time_equil = %s\n" % 0.0) set_file.write("Pwx_cp = %s\n" % 0.0) set_file.write("Taub = %s\n" % 0.0) set_file.write("Time_T2 = %s\n"% cdp.relax_time_list[0]) set_file.write("Xcar = %s\n" % 0.0) set_file.write("Seqfil = %s\n" % 'CW_CPMG') set_file.write("Minerror = %s\n" % "(2.%;0.5/s)") set_file.write("Basis = (%s)\n" % "Iph_7") set_file.write("Format = (%i;%i;%i)\n" % (0, 1, 2)) set_file.write("DataDirectory = %s\n" % (dir+sep)) set_file.write("Data = (\n") # Loop over the spins. for spin, mol_name, res_num, res_name, spin_id in spin_loop(full_info=True, return_id=True, skip_desel=True): # The file. file_name = "spin%s_%i.cpmg" % (spin_id.replace('#', '_').replace(':', '_').replace('@', '_'), frq_string) spin_file = open_write_file(file_name=file_name, dir=dir, force=force) # Write the header. spin_file.write("# %18s %20s %20s\n" % ("nu_cpmg(Hz)", "R2(1/s)", "Esd(R2)")) # Loop over the dispersion points. for offset, point, oi, di in loop_offset_point(exp_type=EXP_TYPE_CPMG_SQ, frq=frq, return_indices=True): # The key. key = return_param_key_from_data(exp_type=EXP_TYPE_CPMG_SQ, frq=frq, offset=offset, point=point) # No data. if key not in spin.r2eff: continue # Write out the data. spin_file.write("%20.15f %20.15f %20.15f\n" % (point, spin.r2eff[key], spin.r2eff_err[key])) # Close the file. spin_file.close() # Add the file name to the set. catia_spin_id = "%i%s" % (res_num, spin.name) set_file.write(" [%s;%s];\n" % (catia_spin_id, file_name)) # Terminate the set file. set_file.write(")\n") set_file.close()