Beispiel #1
0
def run(pdb_file_name,
        n_models,
        log,
        eps=1.e-7,
        output_file_name="ensemble.pdb"):
  pdb_inp = iotbx.pdb.input(file_name = pdb_file_name)
  pdb_hierarchy = pdb_inp.construct_hierarchy()
  xrs = pdb_hierarchy.extract_xray_structure(
    crystal_symmetry=pdb_inp.crystal_symmetry_from_cryst1())
  tls_extract = mmtbx.tls.tools.tls_from_pdb_inp(
    remark_3_records = pdb_inp.extract_remark_iii_records(3),
    pdb_hierarchy    = pdb_hierarchy)
  tlso = tls_extract.tls_params
  if(len(tlso)!=1):
    raise Sorry("Only one TLS group per PDB is currently supported.")
  tlso = tlso[0] # XXX one group only
  deg_to_rad_scale = math.pi/180
  # Units: T[A], L[deg**2], S[A*deg]
  T = matrix.sym(sym_mat3=tlso.t)
  L = matrix.sym(sym_mat3=tlso.l)*(deg_to_rad_scale**2)
  S = matrix.sqr(tlso.s)*deg_to_rad_scale
  # sanity check
  if(not adptbx.is_positive_definite(tlso.t, eps)):
    raise Sorry("T matrix is not positive definite.")
  if(not adptbx.is_positive_definite(tlso.l, eps)):
    raise Sorry("L matrix is not positive definite.")
  r = analysis.run(T=T, L=L, S=S, log=log)
  ensemble_generator(
    decompose_tls_object = r,
    pdb_hierarchy        = pdb_hierarchy,
    xray_structure       = xrs,
    n_models             = n_models,
    log                  = log).write_pdb_file(file_name=output_file_name)
Beispiel #2
0
def run():
    for fn in files:
        try:
            fn_ = libtbx.env.find_in_repositories(
                relative_path="mmtbx/regression/tls/data_tls_analysis/%s" % fn,
                test=os.path.isfile)
            of = open("phenix_" + fn, "w")
            T, L, S = extract(fn_)
            # test python implementation
            r = analysis.run(T=T, L=L, S=S, log=of, implementation='python')
            # test c++ implementation
            r2 = analysis.run(T=T, L=L, S=S, log=of, implementation='c++')
            # test equivalence
            assert approx_equal(r.result.dx, r2.result.dx, 1e-4)
            assert approx_equal(r.result.dy, r2.result.dy, 1e-4)
            assert approx_equal(r.result.dz, r2.result.dz, 1e-4)
            assert approx_equal(r.result.l_x, r2.result.l_x, 1e-4)
            assert approx_equal(r.result.l_y, r2.result.l_y, 1e-4)
            assert approx_equal(r.result.l_z, r2.result.l_z, 1e-4)
            assert approx_equal(r.result.sx, r2.result.sx, 1e-4)
            assert approx_equal(r.result.sy, r2.result.sy, 1e-4)
            assert approx_equal(r.result.sz, r2.result.sz, 1e-4)
            assert approx_equal(r.result.tx, r2.result.tx, 1e-4)
            assert approx_equal(r.result.ty, r2.result.ty, 1e-4)
            assert approx_equal(r.result.tz, r2.result.tz, 1e-4)
            assert approx_equal(r.result.v_x, r2.result.v_x, 1e-4)
            assert approx_equal(r.result.v_x_M, r2.result.v_x_M, 1e-4)
            assert approx_equal(r.result.v_y, r2.result.v_y, 1e-4)
            assert approx_equal(r.result.v_y_M, r2.result.v_y_M, 1e-4)
            assert approx_equal(r.result.v_z, r2.result.v_z, 1e-4)
            assert approx_equal(r.result.v_z_M, r2.result.v_z_M, 1e-4)
            assert approx_equal(r.result.w_L_lx, r2.result.w_L_lx, 1e-4)
            assert approx_equal(r.result.w_L_ly, r2.result.w_L_ly, 1e-4)
            assert approx_equal(r.result.w_L_lz, r2.result.w_L_lz, 1e-4)
            assert approx_equal(r.result.w_M_lx, r2.result.w_M_lx, 1e-4)
            assert approx_equal(r.result.w_M_ly, r2.result.w_M_ly, 1e-4)
            assert approx_equal(r.result.w_M_lz, r2.result.w_M_lz, 1e-4)

            of.close()
            print fn, "OK"
        except Exception, e:
            print fn, str(e)
