Ejemplo n.º 1
0
def random_site(special_position_settings,
                existing_sites,
                min_hetero_distance=1.5,
                general_position_only=False,
                grid=None,
                t_centre_of_inversion=None,
                max_trials=100):
  for trial in xrange(max_trials):
    if (grid is None):
      site = (random.random(), random.random(), random.random())
    else:
      site = [random.randrange(g) / float(g) for g in grid]
    site_symmetry = special_position_settings.site_symmetry(site)
    if (general_position_only and not site_symmetry.is_point_group_1()):
      continue
    sym_equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
    if (not have_suitable_hetero_distance(
              existing_sites, sym_equiv_sites, min_hetero_distance)):
      continue
    site = site_symmetry.exact_site()
    if (t_centre_of_inversion is None):
      return site
    site_inv = [-x+t for x,t in zip(site, t_centre_of_inversion)]
    site_symmetry_inv = special_position_settings.site_symmetry(site_inv)
    if (general_position_only and not site_symmetry_inv.is_point_group_1()):
      continue
    sym_equiv_sites_inv = sgtbx.sym_equiv_sites(site_symmetry_inv)
    if (not have_suitable_hetero_distance(
              existing_sites + [site],
              sym_equiv_sites_inv, min_hetero_distance)):
      continue
    return site, site_symmetry_inv.exact_site()
  return None
Ejemplo n.º 2
0
def random_site(special_position_settings,
                existing_sites,
                min_hetero_distance=1.5,
                general_position_only=False,
                grid=None,
                t_centre_of_inversion=None,
                max_trials=100):
    for trial in xrange(max_trials):
        if (grid is None):
            site = (random.random(), random.random(), random.random())
        else:
            site = [random.randrange(g) / float(g) for g in grid]
        site_symmetry = special_position_settings.site_symmetry(site)
        if (general_position_only and not site_symmetry.is_point_group_1()):
            continue
        sym_equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
        if (not have_suitable_hetero_distance(existing_sites, sym_equiv_sites,
                                              min_hetero_distance)):
            continue
        site = site_symmetry.exact_site()
        if (t_centre_of_inversion is None):
            return site
        site_inv = [-x + t for x, t in zip(site, t_centre_of_inversion)]
        site_symmetry_inv = special_position_settings.site_symmetry(site_inv)
        if (general_position_only
                and not site_symmetry_inv.is_point_group_1()):
            continue
        sym_equiv_sites_inv = sgtbx.sym_equiv_sites(site_symmetry_inv)
        if (not have_suitable_hetero_distance(existing_sites + [site],
                                              sym_equiv_sites_inv,
                                              min_hetero_distance)):
            continue
        return site, site_symmetry_inv.exact_site()
    return None
Ejemplo n.º 3
0
 def loop(self):
     for i_position in xrange(self.wyckoff_table.size()):
         site_symmetry_i = self.wyckoff_table.random_site_symmetry(
             special_position_settings=self.special_position_settings,
             i_position=i_position)
         equiv_sites_i = sgtbx.sym_equiv_sites(site_symmetry_i)
         for j_position in xrange(self.wyckoff_table.size()):
             for n_trial in xrange(self.max_trials_per_position):
                 site_j = self.wyckoff_table.random_site_symmetry(
                     special_position_settings=self.
                     special_position_settings,
                     i_position=j_position).exact_site()
                 dist_info = sgtbx.min_sym_equiv_distance_info(
                     equiv_sites_i, site_j)
                 if (dist_info.dist() > self.min_cross_distance):
                     structure = xray.structure(
                         special_position_settings=self.
                         special_position_settings,
                         scatterers=flex.xray_scatterer([
                             xray.scatterer(
                                 scattering_type=self.scattering_type,
                                 site=site) for site in
                             [site_symmetry_i.exact_site(), site_j]
                         ]))
                     yield structure, dist_info.dist()
                     break
Ejemplo n.º 4
0
 def show_patterson_peaks(self,
                          min_relative_peak_height=0.1,
                          show_at_least=3):
     print("Patterson peaks for %s:" % str(self.input.info()))
     reciprocal_map = self.input
     if (reciprocal_map.anomalous_flag()):
         reciprocal_map = reciprocal_map.average_bijvoet_mates()
     patterson_map = reciprocal_map.patterson_map(
         symmetry_flags=maptbx.use_space_group_symmetry)
     patterson_map.apply_sigma_scaling()
     peak_list = patterson_map.tags().peak_search(
         map=patterson_map.real_map(),
         parameters=maptbx.peak_search_parameters())
     max_height = peak_list.heights()[0]
     sym_equiv_origin = sgtbx.sym_equiv_sites(
         unit_cell=patterson_map.unit_cell(),
         space_group=patterson_map.space_group(),
         original_site=(0, 0, 0))
     print("      Fractional coordinates     Height  Distance from origin")
     for i_peak in range(peak_list.size()):
         height = peak_list.heights()[i_peak]
         if (height < max_height * min_relative_peak_height
                 and i_peak > show_at_least):
             break
         site = peak_list.sites()[i_peak]
         dist_info = sgtbx.min_sym_equiv_distance_info(
             sym_equiv_origin, site)
         print("  %8.4f %8.4f %8.4f" % (dist_info.sym_op() * site), end=' ')
         print("  %8.3f  %8.3f" % (height, dist_info.dist()))
     print()
