Exemplo n.º 1
0
def exercise_isotropic_adp():
  i_seqs = (0,)
  weight = 2
  u_cart = ((1,2,3,5,2,8),)
  u_iso = (0,)
  use_u_aniso = (True,)
  p = adp_restraints.isotropic_adp_proxy(
    i_seqs=i_seqs,
    weight=weight)
  assert p.i_seqs == i_seqs
  assert approx_equal(p.weight, weight)
  i = adp_restraints.isotropic_adp(u_cart=u_cart[0], weight=weight)
  expected_deltas = (-1, 0, 1, 5, 2, 8)
  expected_gradients = (-4, 0, 4, 40, 16, 64)
  assert approx_equal(i.weight, weight)
  assert approx_equal(i.deltas(), expected_deltas)
  assert approx_equal(i.rms_deltas(), 4.5704364002673632)
  assert approx_equal(i.residual(), 376.0)
  assert approx_equal(i.gradients(), expected_gradients)
  gradients_aniso_cart = flex.sym_mat3_double(1, (0,0,0,0,0,0))
  gradients_iso = flex.double(1,0)
  proxies = adp_restraints.shared_isotropic_adp_proxy([p,p])
  u_cart = flex.sym_mat3_double(u_cart)
  u_iso = flex.double(u_iso)
  use_u_aniso = flex.bool(use_u_aniso)
  params = adp_restraint_params(u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso)
  residuals = adp_restraints.isotropic_adp_residuals(params, proxies=proxies)
  assert approx_equal(residuals, (i.residual(),i.residual()))
  deltas_rms = adp_restraints.isotropic_adp_deltas_rms(params, proxies=proxies)
  assert approx_equal(deltas_rms, (i.rms_deltas(),i.rms_deltas()))
  residual_sum = adp_restraints.isotropic_adp_residual_sum(
    params,
    proxies=proxies,
    gradients_aniso_cart=gradients_aniso_cart
  )
  assert approx_equal(residual_sum, 752.0)
  fd_grads_aniso, fd_grads_iso = finite_difference_gradients(
    restraint_type=adp_restraints.isotropic_adp,
    proxy=p,
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso
  )
  for g,e in zip(gradients_aniso_cart, fd_grads_aniso):
    assert approx_equal(g, matrix.col(e)*2)
  #
  # check frame invariance of residual
  #
  u_cart = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01))
  a = adp_restraints.isotropic_adp(
    u_cart=u_cart.as_sym_mat3(), weight=1)
  expected_residual = a.residual()
  gen = flex.mersenne_twister()
  for i in range(20):
    R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3))
    u_cart_rot = R * u_cart * R.transpose()
    a = adp_restraints.isotropic_adp(
      u_cart=u_cart_rot.as_sym_mat3(), weight=1)
    assert approx_equal(a.residual(), expected_residual)
Exemplo n.º 2
0
def exercise_isotropic_adp():
  i_seqs = (0,)
  weight = 2
  u_cart = ((1,2,3,5,2,8),)
  u_iso = (0,)
  use_u_aniso = (True,)
  p = adp_restraints.isotropic_adp_proxy(
    i_seqs=i_seqs,
    weight=weight)
  assert p.i_seqs == i_seqs
  assert approx_equal(p.weight, weight)
  i = adp_restraints.isotropic_adp(u_cart=u_cart[0], weight=weight)
  expected_deltas = (-1, 0, 1, 5, 2, 8)
  expected_gradients = (-4, 0, 4, 40, 16, 64)
  assert approx_equal(i.weight, weight)
  assert approx_equal(i.deltas(), expected_deltas)
  assert approx_equal(i.rms_deltas(), 4.5704364002673632)
  assert approx_equal(i.residual(), 376.0)
  assert approx_equal(i.gradients(), expected_gradients)
  gradients_aniso_cart = flex.sym_mat3_double(1, (0,0,0,0,0,0))
  gradients_iso = flex.double(1,0)
  proxies = adp_restraints.shared_isotropic_adp_proxy([p,p])
  u_cart = flex.sym_mat3_double(u_cart)
  u_iso = flex.double(u_iso)
  use_u_aniso = flex.bool(use_u_aniso)
  params = adp_restraint_params(u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso)
  residuals = adp_restraints.isotropic_adp_residuals(params, proxies=proxies)
  assert approx_equal(residuals, (i.residual(),i.residual()))
  deltas_rms = adp_restraints.isotropic_adp_deltas_rms(params, proxies=proxies)
  assert approx_equal(deltas_rms, (i.rms_deltas(),i.rms_deltas()))
  residual_sum = adp_restraints.isotropic_adp_residual_sum(
    params,
    proxies=proxies,
    gradients_aniso_cart=gradients_aniso_cart
  )
  assert approx_equal(residual_sum, 752.0)
  fd_grads_aniso, fd_grads_iso = finite_difference_gradients(
    restraint_type=adp_restraints.isotropic_adp,
    proxy=p,
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso
  )
  for g,e in zip(gradients_aniso_cart, fd_grads_aniso):
    assert approx_equal(g, matrix.col(e)*2)
  #
  # check frame invariance of residual
  #
  u_cart = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01))
  a = adp_restraints.isotropic_adp(
    u_cart=u_cart.as_sym_mat3(), weight=1)
  expected_residual = a.residual()
  gen = flex.mersenne_twister()
  for i in range(20):
    R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3))
    u_cart_rot = R * u_cart * R.transpose()
    a = adp_restraints.isotropic_adp(
      u_cart=u_cart_rot.as_sym_mat3(), weight=1)
    assert approx_equal(a.residual(), expected_residual)
Exemplo n.º 3
0
 def inverse_transform_hierarchy(self, i, pdb_hierarchy):
   rt = self.get_inverse_matrix(i)
   atoms = pdb_hierarchy.atoms()
   sites_cart = atoms.extract_xyz()
   atoms.set_xyz(rt.r.elems * sites_cart + rt.t.elems)
   uij = flex.sym_mat3_double(sites_cart.size(),[-1,-1,-1,-1,-1,-1])
   atoms.set_uij(uij)
Exemplo n.º 4
0
 def inverse_transform_hierarchy (self, i, pdb_hierarchy) :
   rt = self.get_inverse_matrix(i)
   atoms = pdb_hierarchy.atoms()
   sites_cart = atoms.extract_xyz()
   atoms.set_xyz(rt.r.elems * sites_cart + rt.t.elems)
   uij = flex.sym_mat3_double(sites_cart.size(),[-1,-1,-1,-1,-1,-1])
   atoms.set_uij(uij)
Exemplo n.º 5
0
def finite_differences_u_star(target_ftor, structure, delta=0.000001):
    derivatives = flex.sym_mat3_double()
    for i_scatterer in range(structure.scatterers().size()):
        d_target_d_u_star = [0, 0, 0, 0, 0, 0]
        if (structure.scatterers()[i_scatterer].flags.use_u_aniso()):
            for iu in range(6):
                target_values = []
                for d_sign in (-1, 1):
                    modified_structure = structure.deep_copy_scatterers()
                    ms = modified_structure.scatterers()[i_scatterer]
                    u_star = list(ms.u_star)
                    u_star[iu] += d_sign * delta
                    ms.u_star = u_star
                    f_calc = target_ftor.f_obs(
                    ).structure_factors_from_scatterers(
                        xray_structure=modified_structure,
                        algorithm="direct").f_calc()
                    target_result = target_ftor(f_calc,
                                                compute_derivatives=False)
                    target_values.append(target_result.target())
                derivative = (target_values[1] - target_values[0]) / (2 *
                                                                      delta)
                d_target_d_u_star[iu] = derivative
            derivatives.append(d_target_d_u_star)
        else:
            derivatives.append(d_target_d_u_star)
    return derivatives
def finite_differences_u_star(target_ftor, structure,
                              delta=0.000001):
  derivatives = flex.sym_mat3_double()
  for i_scatterer in xrange(structure.scatterers().size()):
    d_target_d_u_star = [0,0,0,0,0,0]
    if(structure.scatterers()[i_scatterer].flags.use_u_aniso()):
       for iu in xrange(6):
         target_values = []
         for d_sign in (-1, 1):
           modified_structure = structure.deep_copy_scatterers()
           ms = modified_structure.scatterers()[i_scatterer]
           u_star = list(ms.u_star)
           u_star[iu] += d_sign * delta
           ms.u_star = u_star
           f_calc = target_ftor.f_obs().structure_factors_from_scatterers(
             xray_structure=modified_structure,
             algorithm="direct").f_calc()
           target_result = target_ftor(f_calc, compute_derivatives=False)
           target_values.append(target_result.target())
         derivative = (target_values[1] - target_values[0]) / (2 * delta)
         d_target_d_u_star[iu] = derivative
       derivatives.append(d_target_d_u_star)
    else:
       derivatives.append(d_target_d_u_star)
  return derivatives
Exemplo n.º 7
0
def exercise_grad_u_transformations():
    uc = uctbx.unit_cell((12.296512479074615, 15.985466222796999, 20.904071214426843, 83.0, 109.0, 129.0))
    grad_u_star = (
        1681615.347859645,
        1740095.5140965185,
        2212142.6517873215,
        -2802250.0492254314,
        -1934508.748421974,
        1503834.0901063806,
    )
    grad_u_cart = adptbx.grad_u_star_as_u_cart(uc, grad_u_star)
    assert approx_equal(
        grad_u_cart,
        (
            11121.484290152286,
            3713.1538936460488,
            4293.4422553333607,
            -332.12536958297818,
            -340.3709419122527,
            406.25522344235526,
        ),
    )
    assert approx_equal(grad_u_star, adptbx.grad_u_cart_as_u_star(uc, grad_u_cart))
    grad_u_star_array = flex.sym_mat3_double([grad_u_star] * 3)
    grad_u_cart_array = adptbx.grad_u_star_as_u_cart(uc, grad_u_star_array)
    for g in grad_u_cart_array:
        assert approx_equal(grad_u_cart, g)
    grad_u_star_array = adptbx.grad_u_cart_as_u_star(uc, grad_u_cart_array)
    for g in grad_u_star_array:
        assert approx_equal(grad_u_star, g)
Exemplo n.º 8
0
def u_cart_from_tls(sites_cart, selections, tlsos):
  global time_u_cart_from_tls
  t1 = time.time()
  uanisos = flex.sym_mat3_double(sites_cart.size(), [0,0,0,0,0,0])
  for selection, tlso in zip(selections, tlsos):
    u = uaniso_from_tls_one_group(tlso       = tlso,
                                  sites_cart = sites_cart.select(selection))
    uanisos.set_selected(selection, u)
  t2 = time.time()
  time_u_cart_from_tls += (t2 - t1)
  return uanisos
Exemplo n.º 9
0
def u_cart_from_tls(sites_cart, selections, tlsos):
    global time_u_cart_from_tls
    t1 = time.time()
    uanisos = flex.sym_mat3_double(sites_cart.size(), [0, 0, 0, 0, 0, 0])
    for selection, tlso in zip(selections, tlsos):
        u = uaniso_from_tls_one_group(tlso=tlso,
                                      sites_cart=sites_cart.select(selection),
                                      zeroize_trace=True)
        uanisos.set_selected(selection, u)
    t2 = time.time()
    time_u_cart_from_tls += (t2 - t1)
    return uanisos
Exemplo n.º 10
0
def u_cart_from_nm(adp_nmas, selections, xs, n_modes, total_size, zero_mode_flag = True):
    global time_u_cart_from_nm
    t1 = time.time()
    uanisos = flex.sym_mat3_double(total_size, [0,0,0,0,0,0])
    for adp_nma, selection, x in zip(adp_nmas, selections, xs):
        uaniso_form_s_manager = uaniso_from_s(x = x,
                          adp_nma = adp_nma,
                          n_modes = n_modes,
                          zero_mode_flag = zero_mode_flag)
        u = uaniso_form_s_manager.u_cart()
        uanisos.set_selected(selection, u)
    t2 = time.time()
    time_u_cart_from_nm += (t2 - t1)
    return uanisos
Exemplo n.º 11
0
def u_cart_from_nm(adp_nmas, selections, xs, n_modes, total_size, zero_mode_flag = True):
    global time_u_cart_from_nm
    t1 = time.time()
    uanisos = flex.sym_mat3_double(total_size, [0,0,0,0,0,0])
    for adp_nma, selection, x in zip(adp_nmas, selections, xs):
        uaniso_form_s_manager = uaniso_from_s(x = x,
                          adp_nma = adp_nma,
                          n_modes = n_modes,
                          zero_mode_flag = zero_mode_flag)
        u = uaniso_form_s_manager.u_cart()
        uanisos.set_selected(selection, u)
    t2 = time.time()
    time_u_cart_from_nm += (t2 - t1)
    return uanisos
Exemplo n.º 12
0
def u_cart_from_ensemble(models):
    xyz_all = []
    for m in models:
        xyz_all.append(m.atoms().extract_xyz())
    n_atoms = xyz_all[0].size()
    xyz_atoms_all = []
    for i in xrange(n_atoms):
        xyz_atoms = flex.vec3_double()
        for xyzs in xyz_all:
            xyz_atoms.append(xyzs[i])
        xyz_atoms_all.append(xyz_atoms)
    result = flex.sym_mat3_double()
    for i in xrange(n_atoms):
        result.append(u_cart_from_xyz(sites_cart=xyz_atoms_all[i]))
    return result
Exemplo n.º 13
0
def u_cart_from_ensemble(models):
  xyz_all = []
  for m in models:
    xyz_all.append(m.atoms().extract_xyz())
  n_atoms = xyz_all[0].size()
  xyz_atoms_all = []
  for i in xrange(n_atoms):
    xyz_atoms = flex.vec3_double()
    for xyzs in xyz_all:
      xyz_atoms.append(xyzs[i])
    xyz_atoms_all.append(xyz_atoms)
  result = flex.sym_mat3_double()
  for i in xrange(n_atoms):
    result.append(u_cart_from_xyz(sites_cart=xyz_atoms_all[i]))
  return result
Exemplo n.º 14
0
def exercise_grad_u_transformations():
    uc = uctbx.unit_cell((12.296512479074615, 15.985466222796999,
                          20.904071214426843, 83.0, 109.0, 129.0))
    grad_u_star = (1681615.347859645, 1740095.5140965185, 2212142.6517873215,
                   -2802250.0492254314, -1934508.748421974, 1503834.0901063806)
    grad_u_cart = adptbx.grad_u_star_as_u_cart(uc, grad_u_star)
    assert approx_equal(
        grad_u_cart,
        (11121.484290152286, 3713.1538936460488, 4293.4422553333607,
         -332.12536958297818, -340.3709419122527, 406.25522344235526))
    assert approx_equal(grad_u_star,
                        adptbx.grad_u_cart_as_u_star(uc, grad_u_cart))
    grad_u_star_array = flex.sym_mat3_double([grad_u_star] * 3)
    grad_u_cart_array = adptbx.grad_u_star_as_u_cart(uc, grad_u_star_array)
    for g in grad_u_cart_array:
        assert approx_equal(grad_u_cart, g)
    grad_u_star_array = adptbx.grad_u_cart_as_u_star(uc, grad_u_cart_array)
    for g in grad_u_star_array:
        assert approx_equal(grad_u_star, g)
Exemplo n.º 15
0
def run(args):
    #    if (len(args) == 0 ):
    #        raise RuntimeError("Please specify one or more pdb file names.")
    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/1A32.pdb",
    #          test=os.path.isfile)
    pdb_file = "./4KI8.pdb"
    #   print pdb_file
    processed_pdb_file = monomer_library.pdb_interpretation.process(
        mon_lib_srv=mon_lib_srv,
        ener_lib=ener_lib,
        file_name=pdb_file,
        raw_records=None,
        force_symmetry=True)
    xray_structure = processed_pdb_file.xray_structure()
    pdb_inp = iotbx.pdb.input(file_name=pdb_file)
    pdb_hierarchy = pdb_inp.construct_hierarchy()
    #    xray_structure.scattering_type_registry(table = "wk1995")
    #    reflection_file = reflection_file_reader.any_reflection_file(file_name = "./4ksc-sf.cif")
    #    miller_arrays = reflection_file.as_miller_arrays()
    #    for miller_array in miller_arrays:
    #        if (miller_array.is_xray_amplitude_array()):
    #            f_obs = miller_array
    dummy = xray_structure.structure_factors(d_min=3.0).f_calc()
    f_obs = abs(
        dummy.structure_factors_from_scatterers(
            xray_structure=xray_structure).f_calc())
    flags = f_obs.generate_r_free_flags(fraction=0.01)
    #    f_calc = f_obs.structure_factors_from_scatterers(
    #            xray_structure = xray_structure).f_calc()
    fmodel = mmtbx.f_model.manager(xray_structure=xray_structure,
                                   f_obs=f_obs,
                                   r_free_flags=flags)
    #    bulk_solvent_manager = bulk_solvent_and_scaling.bulk_solvent_and_scales(
    #            fmodel_kbu = fmodel.fmodel_kbu)
    #    f_bulk = bulk_solvent_manager.f_bulk()
    #    f_bulk.set_info("Bulk solvent structure factors")
    #    f_bulk.show_summary()

    #    xray_structure.convert_to_isotropic()
    #    u_iso_start = xray_structure.extract_u_iso_or_u_equiv()
    #    xray_structure.set_b_iso(value = 100.0)
    #    xray_structure.convert_to_anisotropic()
    xray_structure.show_u_statistics(text="After set u_iso_start")
    atoms = pdb_hierarchy.atoms()
    atomsxyz = atoms.extract_xyz()
    sites_cart = xray_structure.sites_cart()
    atomic_weights = xray_structure.atomic_weights()
    u_cart = xray_structure.scatterers().extract_u_cart(
        xray_structure.unit_cell())
    #    nm_init_manager = nm_init(filename = "4ki8_evec.dat",
    #            n_modes = 50,
    #            atoms = atoms,
    #            zero_mode_input_flag = False,
    #            zero_mode_flag = True)
    #    eigenvector = nm_init_manager.return_modes(1)
    selections = []
    selection_strings = [
        "chain A", "chain B", "chain C", "chain D", "chain E", "chain F",
        "chain G"
    ]
    #    selection_strings = ["chain A"]
    for string in selection_strings:
        selections.append(
            processed_pdb_file.all_chain_proxies.selection(string=string))
    geometry = processed_pdb_file.geometry_restraints_manager(
        show_energies=False, plain_pairs_radius=5.0)
    restraints_manager = mmtbx.restraints.manager(geometry=geometry)
    modes = tools.generate_evec(selections=selections,
                                xray_structure=xray_structure,
                                pdb_hierarchy=pdb_hierarchy,
                                filename="4ki8_evec.dat",
                                n_modes=20)
    uanisos = flex.sym_mat3_double(xray_structure.sites_cart().size(),
                                   [0, 0, 0, 0, 0, 0])
    nmval = tools.read_nmval_file(evalin="4ki8_eval.dat",
                                  n_modes=20,
                                  zero_mode_input_flag=False,
                                  zero_mode_flag=True)
    xs_initial = []
    adp_nmas = []
    for selection in selections:
        x = tools.init_nm_para(nmval=nmval, n_modes=20)
        modes1d = tools.selected_modes_to_1D(modes=modes,
                                             n_modes=20,
                                             selection=selection)
        weights_selected = xray_structure.atomic_weights().select(selection)
        print "The number of selected atoms is %d." % len(weights_selected)
        u_cart_selected = u_cart.select(selection)
        adp_nma = init_nm_adp(modes=modes1d,
                              weights=weights_selected,
                              n_modes=20,
                              zero_mode_flag=True)
        adp_nmas.append(adp_nma)
        uaniso_from_s_manager = uaniso_from_s(x=x,
                                              adp_nma=adp_nma,
                                              n_modes=20,
                                              zero_mode_flag=True)
        u = uaniso_from_s_manager.u_cart()
        x_scaled = scale_x(x=x,
                           uanisos=u_cart_selected,
                           adp_all=u,
                           n_modes=20,
                           zero_mode_flag=True)
        xs_initial.append(x_scaled)


