def exercise():
  t = covalent_radii.table("sI")
  assert t.label() == "Si"
  assert approx_equal(t.radius(), 1.11)
  assert approx_equal(t.esd(), 0.02)
  n = 0
  for t in covalent_radii.table_iterator():
    n += 1
    if (n == 1):
      assert t.label() == "H"
    elif (n == 97):
      assert t.label() == "Cm"
    u = covalent_radii.table(t.label())
    assert u.label() == t.label()
  assert n == 97
示例#2
0
def exercise():
    t = covalent_radii.table("sI")
    assert t.label() == "Si"
    assert approx_equal(t.radius(), 1.11)
    assert approx_equal(t.esd(), 0.02)
    n = 0
    for t in covalent_radii.table_iterator():
        n += 1
        if (n == 1):
            assert t.label() == "H"
        elif (n == 97):
            assert t.label() == "Cm"
        u = covalent_radii.table(t.label())
        assert u.label() == t.label()
    assert n == 97
示例#3
0
 def __init__(self,
              structure,
              **kwds):
   from cctbx.eltbx import covalent_radii
   self.structure = structure
   libtbx.adopt_optional_init_args(self, kwds)
   max_r = 0
   for st in structure.scattering_type_registry().type_index_pairs_as_dict():
     r = 0
     if self.radii:
       r = self.radii.get(st, 0)
     if r == 0:
       r = covalent_radii.table(st).radius()
     if r > max_r: max_r = r
   self.structure = structure
   self.buffer_thickness = 2*max_r + self.covalent_bond_tolerance
   asu_mappings = structure.asu_mappings(
     buffer_thickness=self.buffer_thickness)
   self._pair_asu_table = crystal.pair_asu_table(asu_mappings)
   self._pair_asu_table_needs_updating = False
   if self.radii is None:
     self.radii = {}
   self._pair_asu_table.add_covalent_pairs(
     structure.scattering_types(),
     conformer_indices=self.conformer_indices,
     sym_excl_indices=self.sym_excl_indices,
     tolerance=self.covalent_bond_tolerance,
     radii=self.radii
   )
   self.pair_sym_table = self.pair_asu_table.extract_pair_sym_table()
示例#4
0
文件: utils.py 项目: dials/cctbx
 def __init__(self, structure, **kwds):
     from cctbx.eltbx import covalent_radii
     self.structure = structure
     libtbx.adopt_optional_init_args(self, kwds)
     max_r = 0
     for st in structure.scattering_type_registry(
     ).type_index_pairs_as_dict():
         r = 0
         if self.radii:
             r = self.radii.get(st, 0)
         if r == 0:
             r = covalent_radii.table(st).radius()
         if r > max_r: max_r = r
     self.structure = structure
     self.buffer_thickness = 2 * max_r + self.covalent_bond_tolerance
     asu_mappings = structure.asu_mappings(
         buffer_thickness=self.buffer_thickness)
     self._pair_asu_table = crystal.pair_asu_table(asu_mappings)
     self._pair_asu_table_needs_updating = False
     if self.radii is None:
         self.radii = {}
     self._pair_asu_table.add_covalent_pairs(
         structure.scattering_types(),
         conformer_indices=self.conformer_indices,
         sym_excl_indices=self.sym_excl_indices,
         tolerance=self.covalent_bond_tolerance,
         radii=self.radii)
     self.pair_sym_table = self.pair_asu_table.extract_pair_sym_table()
