예제 #1
0
def exercise_random_traceless_symmetry_constrained_b_cart():
  from cctbx import crystal
  cs = crystal.symmetry((10,20,30,90,90,90), "P212121")
  bc = adptbx.random_traceless_symmetry_constrained_b_cart(
    crystal_symmetry = cs, u_scale=1, u_min=0.1)
  assert approx_equal(bc[0]+bc[1]+bc[2], 0)
  assert approx_equal(bc[3],0)
  assert approx_equal(bc[4],0)
  assert approx_equal(bc[5],0)
예제 #2
0
def exercise_random_traceless_symmetry_constrained_b_cart():
    from cctbx import crystal

    cs = crystal.symmetry((10, 20, 30, 90, 90, 90), "P212121")
    bc = adptbx.random_traceless_symmetry_constrained_b_cart(crystal_symmetry=cs, u_scale=1, u_min=0.1)
    assert approx_equal(bc[0] + bc[1] + bc[2], 0)
    assert approx_equal(bc[3], 0)
    assert approx_equal(bc[4], 0)
    assert approx_equal(bc[5], 0)
예제 #3
0
def run_0(symbol = "C 2"):
  space_group_info = sgtbx.space_group_info(symbol = symbol)
  xrs = random_structure.xray_structure(
    space_group_info  = space_group_info,
    elements          = ["N"]*50,
    volume_per_atom   = 100.0,
    random_u_iso      = True)
  #
  b_cart = adptbx.random_traceless_symmetry_constrained_b_cart(
    crystal_symmetry=xrs.crystal_symmetry())
  u_star = adptbx.u_cart_as_u_star(xrs.unit_cell(), adptbx.b_as_u(b_cart))
  #
  F = xrs.structure_factors(d_min = 1.5).f_calc()
  k_anisotropic = mmtbx.f_model.ext.k_anisotropic(F.indices(), u_star)
  #
  bin_selections = []
  F.setup_binner(reflections_per_bin=50)
  for i_bin in F.binner().range_used():
    sel = F.binner().selection(i_bin)
    bin_selections.append(sel)
  #
  d_spacings = F.d_spacings().data()
  ss = 1./flex.pow2(d_spacings) / 4.
  k_mask_tmp = mmtbx.f_model.ext.k_mask(ss, 0.35, 80.)
  k_mask = flex.double(F.data().size(), 0)
  k_isotropic = flex.double(F.data().size(), 0)
  for s in bin_selections:
    d = d_spacings.select(s)
    k_mask.set_selected(s, flex.mean(k_mask_tmp.select(s)))
    k_isotropic.set_selected(s, random.randint(1,10))
  #
  fmodel = mmtbx.f_model.manager(
    xray_structure = xrs,
    f_obs          = abs(F),
    k_isotropic    = k_isotropic,
    k_anisotropic  = k_anisotropic,
    k_mask         = k_mask)
  f_calc  = fmodel.f_calc()
  f_masks = fmodel.f_masks()
  f_model = fmodel.f_model()
  f_obs   = abs(f_model)
  r_free_flags = f_obs.generate_r_free_flags(use_lattice_symmetry=False)
  #
  assert approx_equal(bulk_solvent.r_factor(f_obs.data(), f_model.data()), 0)
  aso = scaler.run(
    f_obs          = f_obs,
    f_calc         = f_calc,
    f_mask         = f_masks,
    r_free_flags   = r_free_flags,
    bin_selections = bin_selections,
    number_of_cycles = 500,
    auto_convergence_tolerance = 1.e-9,
    ss             = ss,
    try_poly       = True,
    try_expanal    = True,
    try_expmin     = True,
    verbose        = False)
  assert approx_equal(aso.r_final, 0.00037, 0.00001)
  assert approx_equal(aso.r_low,   0.00002, 0.00001)
  assert approx_equal(aso.r_high,  0.00006, 0.00001)
  assert approx_equal(
    bulk_solvent.r_factor(f_obs.data(), abs(aso.core.f_model).data(), 1),
    bulk_solvent.r_factor(f_obs.data(), abs(aso.core.f_model).data()))