#    t1 = time.time()
    sfg_params = mmtbx.f_model.sf_and_grads_accuracy_master_params.extract()
    sfg_params.cos_sin_table = False
    tools.update_xray_structure_with_nm(xray_structure=xray_structure,
                                        adp_nmas=adp_nmas,
                                        selections=selections,
                                        xs=xs_initial,
                                        n_modes=20,
                                        zero_mode_flag=True)
    del adp_nmas

    class refinement_flags:
        pass

    refinement_flags.adp_tls = selections
    model = mmtbx.model.manager(refinement_flags=refinement_flags,
                                restraints_manager=restraints_manager,
                                xray_structure=xray_structure,
                                pdb_hierarchy=pdb_hierarchy)
    fmodel.update_xray_structure(xray_structure=xray_structure,
                                 update_f_calc=True)
    fmodel_cp = fmodel.deep_copy()
    nm_refinement_manager = tools.nm_refinement(
        fmodel=fmodel_cp,
        model=model,
        selections=selections,
        selections_1d=None,
        n_modes=20,
        number_of_macro_cycles=30,
        max_number_of_iterations=10000,
        evecin="4ki8_evec.dat",
        evalin="4ki8_eval.dat",
        start_xs_value=xs_initial,
        run_finite_differences_test=False)
    tools.show_time()
Exemplo n.º 16
0
def exercise_proxy_show():
  if sys.platform.startswith("win") and sys.version_info[:2] < (2,6):
    # This appears to be a windows-specific bug with string formatting
    # for python versions prior to 2.6, where the exponent is printed
    # with 3 digits rather than 2.
    print "Skipping exercise_proxy_show()"
    return
  sites_cart = flex.vec3_double((
    (-3.1739,10.8317,7.5653),(-2.5419,9.7567,6.6306),
    (-3.3369,8.8794,4.5191),(-3.4640,9.9882,5.3896)))
  site_labels = ("C1", "C2", "O16", "N8")
  u_cart = flex.sym_mat3_double((
    (0.0153,0.0206,0.0234,0.0035,-0.0052,-0.0051),
    (0.0185,0.0109,0.0206,0.0005,-0.0010,0.0002),
    (0.0295,0.0203,0.0218,-0.0010,-0.0003,-0.0044),
    (0.0159,0.0154,0.0206,-0.0003,0.0004,0.0036)))
  u_iso = flex.double((-1,-1,-1,-1))
  use_u_aniso = flex.bool((True,True,True,True))
  #
  proxies = adp_restraints.shared_adp_similarity_proxy()
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    u_cart=flex.sym_mat3_double(),
    u_iso=flex.double(),
    use_u_aniso=flex.bool(),
    f=sio)
  assert not show_diff(sio.getvalue(), """\
ADP similarity restraints: 0
""")
  proxies = adp_restraints.shared_adp_similarity_proxy([
    adp_restraints.adp_similarity_proxy(i_seqs=[0,1],weight=25),
    adp_restraints.adp_similarity_proxy(i_seqs=[2,3],weight=0.3)])
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio,
    prefix=":")
  assert not show_diff(sio.getvalue(), """\
:ADP similarity restraints: 2
:Sorted by residual:
:scatterers 0
:           1
:          delta    sigma   weight rms_deltas residual
: U11  -3.20e-03 2.00e-01 2.50e+01   4.96e-03 5.54e-03
: U22   9.70e-03 2.00e-01 2.50e+01
: U33   2.80e-03 2.00e-01 2.50e+01
: U12   3.00e-03 2.00e-01 2.50e+01
: U13  -4.20e-03 2.00e-01 2.50e+01
: U23  -5.30e-03 2.00e-01 2.50e+01
:scatterers 2
:           3
:          delta    sigma   weight rms_deltas residual
: U11   1.36e-02 1.83e+00 3.00e-01   6.15e-03 1.02e-04
: U22   4.90e-03 1.83e+00 3.00e-01
: U33   1.20e-03 1.83e+00 3.00e-01
: U12  -7.00e-04 1.83e+00 3.00e-01
: U13  -7.00e-04 1.83e+00 3.00e-01
: U23  -8.00e-03 1.83e+00 3.00e-01
""")
  sio = StringIO()
  proxies.show_sorted(
    by_value="rms_deltas",
    site_labels=site_labels,
    u_cart=u_cart,
    u_iso=flex.double((0.024,0.031,0.021,0.028)),
    use_u_aniso=flex.bool((False,False,False,False)),
    f=sio,
    prefix="=")
  assert not show_diff(sio.getvalue(), """\
=ADP similarity restraints: 2
=Sorted by rms_deltas:
=scatterers C1
=           C2
=          delta    sigma   weight residual
= Uiso -7.00e-03 2.00e-01 2.50e+01 1.22e-03
=scatterers O16
=           N8
=          delta    sigma   weight residual
= Uiso -7.00e-03 1.83e+00 3.00e-01 1.47e-05
""")
  #
  proxies = adp_restraints.shared_isotropic_adp_proxy()
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    u_cart=flex.sym_mat3_double(),
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio)
  assert not show_diff(sio.getvalue(), """\
Isotropic ADP restraints: 0
""")
  proxies = adp_restraints.shared_isotropic_adp_proxy([
    adp_restraints.isotropic_adp_proxy(i_seqs=(0,),weight=25),
    adp_restraints.isotropic_adp_proxy(i_seqs=(2,),weight=0.3)])
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    site_labels=site_labels,
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio,
    prefix=" ")
  assert not show_diff(sio.getvalue(), """\
 Isotropic ADP restraints: 2
 Sorted by residual:
 scatterer C1
          delta    sigma   weight rms_deltas residual
  U11 -4.47e-03 2.00e-01 2.50e+01   4.27e-03 4.11e-03
  U22  8.33e-04 2.00e-01 2.50e+01
  U33  3.63e-03 2.00e-01 2.50e+01
  U12  3.50e-03 2.00e-01 2.50e+01
  U13 -5.20e-03 2.00e-01 2.50e+01
  U23 -5.10e-03 2.00e-01 2.50e+01
 scatterer O16
          delta    sigma   weight rms_deltas residual
  U11  5.63e-03 1.83e+00 3.00e-01   3.16e-03 2.69e-05
  U22 -3.57e-03 1.83e+00 3.00e-01
  U33 -2.07e-03 1.83e+00 3.00e-01
  U12 -1.00e-03 1.83e+00 3.00e-01
  U13 -3.00e-04 1.83e+00 3.00e-01
  U23 -4.40e-03 1.83e+00 3.00e-01
""")
  sio = StringIO()
  proxies.show_sorted(
    by_value="rms_deltas",
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio,
    prefix="$")
  assert not show_diff(sio.getvalue(), """\
$Isotropic ADP restraints: 2
$Sorted by rms_deltas:
$scatterer 0
$         delta    sigma   weight rms_deltas residual
$ U11 -4.47e-03 2.00e-01 2.50e+01   4.27e-03 4.11e-03
$ U22  8.33e-04 2.00e-01 2.50e+01
$ U33  3.63e-03 2.00e-01 2.50e+01
$ U12  3.50e-03 2.00e-01 2.50e+01
$ U13 -5.20e-03 2.00e-01 2.50e+01
$ U23 -5.10e-03 2.00e-01 2.50e+01
$scatterer 2
$         delta    sigma   weight rms_deltas residual
$ U11  5.63e-03 1.83e+00 3.00e-01   3.16e-03 2.69e-05
$ U22 -3.57e-03 1.83e+00 3.00e-01
$ U33 -2.07e-03 1.83e+00 3.00e-01
$ U12 -1.00e-03 1.83e+00 3.00e-01
$ U13 -3.00e-04 1.83e+00 3.00e-01
$ U23 -4.40e-03 1.83e+00 3.00e-01
""")
  #
  proxies = adp_restraints.shared_rigid_bond_proxy()
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    sites_cart=flex.vec3_double(),
    u_cart=flex.sym_mat3_double(),
    f=sio)
  assert not show_diff(sio.getvalue(), """\
Rigid bond restraints: 0
""")
  proxies = adp_restraints.shared_rigid_bond_proxy([
    adp_restraints.rigid_bond_proxy(i_seqs=(0,1),weight=25),
    adp_restraints.rigid_bond_proxy(i_seqs=(0,2),weight=15),
    adp_restraints.rigid_bond_proxy(i_seqs=(2,3),weight=25),
    adp_restraints.rigid_bond_proxy(i_seqs=(3,1),weight=30)])
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    sites_cart=sites_cart,
    site_labels=site_labels,
    u_cart=u_cart,
    f=sio,
    prefix="*")
  assert not show_diff(sio.getvalue(), """\
*Rigid bond restraints: 4
*Sorted by residual:
*scatterers O16
*           N8
*   delta_z    sigma   weight residual
* -3.96e-03 2.00e-01 2.50e+01 3.92e-04
*scatterers C1
*           C2
*   delta_z    sigma   weight residual
*  1.08e-03 2.00e-01 2.50e+01 2.89e-05
*scatterers C1
*           O16
*   delta_z    sigma   weight residual
*  4.03e-04 2.58e-01 1.50e+01 2.44e-06
*scatterers N8
*           C2
*   delta_z    sigma   weight residual
* -1.54e-04 1.83e-01 3.00e+01 7.16e-07
""")
  sio = StringIO()
  proxies.show_sorted(
    by_value="delta",
    sites_cart=sites_cart,
    u_cart=u_cart,
    f=sio,
    prefix="||",
    max_items=2)
  assert not show_diff(sio.getvalue(), """\
||Rigid bond restraints: 4
||Sorted by delta:
||scatterers 2
||           3
||   delta_z    sigma   weight residual
|| -3.96e-03 2.00e-01 2.50e+01 3.92e-04
||scatterers 0
||           1
||   delta_z    sigma   weight residual
||  1.08e-03 2.00e-01 2.50e+01 2.89e-05
||... (remaining 2 not shown)
""")
Exemplo n.º 17
0
 def __init__(self,
              u_cart,
              u_iso=None,
              use_u_aniso=None,
              sites_cart=None,
              adp_similarity_proxies=None,
              rigid_bond_proxies=None,
              isotropic_adp_proxies=None,
              compute_gradients=True,
              gradients_aniso_cart=None,
              gradients_iso=None,
              disable_asu_cache=False,
              normalization=False):
     adopt_init_args(self, locals())
     self.number_of_restraints = 0
     self.residual_sum = 0
     self.normalization_factor = None
     if (adp_similarity_proxies is not None):
         assert u_iso is not None and use_u_aniso is not None
     if (rigid_bond_proxies is not None): assert sites_cart is not None
     if (sites_cart is not None): assert sites_cart.size() == u_cart.size()
     if (u_iso is not None): assert u_iso.size() == u_cart.size()
     if (use_u_aniso is not None):
         assert use_u_aniso.size() == u_cart.size()
     if (compute_gradients):
         if (self.gradients_aniso_cart is None):
             self.gradients_aniso_cart = flex.sym_mat3_double(
                 sites_cart.size(), [0, 0, 0, 0, 0, 0])
         else:
             assert self.gradients_aniso_cart.size() == sites_cart.size()
         if (u_iso is not None and self.gradients_iso is None):
             self.gradients_iso = flex.double(sites_cart.size(), 0)
         elif (u_iso is not None):
             assert self.gradients_iso.size() == sites_cart.size()
     if (adp_similarity_proxies is None):
         self.n_adp_similarity_proxies = None
         self.adp_similarity_residual_sum = 0
     else:
         self.n_adp_similarity_proxies = len(adp_similarity_proxies)
         self.adp_similarity_residual_sum = adp_restraints.adp_similarity_residual_sum(
             u_cart=u_cart,
             u_iso=u_iso,
             use_u_aniso=use_u_aniso,
             proxies=adp_similarity_proxies,
             gradients_aniso_cart=self.gradients_aniso_cart,
             gradients_iso=self.gradients_iso)
         self.number_of_restraints += 6 * self.n_adp_similarity_proxies
         self.residual_sum += self.adp_similarity_residual_sum
     if (rigid_bond_proxies is None):
         self.n_rigid_bond_proxies = None
         self.rigid_bond_residual_sum = 0
     else:
         self.n_rigid_bond_proxies = len(rigid_bond_proxies)
         self.rigid_bond_residual_sum = adp_restraints.rigid_bond_residual_sum(
             sites_cart=sites_cart,
             u_cart=u_cart,
             proxies=rigid_bond_proxies,
             gradients_aniso_cart=self.gradients_aniso_cart)
         self.number_of_restraints += self.n_rigid_bond_proxies
         self.residual_sum += self.rigid_bond_residual_sum
     if (isotropic_adp_proxies is None):
         self.n_isotropic_adp_proxies = None
         self.isotropic_adp_residual_sum = 0
     else:
         self.n_isotropic_adp_proxies = len(isotropic_adp_proxies)
         self.isotropic_adp_residual_sum = adp_restraints.isotropic_adp_residual_sum(
             u_cart=u_cart,
             proxies=isotropic_adp_proxies,
             gradients_aniso_cart=self.gradients_aniso_cart)
         self.number_of_restraints += self.n_isotropic_adp_proxies
         self.residual_sum += self.isotropic_adp_residual_sum
     self.finalize_target_and_gradients()
