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)
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)
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()))
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()))
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]
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]
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")