def exercise_00(pdb_str, formula):
  """
  TLS group 6 of 4muy.
  """
  pdb_inp = iotbx.pdb.input(source_info=None, lines = pdb_str)
  pdb_hierarchy = pdb_inp.construct_hierarchy()
  asc = pdb_hierarchy.atom_selection_cache()
  cs = pdb_inp.crystal_symmetry_from_cryst1()
  tls_extract = mmtbx.tls.tools.tls_from_pdb_inp(
    remark_3_records = pdb_inp.extract_remark_iii_records(3),
    pdb_hierarchy    = pdb_hierarchy)
  #
  deg_to_rad_scale = math.pi/180
  tls_params_one_group = tls_extract.tls_params[0]
  T = matrix.sym(sym_mat3=tls_params_one_group.t)
  L = matrix.sym(sym_mat3=tls_params_one_group.l)
  S = matrix.sqr(tls_params_one_group.s)
  origin = tls_params_one_group.origin
  tlso = tools.tlso(
    t      = T.as_sym_mat3(),
    l      = L.as_sym_mat3(),
    s      = S,
    origin = origin)
  log = open("analysis.log","w")
  r = analysis.run(T=T, L=L*(deg_to_rad_scale**2), S=S*deg_to_rad_scale,
    log=log, find_t_S_using_formula=formula).self_check(show=False)
  log.close()
  #
  rs = flex.double()
  for trial in xrange(10):
    o = tools.u_tls_vs_u_ens(pdb_str=pdb_str,
      dx       = r.dx,
      dy       = r.dy,
      dz       = r.dz,
      sx       = r.sx,
      sy       = r.sy,
      sz       = r.sz,
      lx       = r.l_x,
      ly       = r.l_y,
      lz       = r.l_z,
      tx       = r.tx,
      ty       = r.ty,
      tz       = r.tz,
      vx       = r.v_x,
      vy       = r.v_y,
      vz       = r.v_z,
      w_M_lx   = r.w_M_lx,
      w_M_ly   = r.w_M_ly,
      w_M_lz   = r.w_M_lz,
      origin   = origin,
      n_models = 10000,
      assert_similarity=False)
    rs.append(o.r)
  return flex.mean(rs)
def run():
    for fn in files:
        try:
            fn_ = libtbx.env.find_in_repositories(
                relative_path="mmtbx/regression/tls/data_tls_analysis/%s" % fn,
                test=os.path.isfile)
            of = open("phenix_" + fn, "w")
            T, L, S = extract(fn_)
            r = analysis.run(T=T, L=L, S=S, log=of)
            of.close()
            print fn, "OK"
        except Exception, e:
            print fn, str(e)
def run():
  for fn in files:
    try:
      fn_ = libtbx.env.find_in_repositories(
        relative_path="mmtbx/regression/tls/data_tls_analysis/%s"%fn,
        test=os.path.isfile)
      of = open("phenix_"+fn, "w")
      T, L, S = extract(fn_)
      r = analysis.run(T=T, L=L, S=S, log=of)
      of.close()
      print fn, "OK"
    except Exception, e:
      print fn, str(e)