Exemplo n.º 18
0
    def __init__(self, cif_block):
        crystal_symmetry_builder.__init__(self, cif_block)

        self.hierarchy = hierarchy.root()
        # These items are mandatory for the _atom_site loop, all others are optional
        type_symbol = self._wrap_loop_if_needed(cif_block,
                                                "_atom_site.type_symbol")
        atom_labels = self._wrap_loop_if_needed(cif_block,
                                                "_atom_site.auth_atom_id")
        if atom_labels is None:
            atom_labels = self._wrap_loop_if_needed(
                cif_block, "_atom_site.label_atom_id"
            )  # corresponds to chem comp atom name
        alt_id = self._wrap_loop_if_needed(
            cif_block, "_atom_site.label_alt_id")  # alternate conformer id
        label_asym_id = self._wrap_loop_if_needed(
            cif_block, "_atom_site.label_asym_id")  # chain id
        auth_asym_id = self._wrap_loop_if_needed(cif_block,
                                                 "_atom_site.auth_asym_id")
        if label_asym_id is None: label_asym_id = auth_asym_id
        if auth_asym_id is None: auth_asym_id = label_asym_id
        comp_id = self._wrap_loop_if_needed(cif_block,
                                            "_atom_site.auth_comp_id")
        if comp_id is None:
            comp_id = self._wrap_loop_if_needed(
                cif_block, "_atom_site.label_comp_id")  # residue name
        entity_id = self._wrap_loop_if_needed(cif_block,
                                              "_atom_site.label_entity_id")
        seq_id = self._wrap_loop_if_needed(cif_block, "_atom_site.auth_seq_id")
        if seq_id is None:
            seq_id = self._wrap_loop_if_needed(
                cif_block, "_atom_site.label_seq_id")  # residue number
        assert [atom_labels, alt_id, auth_asym_id, comp_id, entity_id,
                seq_id].count(None) == 0, "someting is not present"
        assert type_symbol is not None

        atom_site_fp = cif_block.get('_atom_site.phenix_scat_dispersion_real')
        atom_site_fdp = cif_block.get('_atom_site.phenix_scat_dispersion_imag')

        pdb_ins_code = cif_block.get(
            "_atom_site.pdbx_PDB_ins_code")  # insertion code
        model_ids = cif_block.get("_atom_site.pdbx_PDB_model_num")
        atom_site_id = cif_block.get("_atom_site.id")
        # only permitted values are ATOM or HETATM
        group_PDB = cif_block.get("_atom_site.group_PDB")
        # TODO: read esds
        B_iso_or_equiv = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.B_iso_or_equiv"))
        cart_x = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.Cartn_x"))
        cart_y = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.Cartn_y"))
        cart_z = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.Cartn_z"))
        occu = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.occupancy"))
        formal_charge = self._wrap_loop_if_needed(
            cif_block, "_atom_site.pdbx_formal_charge")
        # anisotropic b-factors
        # TODO: read esds
        anisotrop_id = self._wrap_loop_if_needed(cif_block,
                                                 "_atom_site_anisotrop.id")
        adps = None
        if anisotrop_id is not None:
            u_ij = [
                self._wrap_loop_if_needed(
                    cif_block,
                    "_atom_site_anisotrop.U[%s][%s]" % (ij[0], ij[1]))
                for ij in ("11", "22", "33", "12", "13", "23")
            ]
            assert u_ij.count(None) in (0, 6)
            if u_ij.count(None) == 0:
                adps = u_ij
            else:
                assert u_ij.count(None) == 6
                b_ij = [
                    self._wrap_loop_if_needed(
                        cif_block,
                        "_atom_site_anisotrop.B[%s][%s]" % (ij[0], ij[1]))
                    for ij in ("11", "22", "33", "12", "13", "23")
                ]
                assert b_ij.count(None) in (0, 6)
                if b_ij.count(None) == 0:
                    adps = adptbx.b_as_u(b_ij)
                assert not (u_ij.count(None) and b_ij.count(None)
                            )  # illegal for both to be present
            if adps is not None:
                try:
                    adps = [flex.double(adp) for adp in adps]
                except ValueError as e:
                    raise CifBuilderError("Error interpreting ADPs: " + str(e))
                adps = flex.sym_mat3_double(*adps)
        py_adps = {}
        if anisotrop_id is not None and adps is not None:
            for an_id, adp in zip(list(anisotrop_id), list(adps)):
                py_adps[an_id] = adp
        current_model_id = None
        current_label_asym_id = None
        current_auth_asym_id = None
        current_residue_id = None
        current_ins_code = None

        for i_atom in range(atom_labels.size()):
            # model(s)
            last_model_id = current_model_id
            current_model_id = model_ids[i_atom]
            assert current_model_id is not None
            if current_model_id != last_model_id:
                model = hierarchy.model(id=current_model_id)
                self.hierarchy.append_model(model)

            # chain(s)
            last_label_asym_id = current_label_asym_id
            current_label_asym_id = label_asym_id[i_atom]
            assert current_label_asym_id is not None
            last_auth_asym_id = current_auth_asym_id
            current_auth_asym_id = auth_asym_id[i_atom]
            assert current_auth_asym_id not in [".", "?", " "], "mmCIF file contains " + \
              "record with empty auth_asym_id, which is wrong."
            assert current_label_asym_id is not None
            if (current_auth_asym_id != last_auth_asym_id
                    or current_model_id != last_model_id):
                chain = hierarchy.chain(id=current_auth_asym_id)
                model.append_chain(chain)
            else:
                assert current_auth_asym_id == last_auth_asym_id

            # residue_group(s)
            # defined by residue id and insertion code
            last_residue_id = current_residue_id
            current_residue_id = seq_id[i_atom]
            assert current_residue_id is not None
            last_ins_code = current_ins_code
            if pdb_ins_code is not None:
                current_ins_code = pdb_ins_code[i_atom]
                if current_ins_code in ("?", ".", None): current_ins_code = " "
            if (current_residue_id != last_residue_id
                    or current_ins_code != last_ins_code
                    or current_auth_asym_id != last_auth_asym_id
                    or current_model_id != last_model_id):
                try:
                    resseq = hy36encode(width=4, value=int(current_residue_id))
                except ValueError as e:
                    resseq = current_residue_id
                    assert len(resseq) == 4
                residue_group = hierarchy.residue_group(resseq=resseq,
                                                        icode=current_ins_code)
                chain.append_residue_group(residue_group)
                atom_groups = OrderedDict()  # reset atom_groups cache
            # atom_group(s)
            # defined by resname and altloc id
            current_altloc = alt_id[i_atom]
            if current_altloc == "." or current_altloc == "?":
                current_altloc = ""  # Main chain atoms
            current_resname = comp_id[i_atom]
            if (current_altloc, current_resname) not in atom_groups:
                atom_group = hierarchy.atom_group(altloc=current_altloc,
                                                  resname=current_resname)
                atom_groups[(current_altloc, current_resname)] = atom_group
                if current_altloc == "":
                    residue_group.insert_atom_group(0, atom_group)
                else:
                    residue_group.append_atom_group(atom_group)
            else:
                atom_group = atom_groups[(current_altloc, current_resname)]

            # atom(s)
            atom = hierarchy.atom()
            atom_group.append_atom(atom)
            atom.set_element(type_symbol[i_atom])
            atom.set_name(
                format_pdb_atom_name(atom_labels[i_atom], type_symbol[i_atom]))
            atom.set_xyz(new_xyz=(cart_x[i_atom], cart_y[i_atom],
                                  cart_z[i_atom]))
            atom.set_b(B_iso_or_equiv[i_atom])
            atom.set_occ(occu[i_atom])
            # hy36encode should go once the pdb.hierarchy has been
            # modified to no longer store fixed-width strings
            atom.set_serial(
                hy36encode(width=5, value=int(atom_site_id[i_atom])))
            # some code relies on an empty segid being 4 spaces
            atom.set_segid("    ")
            if group_PDB is not None and group_PDB[i_atom] == "HETATM":
                atom.hetero = True
            if formal_charge is not None:
                charge = formal_charge[i_atom]
                if charge not in ("?", "."):
                    if charge.endswith("-") or charge.startswith("-"):
                        sign = "-"
                    else:
                        sign = "+"
                    charge = charge.strip(" -+")
                    charge = int(charge)
                    if charge == 0: sign = ""
                    atom.set_charge("%i%s" % (charge, sign))
            if atom_site_fp is not None:
                fp = atom_site_fp[i_atom]
                if fp not in ("?", "."):
                    atom.set_fp(new_fp=float(fp))
            if atom_site_fdp is not None:
                fdp = atom_site_fdp[i_atom]
                if fdp not in ("?", "."):
                    atom.set_fdp(new_fdp=float(fdp))
            if anisotrop_id is not None and adps is not None:
                py_u_ij = py_adps.get(atom.serial.strip(), None)
                if py_u_ij is not None:
                    atom.set_uij(py_u_ij)
        if len(self.hierarchy.models()) == 1:
            # for compatibility with single-model PDB files
            self.hierarchy.models()[0].id = ""
Exemplo n.º 19
0
    def __init__(self, cif_block):
        crystal_symmetry_builder.__init__(self, cif_block)

        self.hierarchy = hierarchy.root()
        # These items are mandatory for the _atom_site loop, all others are optional
        type_symbol = self._wrap_loop_if_needed(cif_block,
                                                "_atom_site.type_symbol")
        atom_labels = self._wrap_loop_if_needed(cif_block,
                                                "_atom_site.auth_atom_id")
        if atom_labels is None:
            atom_labels = self._wrap_loop_if_needed(
                cif_block, "_atom_site.label_atom_id"
            )  # corresponds to chem comp atom name
        alt_id = self._wrap_loop_if_needed(
            cif_block, "_atom_site.label_alt_id")  # alternate conformer id
        label_asym_id = self._wrap_loop_if_needed(
            cif_block, "_atom_site.label_asym_id")  # chain id
        auth_asym_id = self._wrap_loop_if_needed(cif_block,
                                                 "_atom_site.auth_asym_id")
        if label_asym_id is None: label_asym_id = auth_asym_id
        if auth_asym_id is None: auth_asym_id = label_asym_id
        comp_id = self._wrap_loop_if_needed(cif_block,
                                            "_atom_site.auth_comp_id")
        if comp_id is None:
            comp_id = self._wrap_loop_if_needed(
                cif_block, "_atom_site.label_comp_id")  # residue name
        entity_id = self._wrap_loop_if_needed(cif_block,
                                              "_atom_site.label_entity_id")
        seq_id = self._wrap_loop_if_needed(cif_block, "_atom_site.auth_seq_id")
        if seq_id is None:
            seq_id = self._wrap_loop_if_needed(
                cif_block, "_atom_site.label_seq_id")  # residue number
        assert [atom_labels, alt_id, auth_asym_id, comp_id, entity_id,
                seq_id].count(None) == 0, "someting is not present"
        assert type_symbol is not None

        atom_site_fp = cif_block.get('_atom_site.phenix_scat_dispersion_real')
        atom_site_fdp = cif_block.get('_atom_site.phenix_scat_dispersion_imag')

        pdb_ins_code = cif_block.get(
            "_atom_site.pdbx_PDB_ins_code")  # insertion code
        model_ids = cif_block.get("_atom_site.pdbx_PDB_model_num")
        atom_site_id = cif_block.get("_atom_site.id")
        # only permitted values are ATOM or HETATM
        group_PDB = cif_block.get("_atom_site.group_PDB")
        # TODO: read esds
        B_iso_or_equiv = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.B_iso_or_equiv"))
        cart_x = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.Cartn_x"))
        cart_y = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.Cartn_y"))
        cart_z = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.Cartn_z"))
        occu = flex.double(
            self._wrap_loop_if_needed(cif_block, "_atom_site.occupancy"))
        formal_charge = self._wrap_loop_if_needed(
            cif_block, "_atom_site.pdbx_formal_charge")
        # anisotropic b-factors
        # TODO: read esds
        anisotrop_id = self._wrap_loop_if_needed(cif_block,
                                                 "_atom_site_anisotrop.id")
        adps = None
        if anisotrop_id is not None:
            u_ij = [
                self._wrap_loop_if_needed(
                    cif_block,
                    "_atom_site_anisotrop.U[%s][%s]" % (ij[0], ij[1]))
                for ij in ("11", "22", "33", "12", "13", "23")
            ]
            assert u_ij.count(None) in (0, 6)
            if u_ij.count(None) == 0:
                adps = u_ij
            else:
                assert u_ij.count(None) == 6
                b_ij = [
                    self._wrap_loop_if_needed(
                        cif_block,
                        "_atom_site_anisotrop.B[%s][%s]" % (ij[0], ij[1]))
                    for ij in ("11", "22", "33", "12", "13", "23")
                ]
                assert b_ij.count(None) in (0, 6)
                if b_ij.count(None) == 0:
                    adps = adptbx.b_as_u(b_ij)
                assert not (u_ij.count(None) and b_ij.count(None)
                            )  # illegal for both to be present
            if adps is not None:
                try:
                    adps = [flex.double(adp) for adp in adps]
                except ValueError, e:
                    raise CifBuilderError("Error interpreting ADPs: " + str(e))
                adps = flex.sym_mat3_double(*adps)
Exemplo n.º 20
0
 def fd_grads(self, proxy):
   dynamic_restraint_proxy_classes = (
     adp.adp_u_eq_similarity_proxy,
     adp.adp_volume_similarity_proxy,
   )
   if isinstance(proxy, (dynamic_restraint_proxy_classes)):
     n_restraints = len(proxy.i_seqs)
   else:
     n_restraints = rows_per_restraint.get(proxy.__class__, 1)
   grads = [flex.double(self.param_map.n_parameters) for i in range(n_restraints)]
   eps = 1e-8
   uc = self.xray_structure.unit_cell()
   xs = self.xray_structure
   u_cart = xs.scatterers().extract_u_cart(uc).deep_copy()
   u_star = xs.scatterers().extract_u_star().deep_copy()
   u_iso = xs.scatterers().extract_u_iso().deep_copy()
   single_delta_classes = (
     adp.fixed_u_eq_adp,
   )
   for n in xrange(n_restraints):
     for i in xrange(self.param_map.n_scatterers):
       use_u_aniso = self.param_map[i].u_aniso > -1
       use_u_iso = self.param_map[i].u_iso > -1
       for j in range(6):
         if use_u_aniso:
           h = [0,0,0,0,0,0]
           h[j] = eps
           h = matrix.sym(sym_mat3=h)
           u_star[i]=list((matrix.sym(sym_mat3=u_star[i]) + h).as_sym_mat3())
           r = self.restraint(proxy, u_cart=flex.sym_mat3_double([
             adptbx.u_star_as_u_cart(uc, u) for u in u_star]))
           if isinstance(r, adp.rigid_bond):
             d1 = r.delta_z()
           elif isinstance(r, single_delta_classes):
             d1 = r.delta()
           else:
             d1 = r.deltas()[n]
           u_star[i]=list((matrix.sym(sym_mat3=u_star[i]) - 2*h).as_sym_mat3())
           r = self.restraint(proxy, u_cart=flex.sym_mat3_double([
             adptbx.u_star_as_u_cart(uc, u) for u in u_star]))
           if isinstance(r, adp.rigid_bond):
             d2 = r.delta_z()
           elif isinstance(r, single_delta_classes):
             d2 = r.delta()
           else:
             d2 = r.deltas()[n]
         elif use_u_iso:
           u_iso[i] += eps
           r = self.restraint(proxy, u_iso=u_iso)
           if isinstance(r, adp.rigid_bond):
             d1 = r.delta_z()
           elif isinstance(r, single_delta_classes):
             d1 = r.delta()
           else:
             d1 = r.deltas()[n]
           u_iso[i] -= 2*eps
           r = self.restraint(proxy, u_iso=u_iso)
           if isinstance(r, adp.rigid_bond):
             d2 = r.delta_z()
           elif isinstance(r, single_delta_classes):
             d2 = r.delta()
           else:
             d2 = r.deltas()[n]
         d_delta = (d1-d2)/(2*eps)
         if not isinstance(r, adp.rigid_bond) and j > 2:
           d_delta *= 2 # off diagonals count twice
         if use_u_aniso:
           grads[n][self.param_map[i].u_aniso+j] = d_delta
         elif use_u_iso:
           grads[n][self.param_map[i].u_iso] = d_delta
           break
   return grads
Exemplo n.º 21
0
def run(args):
    #    if (len(args) == 0 ):
#        raise RuntimeError("Please specify one or more pdb file names.")
    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/1A32.pdb",
#          test=os.path.isfile)
    pdb_file = "./4KI8.pdb"
#   print pdb_file
    processed_pdb_file = monomer_library.pdb_interpretation.process(
           mon_lib_srv               = mon_lib_srv,
           ener_lib                  = ener_lib,
           file_name                 = pdb_file,
           raw_records               = None,
           force_symmetry            = True)
    xray_structure = processed_pdb_file.xray_structure()
    pdb_inp = iotbx.pdb.input(file_name=pdb_file)
    pdb_hierarchy = pdb_inp.construct_hierarchy()
    xray_structure.scattering_type_registry(table = "wk1995")
    xray_structure.convert_to_isotropic()
    u_iso_start = xray_structure.extract_u_iso_or_u_equiv()
    xray_structure.convert_to_anisotropic()
    atoms = pdb_hierarchy.atoms()
    atomsxyz = atoms.extract_xyz()
    sites_cart = xray_structure.sites_cart()
    atomic_weights = xray_structure.atomic_weights()
#    nm_init_manager = nm_init(filename = "4ki8_evec.dat",
#            n_modes = 50,
#            atoms = atoms,
#            zero_mode_input_flag = False,
#            zero_mode_flag = True)
#    eigenvector = nm_init_manager.return_modes(1)
    selections = []
    selection_strings = ["chain A", "chain B", "chain C", "chain D", "chain E", "chain F", "chain G"]
    for string in selection_strings:
        selections.append(processed_pdb_file.all_chain_proxies.selection(
                                                                string = string))
    modes = tools.generate_evec(selections = selections,
                                xray_structure = xray_structure,
                                pdb_hierarchy = pdb_hierarchy,
                                filename = "4ki8_evec.dat",
                                n_modes = 50)
    time_init_nm_adp = 0.0
    uanisos = flex.sym_mat3_double(xray_structure.sites_cart().size(), [0,0,0,0,0,0])
    for selection in selections:
        modes1d = tools.selected_modes_to_1D(modes = modes, n_modes = 50, selection = selection)
        weights_selected = xray_structure.atomic_weights().select(selection)
        assert len(modes1d) % 50 == 0
        nmval = tools.read_nmval_file(evalin = "4ki8_eval.dat",
                                      n_modes = 50,
                                      zero_mode_input_flag = False,
                                      zero_mode_flag = True)
        x = tools.init_nm_para(nmval = nmval,
                         n_modes = 50)
        t1 = time.time()
#        adp_nma = init_nm_adp(modes = modes1d,
#                              weights = weights_selected,
#                              n_modes = 50,
#                              zero_mode_flag = True)
#        print len(adp_nma)
#        s = unpack_x(x = x, n_modes = 50, zero_mode_flag = True)
        uaniso_from_s_manager = uaniso_from_s(x = x, modes1d = modes1d, weights = weights_selected,
                          n_modes = 50,
                          zero_mode_flag = True)
        u = uaniso_from_s_manager.u_cart()
        uanisos.set_selected(selection, u)
        len_mode = int(len(modes1d)/50)
        t2 = time.time()
        time_init_nm_adp += (t2 - t1)
    print " time_init_nm_adp = %-7.2f"% time_init_nm_adp
#        for i in range(50):
#            modes_selected = modes[i].select(selection)
#            for j in range(len_mode):
#                assert modes1d[j+len_mode*i] == modes_selected[j]
#    eigenA = eigenvector.select(selections[0])
#    for selection in selections:
#        sites_cart_selected = xray_structure.sites_cart().select(selection)
#        atomic_weights_selected = xray_structure.atomic_weights().select(selection)
#        nm_init_manager.gen_zero_modes(sites_cart_selected, atomic_weights_selected)
#        zero_mode0 = nm_init_manager.return_zero_modes(0)
#    print t2 - t1
    tools.show_time()