Ejemplo n.º 5
0
 def random_symmetry_mates(self):
   new_positions = []
   for pos in self.positions():
     equiv = sgtbx.sym_equiv_sites(self.site_symmetry(pos.site))
     i = random.randrange(equiv.coordinates().size())
     new_positions.append(emma.position(pos.label, equiv.coordinates()[i]))
   return self.create_new_test_model(new_positions)
Ejemplo n.º 6
0
 def random_symmetry_mates(self):
   new_positions = []
   for pos in self.positions():
     equiv = sgtbx.sym_equiv_sites(self.site_symmetry(pos.site))
     i = random.randrange(equiv.coordinates().size())
     new_positions.append(emma.position(pos.label, equiv.coordinates()[i]))
   return self.create_new_test_model(new_positions)
Ejemplo n.º 7
0
def peak_cluster_reduction(crystal_symmetry, peak_list,
                           min_peak_distance, max_reduced_peaks):
  special_position_settings = crystal.special_position_settings(
    crystal_symmetry=crystal_symmetry,
    min_distance_sym_equiv=min_peak_distance)
  peaks = []
  for i,site in enumerate(peak_list.sites()):
    peaks.append(dicts.easy(
      site=special_position_settings.site_symmetry(site).exact_site(),
      height=peak_list.heights()[i]))
  reduced_peaks = []
  for peak in peaks:
    site_symmetry = special_position_settings.site_symmetry(peak.site)
    equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
    keep = True
    for reduced_peak in reduced_peaks:
      dist = sgtbx.min_sym_equiv_distance_info(
        equiv_sites, reduced_peak.site).dist()
      if (dist < min_peak_distance):
        keep = False
        break
    if (keep == True):
      reduced_peaks.append(peak)
      if (len(reduced_peaks) == max_reduced_peaks): break
  return reduced_peaks
Ejemplo n.º 8
0
def verify_match(model1, model2, tolerance, match_rt, pairs):
    adj_tolerance = tolerance * (1 + 1.e-6)
    for pair in pairs:
        c1 = model1[pair[0]].site
        c2 = match_rt * model2[pair[1]].site
        equiv_c2 = sgtbx.sym_equiv_sites(model1.site_symmetry(c2.elems))
        dist_info = sgtbx.min_sym_equiv_distance_info(equiv_c2, c1)
        assert dist_info.dist() < adj_tolerance, str(model1.space_group_info())
Ejemplo n.º 9
0
def verify_match(model1, model2, tolerance, match_rt, pairs):
  adj_tolerance = tolerance * (1 + 1.e-6)
  for pair in pairs:
    c1 = model1[pair[0]].site
    c2 = match_rt * model2[pair[1]].site
    equiv_c2 = sgtbx.sym_equiv_sites(model1.site_symmetry(c2.elems))
    dist_info = sgtbx.min_sym_equiv_distance_info(equiv_c2, c1)
    assert dist_info.dist() < adj_tolerance, str(model1.space_group_info())
Ejemplo n.º 10
0
def check_peaks(structure, peak_sites, max_min_dist):
  for scatterer in structure.scatterers():
    site_symmetry = structure.site_symmetry(scatterer.site)
    equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
    min_dist = None
    for peak_site in peak_sites:
      dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites, peak_site)
      if (min_dist is None):
        min_dist = dist_info.dist()
      else:
        min_dist = min(min_dist, dist_info.dist())
    assert min_dist <= max_min_dist, (min_dist, max_min_dist)
Ejemplo n.º 11
0
def check_peaks(structure, peak_sites, max_min_dist):
    for scatterer in structure.scatterers():
        site_symmetry = structure.site_symmetry(scatterer.site)
        equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
        min_dist = None
        for peak_site in peak_sites:
            dist_info = sgtbx.min_sym_equiv_distance_info(
                equiv_sites, peak_site)
            if (min_dist is None):
                min_dist = dist_info.dist()
            else:
                min_dist = min(min_dist, dist_info.dist())
        assert min_dist <= max_min_dist, (min_dist, max_min_dist)
 def expand_to_p1(self):
     new_model = model(
         crystal.special_position_settings(
             crystal.symmetry.cell_equivalent_p1(self)))
     for pos in self._positions:
         site_symmetry = self.site_symmetry(pos.site)
         equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
         i = 0
         for site in equiv_sites.coordinates():
             i += 1
             new_model.add_position(
                 position(label=pos.label + "_%03d" % i, site=site))
     return new_model
 def expand_to_p1(self):
   new_model = model(
     crystal.special_position_settings(
       crystal.symmetry.cell_equivalent_p1(self)))
   for pos in self._positions:
     site_symmetry = self.site_symmetry(pos.site)
     equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
     i = 0
     for site in equiv_sites.coordinates():
       i += 1
       new_model.add_position(position(
         label=pos.label+"_%03d"%i,
         site=site))
   return new_model
