def calculate_exp_i_two_phi_peaks(xray_structure, d_min, min_peak_distance, max_reduced_peaks): f_h = xray_structure.structure_factors( anomalous_flag=False, d_min=d_min).f_calc() two_i_phi_h = miller.array( miller_set=f_h, data=flex.polar(1, flex.arg(f_h.data())*2)) fft_map = two_i_phi_h.fft_map( d_min=d_min, symmetry_flags=maptbx.use_space_group_symmetry) real_map = fft_map.real_map() real_map = maptbx.copy(real_map, flex.grid(real_map.focus())) stats = maptbx.statistics(real_map) if (stats.max() != 0): real_map /= abs(stats.max()) grid_tags = maptbx.grid_tags(real_map.focus()) grid_tags.build(fft_map.space_group_info().type(), fft_map.symmetry_flags()) grid_tags.verify(real_map) peak_list = maptbx.peak_list( data=real_map, tags=grid_tags.tag_array(), max_peaks=10*max_reduced_peaks, interpolate=True) reduced_peaks = peak_cluster_reduction( crystal_symmetry=xray_structure, peak_list=peak_list, min_peak_distance=min_peak_distance, max_reduced_peaks=max_reduced_peaks) return reduced_peaks
def test_shift(space_group_info, d_min=0.8, grid_resolution_factor=0.48, max_prime=5, verbose=0): n = 12 // len(space_group_info.group()) or 1 target_structure = random_structure.xray_structure( space_group_info=space_group_info, elements=['C']*n, use_u_iso=False, use_u_aniso=False, ) f_target = miller.build_set( crystal_symmetry=target_structure, anomalous_flag=False, d_min=d_min ).structure_factors_from_scatterers( xray_structure=target_structure, algorithm="direct").f_calc() f_obs = abs(f_target) indices_in_p1 = miller.set.expand_to_p1(f_target) target_structure_in_p1 = target_structure.expand_to_p1() reference_translation = matrix.col((0.1, 0.2, 0.7)) structure_in_p1 = target_structure_in_p1.apply_shift(reference_translation) f_structure_in_p1 = indices_in_p1.structure_factors_from_scatterers( xray_structure=structure_in_p1, algorithm="direct").f_calc() symmetry_flags = translation_search.symmetry_flags( is_isotropic_search_model=False, have_f_part=False) gridding = f_target.crystal_gridding( symmetry_flags=symmetry_flags, resolution_factor=grid_resolution_factor, max_prime=max_prime).n_real() grid_tags = maptbx.grid_tags(gridding) for f_calc_in_p1 in (f_structure_in_p1,): peak_list = run_fast_nv1995( f_obs=f_obs, f_calc_fixed=None, f_calc_p1=f_calc_in_p1, symmetry_flags=symmetry_flags, gridding=gridding, grid_tags=grid_tags, verbose=verbose) assert peak_list.heights()[0] > 0.9 shift = matrix.col(peak_list.sites()[0]) assert f_target.space_group_info().is_allowed_origin_shift( shift + reference_translation, tolerance=0.04)
def exercise_grid_tags(): t = maptbx.grid_tags((8,10,12)) assert not t.is_valid() assert t.tag_array().all() == (8,10,12) s = sgtbx.space_group_info("P 21") for i_flags in xrange(8): f = sgtbx.search_symmetry_flags( use_space_group_symmetry=i_flags % 2 != 0, use_space_group_ltr=0, use_seminvariants=(i_flags//4) % 2 != 0, use_normalizer_k2l=(i_flags//2) % 2 != 0, use_normalizer_l2n=False) t.build(s.type(), f) assert t.is_valid() assert t.space_group_type().group() == s.group() assert t.symmetry_flags() == f if (f.use_seminvariants()): assert [(vm.v, vm.m) for vm in t.grid_ss_continuous()] \ == [((0, 1, 0), 10)] assert t.n_grid_misses() == 0 assert t.n_independent() == (960, 480, 484, 242, 24, 14, 14, 14)[i_flags] assert t.n_independent() + t.n_dependent() == t.tag_array().size() for flex_type in flex_types(): d = flex_type(t.tag_array().accessor()) assert t.n_dependent() == 0 \ or approx_equal(t.dependent_correlation(d, 1.e-10).coefficient(),0) assert t.verify(d, 0) t.sum_sym_equiv_points(d) if (i_flags == 0): assert t.n_independent() == t.tag_array().size() else: assert t.n_independent() < t.tag_array().size() for flex_type in flex_types(): d = flex_type([random.random() for x in xrange(t.tag_array().size())]) d.resize(t.tag_array().accessor()) assert not t.verify(d) t.sum_sym_equiv_points(d) assert t.verify(d)
def exercise(space_group_info, redundancy_counter=0): n_real = (12,12,12) miller_max = (2,2,2) gt = maptbx.grid_tags(n_real) uc = space_group_info.any_compatible_unit_cell(volume=1000) fl = sgtbx.search_symmetry_flags(use_space_group_symmetry=True) gt.build(space_group_info.type(), fl) fft = fftpack.real_to_complex_3d(n_real) map0 = flex.double(flex.grid(fft.m_real()).set_focus(fft.n_real()), 0) weight_map = map0.deep_copy() map = map0.deep_copy() ta = gt.tag_array() order_z = space_group_info.group().order_z() problems_expected = (redundancy_counter != 0) for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): xyz = [i/n for i,n in zip(ijk, n_real)] ss = sgtbx.site_symmetry( unit_cell=uc, space_group=space_group_info.group(), original_site=xyz, min_distance_sym_equiv=1e-5) m = space_group_info.group().multiplicity( site=boost.rational.vector(ijk, n_real)) assert m == ss.multiplicity() w = m / order_z weight_map[ijk] = w map[ijk] = w elif (redundancy_counter != 0): redundancy_counter -= 1 ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t map[ijk] = map[ijk_asu] sf_map = fft.forward(map) del map mi = miller.index_generator( space_group_info.type(), False, miller_max).to_array() assert mi.size() != 0 from_map = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map, conjugate_flag=True) sf = [iround(abs(f)) for f in from_map.data()] if (sf != [0]*len(sf)): assert problems_expected return else: not problems_expected # map_p1 = map0.deep_copy() map_sw = map0.deep_copy() for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): v = random.random()*2-1 map_p1[ijk] = v map_sw[ijk] = v * weight_map[ijk] else: ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t assert map_p1[ijk_asu] != 0 map_p1[ijk] = map_p1[ijk_asu] # # fft followed by symmetry summation in reciprocal space sf_map_sw = fft.forward(map_sw) del map_sw sf_sw = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_sw, conjugate_flag=True).data() del sf_map_sw # # symmetry expansion in real space (done above already) followed fft sf_map_p1 = fft.forward(map_p1) del map_p1 sf_p1 = maptbx.structure_factors.from_map( space_group=sgtbx.space_group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_p1, conjugate_flag=True).data() del sf_map_p1 # corr = flex.linear_correlation(x=flex.abs(sf_sw), y=flex.abs(sf_p1)) assert corr.is_well_defined assert approx_equal(corr.coefficient(), 1)
def run_group(symbol): group = space_group_info(symbol) print("\n==") elements = ('C', 'N', 'O', 'H') * 11 struc = random_structure.xray_structure(space_group_info=group, volume_per_atom=25., general_positions_only=False, elements=elements, min_distance=1.0) struc.show_summary() d_min = 2. fc = struc.structure_factors(d_min=d_min).f_calc() symmetry_flags = maptbx.use_space_group_symmetry fftmap = fc.fft_map(symmetry_flags=symmetry_flags) grid_size = fftmap.real_map().accessor().focus() ### rm = fftmap.real_map().deep_copy() amap0 = asymmetric_map(struc.space_group().type(), rm) p1_map00 = amap0.symmetry_expanded_map() assert approx_equal(p1_map00, rm) # maptbx.unpad_in_place(rm) amap1 = asymmetric_map(struc.space_group().type(), rm) p1_map10 = amap1.symmetry_expanded_map() assert approx_equal(p1_map00, p1_map10) ### grid_tags = maptbx.grid_tags(grid_size) grid_tags.build(fftmap.space_group_info().type(), fftmap.symmetry_flags()) grid_tags.verify(fftmap.real_map()) print("FFT grid_size = ", grid_size) amap = asymmetric_map(struc.space_group().type(), fftmap.real_map()) afc = amap.structure_factors(fc.indices()) afftmap = amap.map_for_fft() print("whole cell map size: ", afftmap.accessor().focus()) adata = amap.data() acc = adata.accessor() print("Asu map size: ", acc.origin(), " ", acc.last(), " ", acc.focus(), \ " ", acc.all()) df = flex.abs(afc - fc.data()) r1 = flex.sum(df) / flex.sum(flex.abs(fc.data())) print("R1: ", r1) assert r1 < 1.e-5 # just to prove to myself that I can shift origin to 000 and then reshape back adata = adata.shift_origin() adata.reshape(acc) # adata2 = adata.deep_copy() * 2. amap2 = asymmetric_map(struc.space_group().type(), adata2, grid_size) afc2 = amap2.structure_factors(fc.indices()) df2 = flex.abs(afc2 * .5 - fc.data()) r12 = flex.sum(df2) / flex.sum(flex.abs(fc.data())) print("R1 again: ", r12) assert r12 < 1.e-5 p1_map = amap.symmetry_expanded_map() assert p1_map.accessor().focus() == grid_size rel_tol = 1.e-6 n = 0 mean_rel_dif = 0. for (m1, m2) in zip(fftmap.real_map(), p1_map): dif = abs(m1 - m2) av = 0.5 * (abs(m1) + abs(m2)) assert dif <= rel_tol * av, "%f not <= %f * %f" % (dif, rel_tol, av) if av != 0: mean_rel_dif = mean_rel_dif + dif / av n = n + 1 mean_rel_dif = mean_rel_dif / n print("mean rel err: ", mean_rel_dif) assert mean_rel_dif < 1.e-6
def test_molecule(space_group_info, use_primitive_setting, flag_f_part, d_min=3., grid_resolution_factor=0.48, max_prime=5, verbose=0): if (use_primitive_setting): space_group_info = space_group_info.primitive_setting() elements = ("N", "C", "C", "O", "N", "C", "C", "O") structure = random_structure.xray_structure( space_group_info, elements=elements, volume_per_atom=50, min_distance=1., general_positions_only=True, random_u_iso=True, random_occupancy=True) if (0 or verbose): structure.show_summary().show_scatterers() miller_set_f_obs = miller.build_set( crystal_symmetry=structure, anomalous_flag=(random.random() < 0.5), d_min=d_min) f_obs = abs(miller_set_f_obs.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct").f_calc()) if (0 or verbose): f_obs.show_summary() if (0 or verbose): f_obs.show_array() miller_set_p1 = miller.set.expand_to_p1(f_obs) special_position_settings_p1 = crystal.special_position_settings( crystal_symmetry=miller_set_p1) structure_p1 = xray.structure( special_position_settings=special_position_settings_p1) structure_fixed = xray.structure(special_position_settings=structure) for scatterer in structure.scatterers(): if (flag_f_part and structure_fixed.scatterers().size() < structure.scatterers().size()//2): structure_fixed.add_scatterer(scatterer) else: structure_p1.add_scatterer(scatterer) if (0 or verbose): if (flag_f_part): structure_fixed.show_summary().show_scatterers() structure_p1.show_summary().show_scatterers() f_calc_fixed = None if (flag_f_part): f_calc_fixed = f_obs.structure_factors_from_scatterers( xray_structure=structure_fixed, algorithm="direct").f_calc() f_calc_p1 = miller_set_p1.structure_factors_from_scatterers( xray_structure=structure_p1, algorithm="direct").f_calc() symmetry_flags = translation_search.symmetry_flags( is_isotropic_search_model=False, have_f_part=flag_f_part) gridding = miller_set_f_obs.crystal_gridding( symmetry_flags=symmetry_flags, resolution_factor=grid_resolution_factor, max_prime=max_prime).n_real() grid_tags = maptbx.grid_tags(gridding) run_fast_terms( structure_fixed, structure_p1, f_obs, f_calc_fixed, f_calc_p1, symmetry_flags, gridding, grid_tags, test_origin=True, verbose=verbose) peak_list = run_fast_nv1995( f_obs, f_calc_fixed, f_calc_p1, symmetry_flags, gridding, grid_tags, verbose) assert peak_list.heights()[0] > 0.99
def test_atom(space_group_info, use_primitive_setting, n_elements=3, d_min=3., grid_resolution_factor=0.48, max_prime=5, verbose=0): if (use_primitive_setting): space_group_info = space_group_info.primitive_setting() structure = random_structure.xray_structure( space_group_info, n_scatterers=n_elements, volume_per_atom=150, min_distance=1., general_positions_only=True) miller_set_f_obs = miller.build_set( crystal_symmetry=structure, anomalous_flag=(random.random() < 0.5), d_min=d_min) symmetry_flags = translation_search.symmetry_flags( is_isotropic_search_model=True, have_f_part=(n_elements>=2)) gridding = miller_set_f_obs.crystal_gridding( symmetry_flags=symmetry_flags, resolution_factor=grid_resolution_factor, max_prime=max_prime).n_real() structure.build_scatterers( elements=["Se"]*n_elements, grid=gridding) if (0 or verbose): structure.show_summary().show_scatterers() f_obs = abs(miller_set_f_obs.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct").f_calc()) if (0 or verbose): f_obs.show_summary() if (0 or verbose): f_obs.show_array() miller_set_p1 = miller.set.expand_to_p1(f_obs) special_position_settings_p1 = crystal.special_position_settings( crystal_symmetry=miller_set_p1) structure_fixed = xray.structure(special_position_settings=structure) for scatterer in structure.scatterers(): structure_p1 = xray.structure( special_position_settings=special_position_settings_p1) scatterer_at_origin = scatterer.customized_copy(site=(0,0,0)) structure_p1.add_scatterer(scatterer_at_origin) if (0 or verbose): structure_p1.show_summary().show_scatterers() f_calc_p1 = miller_set_p1.structure_factors_from_scatterers( xray_structure=structure_p1, algorithm="direct").f_calc() if (0 or verbose): f_calc_p1.show_array() f_calc_fixed = None if (structure_fixed.scatterers().size() > 0): f_calc_fixed = f_obs.structure_factors_from_scatterers( xray_structure=structure_fixed, algorithm="direct").f_calc() symmetry_flags = translation_search.symmetry_flags( is_isotropic_search_model=True, have_f_part=(f_calc_fixed is not None)) if (structure_fixed.scatterers().size() <= 1): gridding = miller_set_f_obs.crystal_gridding( symmetry_flags=symmetry_flags, resolution_factor=grid_resolution_factor, max_prime=max_prime).n_real() grid_tags = maptbx.grid_tags(gridding) run_fast_terms( structure_fixed, structure_p1, f_obs, f_calc_fixed, f_calc_p1, symmetry_flags, gridding, grid_tags, verbose=verbose) peak_list = run_fast_nv1995( f_obs, f_calc_fixed, f_calc_p1, symmetry_flags, gridding, grid_tags, verbose) structure_fixed.add_scatterer(scatterer) if (0 or verbose): structure_fixed.show_summary().show_scatterers() if (structure_fixed.scatterers().size() < n_elements): assert peak_list.heights()[0] < 1 else: assert peak_list.heights()[0] > 0.99 assert peak_list.heights()[0] > 0.99
def exercise(space_group_info, redundancy_counter=0): n_real = (12, 12, 12) miller_max = (2, 2, 2) gt = maptbx.grid_tags(n_real) uc = space_group_info.any_compatible_unit_cell(volume=1000) fl = sgtbx.search_symmetry_flags(use_space_group_symmetry=True) gt.build(space_group_info.type(), fl) fft = fftpack.real_to_complex_3d(n_real) map0 = flex.double(flex.grid(fft.m_real()).set_focus(fft.n_real()), 0) weight_map = map0.deep_copy() map = map0.deep_copy() ta = gt.tag_array() order_z = space_group_info.group().order_z() problems_expected = (redundancy_counter != 0) for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): xyz = [i / n for i, n in zip(ijk, n_real)] ss = sgtbx.site_symmetry(unit_cell=uc, space_group=space_group_info.group(), original_site=xyz, min_distance_sym_equiv=1e-5) m = space_group_info.group().multiplicity( site=boost.rational.vector(ijk, n_real)) assert m == ss.multiplicity() w = m / order_z weight_map[ijk] = w map[ijk] = w elif (redundancy_counter != 0): redundancy_counter -= 1 ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t map[ijk] = map[ijk_asu] sf_map = fft.forward(map) del map mi = miller.index_generator(space_group_info.type(), False, miller_max).to_array() assert mi.size() != 0 from_map = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map, conjugate_flag=True) sf = [iround(abs(f)) for f in from_map.data()] if (sf != [0] * len(sf)): assert problems_expected return else: not problems_expected # map_p1 = map0.deep_copy() map_sw = map0.deep_copy() for ijk in flex.nested_loop(n_real): t = ta[ijk] if (t < 0): v = random.random() * 2 - 1 map_p1[ijk] = v map_sw[ijk] = v * weight_map[ijk] else: ijk_asu = n_dim_index_from_one_dim(i1d=t, sizes=n_real) assert ta.accessor()(ijk_asu) == t assert map_p1[ijk_asu] != 0 map_p1[ijk] = map_p1[ijk_asu] # # fft followed by symmetry summation in reciprocal space sf_map_sw = fft.forward(map_sw) del map_sw sf_sw = maptbx.structure_factors.from_map( space_group=space_group_info.group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_sw, conjugate_flag=True).data() del sf_map_sw # # symmetry expansion in real space (done above already) followed fft sf_map_p1 = fft.forward(map_p1) del map_p1 sf_p1 = maptbx.structure_factors.from_map(space_group=sgtbx.space_group(), anomalous_flag=False, miller_indices=mi, complex_map=sf_map_p1, conjugate_flag=True).data() del sf_map_p1 # corr = flex.linear_correlation(x=flex.abs(sf_sw), y=flex.abs(sf_p1)) assert corr.is_well_defined assert approx_equal(corr.coefficient(), 1)
def run_test(space_group_info, n_elements=5, d_min=1.5, grid_resolution_factor=1./3, max_prime=5, verbose=0): structure = random_structure.xray_structure( space_group_info, elements=["Si"]*n_elements, volume_per_atom=200, min_distance=3., general_positions_only=False) miller_set_f_obs = miller.build_set( crystal_symmetry=structure, anomalous_flag=(random.random()>0.5), d_min=d_min) f_obs = miller_set_f_obs.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct").f_calc() structure_factor_utils.check_phase_restrictions(f_obs, verbose=verbose) if (0 or verbose): f_obs.show_summary() if (0 or verbose): f_obs.show_array() fft_map = f_obs.fft_map( resolution_factor=grid_resolution_factor, symmetry_flags=maptbx.use_space_group_symmetry) p = pickle.dumps(fft_map) l = pickle.loads(p) s1 = StringIO() fft_map.statistics().show_summary(f=s1) s2 = StringIO() l.statistics().show_summary(f=s2) assert not show_diff(s2.getvalue(), s1.getvalue()) # if (not f_obs.anomalous_flag()): maptbx_fft_map = maptbx.fft_to_real_map_unpadded( space_group=fft_map.space_group(), n_real=fft_map.n_real(), miller_indices=f_obs.indices(), data=f_obs.data()) fft_map_unpadded = fft_map.real_map_unpadded(in_place=False) assert approx_equal( flex.linear_correlation( fft_map_unpadded.as_1d(), maptbx_fft_map.as_1d()).coefficient(), 1) assert approx_equal( flex.max(flex.abs(maptbx_fft_map - fft_map_unpadded)), 0) # fft_map.apply_sigma_scaling() real_map = maptbx.copy( fft_map.real_map(), flex.grid(fft_map.real_map().focus())) grid_tags = maptbx.grid_tags(real_map.focus()) grid_tags.build( fft_map.space_group_info().type(), fft_map.symmetry_flags()) assert grid_tags.n_grid_misses() == 0 assert grid_tags.verify(real_map) rms = [] for interpolate in (False,True): peak_list = maptbx.peak_list( data=real_map, tags=grid_tags.tag_array(), peak_search_level=1, max_peaks=2*n_elements, interpolate=interpolate) assert peak_list.gridding() == real_map.focus() check_peaks(structure, peak_list.sites(), d_min * grid_resolution_factor) crystal_gridding_tags = fft_map.tags() cluster_analysis = maptbx.peak_cluster_analysis( peak_list=peak_list, special_position_settings=structure, general_positions_only=False, effective_resolution=d_min, min_cross_distance=2, max_clusters=n_elements).all() check_peaks( structure, cluster_analysis.sites(), cluster_analysis.min_cross_distance() + d_min * grid_resolution_factor) structure_from_peaks = xray.structure(structure) for site in cluster_analysis.sites(): structure_from_peaks.add_scatterer( xray.scatterer(label="site", scattering_type="", site=site)) emma_matches = emma.model_matches( structure.as_emma_model(), structure_from_peaks.as_emma_model(), tolerance=d_min*2) rms.append(emma_matches.refined_matches[0].rms) assert len(emma_matches.refined_matches[0].pairs) == n_elements # exercise interpolation vs. summation map_coeffs = f_obs.expand_to_p1() fft_map = f_obs.fft_map( resolution_factor=grid_resolution_factor, symmetry_flags=maptbx.use_space_group_symmetry) fft_map.apply_volume_scaling() real_map = fft_map.real_map_unpadded() sum1 = sum2 = 0 for scatterer in structure.scatterers() : v1 = real_map.eight_point_interpolation(scatterer.site) v2 = real_map.tricubic_interpolation(scatterer.site) v3 = map_coeffs.direct_summation_at_point(scatterer.site) sum1 += abs(v1 - v3.real) sum2 += abs(v2 - v3.real) mean_delta_linear = sum1 / n_elements mean_delta_cubic = sum2 / n_elements assert (mean_delta_cubic < mean_delta_linear) if (0 or verbose): print "emma rms grid, interpolated: %.2f %.2f" % tuple(rms) assert rms[0] >= rms[1] map_1 = fft_map.real_map_unpadded(in_place=False) map_2 = fft_map.real_map_unpadded(in_place=True) assert (map_1.all_eq(map_2))
def run_test(space_group_info, n_elements=5, d_min=1.5, grid_resolution_factor=1. / 3, max_prime=5, verbose=0): structure = random_structure.xray_structure(space_group_info, elements=["Si"] * n_elements, volume_per_atom=200, min_distance=3., general_positions_only=False) miller_set_f_obs = miller.build_set(crystal_symmetry=structure, anomalous_flag=(random.random() > 0.5), d_min=d_min) f_obs = miller_set_f_obs.structure_factors_from_scatterers( xray_structure=structure, algorithm="direct").f_calc() structure_factor_utils.check_phase_restrictions(f_obs, verbose=verbose) if (0 or verbose): f_obs.show_summary() if (0 or verbose): f_obs.show_array() fft_map = f_obs.fft_map(resolution_factor=grid_resolution_factor, symmetry_flags=maptbx.use_space_group_symmetry) p = pickle.dumps(fft_map) l = pickle.loads(p) s1 = StringIO() fft_map.statistics().show_summary(f=s1) s2 = StringIO() l.statistics().show_summary(f=s2) assert not show_diff(s2.getvalue(), s1.getvalue()) # if (not f_obs.anomalous_flag()): maptbx_fft_map = maptbx.fft_to_real_map_unpadded( space_group=fft_map.space_group(), n_real=fft_map.n_real(), miller_indices=f_obs.indices(), data=f_obs.data()) fft_map_unpadded = fft_map.real_map_unpadded(in_place=False) assert approx_equal( flex.linear_correlation(fft_map_unpadded.as_1d(), maptbx_fft_map.as_1d()).coefficient(), 1) assert approx_equal( flex.max(flex.abs(maptbx_fft_map - fft_map_unpadded)), 0) # fft_map.apply_sigma_scaling() real_map = maptbx.copy(fft_map.real_map(), flex.grid(fft_map.real_map().focus())) grid_tags = maptbx.grid_tags(real_map.focus()) grid_tags.build(fft_map.space_group_info().type(), fft_map.symmetry_flags()) assert grid_tags.n_grid_misses() == 0 assert grid_tags.verify(real_map) rms = [] for interpolate in (False, True): peak_list = maptbx.peak_list(data=real_map, tags=grid_tags.tag_array(), peak_search_level=1, max_peaks=2 * n_elements, interpolate=interpolate) assert peak_list.gridding() == real_map.focus() check_peaks(structure, peak_list.sites(), d_min * grid_resolution_factor) crystal_gridding_tags = fft_map.tags() cluster_analysis = maptbx.peak_cluster_analysis( peak_list=peak_list, special_position_settings=structure, general_positions_only=False, effective_resolution=d_min, min_cross_distance=2, max_clusters=n_elements).all() check_peaks( structure, cluster_analysis.sites(), cluster_analysis.min_cross_distance() + d_min * grid_resolution_factor) structure_from_peaks = xray.structure(structure) for site in cluster_analysis.sites(): structure_from_peaks.add_scatterer( xray.scatterer(label="site", scattering_type="", site=site)) emma_matches = emma.model_matches(structure.as_emma_model(), structure_from_peaks.as_emma_model(), tolerance=d_min * 2) rms.append(emma_matches.refined_matches[0].rms) assert len(emma_matches.refined_matches[0].pairs) == n_elements # exercise interpolation vs. summation map_coeffs = f_obs.expand_to_p1() fft_map = f_obs.fft_map(resolution_factor=grid_resolution_factor, symmetry_flags=maptbx.use_space_group_symmetry) fft_map.apply_volume_scaling() real_map = fft_map.real_map_unpadded() sum1 = sum2 = 0 for scatterer in structure.scatterers(): v1 = real_map.eight_point_interpolation(scatterer.site) v2 = real_map.tricubic_interpolation(scatterer.site) v3 = map_coeffs.direct_summation_at_point(scatterer.site) sum1 += abs(v1 - v3.real) sum2 += abs(v2 - v3.real) mean_delta_linear = sum1 / n_elements mean_delta_cubic = sum2 / n_elements assert (mean_delta_cubic < mean_delta_linear) if (0 or verbose): print("emma rms grid, interpolated: %.2f %.2f" % tuple(rms)) assert rms[0] >= rms[1] map_1 = fft_map.real_map_unpadded(in_place=False) map_2 = fft_map.real_map_unpadded(in_place=True) assert (map_1.all_eq(map_2))