Exemplo n.º 22
0
def exercise_rigid_bond():
  i_seqs = (1,2)
  weight = 1
  p = adp_restraints.rigid_bond_proxy(i_seqs=i_seqs,weight=weight)
  assert p.i_seqs == i_seqs
  assert p.weight == weight
  sites = ((1,2,3),(2,3,4))
  u_cart = ((1,2,3,4,5,6), (3,4,5,6,7,8))
  expected_gradients = ((-4, -4, -4, -8, -8, -8), (4, 4, 4, 8, 8, 8))
  r = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=weight)
  assert r.weight == weight
  assert approx_equal(r.delta_z(), -6)
  assert approx_equal(r.residual(), 36)
  assert approx_equal(r.gradients(), expected_gradients)
  sites_cart = flex.vec3_double(((1,2,3),(2,5,4),(3,4,5)))
  u_cart = flex.sym_mat3_double(((1,2,3,4,5,6),
                                 (2,3,3,5,7,7),
                                 (3,4,5,3,7,8)))
  r = adp_restraints.rigid_bond(
    adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart),
    proxy=p)
  assert approx_equal(r.weight, weight)
  unit_cell = uctbx.unit_cell([15,25,30,90,90,90])
  sites_frac = unit_cell.fractionalize(sites_cart=sites_cart)
  u_star = flex.sym_mat3_double([
    adptbx.u_cart_as_u_star(unit_cell, u_cart_i)
    for u_cart_i in u_cart])
  pair = adp_restraints.rigid_bond_pair(sites_frac[1],
                                     sites_frac[2],
                                     u_star[1],
                                     u_star[2],
                                     unit_cell)
  assert approx_equal(pair.delta_z(), abs(r.delta_z()))
  assert approx_equal(pair.z_12(), r.z_12())
  assert approx_equal(pair.z_21(), r.z_21())
  #
  gradients_aniso_cart = flex.sym_mat3_double(sites_cart.size(), (0,0,0,0,0,0))
  gradients_iso = flex.double(sites_cart.size(), 0)
  proxies = adp_restraints.shared_rigid_bond_proxy([p,p])
  params = adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart)
  residuals = adp_restraints.rigid_bond_residuals(params, proxies=proxies)
  assert approx_equal(residuals, (r.residual(),r.residual()))
  deltas = adp_restraints.rigid_bond_deltas(params, proxies=proxies)
  assert approx_equal(deltas, (r.delta_z(),r.delta_z()))
  residual_sum = adp_restraints.rigid_bond_residual_sum(
    params=params,
    proxies=proxies,
    gradients_aniso_cart=gradients_aniso_cart)
  assert approx_equal(residual_sum, 2 * r.residual())
  for g,e in zip(gradients_aniso_cart[1:3], r.gradients()):
    assert approx_equal(g, matrix.col(e)*2)
  fd_grads_aniso, fd_grads_iso = finite_difference_gradients(
    restraint_type=adp_restraints.rigid_bond,
    proxy=p,
    sites_cart=sites_cart,
    u_cart=u_cart)
  for g,e in zip(gradients_aniso_cart, fd_grads_aniso):
    assert approx_equal(g, matrix.col(e)*2)
  #
  # check frame invariance of residual
  #
  u_cart_1 = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01))
  u_cart_2 = matrix.sym(sym_mat3=(0.21,0.32,0.11,0.02,0.02,0.07))
  u_cart = (u_cart_1.as_sym_mat3(),u_cart_2.as_sym_mat3())
  site_cart_1 = matrix.col((1,2,3))
  site_cart_2 = matrix.col((3,1,4.2))
  sites = (tuple(site_cart_1),tuple(site_cart_2))
  a = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=1)
  expected_residual = a.residual()
  gen = flex.mersenne_twister()
  for i in range(20):
    R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3))
    u_cart_1_rot = R * u_cart_1 * R.transpose()
    u_cart_2_rot = R * u_cart_2 * R.transpose()
    u_cart = (u_cart_1_rot.as_sym_mat3(),u_cart_2_rot.as_sym_mat3())
    site_cart_1_rot = R * site_cart_1
    site_cart_2_rot = R * site_cart_2
    sites = (tuple(site_cart_1_rot),tuple(site_cart_2_rot))
    a = adp_restraints.rigid_bond(
      sites=sites, u_cart=u_cart,
      weight=1)
    assert approx_equal(a.residual(), expected_residual)
Exemplo n.º 23
0
def exercise_flex_xray_scatterer():
  from cctbx import uctbx, sgtbx, xray
  uc = uctbx.unit_cell((10,11,12))
  sg = sgtbx.space_group_info("P 2")
  a = flex.xray_scatterer()
  assert a.size() == 0
  a = flex.xray_scatterer((
    xray.scatterer("Si1", (0.1,0.2,0.3)),
    xray.scatterer("O1", (0.2,0.3,0.4), (1,2,3,-0.1,0.2,-0.3), 0.9),
    xray.scatterer("K1", (0.3,0.4,0.5), (3,1,2,-0.2,0.3,-0.1), 0.8,
                         fp=5, fdp=7)))
  assert a.size() == 3
  assert a[1].multiplicity() == 0
  a[1].apply_symmetry(uc, sg.group())
  assert a[1].multiplicity() == 2
  assert approx_equal(a[1].weight(), 0.9)
  a.front().occupancy = 0.8
  assert approx_equal(a[0].occupancy, 0.8)
  a.back().occupancy = 0.7
  assert approx_equal(a[-1].occupancy, 0.7)
  a[0].flags.set_grad_site(state=True)
  a[1].flags.set_grad_fp(state=True)
  a[2].flags.param = -234
  p = pickle.dumps(a)
  b = pickle.loads(p)
  a_ = a.deep_copy()
  assert a_.n_grad_u_iso() == a_.n_grad_u_aniso() == 0
  a_[0].flags.set_grad_u_iso(state=True)
  a_[1].flags.set_grad_u_aniso(state=True)
  a_[2].flags.set_grad_u_aniso(state=True)
  assert a_.n_grad_u_iso() == 1
  assert a_.n_grad_u_aniso() == 2
  for i,ai in enumerate(a):
    bi = b[i]
    assert ai.label == bi.label
    assert ai.scattering_type == bi.scattering_type
    assert approx_equal(ai.fp, bi.fp)
    assert approx_equal(ai.fdp, bi.fdp)
    assert approx_equal(ai.site, bi.site)
    assert ai.flags.use_u_aniso() == bi.flags.use_u_aniso()
    assert ai.u_iso == bi.u_iso
    assert ai.u_star == bi.u_star
    assert ai.multiplicity() == bi.multiplicity()
    assert approx_equal(ai.weight(), bi.weight())
    assert ai.flags.bits == bi.flags.bits
    assert ai.flags.param == bi.flags.param
  assert b[0].flags.grad_site()
  assert not b[0].flags.grad_fp()
  assert not b[1].flags.grad_site()
  assert b[1].flags.grad_fp()
  assert b[2].flags.param == -234
  assert list(a.extract_labels()) == ["Si1", "O1", "K1"]
  assert list(a.extract_scattering_types()) == ["Si", "O", "K"]
  assert approx_equal(a.extract_sites(),
                      ((0.1,0.2,0.3),(0.2,0.3,0.4),(0.3,0.4,0.5)))
  a.set_sites(sites=flex.vec3_double(
    ((-0.1,-0.2,-0.3),(-0.2,-0.3,-0.4),(-0.3,-0.4,-0.5))))
  assert approx_equal(a.extract_sites(),
    ((-0.1,-0.2,-0.3),(-0.2,-0.3,-0.4),(-0.3,-0.4,-0.5)))
  assert approx_equal(a[1].site, (-0.2,-0.3,-0.4))
  assert approx_equal(a.extract_occupancies(), (0.8,0.9,0.7))
  a.set_occupancies(occupancies=flex.double((0.1,0.2,0.3)))
  assert approx_equal(a.extract_occupancies(), (0.1,0.2,0.3))
  assert approx_equal(a[1].occupancy, 0.2)
  assert approx_equal(a.extract_u_iso(), (0.0, -1.0, -1.0))
  assert approx_equal(a.extract_u_iso_or_u_equiv(unit_cell=uc),
    (0.0, 258, 236+1/3.))
  a.set_u_iso(u_iso=flex.double((3,4,5)), selection=flex.bool(a.size(), True),
    unit_cell = uc)
  assert approx_equal(a.extract_u_iso(), (3,-1,-1))
  assert approx_equal(a.extract_u_iso_or_u_equiv(unit_cell=uc),
    (3, 4, 5))
  assert approx_equal(a[1].u_iso, -1)
  u_cart_answer = [(-1.0, -1.0, -1.0, -1.0, -1.0, -1.0),
                   (4, 4, 4, 0, 0, 0), (5, 5, 5, 0, 0, 0)]
  assert approx_equal(a.extract_u_cart(uc), u_cart_answer)
  a.set_u_star(u_star=flex.sym_mat3_double(
     [(-1,-2,-1,-1,-1,-1),
      (1,2,3,-0.6,0.2,-0.3),
      (3,1,2,-0.2,0.5,-0.1)]))
  assert approx_equal(a.extract_u_star(),
     [(-1,-1,-1,-1,-1,-1),
      (1,2,3,-0.6,0.2,-0.3),
      (3,1,2,-0.2,0.5,-0.1)])
  assert approx_equal(a[1].u_star, (1,2,3,-0.6,0.2,-0.3))
  unit_cell = uctbx.unit_cell((1,1,1,90,90,90))
  a.set_u_cart(
    unit_cell=unit_cell,
    u_cart=flex.sym_mat3_double(
     [(-1,-2,-1,-1,-1,-1),
      (1,2,3,-0.6,0.2,-0.3),
      (3,1,2,-0.2,0.5,-0.1)]))
  assert approx_equal(a.extract_u_cart(unit_cell=unit_cell),
     [(-1,-1,-1,-1,-1,-1),
      (1,2,3,-0.6,0.2,-0.3),
      (3,1,2,-0.2,0.5,-0.1)])
  #
  a.set_u_cart(unit_cell = unit_cell,
               u_cart    = flex.sym_mat3_double([(1,2,3,4,5,6),
                                                 (0,0,0,1,2,3),
                                                 (1,2,3,0,0,0)]),
               selection = flex.size_t([1,2]))
  assert approx_equal(a.extract_u_cart(unit_cell=unit_cell),
     [(-1,-1,-1,-1,-1,-1),
      (0,0,0,1,2,3),
      (1,2,3,0,0,0)])
  #
  unit_cell = uctbx.unit_cell((10,10,10,90,90,90))
  a.set_u_cart(
    unit_cell=unit_cell,
    u_cart=flex.sym_mat3_double(
     [(-1,-2,-1,-1,-1,-1),
      (1,2,3,-0.6,0.2,-0.3),
      (3,1,2,-0.2,0.5,-0.1)]))
  assert approx_equal(a.extract_u_star(),
    [(-1,-1,-1,-1,-1,-1),
     (0.01, 0.02, 0.03, -0.006, 0.002, -0.003),
     (0.03, 0.01, 0.02, -0.002, 0.005, -0.001)])
  assert approx_equal(a.extract_u_iso(), [3,-1,-1])
  a.scale_adps(2.0)
  assert approx_equal(a.extract_u_star(),
    [(-1,-1,-1,-1,-1,-1),
     (0.02, 0.04, 0.06, -0.012, 0.004, -0.006),
     (0.06, 0.02, 0.04, -0.004, 0.01,  -0.002)])
  assert approx_equal(a.extract_u_iso(), [6,-1,-1])
  assert a.count_anisotropic() == 2
  assert a.count_anomalous() == 1
  a.convert_to_isotropic(unit_cell=unit_cell)
  assert a.count_anisotropic() == 0
  a.convert_to_anisotropic(unit_cell=unit_cell)
  assert a.count_anisotropic() == 3
  m = a.sites_mod_positive()
  assert approx_equal(m.extract_sites(), [
    (0.9,0.8,0.7),
    (0.8,0.7,0.6),
    (0.7,0.6,0.5)])
  m[2].site = (0.7,0.6,1.4) # to avoid +-0.5 ambiguity
  m = m.sites_mod_short()
  assert approx_equal(m.extract_sites(), [
    (-0.1,-0.2,-0.3),
    (-0.2,-0.3,-0.4),
    (-0.3,-0.4,0.4)])
  #
  assert a.extract_grad_u_iso().all_eq(False)
  a[1].flags.set_grad_u_iso(state=True)
  assert list(a.extract_grad_u_iso()) == [False, True, False]
Exemplo n.º 24
0
  def __init__(self, cif_block):
    crystal_symmetry_builder.__init__(self, cif_block)

    self.hierarchy = hierarchy.root()

    # These items are mandatory for the _atom_site loop, all others are optional
    type_symbol = cif_block.get("_atom_site.type_symbol")
    atom_labels = cif_block.get("_atom_site.auth_atom_id")
    if atom_labels is None:
      atom_labels = cif_block.get("_atom_site.label_atom_id") # corresponds to chem comp atom name
    alt_id = cif_block.get("_atom_site.label_alt_id") # alternate conformer id
    label_asym_id = cif_block.get("_atom_site.label_asym_id") # chain id
    auth_asym_id = cif_block.get("_atom_site.auth_asym_id")
    if label_asym_id is None: label_asym_id = auth_asym_id
    if auth_asym_id is None: auth_asym_id = label_asym_id
    comp_id = cif_block.get("_atom_site.auth_comp_id")
    if comp_id is None:
      comp_id = cif_block.get("_atom_site.label_comp_id") # residue name
    entity_id = cif_block.get("_atom_site.label_entity_id")
    seq_id = cif_block.get("_atom_site.auth_seq_id")
    if seq_id is None:
      seq_id = cif_block.get("_atom_site.label_seq_id") # residue number
    assert [atom_labels, alt_id, auth_asym_id, comp_id, entity_id, seq_id].count(None) == 0
    assert type_symbol is not None

    atom_site_fp = cif_block.get('_atom_site.phenix_scat_dispersion_real')
    atom_site_fdp = cif_block.get('_atom_site.phenix_scat_dispersion_imag')

    pdb_ins_code = cif_block.get("_atom_site.pdbx_PDB_ins_code") # insertion code
    model_ids = cif_block.get("_atom_site.pdbx_PDB_model_num")
    atom_site_id = cif_block.get("_atom_site.id")
    # only permitted values are ATOM or HETATM
    group_PDB = cif_block.get("_atom_site.group_PDB")

    # TODO: read esds
    B_iso_or_equiv = flex.double(cif_block.get("_atom_site.B_iso_or_equiv"))
    cart_x = flex.double(cif_block.get("_atom_site.Cartn_x"))
    cart_y = flex.double(cif_block.get("_atom_site.Cartn_y"))
    cart_z = flex.double(cif_block.get("_atom_site.Cartn_z"))
    occu = flex.double(cif_block.get("_atom_site.occupancy"))
    formal_charge = cif_block.get("_atom_site.pdbx_formal_charge")

    # anisotropic b-factors
    # TODO: read esds
    anisotrop_id = cif_block.get("_atom_site_anisotrop.id")
    adps = None
    if anisotrop_id is not None:
      u_ij = [cif_block.get("_atom_site_anisotrop.U[%s][%s]" %(ij[0], ij[1]))
              for ij in ("11", "22", "33", "12", "13", "23")]
      assert u_ij.count(None) in (0, 6)
      if u_ij.count(None) == 0:
        adps = u_ij
      else:
        assert u_ij.count(None) == 6
        b_ij = [cif_block.get("_atom_site_anisotrop.B[%s][%s]" %(ij[0], ij[1]))
                for ij in ("11", "22", "33", "12", "13", "23")]
        assert b_ij.count(None) in (0, 6)
        if b_ij.count(None) == 0:
          adps = adptbx.b_as_u(b_ij)
        assert not (u_ij.count(None) and b_ij.count(None)) # illegal for both to be present
      if adps is not None:
        try:
          adps = [flex.double(adp) for adp in adps]
        except ValueError, e:
          raise CifBuilderError("Error interpreting ADPs: " + str(e))
        adps = flex.sym_mat3_double(*adps)
Exemplo n.º 25
0
def exercise_adp_similarity():
  u_cart = ((1,3,2,4,3,6),(2,4,2,6,5,1))
  u_iso = (-1,-1)
  use_u_aniso = (True, True)
  weight = 1
  a = adp_restraints.adp_similarity(
    u_cart=u_cart,
    weight=weight)
  assert approx_equal(a.use_u_aniso, use_u_aniso)
  assert a.weight == weight
  assert approx_equal(a.residual(), 68)
  assert approx_equal(a.gradients2(),
    ((-2.0, -2.0, 0.0, -8.0, -8.0, 20.0), (2.0, 2.0, -0.0, 8.0, 8.0, -20.0)))
  assert approx_equal(a.deltas(), (-1.0, -1.0, 0.0, -2.0, -2.0, 5.0))
  assert approx_equal(a.rms_deltas(), 2.7487370837451071)
  #
  u_cart = ((1,3,2,4,3,6),(-1,-1,-1,-1,-1,-1))
  u_iso = (-1,2)
  use_u_aniso = (True, False)
  a = adp_restraints.adp_similarity(
    u_cart[0], u_iso[1], weight=weight)
  assert approx_equal(a.use_u_aniso, use_u_aniso)
  assert a.weight == weight
  assert approx_equal(a.residual(), 124)
  assert approx_equal(a.gradients2(),
    ((-2, 2, 0, 16, 12, 24), (2, -2, 0, -16, -12, -24)))
  assert approx_equal(a.deltas(), (-1, 1, 0, 4, 3, 6))
  assert approx_equal(a.rms_deltas(), 3.711842908553348)
  #
  i_seqs_aa = (1,2) # () - ()
  i_seqs_ai = (1,0) # () - o
  i_seqs_ia = (3,2) #  o - ()
  i_seqs_ii = (0,3) #  o - o
  p_aa = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_aa,weight=weight)
  p_ai = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_ai,weight=weight)
  p_ia = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_ia,weight=weight)
  p_ii = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_ii,weight=weight)
  assert p_aa.i_seqs == i_seqs_aa
  assert p_aa.weight == weight
  u_cart = flex.sym_mat3_double(((-1,-1,-1,-1,-1,-1),
                                 (1,2,2,4,3,6),
                                 (2,4,2,6,5,1),
                                 (-1,-1,-1,-1,-1,-1)))
  u_iso = flex.double((1,-1,-1,2))
  use_u_aniso = flex.bool((False, True,True,False))
  for p in (p_aa,p_ai,p_ia,p_ii):
    params = adp_restraint_params(u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso)
    a = adp_restraints.adp_similarity(params, proxy=p)
    assert approx_equal(a.weight, weight)
    #
    gradients_aniso_cart = flex.sym_mat3_double(u_cart.size(), (0,0,0,0,0,0))
    gradients_iso = flex.double(u_cart.size(), 0)
    proxies = adp_restraints.shared_adp_similarity_proxy([p,p])
    residuals = adp_restraints.adp_similarity_residuals(params, proxies=proxies)
    assert approx_equal(residuals, (a.residual(),a.residual()))
    deltas_rms = adp_restraints.adp_similarity_deltas_rms(params, proxies=proxies)
    assert approx_equal(deltas_rms, (a.rms_deltas(),a.rms_deltas()))
    residual_sum = adp_restraints.adp_similarity_residual_sum(
      params,
      proxies=proxies,
      gradients_aniso_cart=gradients_aniso_cart,
      gradients_iso=gradients_iso)
    assert approx_equal(residual_sum, 2 * a.residual())
    fd_grads_aniso, fd_grads_iso = finite_difference_gradients(
      restraint_type=adp_restraints.adp_similarity,
      proxy=p,
      u_cart=u_cart,
      u_iso=u_iso,
      use_u_aniso=use_u_aniso)
    for g,e in zip(gradients_aniso_cart, fd_grads_aniso):
      assert approx_equal(g,  matrix.col(e)*2)
    for g,e in zip(gradients_iso, fd_grads_iso):
      assert approx_equal(g, e*2)
  #
  # check frame invariance of residual
  #
  u_cart_1 = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01))
  u_cart_2 = matrix.sym(sym_mat3=(0.21,0.32,0.11,0.02,0.02,0.07))
  u_cart = (u_cart_1.as_sym_mat3(),u_cart_2.as_sym_mat3())
  u_iso = (-1, -1)
  use_u_aniso = (True, True)
  a = adp_restraints.adp_similarity(u_cart, weight=1)
  expected_residual = a.residual()
  gen = flex.mersenne_twister()
  for i in range(20):
    R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3))
    u_cart_1_rot = R * u_cart_1 * R.transpose()
    u_cart_2_rot = R * u_cart_2 * R.transpose()
    u_cart = (u_cart_1_rot.as_sym_mat3(),u_cart_2_rot.as_sym_mat3())
    a = adp_restraints.adp_similarity(u_cart, weight=1)
    assert approx_equal(a.residual(), expected_residual)