示例#5
0
def exercise_hbond_as_cif_loop():
  xs = sucrose()
  for sc in xs.scatterers():
    sc.flags.set_grad_site(True)
  radii = [
    covalent_radii.table(elt).radius() for elt in
    xs.scattering_type_registry().type_index_pairs_as_dict() ]
  asu_mappings = xs.asu_mappings(
    buffer_thickness=2*max(radii) + 0.5)
  pair_asu_table = crystal.pair_asu_table(asu_mappings)
  pair_asu_table.add_covalent_pairs(
    xs.scattering_types(),
    tolerance=0.5)
  hbonds = [
    geometry.hbond(1,5, sgtbx.rt_mx('-X,0.5+Y,2-Z')),
    geometry.hbond(5,14, sgtbx.rt_mx('-X,-0.5+Y,1-Z')),
    geometry.hbond(7,10, sgtbx.rt_mx('1+X,+Y,+Z')),
    geometry.hbond(10,0),
    geometry.hbond(12,14, sgtbx.rt_mx('-1-X,0.5+Y,1-Z')),
    geometry.hbond(14,12, sgtbx.rt_mx('-1-X,-0.5+Y,1-Z')),
    geometry.hbond(16,7)
  ]
  loop = geometry.hbonds_as_cif_loop(
    hbonds, pair_asu_table, xs.scatterers().extract_labels(),
    sites_frac=xs.sites_frac()).loop
  s = StringIO()
  print >> s, loop
  assert not show_diff(s.getvalue(), """\
loop_
  _geom_hbond_atom_site_label_D
  _geom_hbond_atom_site_label_H
  _geom_hbond_atom_site_label_A
  _geom_hbond_distance_DH
  _geom_hbond_distance_HA
  _geom_hbond_distance_DA
  _geom_hbond_angle_DHA
  _geom_hbond_site_symmetry_A
  O2   H2   O4  0.8200  2.0636  2.8635  165.0  2_557
  O4   H4   O9  0.8200  2.0559  2.8736  174.9  2_546
  O5   H5   O7  0.8200  2.0496  2.8589  169.0  1_655
  O7   H7   O1  0.8200  2.0573  2.8617  166.8  .
  O8   H8   O9  0.8200  2.1407  2.8943  152.8  2_456
  O9   H9   O8  0.8200  2.1031  2.8943  162.1  2_446
  O10  H10  O5  0.8200  2.0167  2.7979  159.1  .

""")
  # with a covariance matrix
  flex.set_random_seed(1)
  vcv_matrix = matrix.diag(
    flex.random_double(size=xs.n_parameters(), factor=1e-5))\
             .as_flex_double_matrix().matrix_symmetric_as_packed_u()
  loop = geometry.hbonds_as_cif_loop(
    hbonds, pair_asu_table, xs.scatterers().extract_labels(),
    sites_frac=xs.sites_frac(),
    covariance_matrix=vcv_matrix,
    parameter_map=xs.parameter_map()).loop
  s = StringIO()
  print >> s, loop
  assert not show_diff(s.getvalue(), """\
loop_
  _geom_hbond_atom_site_label_D
  _geom_hbond_atom_site_label_H
  _geom_hbond_atom_site_label_A
  _geom_hbond_distance_DH
  _geom_hbond_distance_HA
  _geom_hbond_distance_DA
  _geom_hbond_angle_DHA
  _geom_hbond_site_symmetry_A
  O2   H2   O4  0.82(3)  2.06(3)    2.86(3)  165.0(18)  2_557
  O4   H4   O9  0.82(4)  2.06(4)    2.87(4)     175(2)  2_546
  O5   H5   O7  0.82(2)  2.05(2)  2.859(19)  169.0(18)  1_655
  O7   H7   O1  0.82(2)  2.06(2)    2.86(2)     167(2)  .
  O8   H8   O9  0.82(3)  2.14(3)    2.89(3)     153(3)  2_456
  O9   H9   O8  0.82(3)  2.10(3)    2.89(3)     162(2)  2_446
  O10  H10  O5  0.82(3)  2.02(3)    2.80(3)     159(3)  .

""")
  cell_vcv = flex.pow2(matrix.diag(flex.random_double(size=6,factor=1e-1))\
                       .as_flex_double_matrix().matrix_symmetric_as_packed_u())
  loop = geometry.hbonds_as_cif_loop(
    hbonds, pair_asu_table, xs.scatterers().extract_labels(),
    sites_frac=xs.sites_frac(),
    covariance_matrix=vcv_matrix,
    cell_covariance_matrix=cell_vcv,
    parameter_map=xs.parameter_map()).loop
  s = StringIO()
  print >> s, loop
  assert not show_diff(s.getvalue(), """\
loop_
  _geom_hbond_atom_site_label_D
  _geom_hbond_atom_site_label_H
  _geom_hbond_atom_site_label_A
  _geom_hbond_distance_DH
  _geom_hbond_distance_HA
  _geom_hbond_distance_DA
  _geom_hbond_angle_DHA
  _geom_hbond_site_symmetry_A
  O2   H2   O4  0.82(3)  2.06(4)  2.86(4)  165.0(18)  2_557
  O4   H4   O9  0.82(4)  2.06(4)  2.87(4)     175(2)  2_546
  O5   H5   O7  0.82(2)  2.05(2)  2.86(2)  169.0(18)  1_655
  O7   H7   O1  0.82(2)  2.06(3)  2.86(3)     167(2)  .
  O8   H8   O9  0.82(3)  2.14(4)  2.89(4)     153(3)  2_456
  O9   H9   O8  0.82(3)  2.10(3)  2.89(4)     162(2)  2_446
  O10  H10  O5  0.82(3)  2.02(3)  2.80(3)     159(3)  .

""")
  def __init__(self, xray_structure, name='??',
               **kwds):
    super(xray_structure_viewer, self).__init__(
      unit_cell=xray_structure.unit_cell(),
      orthographic=True,
      light_position=(-1, 1, 1, 0),
      **kwds)
    assert self.bonding in ("covalent", "all")
    assert self.bonding != "all" or self.distance_cutoff is not None
    self.xray_structure = xs = xray_structure
    self.setWindowTitle("%s in %s" % (name,
                                      xs.space_group().type().hall_symbol()))
    sites_frac = xs.sites_frac()
    self.set_extent(sites_frac.min(), sites_frac.max())
    self.is_unit_cell_shown = False

    sites_cart = self.sites_cart = xs.sites_cart()
    thermal_tensors = xs.extract_u_cart_plus_u_iso()
    self.ellipsoid_to_sphere_transforms = {}
    self.scatterer_indices = flex.std_string()
    self.scatterer_labels = flex.std_string()
    for i, (sc, site, u_cart) in enumerate(itertools.izip(xs.scatterers(),
                                                          sites_cart,
                                                          thermal_tensors)):
      t = quadrics.ellipsoid_to_sphere_transform(site, u_cart)
      self.ellipsoid_to_sphere_transforms.setdefault(
        sc.element_symbol(),
        quadrics.shared_ellipsoid_to_sphere_transforms()).append(t)
      self.scatterer_indices.append("# %i" % i)
      self.scatterer_labels.append(sc.label)
    self.labels = None
    self.label_font = QtGui.QFont("Arial Black", pointSize=18)

    if self.bonding == "covalent":
      radii = [
        covalent_radii.table(elt).radius()
        for elt in xs.scattering_type_registry().type_index_pairs_as_dict() ]
      buffer_thickness = 2*max(radii) + self.covalent_bond_tolerance
      asu_mappings = xs.asu_mappings(buffer_thickness=buffer_thickness)
      bond_table = crystal.pair_asu_table(asu_mappings)
      bond_table.add_covalent_pairs(xs.scattering_types(),
                                    tolerance=self.covalent_bond_tolerance)
    elif self.bonding == "all":
      asu_mappings = xs.asu_mappings(buffer_thickness=self.distance_cutoff)
      bond_table = crystal.pair_asu_table(asu_mappings)
      bond_table.add_all_pairs(self.distance_cutoff)

    pair_sym_table = bond_table.extract_pair_sym_table(
      all_interactions_from_inside_asu=True)
    self.bonds = flex.vec3_double()
    self.bonds.reserve(len(xs.scatterers()))
    uc = self.xray_structure.unit_cell()
    frac = mat.rec(uc.fractionalization_matrix(), (3,3))
    inv_frac = frac.inverse()
    site_symms = xs.site_symmetry_table()
    scatt = self.xray_structure.scatterers()
    for i, neighbours in enumerate(pair_sym_table):
      x0 = sites_cart[i]
      sc0 = scatt[i]
      for j, ops in neighbours.items():
        sc1 = scatt[j]
        if sc0.scattering_type == 'H' and sc1.scattering_type == 'H':
          continue
        for op in ops:
          if op.is_unit_mx():
            x1 = sites_cart[j]
          else:
            x1 = uc.orthogonalize(op*sites_frac[j])
            op_cart = inv_frac*mat.rec(op.r().as_double(), (3,3))*frac
            u1 = (op_cart
                  *mat.sym(sym_mat3=thermal_tensors[j])
                  *op_cart.transpose())
            t = quadrics.ellipsoid_to_sphere_transform(x1, u1.as_sym_mat3())
            self.ellipsoid_to_sphere_transforms[sc1.element_symbol()].append(t)
            self.sites_cart.append(x1)
            op_lbl = (" [%s]" % op).lower()
            self.scatterer_indices.append("# %i%s" % (j, op_lbl))
            self.scatterer_labels.append("%s%s" % (sc1.label, op_lbl))
          self.bonds.append(x0)
          self.bonds.append(x1)