Ejemplo n.º 14
0
def run():
    uc = (10, 12, 14, 90, 90, 90)
    cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 1")
    assert harker.planes_cartesian(cs).count() == 0
    assert harker.planes_cartesian(cs).min_distance((0, 0, 0)) is None
    cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 2 2 2")
    assert harker.planes_cartesian(cs).count() == 3
    assert ae(harker.planes_cartesian(cs).min_distance((0.123, 0.234, 0)), 0)
    assert ae(harker.planes_cartesian(cs).min_distance((0.123, 0, 0.234)), 0)
    assert ae(harker.planes_cartesian(cs).min_distance((0, 0.123, 0.234)), 0)
    assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.234, 0.345)), 1)
    assert ae(
        harker.planes_cartesian(cs).min_distance((0.234, 0.1, 0.345)), 1.2)
    assert ae(
        harker.planes_cartesian(cs).min_distance((0.234, 0.345, 0.1)), 1.4)
    assert ae(harker.planes_cartesian(cs).min_distance((0.2, 0.2, 0.1)), 1.4)
    assert ae(harker.planes_cartesian(cs).min_distance((0.2, 0.1, 0.1)), 1.2)
    assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 0.2)), 1)
    assert ae(harker.planes_cartesian(cs).min_distance((-0.2, 0.1, 0.1)), 1.2)
    assert ae(harker.planes_cartesian(cs).min_distance((0.2, -0.1, 0.1)), 1.2)
    assert ae(harker.planes_cartesian(cs).min_distance((0.2, 0.1, -0.1)), 1.2)
    assert ae(
        harker.planes_cartesian(cs).min_distance((-0.2, -0.1, -0.1)), 1.2)
    uc = (10, 10, 12, 90, 90, 120)
    cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 3")
    assert harker.planes_cartesian(cs).count() == 1
    assert ae(harker.planes_cartesian(cs).min_distance((0, 0, 0)), 0)
    assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 3.)), 4)
    assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 2.)), 6)
    cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 31")
    assert harker.planes_cartesian(cs).count() == 1
    assert ae(harker.planes_cartesian(cs).min_distance((0, 0, 0)), 4)
    assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 3.)), 0)
    assert ae(harker.planes_cartesian(cs).min_distance((0.1, 0.2, 1 / 2.)), 2)
    uc = (10, 10, 12, 90, 90, 90)
    cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4 2 2")
    assert harker.planes_cartesian(cs).count() == 5
    cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 41 2 2")
    assert harker.planes_cartesian(cs).count() == 6
    ps = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4/m m m")
    for x, d, t in (((0.1, 0.2, 0.3), 0.6, "1"), ((0.1, 0.2, 0.75), 0, "1"),
                    ((0.1, 0.0, 0.3), 0, "m")):
        ss = crystal.special_position_settings(ps).site_symmetry(x)
        assert ss.point_group_type() == t
        eq = sgtbx.sym_equiv_sites(ss)
        for x in eq.coordinates():
            assert ae(harker.planes_cartesian(cs).min_distance(x), d)
    print("OK")
Ejemplo n.º 15
0
def run():
  uc = (10,12,14,90,90,90)
  cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 1")
  assert harker.planes_cartesian(cs).count() == 0
  assert harker.planes_cartesian(cs).min_distance((0,0,0)) is None
  cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 2 2 2")
  assert harker.planes_cartesian(cs).count() == 3
  assert ae(harker.planes_cartesian(cs).min_distance((0.123,0.234,0)), 0)
  assert ae(harker.planes_cartesian(cs).min_distance((0.123,0,0.234)), 0)
  assert ae(harker.planes_cartesian(cs).min_distance((0,0.123,0.234)), 0)
  assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.234,0.345)), 1)
  assert ae(harker.planes_cartesian(cs).min_distance((0.234,0.1,0.345)), 1.2)
  assert ae(harker.planes_cartesian(cs).min_distance((0.234,0.345,0.1)), 1.4)
  assert ae(harker.planes_cartesian(cs).min_distance((0.2,0.2,0.1)), 1.4)
  assert ae(harker.planes_cartesian(cs).min_distance((0.2,0.1,0.1)), 1.2)
  assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,0.2)), 1)
  assert ae(harker.planes_cartesian(cs).min_distance((-0.2,0.1,0.1)), 1.2)
  assert ae(harker.planes_cartesian(cs).min_distance((0.2,-0.1,0.1)), 1.2)
  assert ae(harker.planes_cartesian(cs).min_distance((0.2,0.1,-0.1)), 1.2)
  assert ae(harker.planes_cartesian(cs).min_distance((-0.2,-0.1,-0.1)), 1.2)
  uc = (10,10,12,90,90,120)
  cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 3")
  assert harker.planes_cartesian(cs).count() == 1
  assert ae(harker.planes_cartesian(cs).min_distance((0,0,0)), 0)
  assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/3.)), 4)
  assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/2.)), 6)
  cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 31")
  assert harker.planes_cartesian(cs).count() == 1
  assert ae(harker.planes_cartesian(cs).min_distance((0,0,0)), 4)
  assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/3.)), 0)
  assert ae(harker.planes_cartesian(cs).min_distance((0.1,0.2,1/2.)), 2)
  uc = (10,10,12,90,90,90)
  cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4 2 2")
  assert harker.planes_cartesian(cs).count() == 5
  cs = crystal.symmetry(unit_cell=uc, space_group_symbol="P 41 2 2")
  assert harker.planes_cartesian(cs).count() == 6
  ps = crystal.symmetry(unit_cell=uc, space_group_symbol="P 4/m m m")
  for x,d,t in (((0.1,0.2,0.3),0.6,"1"),
                ((0.1,0.2,0.75),0,"1"),
                ((0.1,0.0,0.3),0,"m")):
    ss = crystal.special_position_settings(ps).site_symmetry(x)
    assert ss.point_group_type() == t
    eq = sgtbx.sym_equiv_sites(ss)
    for x in eq.coordinates():
      assert ae(harker.planes_cartesian(cs).min_distance(x), d)
  print "OK"