예제 #4
0
def run_0(symbol="C 2"):
    space_group_info = sgtbx.space_group_info(symbol=symbol)
    xrs = random_structure.xray_structure(space_group_info=space_group_info,
                                          elements=["N"] * 50,
                                          volume_per_atom=100.0,
                                          random_u_iso=True)
    #
    b_cart = adptbx.random_traceless_symmetry_constrained_b_cart(
        crystal_symmetry=xrs.crystal_symmetry())
    u_star = adptbx.u_cart_as_u_star(xrs.unit_cell(), adptbx.b_as_u(b_cart))
    #
    F = xrs.structure_factors(d_min=1.5).f_calc()
    k_anisotropic = mmtbx.f_model.ext.k_anisotropic(F.indices(), u_star)
    #
    bin_selections = []
    F.setup_binner(reflections_per_bin=50)
    for i_bin in F.binner().range_used():
        sel = F.binner().selection(i_bin)
        bin_selections.append(sel)
    #
    d_spacings = F.d_spacings().data()
    ss = 1. / flex.pow2(d_spacings) / 4.
    k_mask_tmp = mmtbx.f_model.ext.k_mask(ss, 0.35, 80.)
    k_mask = flex.double(F.data().size(), 0)
    k_isotropic = flex.double(F.data().size(), 0)
    for s in bin_selections:
        d = d_spacings.select(s)
        k_mask.set_selected(s, flex.mean(k_mask_tmp.select(s)))
        k_isotropic.set_selected(s, random.randint(1, 10))
    #
    fmodel = mmtbx.f_model.manager(xray_structure=xrs,
                                   f_obs=abs(F),
                                   k_isotropic=k_isotropic,
                                   k_anisotropic=k_anisotropic,
                                   k_mask=k_mask)
    f_calc = fmodel.f_calc()
    f_masks = fmodel.f_masks()
    f_model = fmodel.f_model()
    f_obs = abs(f_model)
    r_free_flags = f_obs.generate_r_free_flags(use_lattice_symmetry=False)
    #
    assert approx_equal(bulk_solvent.r_factor(f_obs.data(), f_model.data()), 0)
    aso = scaler.run(f_obs=f_obs,
                     f_calc=f_calc,
                     f_mask=f_masks,
                     r_free_flags=r_free_flags,
                     bin_selections=bin_selections,
                     number_of_cycles=500,
                     auto_convergence_tolerance=1.e-9,
                     ss=ss,
                     try_poly=True,
                     try_expanal=True,
                     try_expmin=True,
                     verbose=True)
    print("r_f:", aso.r_final)
    print("r_l:", aso.r_low)
    print("r_h:", aso.r_high)
    assert aso.r_final < 0.0009, [aso.r_final, 0.0009]
    assert aso.r_low < 0.0017, [aso.r_low, 0.0017]
    assert aso.r_high < 0.0006, [aso.r_high, 0.0006]
    assert approx_equal(
        bulk_solvent.r_factor(f_obs.data(),
                              abs(aso.core.f_model).data(), 1),
        bulk_solvent.r_factor(f_obs.data(),
                              abs(aso.core.f_model).data()))