Exemplo n.º 26
0
    def __init__(self,
                 pdb_str,
                 dx=0,
                 dy=0,
                 dz=0,
                 sx=0,
                 sy=0,
                 sz=0,
                 lx=[1, 0, 0],
                 ly=[0, 1, 0],
                 lz=[0, 0, 1],
                 tx=0,
                 ty=0,
                 tz=0,
                 vx=[1, 0, 0],
                 vy=[0, 1, 0],
                 vz=[0, 0, 1],
                 w_M_lx=[0, 0, 0],
                 w_M_ly=[0, 0, 0],
                 w_M_lz=[0, 0, 0],
                 origin=None,
                 n_models=10000,
                 assert_similarity=True,
                 show=False,
                 log=sys.stdout,
                 write_pdb_files=False,
                 smear_eps=0):
        from mmtbx.tls import analysis, tls_as_xyz
        from scitbx import matrix
        from libtbx.utils import null_out
        if (show):
            print >> log, "INPUTS:", "-" * 73
            print >> log, "dx    :", dx
            print >> log, "dy    :", dy
            print >> log, "dz    :", dz
            print >> log, "sx    :", sx
            print >> log, "sy    :", sy
            print >> log, "sz    :", sz
            print >> log, "lx    :", [i for i in lx]
            print >> log, "ly    :", [i for i in ly]
            print >> log, "lz    :", [i for i in lz]
            print >> log, "tx    :", tx
            print >> log, "ty    :", ty
            print >> log, "tz    :", tz
            print >> log, "vx    :", [i for i in vx]
            print >> log, "vy    :", [i for i in vy]
            print >> log, "vz    :", [i for i in vz]
            print >> log, "w_M_lx:", [i for i in w_M_lx]
            print >> log, "w_M_ly:", [i for i in w_M_ly]
            print >> log, "w_M_lz:", [i for i in w_M_lz]
            print >> log, "origin:", origin
            print >> log, "-" * 79
        #
        pdb_inp = iotbx.pdb.input(source_info=None, lines=pdb_str)
        ph = pdb_inp.construct_hierarchy()
        xrs = ph.extract_xray_structure(
            crystal_symmetry=pdb_inp.crystal_symmetry())
        sites_cart = xrs.sites_cart()
        ph.atoms().set_xyz(sites_cart)
        if (origin is None):
            origin = sites_cart.mean()
        #
        o_tfm = analysis.tls_from_motions(dx=dx,
                                          dy=dy,
                                          dz=dz,
                                          l_x=matrix.col(lx),
                                          l_y=matrix.col(ly),
                                          l_z=matrix.col(lz),
                                          sx=sx,
                                          sy=sy,
                                          sz=sz,
                                          tx=tx,
                                          ty=ty,
                                          tz=tz,
                                          v_x=matrix.col(vx),
                                          v_y=matrix.col(vy),
                                          v_z=matrix.col(vz),
                                          w_M_lx=matrix.col(w_M_lx),
                                          w_M_ly=matrix.col(w_M_ly),
                                          w_M_lz=matrix.col(w_M_lz))
        #
        self.u_cart_tls = get_u_cart(o_tfm=o_tfm,
                                     origin=origin,
                                     sites_cart=sites_cart)
        tlso_ = tlso(t=o_tfm.T_M.as_sym_mat3(),
                     l=o_tfm.L_M.as_sym_mat3(),
                     s=o_tfm.S_M.as_mat3(),
                     origin=origin)
        if (assert_similarity):
            T = matrix.sym(sym_mat3=tlso_.t)
            L = matrix.sym(sym_mat3=tlso_.l)
            S = matrix.sqr(tlso_.s)
            o_tfm = analysis.run(T=T, L=L, S=S, log=null_out()).self_check()
        #
        r = tls_as_xyz.ensemble_generator(tls_from_motions_object=o_tfm,
                                          pdb_hierarchy=ph,
                                          xray_structure=xrs,
                                          n_models=n_models,
                                          origin=origin,
                                          use_states=write_pdb_files,
                                          log=null_out())
        if (write_pdb_files):
            r.write_pdb_file(file_name="ensemble_%s.pdb" % str(n_models))
        #
        xyz_all = r.sites_cart_ens
        n_atoms = xyz_all[0].size()
        ###
        xyz_atoms_all = all_vs_all(xyz_all=xyz_all)
        ###
        self.u_cart_ens = flex.sym_mat3_double()
        for i in xrange(n_atoms):
            self.u_cart_ens.append(
                u_cart_from_xyz(sites_cart=xyz_atoms_all[i]))
        u1 = self.u_cart_tls.as_double()
        u2 = self.u_cart_ens.as_double()
        #self.r = flex.sum(flex.abs(u1-u2))/\
        #         flex.sum(flex.abs(flex.abs(u1)+flex.abs(u2)))*2
        # LS
        #diff = u1-u2
        #self.rLS = math.sqrt(flex.sum(diff*diff)/(9.*diff.size()))
        #
        # Merritt / Murshudov
        e = smear_eps
        eps = matrix.sqr([e, 0, 0, 0, e, 0, 0, 0, e])
        I = matrix.sqr([2, 0, 0, 0, 2, 0, 0, 0, 2])

        def add_const(u):
            es = eigensystem.real_symmetric(u)
            vecs = es.vectors()
            l_z = matrix.col((vecs[0], vecs[1], vecs[2]))
            l_y = matrix.col((vecs[3], vecs[4], vecs[5]))
            l_x = matrix.col((vecs[6], vecs[7], vecs[8]))
            #l_x = l_y.cross(l_z)
            u = matrix.sym(sym_mat3=u)
            R = matrix.sqr([
                l_x[0], l_y[0], l_z[0], l_x[1], l_y[1], l_z[1], l_x[2], l_y[2],
                l_z[2]
            ])
            uD = R.transpose() * u * R
            result = R * (uD + eps) * R.transpose()
            tmp = R * uD * R.transpose()
            for i in xrange(6):
                assert approx_equal(tmp[i], u[i])
            return R * (uD + eps) * R.transpose()

        self.KL = 0
        self.CC = 0
        n1, n2, d1, d2 = 0, 0, 0, 0
        for u1, u2 in zip(self.u_cart_tls, self.u_cart_ens):
            for i in xrange(6):
                n1 += abs(u1[i] - u2[i])
                d1 += (abs(u1[i]) + abs(u2[i]))
            u1 = add_const(u=u1)
            u2 = add_const(u=u2)
            for i in xrange(6):
                n2 += abs(u1[i] - u2[i])
                d2 += (abs(u1[i]) + abs(u2[i]))
            iu1 = u1.inverse()
            iu2 = u2.inverse()
            self.KL += (u1 * iu2 + u2 * iu1 - I).trace()
            diu1 = iu1.determinant()
            diu2 = iu2.determinant()
            den = (iu1 + iu2).determinant()
            self.CC += (diu1 * diu2)**0.25 / (den / 8)**0.5
        self.KL = self.KL / self.u_cart_ens.size()
        self.CC = self.CC / self.u_cart_ens.size()
        self.R1 = n1 / d1 * 2
        self.R2 = n2 / d2 * 2
        self.r = self.R1
        #
        ###
        for i in xrange(n_atoms):
            ut = ["%8.5f" % u for u in self.u_cart_tls[i]]
            ue = ["%8.5f" % u for u in self.u_cart_ens[i]]
            if (assert_similarity):
                for j in xrange(6):
                    assert approx_equal(abs(float(ut[j])), abs(float(ue[j])),
                                        1.e-3)
        #
        if (write_pdb_files):
            ph.atoms().set_uij(self.u_cart_tls)
            ph.write_pdb_file(file_name="u_from_tls.pdb",
                              crystal_symmetry=xrs.crystal_symmetry())
            ph.atoms().set_uij(self.u_cart_ens)
            ph.write_pdb_file(file_name="u_from_ens.pdb",
                              crystal_symmetry=xrs.crystal_symmetry())
Exemplo n.º 27
0
def exercise_rigid_bond():
  i_seqs = (1,2)
  weight = 1
  p = adp_restraints.rigid_bond_proxy(i_seqs=i_seqs,weight=weight)
  assert p.i_seqs == i_seqs
  assert p.weight == weight
  sites = ((1,2,3),(2,3,4))
  u_cart = ((1,2,3,4,5,6), (3,4,5,6,7,8))
  expected_gradients = ((-4, -4, -4, -8, -8, -8), (4, 4, 4, 8, 8, 8))
  r = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=weight)
  assert r.weight == weight
  assert approx_equal(r.delta_z(), -6)
  assert approx_equal(r.residual(), 36)
  assert approx_equal(r.gradients(), expected_gradients)
  sites_cart = flex.vec3_double(((1,2,3),(2,5,4),(3,4,5)))
  u_cart = flex.sym_mat3_double(((1,2,3,4,5,6),
                                 (2,3,3,5,7,7),
                                 (3,4,5,3,7,8)))
  r = adp_restraints.rigid_bond(
    adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart),
    proxy=p)
  assert approx_equal(r.weight, weight)
  unit_cell = uctbx.unit_cell([15,25,30,90,90,90])
  sites_frac = unit_cell.fractionalize(sites_cart=sites_cart)
  u_star = flex.sym_mat3_double([
    adptbx.u_cart_as_u_star(unit_cell, u_cart_i)
    for u_cart_i in u_cart])
  pair = adp_restraints.rigid_bond_pair(sites_frac[1],
                                     sites_frac[2],
                                     u_star[1],
                                     u_star[2],
                                     unit_cell)
  assert approx_equal(pair.delta_z(), abs(r.delta_z()))
  assert approx_equal(pair.z_12(), r.z_12())
  assert approx_equal(pair.z_21(), r.z_21())
  #
  gradients_aniso_cart = flex.sym_mat3_double(sites_cart.size(), (0,0,0,0,0,0))
  gradients_iso = flex.double(sites_cart.size(), 0)
  proxies = adp_restraints.shared_rigid_bond_proxy([p,p])
  params = adp_restraint_params(sites_cart=sites_cart, u_cart=u_cart)
  residuals = adp_restraints.rigid_bond_residuals(params, proxies=proxies)
  assert approx_equal(residuals, (r.residual(),r.residual()))
  deltas = adp_restraints.rigid_bond_deltas(params, proxies=proxies)
  assert approx_equal(deltas, (r.delta_z(),r.delta_z()))
  residual_sum = adp_restraints.rigid_bond_residual_sum(
    params=params,
    proxies=proxies,
    gradients_aniso_cart=gradients_aniso_cart)
  assert approx_equal(residual_sum, 2 * r.residual())
  for g,e in zip(gradients_aniso_cart[1:3], r.gradients()):
    assert approx_equal(g, matrix.col(e)*2)
  fd_grads_aniso, fd_grads_iso = finite_difference_gradients(
    restraint_type=adp_restraints.rigid_bond,
    proxy=p,
    sites_cart=sites_cart,
    u_cart=u_cart)
  for g,e in zip(gradients_aniso_cart, fd_grads_aniso):
    assert approx_equal(g, matrix.col(e)*2)
  #
  # check frame invariance of residual
  #
  u_cart_1 = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01))
  u_cart_2 = matrix.sym(sym_mat3=(0.21,0.32,0.11,0.02,0.02,0.07))
  u_cart = (u_cart_1.as_sym_mat3(),u_cart_2.as_sym_mat3())
  site_cart_1 = matrix.col((1,2,3))
  site_cart_2 = matrix.col((3,1,4.2))
  sites = (tuple(site_cart_1),tuple(site_cart_2))
  a = adp_restraints.rigid_bond(sites=sites, u_cart=u_cart, weight=1)
  expected_residual = a.residual()
  gen = flex.mersenne_twister()
  for i in range(20):
    R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3))
    u_cart_1_rot = R * u_cart_1 * R.transpose()
    u_cart_2_rot = R * u_cart_2 * R.transpose()
    u_cart = (u_cart_1_rot.as_sym_mat3(),u_cart_2_rot.as_sym_mat3())
    site_cart_1_rot = R * site_cart_1
    site_cart_2_rot = R * site_cart_2
    sites = (tuple(site_cart_1_rot),tuple(site_cart_2_rot))
    a = adp_restraints.rigid_bond(
      sites=sites, u_cart=u_cart,
      weight=1)
    assert approx_equal(a.residual(), expected_residual)
Exemplo n.º 28
0
def exercise_adp_similarity():
  u_cart = ((1,3,2,4,3,6),(2,4,2,6,5,1))
  u_iso = (-1,-1)
  use_u_aniso = (True, True)
  weight = 1
  a = adp_restraints.adp_similarity(
    u_cart=u_cart,
    weight=weight)
  assert approx_equal(a.use_u_aniso, use_u_aniso)
  assert a.weight == weight
  assert approx_equal(a.residual(), 68)
  assert approx_equal(a.gradients2(),
    ((-2.0, -2.0, 0.0, -8.0, -8.0, 20.0), (2.0, 2.0, -0.0, 8.0, 8.0, -20.0)))
  assert approx_equal(a.deltas(), (-1.0, -1.0, 0.0, -2.0, -2.0, 5.0))
  assert approx_equal(a.rms_deltas(), 2.7487370837451071)
  #
  u_cart = ((1,3,2,4,3,6),(-1,-1,-1,-1,-1,-1))
  u_iso = (-1,2)
  use_u_aniso = (True, False)
  a = adp_restraints.adp_similarity(
    u_cart[0], u_iso[1], weight=weight)
  assert approx_equal(a.use_u_aniso, use_u_aniso)
  assert a.weight == weight
  assert approx_equal(a.residual(), 124)
  assert approx_equal(a.gradients2(),
    ((-2, 2, 0, 16, 12, 24), (2, -2, 0, -16, -12, -24)))
  assert approx_equal(a.deltas(), (-1, 1, 0, 4, 3, 6))
  assert approx_equal(a.rms_deltas(), 3.711842908553348)
  #
  i_seqs_aa = (1,2) # () - ()
  i_seqs_ai = (1,0) # () - o
  i_seqs_ia = (3,2) #  o - ()
  i_seqs_ii = (0,3) #  o - o
  p_aa = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_aa,weight=weight)
  p_ai = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_ai,weight=weight)
  p_ia = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_ia,weight=weight)
  p_ii = adp_restraints.adp_similarity_proxy(i_seqs=i_seqs_ii,weight=weight)
  assert p_aa.i_seqs == i_seqs_aa
  assert p_aa.weight == weight
  u_cart = flex.sym_mat3_double(((-1,-1,-1,-1,-1,-1),
                                 (1,2,2,4,3,6),
                                 (2,4,2,6,5,1),
                                 (-1,-1,-1,-1,-1,-1)))
  u_iso = flex.double((1,-1,-1,2))
  use_u_aniso = flex.bool((False, True,True,False))
  for p in (p_aa,p_ai,p_ia,p_ii):
    params = adp_restraint_params(u_cart=u_cart, u_iso=u_iso, use_u_aniso=use_u_aniso)
    a = adp_restraints.adp_similarity(params, proxy=p)
    assert approx_equal(a.weight, weight)
    #
    gradients_aniso_cart = flex.sym_mat3_double(u_cart.size(), (0,0,0,0,0,0))
    gradients_iso = flex.double(u_cart.size(), 0)
    proxies = adp_restraints.shared_adp_similarity_proxy([p,p])
    residuals = adp_restraints.adp_similarity_residuals(params, proxies=proxies)
    assert approx_equal(residuals, (a.residual(),a.residual()))
    deltas_rms = adp_restraints.adp_similarity_deltas_rms(params, proxies=proxies)
    assert approx_equal(deltas_rms, (a.rms_deltas(),a.rms_deltas()))
    residual_sum = adp_restraints.adp_similarity_residual_sum(
      params,
      proxies=proxies,
      gradients_aniso_cart=gradients_aniso_cart,
      gradients_iso=gradients_iso)
    assert approx_equal(residual_sum, 2 * a.residual())
    fd_grads_aniso, fd_grads_iso = finite_difference_gradients(
      restraint_type=adp_restraints.adp_similarity,
      proxy=p,
      u_cart=u_cart,
      u_iso=u_iso,
      use_u_aniso=use_u_aniso)
    for g,e in zip(gradients_aniso_cart, fd_grads_aniso):
      assert approx_equal(g,  matrix.col(e)*2)
    for g,e in zip(gradients_iso, fd_grads_iso):
      assert approx_equal(g, e*2)
  #
  # check frame invariance of residual
  #
  u_cart_1 = matrix.sym(sym_mat3=(0.1,0.2,0.05,0.03,0.02,0.01))
  u_cart_2 = matrix.sym(sym_mat3=(0.21,0.32,0.11,0.02,0.02,0.07))
  u_cart = (u_cart_1.as_sym_mat3(),u_cart_2.as_sym_mat3())
  u_iso = (-1, -1)
  use_u_aniso = (True, True)
  a = adp_restraints.adp_similarity(u_cart, weight=1)
  expected_residual = a.residual()
  gen = flex.mersenne_twister()
  for i in range(20):
    R = matrix.rec(gen.random_double_r3_rotation_matrix(),(3,3))
    u_cart_1_rot = R * u_cart_1 * R.transpose()
    u_cart_2_rot = R * u_cart_2 * R.transpose()
    u_cart = (u_cart_1_rot.as_sym_mat3(),u_cart_2_rot.as_sym_mat3())
    a = adp_restraints.adp_similarity(u_cart, weight=1)
    assert approx_equal(a.residual(), expected_residual)