Ejemplo n.º 16
0
 def next_with_effective_resolution(self):
   while 1:
     peak_list_index = self._peak_list_index
     if (peak_list_index >= self._peak_list.size()): return None
     self._peak_list_index += 1
     if (self._is_processed is not None):
       if (self._is_processed[peak_list_index]): continue
       self._is_processed[peak_list_index] = True
     grid_index = self._peak_list.grid_indices(peak_list_index)
     grid_height = self._peak_list.grid_heights()[peak_list_index]
     site = self._peak_list.sites()[peak_list_index]
     height = self._peak_list.heights()[peak_list_index]
     site_symmetry = self._special_position_settings.site_symmetry(site)
     if (    self._general_positions_only
         and not site_symmetry.is_point_group_1()):
       continue
     site = site_symmetry.exact_site()
     equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
     keep = True
     if (self._sites.size() > 250):
       import warnings
       warnings.warn(
         message="This function should not be used for"
                 " processing a large number of peaks.",
         category=RuntimeWarning)
     for s in self._sites:
       dist = sgtbx.min_sym_equiv_distance_info(equiv_sites, s).dist()
       if (dist < self._min_cross_distance):
         keep = False
         break
     if (keep == True):
       if (    self._effective_resolution is not None
           and (   self._heights.size() == 0
                or height <   self._heights[0]
                            * self._significant_height_fraction)):
           site, height = self._accumulate_significant(
             site, height, site_symmetry, equiv_sites)
       self._peak_list_indices.append(peak_list_index)
       self._sites.append(site)
       self._heights.append(height)
       return cluster_site_info(
         peak_list_index=peak_list_index,
         grid_index=grid_index,
         grid_height=grid_height,
         site=site,
         height=height)
Ejemplo n.º 17
0
 def next_with_effective_resolution(self):
     while 1:
         peak_list_index = self._peak_list_index
         if (peak_list_index >= self._peak_list.size()): return None
         self._peak_list_index += 1
         if (self._is_processed is not None):
             if (self._is_processed[peak_list_index]): continue
             self._is_processed[peak_list_index] = True
         grid_index = self._peak_list.grid_indices(peak_list_index)
         grid_height = self._peak_list.grid_heights()[peak_list_index]
         site = self._peak_list.sites()[peak_list_index]
         height = self._peak_list.heights()[peak_list_index]
         site_symmetry = self._special_position_settings.site_symmetry(site)
         if (self._general_positions_only
                 and not site_symmetry.is_point_group_1()):
             continue
         site = site_symmetry.exact_site()
         equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
         keep = True
         if (self._sites.size() > 250):
             import warnings
             warnings.warn(message="This function should not be used for"
                           " processing a large number of peaks.",
                           category=RuntimeWarning)
         for s in self._sites:
             dist = sgtbx.min_sym_equiv_distance_info(equiv_sites, s).dist()
             if (dist < self._min_cross_distance):
                 keep = False
                 break
         if (keep == True):
             if (self._effective_resolution is not None and
                 (self._heights.size() == 0 or height <
                  self._heights[0] * self._significant_height_fraction)):
                 site, height = self._accumulate_significant(
                     site, height, site_symmetry, equiv_sites)
             self._peak_list_indices.append(peak_list_index)
             self._sites.append(site)
             self._heights.append(height)
             return cluster_site_info(peak_list_index=peak_list_index,
                                      grid_index=grid_index,
                                      grid_height=grid_height,
                                      site=site,
                                      height=height)
Ejemplo n.º 18
0
 def loop(self):
   for i_position in xrange(self.wyckoff_table.size()):
     site_symmetry_i = self.wyckoff_table.random_site_symmetry(
       special_position_settings=self.special_position_settings,
       i_position=i_position)
     equiv_sites_i = sgtbx.sym_equiv_sites(site_symmetry_i)
     for j_position in xrange(self.wyckoff_table.size()):
       for n_trial in xrange(self.max_trials_per_position):
         site_j = self.wyckoff_table.random_site_symmetry(
           special_position_settings=self.special_position_settings,
           i_position=j_position).exact_site()
         dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites_i, site_j)
         if (dist_info.dist() > self.min_cross_distance):
           structure = xray.structure(
             special_position_settings=self.special_position_settings,
             scatterers=flex.xray_scatterer(
              [xray.scatterer(scattering_type=self.scattering_type, site=site)
               for site in [site_symmetry_i.exact_site(), site_j]]))
           yield structure, dist_info.dist()
           break