예제 #5
0
def exercise_6_instantiate_consistency(symbol = "C 2"):
  random.seed(0)
  flex.set_random_seed(0)
  for scale in [1.e-4, 1.0, 1.e+4]:
    for k_sol in [0, 0.3]:
      for b_sol in [0, 50]:
        for set_h_occ_to_zero in [True, False]:
          for update_f_part1 in [True, False]:
            for apply_scale_to in ["f_obs", "f_model"]:
              # Simulate Fobs START
              x = random_structure.xray_structure(
                space_group_info       = sgtbx.space_group_info(symbol=symbol),
                elements               =(("O","N","C")*3+("H",)*10),
                volume_per_atom        = 50,
                min_distance           = 3,
                general_positions_only = True,
                random_u_iso           = True,
                random_occupancy       = False)
              x.scattering_type_registry(table="wk1995")
              x.set_occupancies(value=0.8, selection = x.hd_selection())
              f_calc = x.structure_factors(d_min = 2.0).f_calc()
              mask_manager = mmtbx.masks.manager(miller_array = f_calc)
              f_mask = mask_manager.shell_f_masks(xray_structure = x)[0]
              assert flex.mean(abs(f_mask).data()) > 0
              b_cart=adptbx.random_traceless_symmetry_constrained_b_cart(
                crystal_symmetry=x.crystal_symmetry())
              u_star = adptbx.u_cart_as_u_star(x.unit_cell(), adptbx.b_as_u(b_cart))
              k_anisotropic = mmtbx.f_model.ext.k_anisotropic(f_calc.indices(), u_star)
              ss = 1./flex.pow2(f_calc.d_spacings().data()) / 4.
              k_mask = mmtbx.f_model.ext.k_mask(ss, k_sol, b_sol)
              if(apply_scale_to=="f_model"):
                k_isotropic = flex.double(f_calc.data().size(), scale)
              else:
                k_isotropic = flex.double(f_calc.data().size(), 1)
              f_model_data = scale*k_anisotropic*(f_calc.data()+k_mask*f_mask.data())
              f_model = f_calc.customized_copy(data = f_model_data)
              f_obs = abs(f_model)
              if(apply_scale_to=="f_obs"):
                f_obs = f_obs.customized_copy(data = f_obs.data()*scale)
              r_free_flags = f_obs.generate_r_free_flags()
              # Simulate Fobs END
              if(set_h_occ_to_zero):
                x.set_occupancies(value=0.0, selection = x.hd_selection())
              x.shake_sites_in_place(mean_distance=5)
              sel = x.random_remove_sites_selection(fraction=0.3)
              x = x.select(sel)
              fmodel = mmtbx.f_model.manager(
                xray_structure = x,
                f_obs          = f_obs,
                r_free_flags   = r_free_flags)
              fmodel.update_all_scales(fast=True, show=False,
                update_f_part1=update_f_part1)
              f_part1_data = fmodel.f_calc().data()*flex.random_double(
                fmodel.f_calc().data().size())
              f_part1 = fmodel.f_calc().customized_copy(data = f_part1_data)
              fmodel.update(f_part1 = f_part1)
              r1 = fmodel.r_work()
              #
              zero=fmodel.f_calc().customized_copy(data=fmodel.f_calc().data()*0)
              fmodel_dc  = mmtbx.f_model.manager(
                f_obs         = fmodel.f_obs(),
                r_free_flags  = fmodel.r_free_flags(),
                k_isotropic   = fmodel.k_isotropic(),
                k_anisotropic = fmodel.k_anisotropic(),
                f_calc        = fmodel.f_model_no_scales(),
                f_part1       = fmodel.f_part1(),
                f_part2       = fmodel.f_part2(),
                f_mask        = zero)
              r2 = fmodel_dc.r_work()
              if(0):
                print "r1=%8.6f r2=%8.6f fp1=%6.3f fp2=%6.3f fc=%6.3f"%(r1, r2,
                  flex.mean(abs(fmodel.f_part1()).data()), \
                  flex.mean(abs(fmodel.f_part2()).data()), \
                  flex.mean(abs(fmodel.f_calc()).data())), \
                  "set_h_occ_to_zero=", set_h_occ_to_zero,\
                  "update_f_part1=", update_f_part1
              assert approx_equal(r1, r2), [r1, r2]
