示例#1
0
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""")
示例#3
0
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()
示例#4
0
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)
示例#7
0
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
示例#8
0
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)
示例#9
0
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)
示例#10
0
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