示例#7
0
def exercise_hbond_as_cif_loop():
    xs = sucrose()
    for sc in xs.scatterers():
        sc.flags.set_grad_site(True)
    radii = [
        covalent_radii.table(elt).radius()
        for elt in xs.scattering_type_registry().type_index_pairs_as_dict()
    ]
    asu_mappings = xs.asu_mappings(buffer_thickness=2 * max(radii) + 0.5)
    pair_asu_table = crystal.pair_asu_table(asu_mappings)
    pair_asu_table.add_covalent_pairs(xs.scattering_types(), tolerance=0.5)
    hbonds = [
        geometry.hbond(1, 5, sgtbx.rt_mx('-X,0.5+Y,2-Z')),
        geometry.hbond(5, 14, sgtbx.rt_mx('-X,-0.5+Y,1-Z')),
        geometry.hbond(7, 10, sgtbx.rt_mx('1+X,+Y,+Z')),
        geometry.hbond(10, 0),
        geometry.hbond(12, 14, sgtbx.rt_mx('-1-X,0.5+Y,1-Z')),
        geometry.hbond(14, 12, sgtbx.rt_mx('-1-X,-0.5+Y,1-Z')),
        geometry.hbond(16, 7)
    ]
    loop = geometry.hbonds_as_cif_loop(hbonds,
                                       pair_asu_table,
                                       xs.scatterers().extract_labels(),
                                       sites_frac=xs.sites_frac()).loop
    s = StringIO()
    print >> s, loop
    assert not show_diff(
        s.getvalue(), """\
loop_
  _geom_hbond_atom_site_label_D
  _geom_hbond_atom_site_label_H
  _geom_hbond_atom_site_label_A
  _geom_hbond_distance_DH
  _geom_hbond_distance_HA
  _geom_hbond_distance_DA
  _geom_hbond_angle_DHA
  _geom_hbond_site_symmetry_A
  O2   H2   O4  0.8200  2.0636  2.8635  165.0  2_557
  O4   H4   O9  0.8200  2.0559  2.8736  174.9  2_546
  O5   H5   O7  0.8200  2.0496  2.8589  169.0  1_655
  O7   H7   O1  0.8200  2.0573  2.8617  166.8  .
  O8   H8   O9  0.8200  2.1407  2.8943  152.8  2_456
  O9   H9   O8  0.8200  2.1031  2.8943  162.1  2_446
  O10  H10  O5  0.8200  2.0167  2.7979  159.1  .

""")
    # with a covariance matrix
    flex.set_random_seed(1)
    vcv_matrix = matrix.diag(
      flex.random_double(size=xs.n_parameters(), factor=1e-5))\
               .as_flex_double_matrix().matrix_symmetric_as_packed_u()
    loop = geometry.hbonds_as_cif_loop(hbonds,
                                       pair_asu_table,
                                       xs.scatterers().extract_labels(),
                                       sites_frac=xs.sites_frac(),
                                       covariance_matrix=vcv_matrix,
                                       parameter_map=xs.parameter_map()).loop
    s = StringIO()
    print >> s, loop
    assert not show_diff(
        s.getvalue(), """\
loop_
  _geom_hbond_atom_site_label_D
  _geom_hbond_atom_site_label_H
  _geom_hbond_atom_site_label_A
  _geom_hbond_distance_DH
  _geom_hbond_distance_HA
  _geom_hbond_distance_DA
  _geom_hbond_angle_DHA
  _geom_hbond_site_symmetry_A
  O2   H2   O4  0.82(3)  2.06(3)    2.86(3)  165.0(18)  2_557
  O4   H4   O9  0.82(4)  2.06(4)    2.87(4)     175(2)  2_546
  O5   H5   O7  0.82(2)  2.05(2)  2.859(19)  169.0(18)  1_655
  O7   H7   O1  0.82(2)  2.06(2)    2.86(2)     167(2)  .
  O8   H8   O9  0.82(3)  2.14(3)    2.89(3)     153(3)  2_456
  O9   H9   O8  0.82(3)  2.10(3)    2.89(3)     162(2)  2_446
  O10  H10  O5  0.82(3)  2.02(3)    2.80(3)     159(3)  .

""")
    cell_vcv = flex.pow2(matrix.diag(flex.random_double(size=6,factor=1e-1))\
                         .as_flex_double_matrix().matrix_symmetric_as_packed_u())
    loop = geometry.hbonds_as_cif_loop(hbonds,
                                       pair_asu_table,
                                       xs.scatterers().extract_labels(),
                                       sites_frac=xs.sites_frac(),
                                       covariance_matrix=vcv_matrix,
                                       cell_covariance_matrix=cell_vcv,
                                       parameter_map=xs.parameter_map()).loop
    s = StringIO()
    print >> s, loop
    assert not show_diff(
        s.getvalue(), """\
loop_
  _geom_hbond_atom_site_label_D
  _geom_hbond_atom_site_label_H
  _geom_hbond_atom_site_label_A
  _geom_hbond_distance_DH
  _geom_hbond_distance_HA
  _geom_hbond_distance_DA
  _geom_hbond_angle_DHA
  _geom_hbond_site_symmetry_A
  O2   H2   O4  0.82(3)  2.06(4)  2.86(4)  165.0(18)  2_557
  O4   H4   O9  0.82(4)  2.06(4)  2.87(4)     175(2)  2_546
  O5   H5   O7  0.82(2)  2.05(2)  2.86(2)  169.0(18)  1_655
  O7   H7   O1  0.82(2)  2.06(3)  2.86(3)     167(2)  .
  O8   H8   O9  0.82(3)  2.14(4)  2.89(4)     153(3)  2_456
  O9   H9   O8  0.82(3)  2.10(3)  2.89(4)     162(2)  2_446
  O10  H10  O5  0.82(3)  2.02(3)  2.80(3)     159(3)  .

""")
    def __init__(self, xray_structure, name='??', **kwds):
        super(xray_structure_viewer,
              self).__init__(unit_cell=xray_structure.unit_cell(),
                             orthographic=True,
                             light_position=(-1, 1, 1, 0),
                             **kwds)
        assert self.bonding in ("covalent", "all")
        assert self.bonding != "all" or self.distance_cutoff is not None
        self.xray_structure = xs = xray_structure
        self.setWindowTitle("%s in %s" %
                            (name, xs.space_group().type().hall_symbol()))
        sites_frac = xs.sites_frac()
        self.set_extent(sites_frac.min(), sites_frac.max())
        self.is_unit_cell_shown = False

        sites_cart = self.sites_cart = xs.sites_cart()
        thermal_tensors = xs.extract_u_cart_plus_u_iso()
        self.ellipsoid_to_sphere_transforms = {}
        self.scatterer_indices = flex.std_string()
        self.scatterer_labels = flex.std_string()
        for i, (sc, site, u_cart) in enumerate(
                zip(xs.scatterers(), sites_cart, thermal_tensors)):
            t = quadrics.ellipsoid_to_sphere_transform(site, u_cart)
            self.ellipsoid_to_sphere_transforms.setdefault(
                sc.element_symbol(),
                quadrics.shared_ellipsoid_to_sphere_transforms()).append(t)
            self.scatterer_indices.append("# %i" % i)
            self.scatterer_labels.append(sc.label)
        self.labels = None
        self.label_font = QtGui.QFont("Arial Black", pointSize=18)

        if self.bonding == "covalent":
            radii = [
                covalent_radii.table(elt).radius() for elt in
                xs.scattering_type_registry().type_index_pairs_as_dict()
            ]
            buffer_thickness = 2 * max(radii) + self.covalent_bond_tolerance
            asu_mappings = xs.asu_mappings(buffer_thickness=buffer_thickness)
            bond_table = crystal.pair_asu_table(asu_mappings)
            bond_table.add_covalent_pairs(
                xs.scattering_types(), tolerance=self.covalent_bond_tolerance)
        elif self.bonding == "all":
            asu_mappings = xs.asu_mappings(
                buffer_thickness=self.distance_cutoff)
            bond_table = crystal.pair_asu_table(asu_mappings)
            bond_table.add_all_pairs(self.distance_cutoff)

        pair_sym_table = bond_table.extract_pair_sym_table(
            all_interactions_from_inside_asu=True)
        self.bonds = flex.vec3_double()
        self.bonds.reserve(len(xs.scatterers()))
        uc = self.xray_structure.unit_cell()
        frac = mat.rec(uc.fractionalization_matrix(), (3, 3))
        inv_frac = frac.inverse()
        site_symms = xs.site_symmetry_table()
        scatt = self.xray_structure.scatterers()
        for i, neighbours in enumerate(pair_sym_table):
            x0 = sites_cart[i]
            sc0 = scatt[i]
            for j, ops in neighbours.items():
                sc1 = scatt[j]
                if sc0.scattering_type == 'H' and sc1.scattering_type == 'H':
                    continue
                for op in ops:
                    if op.is_unit_mx():
                        x1 = sites_cart[j]
                    else:
                        x1 = uc.orthogonalize(op * sites_frac[j])
                        op_cart = inv_frac * mat.rec(op.r().as_double(),
                                                     (3, 3)) * frac
                        u1 = (op_cart * mat.sym(sym_mat3=thermal_tensors[j]) *
                              op_cart.transpose())
                        t = quadrics.ellipsoid_to_sphere_transform(
                            x1, u1.as_sym_mat3())
                        self.ellipsoid_to_sphere_transforms[
                            sc1.element_symbol()].append(t)
                        self.sites_cart.append(x1)
                        op_lbl = (" [%s]" % op).lower()
                        self.scatterer_indices.append("# %i%s" % (j, op_lbl))
                        self.scatterer_labels.append("%s%s" %
                                                     (sc1.label, op_lbl))
                    self.bonds.append(x0)
                    self.bonds.append(x1)