Ejemplo n.º 19
0
def match_sites_by_symmetry(ref_sites,
                            query_sites,
                            unit_cell,
                            space_group,
                            cutoff=5):
    """Pair sites in query_sites to sites in ref_sites, allowing for symmetry"""

    pairings = numpy.zeros((len(ref_sites), len(query_sites)), dtype=numpy.int)

    for i_ref, ref in enumerate(ref_sites):
        ref_frac = unit_cell.fractionalize(ref)
        sym_sites_ref = sgtbx.sym_equiv_sites(space_group=space_group,
                                              unit_cell=unit_cell,
                                              original_site=ref_frac)

        for i_query, query in enumerate(query_sites):
            query_frac = unit_cell.fractionalize(query)
            min_dist = sgtbx.min_sym_equiv_distance_info(
                sym_sites_ref, query_frac).dist()
            if min_dist < cutoff:
                pairings[i_ref, i_query] = 1

    return pairings
Ejemplo n.º 20
0
 def structure_factors(self, d_min):
   print "WARNING: RESULTS NOT VERIFIED" # XXX
   miller_set = miller.build_set(
     crystal_symmetry=self,
     anomalous_flag=True, # XXX always True?
     d_min=d_min)
   f_calc = flex.complex_double()
   for h in miller_set.indices():
     fc = 0j
     for scatterer in self.scatterers():
       site_symmetry = self.site_symmetry(scatterer.site)
       equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
       sum_exp_j_two_pi_hx = 0j
       for i_symop,x in enumerate(equiv_sites.coordinates()):
         sum_hx = 0
         for i in xrange(3):
           sum_hx += h[i] * x[i]
         phase = 2 * math.pi * sum_hx
         exp_j_two_pi_hx = complex(math.cos(phase), math.sin(phase))
         if (scatterer.anisotropic_flag):
           r = self.space_group()(i_symop).r()
           hr = h
           dw = adptbx.debye_waller_factor_u_star(hr, scatterer.u_star)
           exp_j_two_pi_hx *= dw
         sum_exp_j_two_pi_hx += exp_j_two_pi_hx
       b_j = scatterer.scattering_info.bound_coh_scatt_length()
       fc_site = scatterer.weight() * b_j * sum_exp_j_two_pi_hx
       if (not scatterer.anisotropic_flag):
         d_star_sq = self.unit_cell().d_star_sq(h)
         dw = adptbx.debye_waller_factor_u_iso(d_star_sq/4, scatterer.u_iso)
         fc_site *= dw
       fc += fc_site
     f_calc.append(fc)
   return miller.array(
     miller_set=miller_set,
     data=f_calc)
Ejemplo n.º 21
0
 def show_patterson_peaks(self, min_relative_peak_height=0.1, show_at_least=3):
     print "Patterson peaks for %s:" % str(self.input.info())
     reciprocal_map = self.input
     if reciprocal_map.anomalous_flag():
         reciprocal_map = reciprocal_map.average_bijvoet_mates()
     patterson_map = reciprocal_map.patterson_map(symmetry_flags=maptbx.use_space_group_symmetry)
     patterson_map.apply_sigma_scaling()
     peak_list = patterson_map.tags().peak_search(
         map=patterson_map.real_map(), parameters=maptbx.peak_search_parameters()
     )
     max_height = peak_list.heights()[0]
     sym_equiv_origin = sgtbx.sym_equiv_sites(
         unit_cell=patterson_map.unit_cell(), space_group=patterson_map.space_group(), original_site=(0, 0, 0)
     )
     print "      Fractional coordinates     Height  Distance from origin"
     for i_peak in xrange(peak_list.size()):
         height = peak_list.heights()[i_peak]
         if height < max_height * min_relative_peak_height and i_peak > show_at_least:
             break
         site = peak_list.sites()[i_peak]
         dist_info = sgtbx.min_sym_equiv_distance_info(sym_equiv_origin, site)
         print "  %8.4f %8.4f %8.4f" % (dist_info.sym_op() * site),
         print "  %8.3f  %8.3f" % (height, dist_info.dist())
     print