예제 #6
0
파일: tst_fmodel.py 프로젝트: dials/cctbx
def exercise_6_instantiate_consistency(symbol="C 2"):
    random.seed(0)
    flex.set_random_seed(0)
    for scale in [1.e-4, 1.0, 1.e+4]:
        for k_sol in [0, 0.3]:
            for b_sol in [0, 50]:
                for set_h_occ_to_zero in [True, False]:
                    for update_f_part1 in [True, False]:
                        for apply_scale_to in ["f_obs", "f_model"]:
                            # Simulate Fobs START
                            x = random_structure.xray_structure(
                                space_group_info=sgtbx.space_group_info(
                                    symbol=symbol),
                                elements=(("O", "N", "C") * 3 + ("H", ) * 10),
                                volume_per_atom=50,
                                min_distance=3,
                                general_positions_only=True,
                                random_u_iso=True,
                                random_occupancy=False)
                            x.scattering_type_registry(table="wk1995")
                            x.set_occupancies(value=0.8,
                                              selection=x.hd_selection())
                            f_calc = x.structure_factors(d_min=2.0).f_calc()
                            mask_manager = mmtbx.masks.manager(
                                miller_array=f_calc)
                            f_mask = mask_manager.shell_f_masks(
                                xray_structure=x)[0]
                            assert flex.mean(abs(f_mask).data()) > 0
                            b_cart = adptbx.random_traceless_symmetry_constrained_b_cart(
                                crystal_symmetry=x.crystal_symmetry())
                            u_star = adptbx.u_cart_as_u_star(
                                x.unit_cell(), adptbx.b_as_u(b_cart))
                            k_anisotropic = mmtbx.f_model.ext.k_anisotropic(
                                f_calc.indices(), u_star)
                            ss = 1. / flex.pow2(
                                f_calc.d_spacings().data()) / 4.
                            k_mask = mmtbx.f_model.ext.k_mask(ss, k_sol, b_sol)
                            if (apply_scale_to == "f_model"):
                                k_isotropic = flex.double(
                                    f_calc.data().size(), scale)
                            else:
                                k_isotropic = flex.double(
                                    f_calc.data().size(), 1)
                            f_model_data = scale * k_anisotropic * (
                                f_calc.data() + k_mask * f_mask.data())
                            f_model = f_calc.customized_copy(data=f_model_data)
                            f_obs = abs(f_model)
                            if (apply_scale_to == "f_obs"):
                                f_obs = f_obs.customized_copy(
                                    data=f_obs.data() * scale)
                            r_free_flags = f_obs.generate_r_free_flags()
                            # Simulate Fobs END
                            if (set_h_occ_to_zero):
                                x.set_occupancies(value=0.0,
                                                  selection=x.hd_selection())
                            x.shake_sites_in_place(mean_distance=5)
                            sel = x.random_remove_sites_selection(fraction=0.3)
                            x = x.select(sel)
                            fmodel = mmtbx.f_model.manager(
                                xray_structure=x,
                                f_obs=f_obs,
                                r_free_flags=r_free_flags)
                            fmodel.update_all_scales(
                                fast=True,
                                show=False,
                                update_f_part1=update_f_part1)
                            f_part1_data = fmodel.f_calc().data(
                            ) * flex.random_double(
                                fmodel.f_calc().data().size())
                            f_part1 = fmodel.f_calc().customized_copy(
                                data=f_part1_data)
                            fmodel.update(f_part1=f_part1)
                            r1 = fmodel.r_work()
                            #
                            zero = fmodel.f_calc().customized_copy(
                                data=fmodel.f_calc().data() * 0)
                            fmodel_dc = mmtbx.f_model.manager(
                                f_obs=fmodel.f_obs(),
                                r_free_flags=fmodel.r_free_flags(),
                                k_isotropic=fmodel.k_isotropic(),
                                k_anisotropic=fmodel.k_anisotropic(),
                                f_calc=fmodel.f_model_no_scales(),
                                f_part1=fmodel.f_part1(),
                                f_part2=fmodel.f_part2(),
                                f_mask=zero)
                            r2 = fmodel_dc.r_work()
                            if (0):
                                print("r1=%8.6f r2=%8.6f fp1=%6.3f fp2=%6.3f fc=%6.3f"%(r1, r2,
                                  flex.mean(abs(fmodel.f_part1()).data()), \
                                  flex.mean(abs(fmodel.f_part2()).data()), \
                                  flex.mean(abs(fmodel.f_calc()).data())), \
                                  "set_h_occ_to_zero=", set_h_occ_to_zero,\
                                  "update_f_part1=", update_f_part1)
                            assert approx_equal(r1, r2), [r1, r2]