Beispiel #6
0
def run(pdb_file_name, n_models, log, output_file_name_prefix, eps=1.e-7):
    pdb_inp = iotbx.pdb.input(file_name=pdb_file_name)
    pdb_hierarchy = pdb_inp.construct_hierarchy()
    asc = pdb_hierarchy.atom_selection_cache()
    cs = pdb_inp.crystal_symmetry_from_cryst1()
    tls_extract = mmtbx.tls.tools.tls_from_pdb_inp(
        remark_3_records=pdb_inp.extract_remark_iii_records(3),
        pdb_hierarchy=pdb_hierarchy)
    for i_group, tls_params_one_group in enumerate(tls_extract.tls_params):
        selection = asc.selection(tls_params_one_group.selection_string)
        pdb_hierarchy_sel = pdb_hierarchy.select(selection)
        xrs = pdb_hierarchy_sel.extract_xray_structure(crystal_symmetry=cs)
        deg_to_rad_scale = math.pi / 180
        # Units: T[A], L[deg**2], S[A*deg]
        T = matrix.sym(sym_mat3=tls_params_one_group.t)
        L = matrix.sym(sym_mat3=tls_params_one_group.l)
        S = matrix.sqr(tls_params_one_group.s)
        origin = tls_params_one_group.origin
        tlso = tools.tlso(t=T.as_sym_mat3(),
                          l=L.as_sym_mat3(),
                          s=S,
                          origin=origin)
        # sanity check
        if (not adptbx.is_positive_definite(tls_params_one_group.t, eps)):
            raise Sorry("T matrix is not positive definite.")
        if (not adptbx.is_positive_definite(tls_params_one_group.l, eps)):
            raise Sorry("L matrix is not positive definite.")
        r = analysis.run(T=T,
                         L=L * (deg_to_rad_scale**2),
                         S=S * deg_to_rad_scale,
                         log=log).self_check()
        ensemble_generator_obj = ensemble_generator(
            tls_from_motions_object=r,
            pdb_hierarchy=pdb_hierarchy_sel,
            xray_structure=xrs,
            n_models=n_models,
            origin=origin,
            log=log)
        ensemble_generator_obj.write_pdb_file(
            file_name=output_file_name_prefix +
            "_ensemble_%s.pdb" % str(i_group))
        # get U from TLS
        u_from_tls = tools.uaniso_from_tls_one_group(
            tlso=tlso, sites_cart=xrs.sites_cart(), zeroize_trace=False)
        # get U from ensemble
        pdb_hierarchy_from_tls = pdb_hierarchy_sel.deep_copy()
        pdb_hierarchy_from_ens = pdb_hierarchy_sel.deep_copy()
        u_from_ens = tools.u_cart_from_ensemble(
            models=ensemble_generator_obj.states.root.models())
        for i in xrange(xrs.sites_cart().size()):
            print "atom %d:" % i
            print "  Ucart(from TLS):", ["%8.5f" % u for u in u_from_tls[i]]
            print "  Ucart(from ens):", ["%8.5f" % u for u in u_from_ens[i]]
        #
        u1, u2 = u_from_tls.as_double(), u_from_ens.as_double()
        cc = flex.linear_correlation(x=u1, y=u2).coefficient()
        r = flex.sum(flex.abs(u1-u2))/\
            flex.sum(flex.abs(flex.abs(u1)+flex.abs(u2)))*2
        print "%6.4f %6.4f" % (cc, r)
        #
        pdb_hierarchy_from_tls.atoms().set_uij(u_from_tls)
        pdb_hierarchy_from_ens.atoms().set_uij(u_from_ens)
        pdb_hierarchy_from_tls.write_pdb_file(
            file_name=output_file_name_prefix +
            "_u_from_tls_%s.pdb" % str(i_group),
            crystal_symmetry=cs)
        pdb_hierarchy_from_ens.write_pdb_file(
            file_name=output_file_name_prefix +
            "_u_from_ensemble_%s.pdb" % str(i_group),
            crystal_symmetry=cs)
    return ensemble_generator_obj
def run(pdb_file_name,
        n_models,
        log,
        output_file_name_prefix,
        eps=1.e-7):
  pdb_inp = iotbx.pdb.input(file_name = pdb_file_name)
  pdb_hierarchy = pdb_inp.construct_hierarchy()
  asc = pdb_hierarchy.atom_selection_cache()
  cs = pdb_inp.crystal_symmetry_from_cryst1()
  tls_extract = mmtbx.tls.tools.tls_from_pdb_inp(
    remark_3_records = pdb_inp.extract_remark_iii_records(3),
    pdb_hierarchy    = pdb_hierarchy)
  for i_group, tls_params_one_group in enumerate(tls_extract.tls_params):
    selection = asc.selection(tls_params_one_group.selection_string)
    pdb_hierarchy_sel = pdb_hierarchy.select(selection)
    xrs = pdb_hierarchy_sel.extract_xray_structure(crystal_symmetry=cs)
    deg_to_rad_scale = math.pi/180
    # Units: T[A], L[deg**2], S[A*deg]
    T = matrix.sym(sym_mat3=tls_params_one_group.t)
    L = matrix.sym(sym_mat3=tls_params_one_group.l)
    S = matrix.sqr(tls_params_one_group.s)
    origin = tls_params_one_group.origin
    tlso = tools.tlso(
      t      = T.as_sym_mat3(),
      l      = L.as_sym_mat3(),
      s      = S,
      origin = origin)
    # sanity check
    if(not adptbx.is_positive_definite(tls_params_one_group.t, eps)):
      raise Sorry("T matrix is not positive definite.")
    if(not adptbx.is_positive_definite(tls_params_one_group.l, eps)):
      raise Sorry("L matrix is not positive definite.")
    r = analysis.run(T=T, L=L*(deg_to_rad_scale**2), S=S*deg_to_rad_scale,
      log=log).self_check()
    ensemble_generator_obj = ensemble_generator(
      tls_from_motions_object = r,
      pdb_hierarchy           = pdb_hierarchy_sel,
      xray_structure          = xrs,
      n_models                = n_models,
      origin                  = origin,
      log                     = log)
    ensemble_generator_obj.write_pdb_file(
      file_name=output_file_name_prefix+"_ensemble_%s.pdb"%str(i_group))
    # get U from TLS
    u_from_tls = tools.uaniso_from_tls_one_group(
      tlso          = tlso,
      sites_cart    = xrs.sites_cart(),
      zeroize_trace = False)
    # get U from ensemble
    pdb_hierarchy_from_tls = pdb_hierarchy_sel.deep_copy()
    pdb_hierarchy_from_ens = pdb_hierarchy_sel.deep_copy()
    u_from_ens = tools.u_cart_from_ensemble(
      models = ensemble_generator_obj.states.root.models())
    for i in xrange(xrs.sites_cart().size()):
      print "atom %d:"%i
      print "  Ucart(from TLS):", ["%8.5f"%u for u in u_from_tls[i]]
      print "  Ucart(from ens):", ["%8.5f"%u for u in u_from_ens[i]]
    #
    u1, u2 = u_from_tls.as_double(), u_from_ens.as_double()
    cc = flex.linear_correlation(x=u1, y=u2).coefficient()
    r = flex.sum(flex.abs(u1-u2))/\
        flex.sum(flex.abs(flex.abs(u1)+flex.abs(u2)))*2
    print "%6.4f %6.4f"%(cc, r)
    #
    pdb_hierarchy_from_tls.atoms().set_uij(u_from_tls)
    pdb_hierarchy_from_ens.atoms().set_uij(u_from_ens)
    pdb_hierarchy_from_tls.write_pdb_file(
      file_name = output_file_name_prefix+"_u_from_tls_%s.pdb"%str(i_group),
      crystal_symmetry = cs)
    pdb_hierarchy_from_ens.write_pdb_file(
      file_name = output_file_name_prefix+"_u_from_ensemble_%s.pdb"%str(i_group),
      crystal_symmetry = cs)
  return ensemble_generator_obj