Ejemplo n.º 22
0
 def structure_factors(self, d_min):
     print "WARNING: RESULTS NOT VERIFIED"  # XXX
     miller_set = miller.build_set(
         crystal_symmetry=self,
         anomalous_flag=True,  # XXX always True?
         d_min=d_min)
     f_calc = flex.complex_double()
     for h in miller_set.indices():
         fc = 0j
         for scatterer in self.scatterers():
             site_symmetry = self.site_symmetry(scatterer.site)
             equiv_sites = sgtbx.sym_equiv_sites(site_symmetry)
             sum_exp_j_two_pi_hx = 0j
             for i_symop, x in enumerate(equiv_sites.coordinates()):
                 sum_hx = 0
                 for i in xrange(3):
                     sum_hx += h[i] * x[i]
                 phase = 2 * math.pi * sum_hx
                 exp_j_two_pi_hx = complex(math.cos(phase), math.sin(phase))
                 if (scatterer.anisotropic_flag):
                     r = self.space_group()(i_symop).r()
                     hr = h
                     dw = adptbx.debye_waller_factor_u_star(
                         hr, scatterer.u_star)
                     exp_j_two_pi_hx *= dw
                 sum_exp_j_two_pi_hx += exp_j_two_pi_hx
             b_j = scatterer.scattering_info.bound_coh_scatt_length()
             fc_site = scatterer.weight() * b_j * sum_exp_j_two_pi_hx
             if (not scatterer.anisotropic_flag):
                 d_star_sq = self.unit_cell().d_star_sq(h)
                 dw = adptbx.debye_waller_factor_u_iso(
                     d_star_sq / 4, scatterer.u_iso)
                 fc_site *= dw
             fc += fc_site
         f_calc.append(fc)
     return miller.array(miller_set=miller_set, data=f_calc)
Ejemplo n.º 23
0
def run_call_back(flags, space_group_info):
  verbose = flags.Verbose
  if (flags.StaticModels):
    model1 = (test_model()
      .add_random_positions(2, "A")
      .shuffle_positions()
      .random_symmetry_mates()
      .apply_random_eucl_op()
      )
    model2 = (test_model()
      .add_random_positions(3, "B")
      .shuffle_positions()
      .random_symmetry_mates()
      .apply_random_eucl_op()
      .shake_positions()
      .random_hand()
      )
    for i in (0,1):
      m1 = model1
      if (i): m1 = model1.transform_to_reference_setting().reset_cb_op()
      for j in (0,1):
        m2 = model2
        if (j): m2 = model2.transform_to_reference_setting().reset_cb_op()
        if (0 or verbose):
          m1.show("Model1(%d)" % (i,))
          m2.show("Model2(%d)" % (j,))
        model_matches = emma.model_matches(m1, m2, rms_penalty_per_site=0)
        analyze_refined_matches(m1, m2, model_matches.refined_matches, verbose)
    return False
  model_core = test_model(space_group_info)
  model1 = (model_core
    .add_random_positions(2, "A")
    )
  model2 = (model_core
    .add_random_positions(3, "B")
    .shuffle_positions()
    .random_symmetry_mates()
    .apply_random_eucl_op()
    .shake_positions()
    .random_hand()
    )
  if (0 or verbose):
    model_core.show("Core")
    model1.show("Model1")
    model2.show("Model2")
  model_matches = emma.model_matches(model1, model2, rms_penalty_per_site=0)
  analyze_refined_matches(
    model1, model2, model_matches.refined_matches, verbose)
  assert model_matches.consensus_model().size() >= model1.size()-2
  assert model_matches.consensus_model(i_model=2).size() >= model2.size()-3
  model1.expand_to_p1()
  model2.as_xray_structure()
  for i1,i2,m1,m2 in [(1,2,model1,model2),(2,1,model2,model1)]:
    m2_t = model_matches.transform_model(i_model=i2)
    assert m1.unit_cell().is_similar_to(m2_t.unit_cell())
    assert m1.space_group() == m2_t.space_group()
    for pair in model_matches.refined_matches[0].pairs:
      site1 = m1.positions()[pair[i1-1]].site
      site2 = m2_t.positions()[pair[i2-1]].site
      equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1))
      dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites1, site2)
      assert dist_info.dist() < model_matches.tolerance + 1.e-6
      site2_closest = dist_info.sym_op() * site2
      assert approx_equal(
        m1.unit_cell().distance(site1, site2_closest),
        dist_info.dist())
    if (i1 == 1):
      singles = model_matches.refined_matches[0].singles2
    else:
      singles = model_matches.refined_matches[0].singles1
    for i_site2 in singles:
      site2 = m2_t.positions()[i_site2].site
      for i_site1 in xrange(len(model1.positions())):
        site1 = m1.positions()[i_site1].site
        equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1))
        dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites1, site2)
        if (dist_info.dist() < model_matches.tolerance - 1.e-6):
          ok = False
          for pair in model_matches.refined_matches[0].pairs:
            if (pair[i1-1] == i_site1):
              ok = True
          assert ok