Exemplo n.º 29
0
def run(args):
    #    if (len(args) == 0 ):
    #        raise RuntimeError("Please specify one or more pdb file names.")
    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/1A32.pdb",
    #          test=os.path.isfile)
    pdb_file = "./4KI8.pdb"
    #   print pdb_file
    processed_pdb_file = monomer_library.pdb_interpretation.process(
        mon_lib_srv=mon_lib_srv,
        ener_lib=ener_lib,
        file_name=pdb_file,
        raw_records=None,
        force_symmetry=True)
    xray_structure = processed_pdb_file.xray_structure()
    pdb_inp = iotbx.pdb.input(file_name=pdb_file)
    pdb_hierarchy = pdb_inp.construct_hierarchy()
    xray_structure.scattering_type_registry(table="wk1995")
    xray_structure.convert_to_isotropic()
    u_iso_start = xray_structure.extract_u_iso_or_u_equiv()
    xray_structure.convert_to_anisotropic()
    atoms = pdb_hierarchy.atoms()
    atomsxyz = atoms.extract_xyz()
    sites_cart = xray_structure.sites_cart()
    atomic_weights = xray_structure.atomic_weights()
    u_cart = xray_structure.scatterers().extract_u_cart(
        xray_structure.unit_cell())
    print atomic_weights.size()
    #    nm_init_manager = nm_init(filename = "4ki8_evec.dat",
    #            n_modes = 50,
    #            atoms = atoms,
    #            zero_mode_input_flag = False,
    #            zero_mode_flag = True)
    #    eigenvector = nm_init_manager.return_modes(1)
    selections = []
    selection_strings = [
        "chain A", "chain B", "chain C", "chain D", "chain E", "chain F",
        "chain G"
    ]
    for string in selection_strings:
        selections.append(
            processed_pdb_file.all_chain_proxies.selection(string=string))
    print selections[0]
    print len(selections[0])
    modes = tools.generate_evec(selections=selections,
                                xray_structure=xray_structure,
                                pdb_hierarchy=pdb_hierarchy,
                                filename="4ki8_evec.dat",
                                n_modes=50)
    time_init_nm_adp = 0.0
    uanisos = flex.sym_mat3_double(xray_structure.sites_cart().size(),
                                   [0, 0, 0, 0, 0, 0])
    nmval = tools.read_nmval_file(evalin="4ki8_eval.dat",
                                  n_modes=50,
                                  zero_mode_input_flag=False,
                                  zero_mode_flag=True)
    for selection in selections:
        modes1d = tools.selected_modes_to_1D(modes=modes,
                                             n_modes=50,
                                             selection=selection)
        #        pprint(list(modes1d))
        weights_selected = xray_structure.atomic_weights().select(selection)
        u_cart_selected = u_cart.select(selection)
        assert len(modes1d) % 50 == 0
        x = tools.init_nm_para(nmval=nmval, n_modes=50)
        #        pprint(list(x))
        t1 = time.time()
        adp_nma = init_nm_adp(modes=modes1d,
                              weights=weights_selected,
                              n_modes=50,
                              zero_mode_flag=True)
        #        print len(adp_nma)
        #        s = unpack_x(x = x, n_modes = 50, zero_mode_flag = True)
        uaniso_from_s_manager = uaniso_from_s(x=x,
                                              adp_nma=adp_nma,
                                              weights=weights_selected,
                                              n_modes=50,
                                              zero_mode_flag=True)
        u = uaniso_from_s_manager.u_cart()
        x_scaled = scale_x(x=x,
                           uanisos=u_cart_selected,
                           adp_all=u,
                           n_modes=50,
                           zero_mode_flag=True)
        del uaniso_from_s_manager
        uaniso_from_s_manager = uaniso_from_s(x=x_scaled,
                                              adp_nma=adp_nma,
                                              weights=weights_selected,
                                              n_modes=50,
                                              zero_mode_flag=True)
        del u
        u = uaniso_from_s_manager.u_cart()
        uanisos.set_selected(selection, u)
        len_mode = int(len(modes1d) / 50)
        t2 = time.time()
        time_init_nm_adp += (t2 - t1)
    pprint(list(uanisos))
    print " time_init_nm_adp = %-7.2f" % time_init_nm_adp
    #        for i in range(50):
    #            modes_selected = modes[i].select(selection)
    #            for j in range(len_mode):
    #                assert modes1d[j+len_mode*i] == modes_selected[j]
    #    eigenA = eigenvector.select(selections[0])
    #    for selection in selections:
    #        sites_cart_selected = xray_structure.sites_cart().select(selection)
    #        atomic_weights_selected = xray_structure.atomic_weights().select(selection)
    #        nm_init_manager.gen_zero_modes(sites_cart_selected, atomic_weights_selected)
    #        zero_mode0 = nm_init_manager.return_zero_modes(0)
    #    print t2 - t1
    tools.show_time()
Exemplo n.º 30
0
def exercise_proxy_show():
  sites_cart = flex.vec3_double((
    (-3.1739,10.8317,7.5653),(-2.5419,9.7567,6.6306),
    (-3.3369,8.8794,4.5191),(-3.4640,9.9882,5.3896)))
  site_labels = ("C1", "C2", "O16", "N8")
  u_cart = flex.sym_mat3_double((
    (0.0153,0.0206,0.0234,0.0035,-0.0052,-0.0051),
    (0.0185,0.0109,0.0206,0.0005,-0.0010,0.0002),
    (0.0295,0.0203,0.0218,-0.0010,-0.0003,-0.0044),
    (0.0159,0.0154,0.0206,-0.0003,0.0004,0.0036)))
  u_iso = flex.double((-1,-1,-1,-1))
  use_u_aniso = flex.bool((True,True,True,True))
  #
  proxies = adp_restraints.shared_adp_similarity_proxy()
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    u_cart=flex.sym_mat3_double(),
    u_iso=flex.double(),
    use_u_aniso=flex.bool(),
    f=sio)
  assert not show_diff(sio.getvalue(), """\
ADP similarity restraints: 0
""")
  proxies = adp_restraints.shared_adp_similarity_proxy([
    adp_restraints.adp_similarity_proxy(i_seqs=[0,1],weight=25),
    adp_restraints.adp_similarity_proxy(i_seqs=[2,3],weight=0.3)])
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio,
    prefix=":")
  assert not show_diff(sio.getvalue(), """\
:ADP similarity restraints: 2
:Sorted by residual:
:scatterers 0
:           1
:          delta    sigma   weight rms_deltas residual
: U11  -3.20e-03 2.00e-01 2.50e+01   4.96e-03 5.54e-03
: U22   9.70e-03 2.00e-01 2.50e+01
: U33   2.80e-03 2.00e-01 2.50e+01
: U12   3.00e-03 2.00e-01 2.50e+01
: U13  -4.20e-03 2.00e-01 2.50e+01
: U23  -5.30e-03 2.00e-01 2.50e+01
:scatterers 2
:           3
:          delta    sigma   weight rms_deltas residual
: U11   1.36e-02 1.83e+00 3.00e-01   6.15e-03 1.02e-04
: U22   4.90e-03 1.83e+00 3.00e-01
: U33   1.20e-03 1.83e+00 3.00e-01
: U12  -7.00e-04 1.83e+00 3.00e-01
: U13  -7.00e-04 1.83e+00 3.00e-01
: U23  -8.00e-03 1.83e+00 3.00e-01
""")
  sio = StringIO()
  proxies.show_sorted(
    by_value="rms_deltas",
    site_labels=site_labels,
    u_cart=u_cart,
    u_iso=flex.double((0.024,0.031,0.021,0.028)),
    use_u_aniso=flex.bool((False,False,False,False)),
    f=sio,
    prefix="=")
  assert not show_diff(sio.getvalue(), """\
=ADP similarity restraints: 2
=Sorted by rms_deltas:
=scatterers C1
=           C2
=          delta    sigma   weight residual
= Uiso -7.00e-03 2.00e-01 2.50e+01 1.22e-03
=scatterers O16
=           N8
=          delta    sigma   weight residual
= Uiso -7.00e-03 1.83e+00 3.00e-01 1.47e-05
""")
  #
  proxies = adp_restraints.shared_isotropic_adp_proxy()
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    u_cart=flex.sym_mat3_double(),
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio)
  assert not show_diff(sio.getvalue(), """\
Isotropic ADP restraints: 0
""")
  proxies = adp_restraints.shared_isotropic_adp_proxy([
    adp_restraints.isotropic_adp_proxy(i_seqs=(0,),weight=25),
    adp_restraints.isotropic_adp_proxy(i_seqs=(2,),weight=0.3)])
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    site_labels=site_labels,
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio,
    prefix=" ")
  assert not show_diff(sio.getvalue(), """\
 Isotropic ADP restraints: 2
 Sorted by residual:
 scatterer C1
          delta    sigma   weight rms_deltas residual
  U11 -4.47e-03 2.00e-01 2.50e+01   4.27e-03 4.11e-03
  U22  8.33e-04 2.00e-01 2.50e+01
  U33  3.63e-03 2.00e-01 2.50e+01
  U12  3.50e-03 2.00e-01 2.50e+01
  U13 -5.20e-03 2.00e-01 2.50e+01
  U23 -5.10e-03 2.00e-01 2.50e+01
 scatterer O16
          delta    sigma   weight rms_deltas residual
  U11  5.63e-03 1.83e+00 3.00e-01   3.16e-03 2.69e-05
  U22 -3.57e-03 1.83e+00 3.00e-01
  U33 -2.07e-03 1.83e+00 3.00e-01
  U12 -1.00e-03 1.83e+00 3.00e-01
  U13 -3.00e-04 1.83e+00 3.00e-01
  U23 -4.40e-03 1.83e+00 3.00e-01
""")
  sio = StringIO()
  proxies.show_sorted(
    by_value="rms_deltas",
    u_cart=u_cart,
    u_iso=u_iso,
    use_u_aniso=use_u_aniso,
    f=sio,
    prefix="$")
  assert not show_diff(sio.getvalue(), """\
$Isotropic ADP restraints: 2
$Sorted by rms_deltas:
$scatterer 0
$         delta    sigma   weight rms_deltas residual
$ U11 -4.47e-03 2.00e-01 2.50e+01   4.27e-03 4.11e-03
$ U22  8.33e-04 2.00e-01 2.50e+01
$ U33  3.63e-03 2.00e-01 2.50e+01
$ U12  3.50e-03 2.00e-01 2.50e+01
$ U13 -5.20e-03 2.00e-01 2.50e+01
$ U23 -5.10e-03 2.00e-01 2.50e+01
$scatterer 2
$         delta    sigma   weight rms_deltas residual
$ U11  5.63e-03 1.83e+00 3.00e-01   3.16e-03 2.69e-05
$ U22 -3.57e-03 1.83e+00 3.00e-01
$ U33 -2.07e-03 1.83e+00 3.00e-01
$ U12 -1.00e-03 1.83e+00 3.00e-01
$ U13 -3.00e-04 1.83e+00 3.00e-01
$ U23 -4.40e-03 1.83e+00 3.00e-01
""")
  #
  proxies = adp_restraints.shared_rigid_bond_proxy()
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    sites_cart=flex.vec3_double(),
    u_cart=flex.sym_mat3_double(),
    f=sio)
  assert not show_diff(sio.getvalue(), """\
Rigid bond restraints: 0
""")
  proxies = adp_restraints.shared_rigid_bond_proxy([
    adp_restraints.rigid_bond_proxy(i_seqs=(0,1),weight=25),
    adp_restraints.rigid_bond_proxy(i_seqs=(0,2),weight=15),
    adp_restraints.rigid_bond_proxy(i_seqs=(2,3),weight=25),
    adp_restraints.rigid_bond_proxy(i_seqs=(3,1),weight=30)])
  sio = StringIO()
  proxies.show_sorted(
    by_value="residual",
    sites_cart=sites_cart,
    site_labels=site_labels,
    u_cart=u_cart,
    f=sio,
    prefix="*")
  assert not show_diff(sio.getvalue(), """\
*Rigid bond restraints: 4
*Sorted by residual:
*scatterers O16
*           N8
*   delta_z    sigma   weight residual
* -3.96e-03 2.00e-01 2.50e+01 3.92e-04
*scatterers C1
*           C2
*   delta_z    sigma   weight residual
*  1.08e-03 2.00e-01 2.50e+01 2.89e-05
*scatterers C1
*           O16
*   delta_z    sigma   weight residual
*  4.03e-04 2.58e-01 1.50e+01 2.44e-06
*scatterers N8
*           C2
*   delta_z    sigma   weight residual
* -1.54e-04 1.83e-01 3.00e+01 7.16e-07
""")
  sio = StringIO()
  proxies.show_sorted(
    by_value="delta",
    sites_cart=sites_cart,
    u_cart=u_cart,
    f=sio,
    prefix="||",
    max_items=2)
  assert not show_diff(sio.getvalue(), """\
||Rigid bond restraints: 4
||Sorted by delta:
||scatterers 2
||           3
||   delta_z    sigma   weight residual
|| -3.96e-03 2.00e-01 2.50e+01 3.92e-04
||scatterers 0
||           1
||   delta_z    sigma   weight residual
||  1.08e-03 2.00e-01 2.50e+01 2.89e-05
||... (remaining 2 not shown)
""")
Exemplo n.º 31
0
def run(args):
    #    if (len(args) == 0 ):
    #        raise RuntimeError("Please specify one or more pdb file names.")
    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/1A32.pdb",
    #          test=os.path.isfile)
    pdb_file = "./4KSC.pdb"
    #   print pdb_file
    processed_pdb_file = monomer_library.pdb_interpretation.process(
        mon_lib_srv=mon_lib_srv,
        ener_lib=ener_lib,
        file_name=pdb_file,
        raw_records=None,
        force_symmetry=True)
    xray_structure = processed_pdb_file.xray_structure()
    pdb_inp = iotbx.pdb.input(file_name=pdb_file)
    pdb_hierarchy = pdb_inp.construct_hierarchy()
    xray_structure.scattering_type_registry(table="wk1995")
    reflection_file = reflection_file_reader.any_reflection_file(
        file_name="./4ksc-sf.cif")
    miller_arrays = reflection_file.as_miller_arrays()
    for miller_array in miller_arrays:
        if (miller_array.is_xray_amplitude_array()):
            f_obs = miller_array

#    xray_structure.convert_to_isotropic()
#    u_iso_start = xray_structure.extract_u_iso_or_u_equiv()
    xray_structure.convert_to_anisotropic()
    atoms = pdb_hierarchy.atoms()
    atomsxyz = atoms.extract_xyz()
    sites_cart = xray_structure.sites_cart()
    atomic_weights = xray_structure.atomic_weights()
    u_cart = xray_structure.scatterers().extract_u_cart(
        xray_structure.unit_cell())
    #    nm_init_manager = nm_init(filename = "4ki8_evec.dat",
    #            n_modes = 50,
    #            atoms = atoms,
    #            zero_mode_input_flag = False,
    #            zero_mode_flag = True)
    #    eigenvector = nm_init_manager.return_modes(1)
    selections = []
    #    selection_strings = ["chain A", "chain B", "chain C", "chain D", "chain E", "chain F", "chain G"]
    selection_strings = ["chain A"]
    for string in selection_strings:
        selections.append(
            processed_pdb_file.all_chain_proxies.selection(string=string))
    modes = tools.generate_evec(selections=selections,
                                xray_structure=xray_structure,
                                pdb_hierarchy=pdb_hierarchy,
                                filename="eigenvectors.dat",
                                n_modes=20)
    time_nm_from_uaniso = 0.0
    uanisos = flex.sym_mat3_double(xray_structure.sites_cart().size(),
                                   [0, 0, 0, 0, 0, 0])
    nmval = tools.read_nmval_file(evalin="eigenvalues.dat",
                                  n_modes=20,
                                  zero_mode_input_flag=False,
                                  zero_mode_flag=True)
    xs_initial = []
    adp_nmas = []
    for selection in selections:
        x = tools.init_nm_para(nmval=nmval, n_modes=20)
        modes1d = tools.selected_modes_to_1D(modes=modes,
                                             n_modes=20,
                                             selection=selection)
        weights_selected = xray_structure.atomic_weights().select(selection)
        print "The number of selected atoms is %d." % len(weights_selected)
        u_cart_selected = u_cart.select(selection)
        adp_nma = init_nm_adp(modes=modes1d,
                              weights=weights_selected,
                              n_modes=20,
                              zero_mode_flag=True)
        adp_nmas.append(adp_nma)
        uaniso_from_s_manager = uaniso_from_s(
            x=x,
            adp_nma=adp_nma,
            #                                              weights = weights_selected,
            n_modes=20,
            zero_mode_flag=True)
        u = uaniso_from_s_manager.u_cart()
        x_scaled = scale_x(x=x,
                           uanisos=u_cart_selected,
                           adp_all=u,
                           n_modes=20,
                           zero_mode_flag=True)
        xs_initial.append(x_scaled)


#    t1 = time.time()
    nm_from_uanisos = tools.nm_from_uanisos(xray_structure=xray_structure,
                                            selections=selections,
                                            modes=modes,
                                            xs_initial=xs_initial,
                                            n_modes=20,
                                            number_of_macro_cycles=4,
                                            verbose=1)
    tools.update_xray_structure_with_nm(xray_structure=xray_structure,
                                        adp_nmas=adp_nmas,
                                        selections=selections,
                                        xs=nm_from_uanisos,
                                        n_modes=20,
                                        zero_mode_flag=True)

    #    t2 = time.time()
    #    print t2 - t1
    tools.show_time()