Beispiel #8
0
def u_tls_vs_u_ens(
        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):
  from mmtbx.tls import analysis, tls_as_xyz
  from scitbx import matrix
  from libtbx.utils import null_out
  #
  print "INPUTS:","-"*73
  print "dx    :", dx
  print "dy    :", dy
  print "dz    :", dz
  print "sx    :", sx
  print "sy    :", sy
  print "sz    :", sz
  print "lx    :", [i for i in lx]
  print "ly    :", [i for i in ly]
  print "lz    :", [i for i in lz]
  print "tx    :", tx
  print "ty    :", ty
  print "tz    :", tz
  print "vx    :", [i for i in vx]
  print "vy    :", [i for i in vy]
  print "vz    :", [i for i in vz]
  print "w_M_lx:", [i for i in w_M_lx]
  print "w_M_ly:", [i for i in w_M_ly]
  print "w_M_lz:", [i for i in w_M_lz]
  print "origin:", origin
  print "-"*79
  #
  #p1 = "dx"+str(dx)+"_"+"dy"+str(dy)+"_"+"dz"+str(dz)
  #p2 = "sx"+str(sx)+"_"+"sy"+str(sy)+"_"+"sz"+str(sz)
  #p3 = "lx"+"".join([str(i) for i in lx])+"_"+\
  #     "ly"+"".join([str(i) for i in ly])+"_"+\
  #     "lz"+"".join([str(i) for i in lz])
  #prefix = "_".join([p1,p2,p3])
  prefix="u_tls_vs_u_ens"
  #
  pdb_inp = iotbx.pdb.input(source_info=None, lines=pdb_str)
  xrs = pdb_inp.xray_structure_simple()
  sites_cart = xrs.sites_cart()
  xrs.set_sites_cart(sites_cart)
  ph = pdb_inp.construct_hierarchy()
  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))
  #
  u_cart_from_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,
    log                  = null_out())
  r.write_pdb_file(file_name="%s_ensemble.pdb"%prefix)
  #
  xyz_all = []
  for m in r.states.root.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)
  ###
  u1 = u_cart_from_tls.as_double()
  u2 = flex.double()
  for i in xrange(n_atoms):
    ui=flex.double(u_cart_from_xyz(sites_cart=xyz_atoms_all[i]))
    u2.extend(ui)
  r = flex.sum(flex.abs(u1-u2))/\
        flex.sum(flex.abs(flex.abs(u1)+flex.abs(u2)))*2
  print "R(U_tls,U_ens)=%6.4f"%(r)
  print "-"*79
  ###
  for i in xrange(n_atoms):
    print "atom %d:"%i
    ut=["%8.5f"%u for u in u_cart_from_tls[i]]
    ue=["%8.5f"%u for u in u_cart_from_xyz(sites_cart=xyz_atoms_all[i])]
    print "  Ucart(from TLS):", ut
    print "  Ucart(from ens):", ue
    if(assert_similarity):
      for j in xrange(6):
        assert approx_equal(abs(float(ut[j])), abs(float(ue[j])), 1.e-3)
Beispiel #9
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())
Beispiel #10
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())