Ejemplo n.º 24
0
def run_call_back(flags, space_group_info):
    verbose = flags.Verbose
    if (flags.StaticModels):
        model1 = (test_model().add_random_positions(2, "A").shuffle_positions(
        ).random_symmetry_mates().apply_random_eucl_op())
        model2 = (test_model().add_random_positions(
            3, "B").shuffle_positions().random_symmetry_mates().
                  apply_random_eucl_op().shake_positions().random_hand())
        for i in (0, 1):
            m1 = model1
            if (i): m1 = model1.transform_to_reference_setting().reset_cb_op()
            for j in (0, 1):
                m2 = model2
                if (j):
                    m2 = model2.transform_to_reference_setting().reset_cb_op()
                if (0 or verbose):
                    m1.show("Model1(%d)" % (i, ))
                    m2.show("Model2(%d)" % (j, ))
                model_matches = emma.model_matches(m1,
                                                   m2,
                                                   rms_penalty_per_site=0)
                analyze_refined_matches(m1, m2, model_matches.refined_matches,
                                        verbose)
        return False
    model_core = test_model(space_group_info)
    model1 = (model_core.add_random_positions(2, "A"))
    model2 = (model_core.add_random_positions(
        3, "B").shuffle_positions().random_symmetry_mates().
              apply_random_eucl_op().shake_positions().random_hand())
    if (0 or verbose):
        model_core.show("Core")
        model1.show("Model1")
        model2.show("Model2")
    model_matches = emma.model_matches(model1, model2, rms_penalty_per_site=0)
    analyze_refined_matches(model1, model2, model_matches.refined_matches,
                            verbose)
    assert model_matches.consensus_model().size() >= model1.size() - 2
    assert model_matches.consensus_model(i_model=2).size() >= model2.size() - 3
    model1.expand_to_p1()
    model2.as_xray_structure()
    for i1, i2, m1, m2 in [(1, 2, model1, model2), (2, 1, model2, model1)]:
        m2_t = model_matches.transform_model(i_model=i2)
        assert m1.unit_cell().is_similar_to(m2_t.unit_cell())
        assert m1.space_group() == m2_t.space_group()
        for pair in model_matches.refined_matches[0].pairs:
            site1 = m1.positions()[pair[i1 - 1]].site
            site2 = m2_t.positions()[pair[i2 - 1]].site
            equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1))
            dist_info = sgtbx.min_sym_equiv_distance_info(equiv_sites1, site2)
            assert dist_info.dist() < model_matches.tolerance + 1.e-6
            site2_closest = dist_info.sym_op() * site2
            assert approx_equal(m1.unit_cell().distance(site1, site2_closest),
                                dist_info.dist())
        if (i1 == 1):
            singles = model_matches.refined_matches[0].singles2
        else:
            singles = model_matches.refined_matches[0].singles1
        for i_site2 in singles:
            site2 = m2_t.positions()[i_site2].site
            for i_site1 in range(len(model1.positions())):
                site1 = m1.positions()[i_site1].site
                equiv_sites1 = sgtbx.sym_equiv_sites(m1.site_symmetry(site1))
                dist_info = sgtbx.min_sym_equiv_distance_info(
                    equiv_sites1, site2)
                if (dist_info.dist() < model_matches.tolerance - 1.e-6):
                    ok = False
                    for pair in model_matches.refined_matches[0].pairs:
                        if (pair[i1 - 1] == i_site1):
                            ok = True
                    assert ok
def check_with_grid_tags(inp_symmetry, symmetry_flags,
                         sites_cart, point_distance,
                         strictly_inside, flag_write_pdb, verbose):
  cb_op_inp_ref = inp_symmetry.change_of_basis_op_to_reference_setting()
  if (verbose):
    print "cb_op_inp_ref.c():", cb_op_inp_ref.c()
  ref_symmetry = inp_symmetry.change_basis(cb_op_inp_ref)
  search_symmetry = sgtbx.search_symmetry(
    flags=symmetry_flags,
    space_group_type=ref_symmetry.space_group_info().type(),
    seminvariant=ref_symmetry.space_group_info().structure_seminvariants())
  assert search_symmetry.continuous_shifts_are_principal()
  continuous_shift_flags = search_symmetry.continuous_shift_flags()
  if (flag_write_pdb):
    tag_sites_frac = flex.vec3_double()
  else:
    tag_sites_frac = None
  if (strictly_inside):
    inp_tags = inp_symmetry.gridding(
      step=point_distance*.7,
      symmetry_flags=symmetry_flags).tags()
    if (tag_sites_frac is not None):
      for point in flex.nested_loop(inp_tags.n_real()):
        if (inp_tags.tags().tag_array()[point] < 0):
          point_frac_inp=[float(n)/d for n,d in zip(point, inp_tags.n_real())]
          tag_sites_frac.append(point_frac_inp)
    if (inp_tags.tags().n_independent() < sites_cart.size()):
      print "FAIL:", inp_symmetry.space_group_info(), \
                     inp_tags.tags().n_independent(), sites_cart.size()
      raise AssertionError
  else:
    inp_tags = inp_symmetry.gridding(
      step=point_distance/2.,
      symmetry_flags=symmetry_flags).tags()
    sites_frac_inp = inp_symmetry.unit_cell().fractionalize(
      sites_cart=sites_cart)
    rt = cb_op_inp_ref.c().as_double_array()
    sites_frac_ref = rt[:9] * sites_frac_inp
    sites_frac_ref += rt[9:]
    max_distance = 2 * ((.5 * math.sqrt(3) * point_distance) * 2/3.)
    if (verbose):
      print "max_distance:", max_distance
    for point in flex.nested_loop(inp_tags.n_real()):
      if (inp_tags.tags().tag_array()[point] < 0):
        point_frac_inp = [float(n)/d for n,d in zip(point, inp_tags.n_real())]
        if (tag_sites_frac is not None):
          tag_sites_frac.append(point_frac_inp)
        point_frac_ref = cb_op_inp_ref.c() * point_frac_inp
        equiv_points = sgtbx.sym_equiv_sites(
          unit_cell=ref_symmetry.unit_cell(),
          space_group=search_symmetry.subgroup(),
          original_site=point_frac_ref,
          minimum_distance=2.e-6,
          tolerance=1.e-6)
        min_dist = sgtbx.min_sym_equiv_distance_info(
          reference_sites=equiv_points,
          others=sites_frac_ref,
          principal_continuous_allowed_origin_shift_flags
            =continuous_shift_flags).dist()
        if (min_dist > max_distance):
          print "FAIL:", inp_symmetry.space_group_info(), \
                         point_frac_ref, min_dist
          raise AssertionError
    if (inp_tags.tags().n_independent()+10 < sites_cart.size()):
      print "FAIL:", inp_symmetry.space_group_info(), \
                     inp_tags.tags().n_independent(), sites_cart.size()
      raise AssertionError
  if (tag_sites_frac is not None):
    dump_pdb(
      file_name="tag_sites.pdb",
      crystal_symmetry=inp_symmetry,
      sites_cart=inp_symmetry.unit_cell().orthogonalize(
        sites_frac=tag_sites_frac))