Exemplo n.º 32
0
 def fd_grads(self, proxy):
     dynamic_restraint_proxy_classes = (
         adp.adp_u_eq_similarity_proxy,
         adp.adp_volume_similarity_proxy,
     )
     if isinstance(proxy, (dynamic_restraint_proxy_classes)):
         n_restraints = len(proxy.i_seqs)
     else:
         n_restraints = rows_per_restraint.get(proxy.__class__, 1)
     grads = [
         flex.double(self.param_map.n_parameters)
         for i in range(n_restraints)
     ]
     eps = 1e-8
     uc = self.xray_structure.unit_cell()
     xs = self.xray_structure
     u_cart = xs.scatterers().extract_u_cart(uc).deep_copy()
     u_star = xs.scatterers().extract_u_star().deep_copy()
     u_iso = xs.scatterers().extract_u_iso().deep_copy()
     single_delta_classes = (adp.fixed_u_eq_adp, )
     for n in xrange(n_restraints):
         for i in xrange(self.param_map.n_scatterers):
             use_u_aniso = self.param_map[i].u_aniso > -1
             use_u_iso = self.param_map[i].u_iso > -1
             for j in range(6):
                 if use_u_aniso:
                     h = [0, 0, 0, 0, 0, 0]
                     h[j] = eps
                     h = matrix.sym(sym_mat3=h)
                     u_star[i] = list(
                         (matrix.sym(sym_mat3=u_star[i]) + h).as_sym_mat3())
                     r = self.restraint(proxy,
                                        u_cart=flex.sym_mat3_double([
                                            adptbx.u_star_as_u_cart(uc, u)
                                            for u in u_star
                                        ]))
                     if isinstance(r, adp.rigid_bond):
                         d1 = r.delta_z()
                     elif isinstance(r, single_delta_classes):
                         d1 = r.delta()
                     else:
                         d1 = r.deltas()[n]
                     u_star[i] = list((matrix.sym(sym_mat3=u_star[i]) -
                                       2 * h).as_sym_mat3())
                     r = self.restraint(proxy,
                                        u_cart=flex.sym_mat3_double([
                                            adptbx.u_star_as_u_cart(uc, u)
                                            for u in u_star
                                        ]))
                     if isinstance(r, adp.rigid_bond):
                         d2 = r.delta_z()
                     elif isinstance(r, single_delta_classes):
                         d2 = r.delta()
                     else:
                         d2 = r.deltas()[n]
                 elif use_u_iso:
                     u_iso[i] += eps
                     r = self.restraint(proxy, u_iso=u_iso)
                     if isinstance(r, adp.rigid_bond):
                         d1 = r.delta_z()
                     elif isinstance(r, single_delta_classes):
                         d1 = r.delta()
                     else:
                         d1 = r.deltas()[n]
                     u_iso[i] -= 2 * eps
                     r = self.restraint(proxy, u_iso=u_iso)
                     if isinstance(r, adp.rigid_bond):
                         d2 = r.delta_z()
                     elif isinstance(r, single_delta_classes):
                         d2 = r.delta()
                     else:
                         d2 = r.deltas()[n]
                 d_delta = (d1 - d2) / (2 * eps)
                 if not isinstance(r, adp.rigid_bond) and j > 2:
                     d_delta *= 2  # off diagonals count twice
                 if use_u_aniso:
                     grads[n][self.param_map[i].u_aniso + j] = d_delta
                 elif use_u_iso:
                     grads[n][self.param_map[i].u_iso] = d_delta
                     break
     return grads
Exemplo n.º 33
0
    def __init__(self, cif_block):
        # XXX To do: interpret _atom_site_refinement_flags
        crystal_symmetry_builder.__init__(self, cif_block, strict=True)
        atom_sites_frac = [
            as_double_or_none_if_all_question_marks(
                _, column_name='_atom_site_fract_%s' % axis)
            for _, axis in [(cif_block.get('_atom_site_fract_%s' % axis), axis)
                            for axis in ('x', 'y', 'z')]
        ]
        if atom_sites_frac.count(None) == 3:
            atom_sites_cart = [
                as_double_or_none_if_all_question_marks(
                    _, column_name='_atom_site_Cartn_%s' % axis) for _ in [
                        cif_block.get('_atom_site_Cartn_%s' % axis)
                        for axis in ('x', 'y', 'z')
                    ]
            ]
            if atom_sites_cart.count(None) != 0:
                raise CifBuilderError("No atomic coordinates could be found")
            atom_sites_cart = flex.vec3_double(*atom_sites_cart)
            # XXX do we need to take account of _atom_sites_Cartn_tran_matrix_ ?
            atom_sites_frac = self.crystal_symmetry.unit_cell().fractionalize(
                atom_sites_cart)
        else:
            if atom_sites_frac.count(None) != 0:
                raise CifBuilderError("No atomic coordinates could be found")
            atom_sites_frac = flex.vec3_double(*atom_sites_frac)
        labels = cif_block.get('_atom_site_label')
        type_symbol = cif_block.get('_atom_site_type_symbol')
        if type_symbol:
            type_symbol = flex.std_string(
                s.replace('0+', '').replace('0-', '') for s in type_symbol)
        U_iso_or_equiv = flex_double_else_none(
            cif_block.get('_atom_site_U_iso_or_equiv',
                          cif_block.get('_atom_site_U_equiv_geom_mean')))
        if U_iso_or_equiv is None:
            B_iso_or_equiv = flex_double_else_none(
                cif_block.get('_atom_site_B_iso_or_equiv',
                              cif_block.get('_atom_site_B_equiv_geom_mean')))
        adp_type = cif_block.get('_atom_site_adp_type')
        occupancy = flex_double_else_none(
            cif_block.get('_atom_site_occupancy'))
        scatterers = flex.xray_scatterer()
        atom_site_aniso_label = flex_std_string_else_none(
            cif_block.get('_atom_site_aniso_label'))
        if atom_site_aniso_label is not None:
            atom_site_aniso_label = atom_site_aniso_label
            adps = [
                cif_block.get('_atom_site_aniso_U_%i' % i)
                for i in (11, 22, 33, 12, 13, 23)
            ]
            have_Bs = False
            if adps.count(None) > 0:
                adps = [
                    cif_block.get('_atom_site_aniso_B_%i' % i)
                    for i in (11, 22, 33, 12, 13, 23)
                ]
                have_Bs = True
            if adps.count(None) == 6:
                adps = None
            elif adps.count(None) > 0:
                CifBuilderError("Some ADP items are missing")
            else:
                sel = None
                for adp in adps:
                    f = (adp == "?")
                    if (sel is None): sel = f
                    else: sel &= f
                sel = ~sel
                atom_site_aniso_label = atom_site_aniso_label.select(sel)
                try:
                    adps = [flex.double(adp.select(sel)) for adp in adps]
                except ValueError as e:
                    raise CifBuilderError("Error interpreting ADPs: " + str(e))
                adps = flex.sym_mat3_double(*adps)
        for i in range(len(atom_sites_frac)):
            kwds = {}
            if labels is not None:
                kwds.setdefault('label', str(labels[i]))
            if type_symbol is not None:
                kwds.setdefault('scattering_type', str(type_symbol[i]))
            if (atom_site_aniso_label is not None and adps is not None
                    and labels is not None
                    and labels[i] in atom_site_aniso_label):
                adp = adps[flex.first_index(atom_site_aniso_label, labels[i])]
                if have_Bs: adp = adptbx.b_as_u(adp)
                kwds.setdefault(
                    'u',
                    adptbx.u_cif_as_u_star(self.crystal_symmetry.unit_cell(),
                                           adp))
            elif U_iso_or_equiv is not None:
                kwds.setdefault('u', float_from_string(U_iso_or_equiv[i]))
            elif B_iso_or_equiv is not None:
                kwds.setdefault('b', float_from_string(B_iso_or_equiv[i]))
            if occupancy is not None:
                kwds.setdefault('occupancy', float_from_string(occupancy[i]))
            scatterers.append(xray.scatterer(**kwds))
        scatterers.set_sites(atom_sites_frac)

        self.structure = xray.structure(crystal_symmetry=self.crystal_symmetry,
                                        scatterers=scatterers)
Exemplo n.º 34
0
 def __init__(self, u_cart,
                    u_iso=None,
                    use_u_aniso=None,
                    sites_cart=None,
                    adp_similarity_proxies=None,
                    rigid_bond_proxies=None,
                    isotropic_adp_proxies=None,
                    compute_gradients=True,
                    gradients_aniso_cart=None,
                    gradients_iso=None,
                    disable_asu_cache=False,
                    normalization=False):
   adopt_init_args(self, locals())
   self.number_of_restraints = 0
   self.residual_sum = 0
   self.normalization_factor = None
   if (adp_similarity_proxies is not None):
     assert u_iso is not None and use_u_aniso is not None
   if (rigid_bond_proxies is not None): assert sites_cart is not None
   if (sites_cart is not None): assert sites_cart.size() == u_cart.size()
   if (u_iso is not None): assert u_iso.size() == u_cart.size()
   if (use_u_aniso is not None): assert use_u_aniso.size() == u_cart.size()
   if (compute_gradients):
     if (self.gradients_aniso_cart is None):
       self.gradients_aniso_cart = flex.sym_mat3_double(
         sites_cart.size(), [0,0,0,0,0,0])
     else:
       assert self.gradients_aniso_cart.size() == sites_cart.size()
     if (u_iso is not None and self.gradients_iso is None):
       self.gradients_iso = flex.double(sites_cart.size(), 0)
     elif (u_iso is not None):
       assert self.gradients_iso.size() == sites_cart.size()
   if (adp_similarity_proxies is None):
     self.n_adp_similarity_proxies = None
     self.adp_similarity_residual_sum = 0
   else:
     self.n_adp_similarity_proxies = len(adp_similarity_proxies)
     self.adp_similarity_residual_sum = adp_restraints.adp_similarity_residual_sum(
       u_cart=u_cart,
       u_iso=u_iso,
       use_u_aniso=use_u_aniso,
       proxies=adp_similarity_proxies,
       gradients_aniso_cart=self.gradients_aniso_cart,
       gradients_iso=self.gradients_iso)
     self.number_of_restraints += 6 * self.n_adp_similarity_proxies
     self.residual_sum += self.adp_similarity_residual_sum
   if (rigid_bond_proxies is None):
     self.n_rigid_bond_proxies = None
     self.rigid_bond_residual_sum = 0
   else:
     self.n_rigid_bond_proxies = len(rigid_bond_proxies)
     self.rigid_bond_residual_sum = adp_restraints.rigid_bond_residual_sum(
       sites_cart=sites_cart,
       u_cart=u_cart,
       proxies=rigid_bond_proxies,
       gradients_aniso_cart=self.gradients_aniso_cart)
     self.number_of_restraints += self.n_rigid_bond_proxies
     self.residual_sum += self.rigid_bond_residual_sum
   if (isotropic_adp_proxies is None):
     self.n_isotropic_adp_proxies = None
     self.isotropic_adp_residual_sum = 0
   else:
     self.n_isotropic_adp_proxies = len(isotropic_adp_proxies)
     self.isotropic_adp_residual_sum = adp_restraints.isotropic_adp_residual_sum(
       u_cart=u_cart,
       proxies=isotropic_adp_proxies,
       gradients_aniso_cart=self.gradients_aniso_cart)
     self.number_of_restraints += self.n_isotropic_adp_proxies
     self.residual_sum += self.isotropic_adp_residual_sum
   self.finalize_target_and_gradients()
Exemplo n.º 35
0
 def __init__(self, cif_block):
     # XXX To do: interpret _atom_site_refinement_flags
     crystal_symmetry_builder.__init__(self, cif_block, strict=True)
     atom_sites_frac = [
         as_double_or_none_if_all_question_marks(
             _, column_name='_atom_site_fract_%s' % axis) for _ in [
                 cif_block.get('_atom_site_fract_%s' % axis)
                 for axis in ('x', 'y', 'z')
             ]
     ]
     if atom_sites_frac.count(None) == 3:
         atom_sites_cart = [
             as_double_or_none_if_all_question_marks(
                 _, column_name='_atom_site_Cartn_%s' % axis) for _ in [
                     cif_block.get('_atom_site_Cartn_%s' % axis)
                     for axis in ('x', 'y', 'z')
                 ]
         ]
         if atom_sites_cart.count(None) != 0:
             raise CifBuilderError("No atomic coordinates could be found")
         atom_sites_cart = flex.vec3_double(*atom_sites_cart)
         # XXX do we need to take account of _atom_sites_Cartn_tran_matrix_ ?
         atom_sites_frac = self.crystal_symmetry.unit_cell().fractionalize(
             atom_sites_cart)
     else:
         if atom_sites_frac.count(None) != 0:
             raise CifBuilderError("No atomic coordinates could be found")
         atom_sites_frac = flex.vec3_double(*atom_sites_frac)
     labels = cif_block.get('_atom_site_label')
     type_symbol = cif_block.get('_atom_site_type_symbol')
     U_iso_or_equiv = flex_double_else_none(
         cif_block.get('_atom_site_U_iso_or_equiv',
                       cif_block.get('_atom_site_U_equiv_geom_mean')))
     if U_iso_or_equiv is None:
         B_iso_or_equiv = flex_double_else_none(
             cif_block.get('_atom_site_B_iso_or_equiv',
                           cif_block.get('_atom_site_B_equiv_geom_mean')))
     adp_type = cif_block.get('_atom_site_adp_type')
     occupancy = flex_double_else_none(
         cif_block.get('_atom_site_occupancy'))
     scatterers = flex.xray_scatterer()
     atom_site_aniso_label = flex_std_string_else_none(
         cif_block.get('_atom_site_aniso_label'))
     if atom_site_aniso_label is not None:
         atom_site_aniso_label = atom_site_aniso_label
         adps = [
             cif_block.get('_atom_site_aniso_U_%i' % i)
             for i in (11, 22, 33, 12, 13, 23)
         ]
         have_Bs = False
         if adps.count(None) > 0:
             adps = [
                 cif_block.get('_atom_site_aniso_B_%i' % i)
                 for i in (11, 22, 33, 12, 13, 23)
             ]
             have_Bs = True
         if adps.count(None) == 6:
             adps = None
         elif adps.count(None) > 0:
             CifBuilderError("Some ADP items are missing")
         else:
             sel = None
             for adp in adps:
                 f = (adp == "?")
                 if (sel is None): sel = f
                 else: sel &= f
             sel = ~sel
             atom_site_aniso_label = atom_site_aniso_label.select(sel)
             try:
                 adps = [flex.double(adp.select(sel)) for adp in adps]
             except ValueError, e:
                 raise CifBuilderError("Error interpreting ADPs: " + str(e))
             adps = flex.sym_mat3_double(*adps)
Exemplo n.º 36
0
 def __init__(self, cif_block):
   # XXX To do: interpret _atom_site_refinement_flags
   crystal_symmetry_builder.__init__(self, cif_block, strict=True)
   atom_sites_frac = [as_double_or_none_if_all_question_marks(
     _, column_name='_atom_site_fract_%s' %axis)
                      for _ in [cif_block.get('_atom_site_fract_%s' %axis)
                                for axis in ('x','y','z')]]
   if atom_sites_frac.count(None) == 3:
     atom_sites_cart = [as_double_or_none_if_all_question_marks(
       _, column_name='_atom_site_Cartn_%s' %axis)
                        for _ in [cif_block.get('_atom_site_Cartn_%s' %axis)
                                  for axis in ('x','y','z')]]
     if atom_sites_cart.count(None) != 0:
       raise CifBuilderError("No atomic coordinates could be found")
     atom_sites_cart = flex.vec3_double(*atom_sites_cart)
     # XXX do we need to take account of _atom_sites_Cartn_tran_matrix_ ?
     atom_sites_frac = self.crystal_symmetry.unit_cell().fractionalize(
       atom_sites_cart)
   else:
     if atom_sites_frac.count(None) != 0:
       raise CifBuilderError("No atomic coordinates could be found")
     atom_sites_frac = flex.vec3_double(*atom_sites_frac)
   labels = cif_block.get('_atom_site_label')
   type_symbol = cif_block.get('_atom_site_type_symbol')
   if type_symbol:
     type_symbol = flex.std_string(
       s.replace('0+', '').replace('0-', '') for s in type_symbol)
   U_iso_or_equiv = flex_double_else_none(
     cif_block.get('_atom_site_U_iso_or_equiv',
     cif_block.get('_atom_site_U_equiv_geom_mean')))
   if U_iso_or_equiv is None:
     B_iso_or_equiv = flex_double_else_none(
       cif_block.get('_atom_site_B_iso_or_equiv',
       cif_block.get('_atom_site_B_equiv_geom_mean')))
   adp_type = cif_block.get('_atom_site_adp_type')
   occupancy = flex_double_else_none(cif_block.get('_atom_site_occupancy'))
   scatterers = flex.xray_scatterer()
   atom_site_aniso_label = flex_std_string_else_none(
     cif_block.get('_atom_site_aniso_label'))
   if atom_site_aniso_label is not None:
     atom_site_aniso_label = atom_site_aniso_label
     adps = [cif_block.get('_atom_site_aniso_U_%i' %i)
             for i in (11,22,33,12,13,23)]
     have_Bs = False
     if adps.count(None) > 0:
       adps = [cif_block.get('_atom_site_aniso_B_%i' %i)
               for i in (11,22,33,12,13,23)]
       have_Bs = True
     if adps.count(None) == 6:
       adps = None
     elif adps.count(None) > 0:
       CifBuilderError("Some ADP items are missing")
     else:
       sel = None
       for adp in adps:
         f = (adp == "?")
         if (sel is None): sel = f
         else:             sel &= f
       sel = ~sel
       atom_site_aniso_label = atom_site_aniso_label.select(sel)
       try:
         adps = [flex.double(adp.select(sel)) for adp in adps]
       except ValueError, e:
         raise CifBuilderError("Error interpreting ADPs: " + str(e))
       adps = flex.sym_mat3_double(*adps)
