def exercise(): pdb_file_names = raw_input( "pdb file name here,space interval,such as : 2ona.pdb 2whb.pdb") p_f = pdb_file_names.split(' ') for pdb_file_name in p_f: easy_run.call("phenix.fetch_pdb {0}".format(pdb_file_name[0:4])) easy_run.call("phenix.ready_set {0}".format(pdb_file_name)) print(pdb_file_name, "-" * 50) cif_file_name = pdb_file_name[0:4] + ".ligands.cif" if os.path.exists(cif_file_name): cif_file_names = cif_file_name else: cif_file_names = None model = get_model(pdb_file_name=pdb_file_name, cif_file_name=cif_file_names) resnames = raw_input( 'list of resnames ,comma interval,such as: resname PHE,resname HIS' ) resn = resnames.split(',') ss = " or ".join(resn) m_sel = model.selection(ss) new_model = model.select(m_sel) hierarchy = new_model.get_hierarchy() crystal_symmetry = new_model.crystal_symmetry() hierarchy.write_pdb_file(file_name=pdb_file_name[0:4] + "new.pdb", crystal_symmetry=crystal_symmetry)
def test_3(): """ test for command-line tool iotbx.unique_with_biomt""" inp = iotbx.pdb.input(source_info=None, lines=pdb_str_0) model = mmtbx.model.manager(model_input=inp) model.expand_with_BIOMT_records() model = shift_and_box_model(model) sel = model.selection("chain '0' or chain 'C' or chain 'F' or chain 'I' or chain 'L' or chain 'O' or chain 'R' or chain 'U' or chain 'X'") model = model.select(sel) pdb_str = model.model_as_pdb() fname = 'tst_reduce_model_with_biomt_test3.pdb' with open(fname, 'w') as f: f.write(pdb_str) assert os.path.isfile(fname) cmd = "iotbx.unique_with_biomt %s" % fname print(cmd) easy_run.call(cmd) res_fname = 'tst_reduce_model_with_biomt_test3_unique_biomt_000.cif' assert_lines_in_file(res_fname, """ ATOM 1 N . LYS 0 151 ? 72.74200 43.65400 193.22800 14.010 14.01000 N ? A ? 1 1""") assert_lines_in_file(res_fname, """ _pdbx_struct_assembly_gen.asym_id_list 1 (1-9) A""") cmd = "iotbx.unique_with_biomt %s chain_id_to_leave='C' output.serial=1" % fname print(cmd) easy_run.call(cmd) res_fname = 'tst_reduce_model_with_biomt_test3_unique_biomt_001.cif' assert_lines_in_file(res_fname, """ ATOM 1 N . LYS C 151 ? 186.74500 185.38200 236.77300 14.010 14.01000 N ? A ? 1 1""") assert_lines_in_file(res_fname, """ _pdbx_struct_assembly_gen.asym_id_list 1 (1-9) A""")
def exercise_no_sidechains(prefix="tst_one_resid_rotation_no_sidechains"): pdb_inp = iotbx.pdb.input(lines=pdb_str.split('\n'), source_info=None) model = mmtbx.model.manager( model_input = pdb_inp) with open("%s_start.pdb" % prefix, 'w') as f: f.write(model.model_as_pdb()) s = model.selection("name N or name CA or name C or name O") model = model.select(s) ci = cablam_idealization(model = model, params=master_phil.extract().cablam_idealization, log=sys.stdout) pdb_txt = model.model_as_pdb()
def main(filename): t0 = time.time() pdb_inp = iotbx.pdb.input(file_name=filename) model = mmtbx.model.manager(model_input=pdb_inp, log=null_out()) sel = model.selection(string="protein") model = model.select(selection=sel) model.crystal_symmetry() a = aev.AEV(model=model) CC_value = aev.compare(a) print(CC_value) recs = aev.format_HELIX_records_from_AEV(CC_value) print("\n".join(recs)) print('time', time.time() - t0)
def exercise_05(verbose): if (verbose): log = sys.stdout else: log = StringIO() model = get_model(file_name=None, log=log, pdb_str=pdb_str_2) #model.get_hierarchy().write_pdb_file(file_name="haha.pdb") model.de_deuterate() assert (len(model.hd_group_selections()) == 0) ph = model.get_hierarchy() atoms = ph.atoms() assert (atoms.extract_element().count('D') == 0) #print(model.get_hd_selection().count(True)) assert (model.get_hd_selection().count(True) == 35) assert (model.selection('resname DOD').count(True) == 0)
def test_1(): inp = iotbx.pdb.input(source_info=None, lines=pdb_str_0) model = mmtbx.model.manager(model_input=inp) model.expand_with_BIOMT_records() model = shift_and_box_model(model) sel = model.selection("chain '0' or chain 'C' or chain 'F' or chain 'I' or chain 'L' or chain 'O' or chain 'R' or chain 'U' or chain 'X'") model = model.select(sel) model.search_for_ncs() model.setup_ncs_constraints_groups(filter_groups=True) n1 = model.get_number_of_atoms() assert n1 == 648, n1 assert model.ncs_constraints_present() nrgl = model.get_ncs_groups() assert len(nrgl[0].master_iselection) == 72 assert len(nrgl[0].copies) == 8 # nrgl._show() # print (model.can_be_unique_with_biomt()) cif_txt = model.model_as_mmcif(try_unique_with_biomt=True) # print (cif_txt) assert_lines_in_text(cif_txt, """ loop_ _pdbx_struct_assembly_gen.assembly_id _pdbx_struct_assembly_gen.oper_expression _pdbx_struct_assembly_gen.asym_id_list 1 (1-9) A""") assert_lines_in_text(cif_txt, """ loop_ _pdbx_struct_assembly.id _pdbx_struct_assembly.details _pdbx_struct_assembly.method_details _pdbx_struct_assembly.oligomeric_details _pdbx_struct_assembly.oligomeric_count 1 'Symmetry assembly' ? ? ? """) assert_lines_in_text(cif_txt, """ _pdbx_struct_oper_list.vector[1] _pdbx_struct_oper_list.vector[2] _pdbx_struct_oper_list.vector[3] 1 'point symmetry operation' ? ? 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0 1.0 0.0 0.0 0.0""") inp = iotbx.pdb.input(source_info=None, lines=cif_txt) m2 = mmtbx.model.manager(model_input=inp) n2_1 = m2.get_number_of_atoms() assert n2_1 == 72 m2.expand_with_BIOMT_records() n2_2 = m2.get_number_of_atoms() # print (n1, n2) assert n1 == n2_2, "%d, %d" % (n1, n2)
def run(args=(), params=None, out=None): if (out is None): out = sys.stdout if (params is None): import iotbx.phil cmdline = iotbx.phil.process_command_line_with_files( args=args, master_phil_string=master_phil, pdb_file_def="adp_statistics.pdb_file", cif_file_def="adp_statistics.cif_file", usage_string="""\ phenix.b_factor_statistics model.pdb [restraints.cif] [selection=...] Show statistics for atomic displacement parameters (ADPs) or B-factors, including TLS contribution if present.""") params = cmdline.work.extract() validate_params(params) import mmtbx.model m_input = iotbx.pdb.input(file_name=params.adp_statistics.pdb_file) restraint_objects = [] for fn in params.adp_statistics.cif_file: cif_object = iotbx.cif.reader(file_path=fn).model() restraint_objects.append((fn, cif_object)) model = mmtbx.model.manager(model_input=m_input, restraint_objects=restraint_objects, build_grm=True, log=out) make_sub_header("Analyzing model B-factors", out=out) if (params.adp_statistics.selection is not None): selection = model.selection(params.adp_statistics.selection) n_sel = selection.count(True) if (n_sel == 0): raise Sorry("No atoms in selection!") else: model = model.select(selection) print >> out, "Extracted %d atoms in selection:" % n_sel print >> out, " %s" % params.adp_statistics.selection print >> out, "" stats = model.adp_statistics() stats.file_name = params.adp_statistics.pdb_file stats.selection = params.adp_statistics.selection stats.show_1(out=out) return stats
def exercise_2(eps = 1.e-6): ###> Get started from PDB mon_lib_srv = monomer_library.server.server() ener_lib = monomer_library.server.ener_lib() pdb_file = libtbx.env.find_in_repositories( relative_path="phenix_regression/pdb/phe_abc_tlsanl_out_geometry_minimized.pdb", test=os.path.isfile) model = mmtbx.model.manager( model_input=iotbx.pdb.input(file_name=pdb_file), build_grm=True) model.setup_scattering_dictionaries(scattering_table="wk1995") model.get_xray_structure().convert_to_isotropic() u_iso_start = model.get_xray_structure().extract_u_iso_or_u_equiv() model.get_xray_structure().convert_to_anisotropic() selections = [] selection_strings = ["chain A", "chain B", "chain C"] for string in selection_strings: selections.append(model.selection(string = string)) ################ selection = flex.bool(model.get_number_of_atoms(), True) class refinement_flags: pass refinement_flags.adp_tls = selections model.set_refinement_flags(refinement_flags) model.determine_tls_groups(selection_strings=selections, generate_tlsos=selections) model.set_refinement_flags(refinement_flags) xray_structure = model.get_xray_structure() ################ ###> Get TLS <-> Ucart T_initial = [] L_initial = [] S_initial = [] T_initial.append([0.11,0.22,0.33,0.12,0.13,0.23]) L_initial.append([1.11,1.22,1.33,1.12,1.13,1.23]) S_initial.append([0.11,0.12,0.13,0.21,0.22,0.23,0.31,0.32,-0.33]) T_initial.append([0.22,0.44,0.66,0.24,0.26,0.46]) L_initial.append([2.22,2.44,2.66,2.24,2.26,2.46]) S_initial.append([0.22,0.24,0.26,0.42,0.44,0.46,0.62,0.64,-0.66]) T_initial.append([0.33,0.66,0.99,0.36,0.39,0.69]) L_initial.append([2.33,2.66,2.99,2.36,2.39,2.69]) S_initial.append([0.22,0.24,0.26,0.42,0.44,0.46,0.62,0.64,-0.66]) tlsosA = tools.generate_tlsos(selections = selections, xray_structure = xray_structure, T = T_initial, L = L_initial, S = S_initial) tlsos = tools.generate_tlsos(selections = selections, xray_structure = xray_structure, T = T_initial, L = L_initial, S = S_initial) tlsos = tools.make_tlso_compatible_with_u_positive_definite( tlsos = tlsos, xray_structure = xray_structure.deep_copy_scatterers(), selections = selections, max_iterations = 50, number_of_u_nonpositive_definite = 0, eps = eps, number_of_macro_cycles_for_tls_from_uanisos = 30) u_cart_answer = tools.u_cart_from_tls(sites_cart = xray_structure.sites_cart(), selections = selections, tlsos = tlsos) xray_structure.scatterers().set_u_cart(xray_structure.unit_cell(), u_cart_answer) assert approx_equal(u_cart_answer, xray_structure.scatterers().extract_u_cart(xray_structure.unit_cell())) tools.show_tls(tlsos = tlsos, text = "ANSWER") ###> Set up fmodel sfg_params = mmtbx.f_model.sf_and_grads_accuracy_master_params.extract() sfg_params.algorithm = "direct" sfg_params.cos_sin_table = False dummy = xray_structure.structure_factors(algorithm = sfg_params.algorithm, d_min = 2.0).f_calc() f_obs = abs(dummy.structure_factors_from_scatterers( xray_structure = xray_structure, algorithm = sfg_params.algorithm, cos_sin_table = sfg_params.cos_sin_table).f_calc()) flags = f_obs.generate_r_free_flags(fraction=0.01, max_free=2000) fmodel = mmtbx.f_model.manager(xray_structure = xray_structure, f_obs = f_obs, r_free_flags = flags, target_name = "ls_wunit_k1", sf_and_grads_accuracy_params = sfg_params) fmodel.info(free_reflections_per_bin=250, max_number_of_bins=30).show_all() xray_structure.convert_to_isotropic() xray_structure.set_b_iso(value = 25.0) fmodel.update_xray_structure(xray_structure = xray_structure, update_f_calc = True) fmodel.info(free_reflections_per_bin=250, max_number_of_bins=30).show_all() print("*"*80) ###> TLS refinement against xray data if (not "--comprehensive" in sys.argv[1:]): number_of_macro_cycles = 1 max_number_of_iterations = 3 else: number_of_macro_cycles = 100 max_number_of_iterations = 50 for start_tls_value in [None]:#[0.0, tlsosA, None]: #for start_tls_value in [None]: print(" \n "+str(start_tls_value) + " \n ") fmodel_cp = fmodel.deep_copy() #for sc in fmodel_cp.xray_structure.scatterers(): # sc.flags.set_use_u_aniso(True) fmodel_cp.xray_structure.convert_to_anisotropic() if(start_tls_value is None): run_finite_differences_test = True else: run_finite_differences_test = False model.set_xray_structure(fmodel_cp.xray_structure) tls_refinement_manager = tools.tls_refinement( fmodel = fmodel_cp, model = model, selections = selections, selections_1d = None, refine_T = 1, refine_L = 1, refine_S = 1, number_of_macro_cycles = number_of_macro_cycles, max_number_of_iterations = max_number_of_iterations, start_tls_value = start_tls_value, run_finite_differences_test = run_finite_differences_test, eps = eps) u_cart = tls_refinement_manager.fmodel.xray_structure.scatterers().extract_u_cart( xray_structure.unit_cell()) if("--comprehensive" in sys.argv[1:]): format = "%10.6f %10.6f %10.6f %10.6f %10.6f %10.6f" counter = 0 if(start_tls_value == tlsosA): tolerance = 1.e-6 else: tolerance = 0.02 for m1,m2 in zip(u_cart_answer, u_cart): counter += 1 if(counter < 10): print("1=" + format % (m1[0],m1[1],m1[2],m1[3],m1[4],m1[5])) print("2=" + format % (m2[0],m2[1],m2[2],m2[3],m2[4],m2[5])) assert approx_equal(m1,m2, tolerance)
def stats(model, prefix, no_ticks=True): # Get rid of H, multi-model, no-protein and single-atom residue models if (model.percent_of_single_atom_residues() > 20): return None sel = model.selection(string="protein") if (sel.count(True) == 0): return None ssr = "protein and not (element H or element D or resname UNX or resname UNK or resname UNL)" sel = model.selection(string=ssr) model = model.select(sel) if (len(model.get_hierarchy().models()) > 1): return None # Add H; this looses CRYST1 ! rr = run_reduce_with_timeout( stdin_lines=model.get_hierarchy().as_pdb_string().splitlines(), file_name=None, parameters="-oh -his -flip -keep -allalt -pen9999 -", override_auto_timeout_with=None) # Create model; this is a single-model pure protein with new H added pdb_inp = iotbx.pdb.input(source_info=None, lines=rr.stdout_lines) model = mmtbx.model.manager(model_input=None, build_grm=True, pdb_hierarchy=pdb_inp.construct_hierarchy(), process_input=True, log=null_out()) box = uctbx.non_crystallographic_unit_cell_with_the_sites_in_its_center( sites_cart=model.get_sites_cart(), buffer_layer=5) model.set_sites_cart(box.sites_cart) model._crystal_symmetry = box.crystal_symmetry() # N = 10 SS = get_ss_selections(hierarchy=model.get_hierarchy()) HB_all = find( model=model.select(flex.bool(model.size(), True)), a_DHA_cutoff=90).get_params_as_arrays(replace_with_empty_threshold=N) HB_alpha = find( model=model.select(SS.both.h_sel), a_DHA_cutoff=90).get_params_as_arrays(replace_with_empty_threshold=N) HB_beta = find( model=model.select(SS.both.s_sel), a_DHA_cutoff=90).get_params_as_arrays(replace_with_empty_threshold=N) print(HB_all.d_HA.size()) result_dict = {} result_dict["all"] = HB_all result_dict["alpha"] = HB_alpha result_dict["beta"] = HB_beta # result_dict["loop"] = get_selected(sel=loop_sel) # Load histograms for reference high-resolution d_HA and a_DHA pkl_fn = libtbx.env.find_in_repositories( relative_path="mmtbx") + "/nci/d_HA_and_a_DHA_high_res.pkl" assert os.path.isfile(pkl_fn) ref = easy_pickle.load(pkl_fn) # import matplotlib as mpl mpl.use('Agg') import matplotlib.pyplot as plt fig = plt.figure(figsize=(10, 10)) kwargs = dict(histtype='bar', bins=20, range=[1.6, 3.0], alpha=.8) for j, it in enumerate([["alpha", 1], ["beta", 3], ["all", 5]]): key, i = it ax = plt.subplot(int("32%d" % i)) if (no_ticks): #ax.set_xticks([]) ax.set_yticks([]) if (j in [0, 1]): ax.tick_params(bottom=False) ax.set_xticklabels([]) ax.tick_params(axis="x", labelsize=12) ax.tick_params(axis="y", labelsize=12, left=False, pad=-2) ax.text(0.98, 0.92, key, size=12, horizontalalignment='right', transform=ax.transAxes) HB = result_dict[key] if HB is None: continue w1 = np.ones_like(HB.d_HA) / HB.d_HA.size() ax.hist(HB.d_HA, color="orangered", weights=w1, rwidth=0.3, **kwargs) # start, end1, end2 = 0, max(ref.distances[key].vals), \ round(max(ref.distances[key].vals),2) if (not no_ticks): plt.yticks([0.01, end1], ["0", end2], visible=True, rotation="horizontal") if (key == "alpha"): plt.ylim(0, end2 + 0.02) elif (key == "beta"): plt.ylim(0, end2 + 0.02) elif (key == "all"): plt.ylim(0, end2 + 0.02) else: assert 0 # if (j == 0): ax.set_title("Distance", size=15) bins = list(flex.double(ref.distances[key].bins)) ax.bar(bins, ref.distances[key].vals, alpha=.3, width=0.07) # kwargs = dict(histtype='bar', bins=20, range=[90, 180], alpha=.8) for j, it in enumerate([["alpha", 2], ["beta", 4], ["all", 6]]): key, i = it ax = plt.subplot(int("32%d" % i)) if (j in [0, 1]): ax.tick_params(bottom=False) ax.set_xticklabels([]) if (no_ticks): #ax.set_xticks([]) ax.set_yticks([]) ax.tick_params(axis="x", labelsize=12) ax.tick_params(axis="y", labelsize=12, left=False, pad=-2) ax.text(0.98, 0.92, key, size=12, horizontalalignment='right', transform=ax.transAxes) ax.text(0.98, 0.92, key, size=12, horizontalalignment='right', transform=ax.transAxes) #if(j in [0,1]): ax.plot_params(bottom=False) HB = result_dict[key] if HB is None: continue w1 = np.ones_like(HB.a_DHA) / HB.a_DHA.size() ax.hist(HB.a_DHA, color="orangered", weights=w1, rwidth=0.3, **kwargs) # start, end1, end2 = 0, max(ref.angles[key].vals), \ round(max(ref.angles[key].vals),2) if (not no_ticks): plt.yticks([0.01, end1], ["0", end2], visible=True, rotation="horizontal") if (key == "alpha"): plt.ylim(0, end2 + 0.02) elif (key == "beta"): plt.ylim(0, end2 + 0.02) elif (key == "all"): plt.ylim(0, end2 + 0.02) else: assert 0 # if (j == 0): ax.set_title("Angle", size=15) ax.bar(ref.angles[key].bins, ref.angles[key].vals, width=4.5, alpha=.3) plt.subplots_adjust(wspace=0.12, hspace=0.025) if (no_ticks): plt.subplots_adjust(wspace=0.025, hspace=0.025) #fig.savefig("%s.png"%prefix, dpi=1000) fig.savefig("%s.pdf" % prefix)
def exercise_nonstd_residue(): """ When loop closure need to put back side chain for non-standard residue, here is TPO """ tst_pdb_2 = """\ CRYST1 114.270 114.270 170.840 90.00 90.00 120.00 P 32 2 1 6 ATOM 2808 N GLY A 495 -21.779 41.479 -17.193 1.00 99.35 N ATOM 2809 CA GLY A 495 -21.593 42.735 -17.896 1.00 99.35 C ATOM 2810 C GLY A 495 -22.691 43.004 -18.907 1.00 99.35 C ATOM 2811 O GLY A 495 -22.977 44.156 -19.232 1.00 99.35 O ATOM 2812 N VAL A 496 -23.308 41.937 -19.403 1.00 93.50 N ATOM 2813 CA VAL A 496 -24.379 42.055 -20.385 1.00 93.50 C ATOM 2814 C VAL A 496 -25.614 42.689 -19.751 1.00 93.50 C ATOM 2815 O VAL A 496 -25.859 42.530 -18.555 1.00 93.50 O ATOM 2816 CB VAL A 496 -24.766 40.672 -20.951 1.00109.49 C ATOM 2817 CG1 VAL A 496 -25.690 40.837 -22.146 1.00109.49 C ATOM 2818 CG2 VAL A 496 -23.515 39.902 -21.340 1.00109.49 C ATOM 2819 N THR A 497 -26.391 43.407 -20.558 1.00 89.25 N ATOM 2820 CA THR A 497 -27.597 44.065 -20.068 1.00 89.25 C ATOM 2821 C THR A 497 -28.779 43.853 -21.009 1.00 89.25 C ATOM 2822 O THR A 497 -28.783 42.929 -21.822 1.00 89.25 O ATOM 2823 CB THR A 497 -27.264 45.433 -19.439 1.00109.67 C ATOM 2824 OG1 THR A 497 -28.479 46.116 -19.107 1.00109.67 O ATOM 2825 CG2 THR A 497 -26.458 46.284 -20.409 1.00109.67 C ATOM 2826 N THR A 498 -29.782 44.718 -20.887 1.00 88.67 N ATOM 2827 CA THR A 498 -30.974 44.647 -21.724 1.00 88.67 C ATOM 2828 C THR A 498 -32.417 45.138 -21.787 1.00 88.67 C ATOM 2829 O THR A 498 -33.305 44.408 -22.229 1.00 88.67 O ATOM 2830 CB THR A 498 -31.649 43.319 -22.121 1.00 90.48 C ATOM 2831 OG1 THR A 498 -32.602 43.559 -23.164 1.00 90.48 O ATOM 2832 CG2 THR A 498 -32.357 42.701 -20.925 1.00 90.48 C ATOM 2833 N LYS A 499 -32.654 46.372 -21.352 1.00 81.24 N ATOM 2834 CA LYS A 499 -34.004 46.920 -21.362 1.00 81.24 C ATOM 2835 C LYS A 499 -35.350 46.867 -22.083 1.00 81.24 C ATOM 2836 O LYS A 499 -35.726 47.804 -22.788 1.00 81.24 O ATOM 2837 CB LYS A 499 -33.470 48.359 -21.348 1.00138.53 C ATOM 2838 CG LYS A 499 -32.387 48.644 -22.386 1.00138.53 C ATOM 2839 CD LYS A 499 -32.946 49.210 -23.682 1.00138.53 C ATOM 2840 CE LYS A 499 -33.295 50.684 -23.534 1.00138.53 C ATOM 2841 NZ LYS A 499 -33.775 51.276 -24.813 1.00138.53 N HETATM 2842 N TPO A 500 -36.075 45.767 -21.897 1.00 93.19 N HETATM 2843 CA TPO A 500 -37.391 45.606 -22.507 1.00 93.19 C HETATM 2844 CB TPO A 500 -37.442 44.363 -23.396 1.00112.60 C HETATM 2845 CG2 TPO A 500 -38.746 44.383 -24.204 1.00112.60 C HETATM 2846 OG1 TPO A 500 -36.327 44.384 -24.298 1.00112.60 O HETATM 2847 P TPO A 500 -35.745 42.879 -24.411 1.00112.60 P HETATM 2848 O1P TPO A 500 -36.794 41.971 -24.933 1.00112.60 O HETATM 2849 O2P TPO A 500 -34.491 42.875 -25.421 1.00112.60 O HETATM 2850 O3P TPO A 500 -35.274 42.380 -22.956 1.00112.60 O HETATM 2851 C TPO A 500 -38.390 46.538 -21.826 1.00 93.19 C HETATM 2852 O TPO A 500 -38.487 47.718 -22.163 1.00 93.19 O ATOM 2853 N PHE A 501 -39.132 45.991 -20.868 1.00 94.45 N ATOM 2854 CA PHE A 501 -40.138 46.751 -20.134 1.00 94.45 C ATOM 2855 C PHE A 501 -41.172 45.642 -20.302 1.00 94.45 C ATOM 2856 O PHE A 501 -42.021 45.697 -21.192 1.00 94.45 O ATOM 2857 CB PHE A 501 -40.812 48.126 -20.206 1.00 71.72 C ATOM 2858 CG PHE A 501 -41.372 48.607 -18.894 1.00 71.72 C ATOM 2859 CD1 PHE A 501 -41.285 49.951 -18.547 1.00 71.72 C ATOM 2860 CD2 PHE A 501 -41.992 47.727 -18.010 1.00 71.72 C ATOM 2861 CE1 PHE A 501 -41.804 50.415 -17.341 1.00 71.72 C ATOM 2862 CE2 PHE A 501 -42.516 48.181 -16.801 1.00 71.72 C ATOM 2863 CZ PHE A 501 -42.421 49.529 -16.467 1.00 71.72 C ATOM 2864 N CYS A 502 -41.089 44.634 -19.439 1.00 84.28 N ATOM 2865 CA CYS A 502 -42.009 43.503 -19.480 1.00 84.28 C ATOM 2866 C CYS A 502 -42.191 42.910 -18.087 1.00 84.28 C ATOM 2867 O CYS A 502 -41.624 43.404 -17.113 1.00 84.28 O ATOM 2868 CB CYS A 502 -41.477 42.426 -20.428 1.00117.39 C ATOM 2869 SG CYS A 502 -39.879 41.732 -19.943 1.00117.39 S ATOM 2870 N GLY A 503 -42.984 41.847 -17.999 1.00109.92 N ATOM 2871 CA GLY A 503 -43.219 41.207 -16.718 1.00109.92 C ATOM 2872 C GLY A 503 -44.627 41.425 -16.198 1.00109.92 C ATOM 2873 O GLY A 503 -45.559 41.639 -16.974 1.00109.92 O ATOM 2874 N THR A 504 -44.779 41.375 -14.879 1.00102.36 N ATOM 2875 CA THR A 504 -46.079 41.561 -14.246 1.00102.36 C ATOM 2876 C THR A 504 -46.092 42.865 -13.449 1.00102.36 C ATOM 2877 O THR A 504 -45.101 43.222 -12.812 1.00102.36 O ATOM 2878 CB THR A 504 -46.396 40.395 -13.292 1.00 94.96 C ATOM 2879 OG1 THR A 504 -45.797 39.194 -13.793 1.00 94.96 O ATOM 2880 CG2 THR A 504 -47.899 40.185 -13.187 1.00 94.96 C END """ pdb_inp = iotbx.pdb.input(source_info=None, lines=tst_pdb_2) model = mmtbx.model.manager(model_input=pdb_inp) model.process(make_restraints=True) model.get_hierarchy().write_pdb_file("tst_loop_closure_2_start.pdb") assert model.get_hierarchy().atoms_size() == 73 loop_ideal_params = loop_idealization.master_phil.extract() loop_ideal_params.loop_idealization.enabled = True loop_ideal_params.loop_idealization.variant_search_level = 1 loop_ideal_params.loop_idealization.variant_number_cutoff = 10 loop_ideal_params.loop_idealization.number_of_ccd_trials = 1 loop_ideal_params.loop_idealization.minimize_whole = False loop_ideal = loop_idealization.loop_idealization(model=model, params=loop_ideal_params, verbose=False) model.get_hierarchy().write_pdb_file("tst_loop_closure_2_result.pdb") assert model.get_hierarchy().atoms_size() == 73 sel = model.selection("resname TPO") assert model.get_hierarchy().select(sel).atoms_size() == 11