예제 #7
0
def exercise_5_bulk_sol_and_scaling_and_H(symbol = "C 2"):
  random.seed(0)
  flex.set_random_seed(0)
  x = random_structure.xray_structure(
    space_group_info       = sgtbx.space_group_info(symbol=symbol),
    elements               =(("O","N","C")*5+("H",)*10),
    volume_per_atom        = 200,
    min_distance           = 1.5,
    general_positions_only = True,
    random_u_iso           = True,
    random_occupancy       = False)
  x.scattering_type_registry(table="wk1995")
  x.set_occupancies(value=0.6, selection = x.hd_selection())
  f_calc = x.structure_factors(d_min = 1.5, algorithm="direct").f_calc()
  mask_manager = mmtbx.masks.manager(miller_array = f_calc)
  f_mask = mask_manager.shell_f_masks(xray_structure = x)[0]
  assert flex.mean(abs(f_mask).data()) > 0
  b_cart=adptbx.random_traceless_symmetry_constrained_b_cart(crystal_symmetry=x.crystal_symmetry())
  u_star = adptbx.u_cart_as_u_star(x.unit_cell(), adptbx.b_as_u(b_cart))
  k_anisotropic = mmtbx.f_model.ext.k_anisotropic(f_calc.indices(), u_star)
  ss = 1./flex.pow2(f_calc.d_spacings().data()) / 4.
  k_mask = mmtbx.f_model.ext.k_mask(ss, 0.37, 64.0)
  scale = 17.
  k_isotropic = flex.double(f_calc.data().size(), scale)
  f_model_data = scale*k_anisotropic*(f_calc.data()+k_mask*f_mask.data())
  f_model = f_calc.customized_copy(data = f_model_data)
  f_obs = abs(f_model)
  r_free_flags = f_obs.generate_r_free_flags()
  sfg_params = mmtbx.f_model.sf_and_grads_accuracy_master_params.extract()
  sfg_params.algorithm = "direct"
  for it in [(0,0.6), (1,-0.4), (0.2,0.4), (-0.2,0.8)]:
    value, k_h_ = it
    x.set_occupancies(value=value, selection = x.hd_selection())
    fmodel = mmtbx.f_model.manager(
      xray_structure = x,
      f_obs          = f_obs,
      k_mask         = k_mask,
      k_anisotropic  = k_anisotropic,
      k_isotropic    = k_isotropic,
      r_free_flags   = r_free_flags,
      sf_and_grads_accuracy_params = sfg_params)
    fmodel_dc = fmodel.deep_copy()
    assert fmodel.r_work() > 0.02, fmodel.r_work()
    fmodel.update_f_hydrogens_grid_search()
    assert approx_equal(fmodel.k_h, k_h_), [it, fmodel.k_h, fmodel.r_work()]
    assert approx_equal(fmodel.b_h, 0)
    assert approx_equal(fmodel.r_work(), 0)
    fmodel_dc.update_f_hydrogens()
    assert fmodel_dc.r_work() < 0.01
    # test 2
    fmodel = mmtbx.f_model.manager(
      xray_structure = x,
      f_obs          = f_obs,
      r_free_flags   = r_free_flags,
      sf_and_grads_accuracy_params = sfg_params)
    fmodel_dc = fmodel.deep_copy()
    assert fmodel.r_work() > 0.25
    fmodel.update_all_scales(cycles=6, fast=False, update_f_part1=False,
      refine_hd_scattering_method="slow")
    assert approx_equal(fmodel.k_h, k_h_)
    assert approx_equal(fmodel.b_h, 0)
    assert approx_equal(fmodel.r_work(), 0)
    fmodel_dc.update_all_scales(update_f_part1=False,
      refine_hd_scattering_method="fast")
    assert fmodel_dc.r_work() < 0.05
    # test 3
    fmodel = mmtbx.f_model.manager(
      xray_structure = x,
      f_obs          = f_obs,
      r_free_flags   = r_free_flags,
      sf_and_grads_accuracy_params = sfg_params)
    assert fmodel.r_work() > 0.25
    fmodel.update_all_scales(cycles=6, fast=True, show=False,
      update_f_part1=False, refine_hd_scattering_method="slow")
    assert approx_equal(fmodel.k_h, k_h_)
    assert approx_equal(fmodel.b_h, 0)
    assert fmodel.r_work() < 0.025
  map_coeffs = fmodel.map_coefficients(map_type="2mFo-DFc")
  fmodel.export_f_obs_flags_as_mtz(file_name="tmp_tst_fmodel.mtz")
  assert os.path.isfile("tmp_tst_fmodel.mtz")