Ejemplo n.º 26
0
def check_with_grid_tags(inp_symmetry, symmetry_flags, sites_cart,
                         point_distance, strictly_inside, flag_write_pdb,
                         verbose):
    cb_op_inp_ref = inp_symmetry.change_of_basis_op_to_reference_setting()
    if (verbose):
        print("cb_op_inp_ref.c():", cb_op_inp_ref.c())
    ref_symmetry = inp_symmetry.change_basis(cb_op_inp_ref)
    search_symmetry = sgtbx.search_symmetry(
        flags=symmetry_flags,
        space_group_type=ref_symmetry.space_group_info().type(),
        seminvariant=ref_symmetry.space_group_info().structure_seminvariants())
    assert search_symmetry.continuous_shifts_are_principal()
    continuous_shift_flags = search_symmetry.continuous_shift_flags()
    if (flag_write_pdb):
        tag_sites_frac = flex.vec3_double()
    else:
        tag_sites_frac = None
    if (strictly_inside):
        inp_tags = inp_symmetry.gridding(step=point_distance * .7,
                                         symmetry_flags=symmetry_flags).tags()
        if (tag_sites_frac is not None):
            for point in flex.nested_loop(inp_tags.n_real()):
                if (inp_tags.tags().tag_array()[point] < 0):
                    point_frac_inp = [
                        float(n) / d for n, d in zip(point, inp_tags.n_real())
                    ]
                    tag_sites_frac.append(point_frac_inp)
        if (inp_tags.tags().n_independent() < sites_cart.size()):
            print("FAIL:", inp_symmetry.space_group_info(), \
                           inp_tags.tags().n_independent(), sites_cart.size())
            raise AssertionError
    else:
        inp_tags = inp_symmetry.gridding(step=point_distance / 2.,
                                         symmetry_flags=symmetry_flags).tags()
        sites_frac_inp = inp_symmetry.unit_cell().fractionalize(
            sites_cart=sites_cart)
        rt = cb_op_inp_ref.c().as_double_array()
        sites_frac_ref = rt[:9] * sites_frac_inp
        sites_frac_ref += rt[9:]
        max_distance = 2 * ((.5 * math.sqrt(3) * point_distance) * 2 / 3.)
        if (verbose):
            print("max_distance:", max_distance)
        for point in flex.nested_loop(inp_tags.n_real()):
            if (inp_tags.tags().tag_array()[point] < 0):
                point_frac_inp = [
                    float(n) / d for n, d in zip(point, inp_tags.n_real())
                ]
                if (tag_sites_frac is not None):
                    tag_sites_frac.append(point_frac_inp)
                point_frac_ref = cb_op_inp_ref.c() * point_frac_inp
                equiv_points = sgtbx.sym_equiv_sites(
                    unit_cell=ref_symmetry.unit_cell(),
                    space_group=search_symmetry.subgroup(),
                    original_site=point_frac_ref,
                    minimum_distance=2.e-6,
                    tolerance=1.e-6)
                min_dist = sgtbx.min_sym_equiv_distance_info(
                    reference_sites=equiv_points,
                    others=sites_frac_ref,
                    principal_continuous_allowed_origin_shift_flags=
                    continuous_shift_flags).dist()
                if (min_dist > max_distance):
                    print("FAIL:", inp_symmetry.space_group_info(), \
                                   point_frac_ref, min_dist)
                    raise AssertionError
        if (inp_tags.tags().n_independent() + 10 < sites_cart.size()):
            print("FAIL:", inp_symmetry.space_group_info(), \
                           inp_tags.tags().n_independent(), sites_cart.size())
            raise AssertionError
    if (tag_sites_frac is not None):
        dump_pdb(file_name="tag_sites.pdb",
                 crystal_symmetry=inp_symmetry,
                 sites_cart=inp_symmetry.unit_cell().orthogonalize(
                     sites_frac=tag_sites_frac))