Exemplo n.º 37
0
def exercise_flex_xray_scatterer():
    from cctbx import uctbx, sgtbx, xray
    uc = uctbx.unit_cell((10, 11, 12))
    sg = sgtbx.space_group_info("P 2")
    a = flex.xray_scatterer()
    assert a.size() == 0
    a = flex.xray_scatterer((xray.scatterer("Si1", (0.1, 0.2, 0.3)),
                             xray.scatterer("O1", (0.2, 0.3, 0.4),
                                            (1, 2, 3, -0.1, 0.2, -0.3), 0.9),
                             xray.scatterer("K1", (0.3, 0.4, 0.5),
                                            (3, 1, 2, -0.2, 0.3, -0.1),
                                            0.8,
                                            fp=5,
                                            fdp=7)))
    assert a.size() == 3
    assert a[1].multiplicity() == 0
    a[1].apply_symmetry(uc, sg.group())
    assert a[1].multiplicity() == 2
    assert approx_equal(a[1].weight(), 0.9)
    a.front().occupancy = 0.8
    assert approx_equal(a[0].occupancy, 0.8)
    a.back().occupancy = 0.7
    assert approx_equal(a[-1].occupancy, 0.7)
    a[0].flags.set_grad_site(state=True)
    a[1].flags.set_grad_fp(state=True)
    a[2].flags.param = -234
    p = pickle.dumps(a)
    b = pickle.loads(p)
    a_ = a.deep_copy()
    assert a_.n_grad_u_iso() == a_.n_grad_u_aniso() == 0
    a_[0].flags.set_grad_u_iso(state=True)
    a_[1].flags.set_grad_u_aniso(state=True)
    a_[2].flags.set_grad_u_aniso(state=True)
    assert a_.n_grad_u_iso() == 1
    assert a_.n_grad_u_aniso() == 2
    for i, ai in enumerate(a):
        bi = b[i]
        assert ai.label == bi.label
        assert ai.scattering_type == bi.scattering_type
        assert approx_equal(ai.fp, bi.fp)
        assert approx_equal(ai.fdp, bi.fdp)
        assert approx_equal(ai.site, bi.site)
        assert ai.flags.use_u_aniso() == bi.flags.use_u_aniso()
        assert ai.u_iso == bi.u_iso
        assert ai.u_star == bi.u_star
        assert ai.multiplicity() == bi.multiplicity()
        assert approx_equal(ai.weight(), bi.weight())
        assert ai.flags.bits == bi.flags.bits
        assert ai.flags.param == bi.flags.param
    assert b[0].flags.grad_site()
    assert not b[0].flags.grad_fp()
    assert not b[1].flags.grad_site()
    assert b[1].flags.grad_fp()
    assert b[2].flags.param == -234
    assert list(a.extract_labels()) == ["Si1", "O1", "K1"]
    assert list(a.extract_scattering_types()) == ["Si", "O", "K"]
    assert approx_equal(a.extract_sites(),
                        ((0.1, 0.2, 0.3), (0.2, 0.3, 0.4), (0.3, 0.4, 0.5)))
    a.set_sites(sites=flex.vec3_double(((-0.1, -0.2, -0.3), (-0.2, -0.3, -0.4),
                                        (-0.3, -0.4, -0.5))))
    assert approx_equal(a.extract_sites(),
                        ((-0.1, -0.2, -0.3), (-0.2, -0.3, -0.4),
                         (-0.3, -0.4, -0.5)))
    assert approx_equal(a[1].site, (-0.2, -0.3, -0.4))
    assert approx_equal(a.extract_occupancies(), (0.8, 0.9, 0.7))
    a.set_occupancies(occupancies=flex.double((0.1, 0.2, 0.3)))
    assert approx_equal(a.extract_occupancies(), (0.1, 0.2, 0.3))
    assert approx_equal(a[1].occupancy, 0.2)
    assert approx_equal(a.extract_u_iso(), (0.0, -1.0, -1.0))
    assert approx_equal(a.extract_u_iso_or_u_equiv(unit_cell=uc),
                        (0.0, 258, 236 + 1 / 3.))
    a.set_u_iso(u_iso=flex.double((3, 4, 5)),
                selection=flex.bool(a.size(), True),
                unit_cell=uc)
    assert approx_equal(a.extract_u_iso(), (3, -1, -1))
    assert approx_equal(a.extract_u_iso_or_u_equiv(unit_cell=uc), (3, 4, 5))
    assert approx_equal(a[1].u_iso, -1)
    u_cart_answer = [(-1.0, -1.0, -1.0, -1.0, -1.0, -1.0), (4, 4, 4, 0, 0, 0),
                     (5, 5, 5, 0, 0, 0)]
    assert approx_equal(a.extract_u_cart(uc), u_cart_answer)
    a.set_u_star(
        u_star=flex.sym_mat3_double([(-1, -2, -1, -1, -1,
                                      -1), (1, 2, 3, -0.6, 0.2,
                                            -0.3), (3, 1, 2, -0.2, 0.5,
                                                    -0.1)]))
    assert approx_equal(a.extract_u_star(), [(-1, -1, -1, -1, -1, -1),
                                             (1, 2, 3, -0.6, 0.2, -0.3),
                                             (3, 1, 2, -0.2, 0.5, -0.1)])
    assert approx_equal(a[1].u_star, (1, 2, 3, -0.6, 0.2, -0.3))
    unit_cell = uctbx.unit_cell((1, 1, 1, 90, 90, 90))
    a.set_u_cart(unit_cell=unit_cell,
                 u_cart=flex.sym_mat3_double([(-1, -2, -1, -1, -1, -1),
                                              (1, 2, 3, -0.6, 0.2, -0.3),
                                              (3, 1, 2, -0.2, 0.5, -0.1)]))
    assert approx_equal(a.extract_u_cart(unit_cell=unit_cell),
                        [(-1, -1, -1, -1, -1, -1), (1, 2, 3, -0.6, 0.2, -0.3),
                         (3, 1, 2, -0.2, 0.5, -0.1)])
    #
    a.set_u_cart(unit_cell=unit_cell,
                 u_cart=flex.sym_mat3_double([(1, 2, 3, 4, 5, 6),
                                              (0, 0, 0, 1, 2, 3),
                                              (1, 2, 3, 0, 0, 0)]),
                 selection=flex.size_t([1, 2]))
    assert approx_equal(a.extract_u_cart(unit_cell=unit_cell),
                        [(-1, -1, -1, -1, -1, -1), (0, 0, 0, 1, 2, 3),
                         (1, 2, 3, 0, 0, 0)])
    #
    unit_cell = uctbx.unit_cell((10, 10, 10, 90, 90, 90))
    a.set_u_cart(unit_cell=unit_cell,
                 u_cart=flex.sym_mat3_double([(-1, -2, -1, -1, -1, -1),
                                              (1, 2, 3, -0.6, 0.2, -0.3),
                                              (3, 1, 2, -0.2, 0.5, -0.1)]))
    assert approx_equal(a.extract_u_star(),
                        [(-1, -1, -1, -1, -1, -1),
                         (0.01, 0.02, 0.03, -0.006, 0.002, -0.003),
                         (0.03, 0.01, 0.02, -0.002, 0.005, -0.001)])
    assert approx_equal(a.extract_u_iso(), [3, -1, -1])
    a.scale_adps(2.0)
    assert approx_equal(a.extract_u_star(),
                        [(-1, -1, -1, -1, -1, -1),
                         (0.02, 0.04, 0.06, -0.012, 0.004, -0.006),
                         (0.06, 0.02, 0.04, -0.004, 0.01, -0.002)])
    assert approx_equal(a.extract_u_iso(), [6, -1, -1])
    assert a.count_anisotropic() == 2
    assert a.count_anomalous() == 1
    a.convert_to_isotropic(unit_cell=unit_cell)
    assert a.count_anisotropic() == 0
    a.convert_to_anisotropic(unit_cell=unit_cell)
    assert a.count_anisotropic() == 3
    m = a.sites_mod_positive()
    assert approx_equal(m.extract_sites(), [(0.9, 0.8, 0.7), (0.8, 0.7, 0.6),
                                            (0.7, 0.6, 0.5)])
    m[2].site = (0.7, 0.6, 1.4)  # to avoid +-0.5 ambiguity
    m = m.sites_mod_short()
    assert approx_equal(m.extract_sites(), [(-0.1, -0.2, -0.3),
                                            (-0.2, -0.3, -0.4),
                                            (-0.3, -0.4, 0.4)])
    #
    assert a.extract_grad_u_iso().all_eq(False)
    a[1].flags.set_grad_u_iso(state=True)
    assert list(a.extract_grad_u_iso()) == [False, True, False]
Exemplo n.º 38
0
def run(args):
    #    if (len(args) == 0 ):
#        raise RuntimeError("Please specify one or more pdb file names.")
    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/1A32.pdb",
#          test=os.path.isfile)
    pdb_file = "./4KSC.pdb"
#   print pdb_file
    processed_pdb_file = monomer_library.pdb_interpretation.process(
           mon_lib_srv               = mon_lib_srv,
           ener_lib                  = ener_lib,
           file_name                 = pdb_file,
           raw_records               = None,
           force_symmetry            = True)
    xray_structure = processed_pdb_file.xray_structure()
    pdb_inp = iotbx.pdb.input(file_name=pdb_file)
    pdb_hierarchy = pdb_inp.construct_hierarchy()
#    xray_structure.scattering_type_registry(table = "wk1995")
#    reflection_file = reflection_file_reader.any_reflection_file(file_name = "./4ksc-sf.cif")
#    miller_arrays = reflection_file.as_miller_arrays()
#    for miller_array in miller_arrays:
#        if (miller_array.is_xray_amplitude_array()):
#            f_obs = miller_array
    dummy = xray_structure.structure_factors(d_min = 2.0).f_calc()
    f_obs = abs(dummy.structure_factors_from_scatterers(
                xray_structure = xray_structure).f_calc())
    flags = f_obs.generate_r_free_flags(fraction=0.01)
#    f_calc = f_obs.structure_factors_from_scatterers(
#            xray_structure = xray_structure).f_calc()
    fmodel = mmtbx.f_model.manager(xray_structure = xray_structure,
                                   f_obs          = f_obs,
                                   r_free_flags   = flags)
#    bulk_solvent_manager = bulk_solvent_and_scaling.bulk_solvent_and_scales(
#            fmodel_kbu = fmodel.fmodel_kbu)
#    f_bulk = bulk_solvent_manager.f_bulk()
#    f_bulk.set_info("Bulk solvent structure factors")
#    f_bulk.show_summary()


#    xray_structure.convert_to_isotropic()
#    u_iso_start = xray_structure.extract_u_iso_or_u_equiv()
    xray_structure.set_b_iso(value = 25.0)
    xray_structure.convert_to_anisotropic()
    xray_structure.show_u_statistics(
            text = "After set u_iso_start")
    atoms = pdb_hierarchy.atoms()
    atomsxyz = atoms.extract_xyz()
    sites_cart = xray_structure.sites_cart()
    atomic_weights = xray_structure.atomic_weights()
    u_cart = xray_structure.scatterers().extract_u_cart(xray_structure.unit_cell())
#    nm_init_manager = nm_init(filename = "4ki8_evec.dat",
#            n_modes = 50,
#            atoms = atoms,
#            zero_mode_input_flag = False,
#            zero_mode_flag = True)
#    eigenvector = nm_init_manager.return_modes(1)
    selections = []
#    selection_strings = ["chain A", "chain B", "chain C", "chain D", "chain E", "chain F", "chain G"]
    selection_strings = ["chain A"]
    for string in selection_strings:
        selections.append(processed_pdb_file.all_chain_proxies.selection(
                                                                string = string))
    geometry = processed_pdb_file.geometry_restraints_manager(
                                            show_energies = False,
                                            plain_pairs_radius = 5.0)
    restraints_manager = mmtbx.restraints.manager(geometry = geometry)
    modes = tools.generate_evec(selections = selections,
                                xray_structure = xray_structure,
                                pdb_hierarchy = pdb_hierarchy,
                                filename = "eigenvectors.dat",
                                n_modes = 20)
    time_nm_from_uaniso = 0.0
    uanisos = flex.sym_mat3_double(xray_structure.sites_cart().size(), [0,0,0,0,0,0])
    nmval = tools.read_nmval_file(evalin = "eigenvalues.dat",
                                  n_modes = 20,
                                  zero_mode_input_flag = False,
                                  zero_mode_flag = True)
    xs_initial = []
    adp_nmas = []
    for selection in selections:
        x = tools.init_nm_para(nmval = nmval,
                               n_modes = 20)
        modes1d = tools.selected_modes_to_1D(modes = modes, n_modes = 20, selection = selection)
        weights_selected = xray_structure.atomic_weights().select(selection)
        print "The number of selected atoms is %d." % len(weights_selected)
        u_cart_selected = u_cart.select(selection)
        adp_nma = init_nm_adp(modes = modes1d,
                              weights = weights_selected,
                              n_modes = 20,
                              zero_mode_flag = True)
        adp_nmas.append(adp_nma)
        uaniso_from_s_manager = uaniso_from_s(x = x,                            
                                              adp_nma = adp_nma, 
#                                              weights = weights_selected,
                                              n_modes = 20,
                                              zero_mode_flag = True)
        u = uaniso_from_s_manager.u_cart()
        x_scaled = scale_x(x = x,
                           uanisos = u_cart_selected,
                           adp_all = u,
                           n_modes = 20,
                           zero_mode_flag = True)
        xs_initial.append(x_scaled)
#    t1 = time.time()
    sfg_params = mmtbx.f_model.sf_and_grads_accuracy_master_params.extract()
    sfg_params.cos_sin_table = False
    tools.update_xray_structure_with_nm(xray_structure = xray_structure,
                                        adp_nmas = adp_nmas,
                                        selections = selections,
                                        xs = xs_initial,
                                        n_modes = 20,
                                        zero_mode_flag = True)
    class refinement_flags: pass
    refinement_flags.adp_tls = selections
    model = mmtbx.model.manager(
            refinement_flags = refinement_flags,
            restraints_manager = restraints_manager,
            xray_structure = xray_structure,
            pdb_hierarchy = pdb_hierarchy)
    fmodel.update_xray_structure(xray_structure = xray_structure,
                                 update_f_calc = True)
    fmodel_cp = fmodel.deep_copy()
    nm_refinement_manager = tools.nm_refinement(
            fmodel = fmodel_cp,
            model  = model,
            selections = selections,
            selections_1d = None,
            n_modes = 20,
            number_of_macro_cycles = 50,
            max_number_of_iterations = 10000,
            start_xs_value = xs_initial,
            run_finite_differences_test = False)
#    t2 = time.time()
#    print t2 - t1
    tools.show_time()
Exemplo n.º 39
0
 def __init__(self,
              pdb_str,
              dx=0,
              dy=0,
              dz=0,
              sx=0,
              sy=0,
              sz=0,
              lx=[1, 0, 0],
              ly=[0, 1, 0],
              lz=[0, 0, 1],
              tx=0,
              ty=0,
              tz=0,
              vx=[1, 0, 0],
              vy=[0, 1, 0],
              vz=[0, 0, 1],
              w_M_lx=[0, 0, 0],
              w_M_ly=[0, 0, 0],
              w_M_lz=[0, 0, 0],
              origin=None,
              n_models=10000,
              assert_similarity=True,
              show=False,
              log=sys.stdout,
              write_pdb_files=False):
     from mmtbx.tls import analysis, tls_as_xyz
     from scitbx import matrix
     from libtbx.utils import null_out
     if (show):
         print >> log, "INPUTS:", "-" * 73
         print >> log, "dx    :", dx
         print >> log, "dy    :", dy
         print >> log, "dz    :", dz
         print >> log, "sx    :", sx
         print >> log, "sy    :", sy
         print >> log, "sz    :", sz
         print >> log, "lx    :", [i for i in lx]
         print >> log, "ly    :", [i for i in ly]
         print >> log, "lz    :", [i for i in lz]
         print >> log, "tx    :", tx
         print >> log, "ty    :", ty
         print >> log, "tz    :", tz
         print >> log, "vx    :", [i for i in vx]
         print >> log, "vy    :", [i for i in vy]
         print >> log, "vz    :", [i for i in vz]
         print >> log, "w_M_lx:", [i for i in w_M_lx]
         print >> log, "w_M_ly:", [i for i in w_M_ly]
         print >> log, "w_M_lz:", [i for i in w_M_lz]
         print >> log, "origin:", origin
         print >> log, "-" * 79
     #
     pdb_inp = iotbx.pdb.input(source_info=None, lines=pdb_str)
     ph = pdb_inp.construct_hierarchy()
     xrs = ph.extract_xray_structure(
         crystal_symmetry=pdb_inp.crystal_symmetry())
     sites_cart = xrs.sites_cart()
     ph.atoms().set_xyz(sites_cart)
     if (origin is None):
         origin = sites_cart.mean()
     #
     o_tfm = analysis.tls_from_motions(dx=dx,
                                       dy=dy,
                                       dz=dz,
                                       l_x=matrix.col(lx),
                                       l_y=matrix.col(ly),
                                       l_z=matrix.col(lz),
                                       sx=sx,
                                       sy=sy,
                                       sz=sz,
                                       tx=tx,
                                       ty=ty,
                                       tz=tz,
                                       v_x=matrix.col(vx),
                                       v_y=matrix.col(vy),
                                       v_z=matrix.col(vz),
                                       w_M_lx=matrix.col(w_M_lx),
                                       w_M_ly=matrix.col(w_M_ly),
                                       w_M_lz=matrix.col(w_M_lz))
     #
     self.u_cart_tls = get_u_cart(o_tfm=o_tfm,
                                  origin=origin,
                                  sites_cart=sites_cart)
     tlso_ = tlso(t=o_tfm.T_M.as_sym_mat3(),
                  l=o_tfm.L_M.as_sym_mat3(),
                  s=o_tfm.S_M.as_mat3(),
                  origin=origin)
     if (assert_similarity):
         T = matrix.sym(sym_mat3=tlso_.t)
         L = matrix.sym(sym_mat3=tlso_.l)
         S = matrix.sqr(tlso_.s)
         o_tfm = analysis.run(T=T, L=L, S=S, log=null_out()).self_check()
     #
     r = tls_as_xyz.ensemble_generator(tls_from_motions_object=o_tfm,
                                       pdb_hierarchy=ph,
                                       xray_structure=xrs,
                                       n_models=n_models,
                                       origin=origin,
                                       use_states=write_pdb_files,
                                       log=null_out())
     if (write_pdb_files):
         r.write_pdb_file(file_name="ensemble_%s.pdb" % str(n_models))
     #
     xyz_all = r.sites_cart_ens
     n_atoms = xyz_all[0].size()
     ###
     xyz_atoms_all = all_vs_all(xyz_all=xyz_all)
     ###
     self.u_cart_ens = flex.sym_mat3_double()
     for i in xrange(n_atoms):
         self.u_cart_ens.append(
             u_cart_from_xyz(sites_cart=xyz_atoms_all[i]))
     u1 = self.u_cart_tls.as_double()
     u2 = self.u_cart_ens.as_double()
     self.r = flex.sum(flex.abs(u1-u2))/\
              flex.sum(flex.abs(flex.abs(u1)+flex.abs(u2)))*2
     ###
     for i in xrange(n_atoms):
         ut = ["%8.5f" % u for u in self.u_cart_tls[i]]
         ue = ["%8.5f" % u for u in self.u_cart_ens[i]]
         if (assert_similarity):
             for j in xrange(6):
                 assert approx_equal(abs(float(ut[j])), abs(float(ue[j])),
                                     1.e-3)
     #
     if (write_pdb_files):
         ph.atoms().set_uij(self.u_cart_tls)
         ph.write_pdb_file(file_name="u_from_tls.pdb",
                           crystal_symmetry=xrs.crystal_symmetry())
         ph.atoms().set_uij(self.u_cart_ens)
         ph.write_pdb_file(file_name="u_from_ens.pdb",
                           crystal_symmetry=xrs.crystal_symmetry())