Ejemplo n.º 1
0
def exercise_gruber_1973_example():
    start = ucgmx((4, 136, 76, -155, -31, 44))
    assert start.is_similar_to(
        uctbx.unit_cell(
            (2, 11.66, 8.718, 139 + 40 / 60., 152 + 45 / 60., 19 + 24 / 60.)))
    buerger = ucgmx((4, 16, 16, -16, -1, -3))
    assert buerger.is_similar_to(
        uctbx.unit_cell((2, 4, 4, 120, 93.5833, 100.807)))
    niggli = ucgmx((4, 16, 16, 16, 3, 4))
    assert niggli.is_similar_to(
        uctbx.unit_cell((2, 4, 4, 60, 79.1931, 75.5225)))
    red = reduction_base.gruber_parameterization(start)
    assert not red.is_buerger_cell()
    assert approx_equal(red.as_gruber_matrix(), (4, 136, 76, -155, -31, 44))
    assert approx_equal(red.as_niggli_matrix(),
                        (4, 136, 76, -155 / 2., -31 / 2., 44 / 2.))
    assert approx_equal(red.as_sym_mat3(),
                        (4, 136, 76, 44 / 2., -31 / 2., -155 / 2.))
    assert red.as_unit_cell().is_similar_to(start)
    red = reduction_base.gruber_parameterization(buerger)
    assert red.is_buerger_cell()
    assert not red.is_niggli_cell()
    red = reduction_base.gruber_parameterization(niggli)
    assert red.is_niggli_cell()
    red = reduce(start)
    assert red.as_unit_cell().is_similar_to(niggli)
    assert red.r_inv().elems == (-1, 5, 9, 0, -1, -1, 0, 0, 1)
    assert red.n_iterations() == 29
    red = reduce(buerger)
    assert red.as_unit_cell().is_similar_to(niggli)
    assert red.r_inv().elems == (-1, 0, 0, 0, 1, 1, 0, 1, 0)
    assert red.n_iterations() == 4
    red = reduce(niggli)
    assert red.as_unit_cell().is_similar_to(niggli)
    assert red.r_inv().elems == (1, 0, 0, 0, 1, 0, 0, 0, 1)
    assert red.n_iterations() == 1
    try:
        red = krivy_gruber_1976.reduction(buerger, iteration_limit=1)
    except krivy_gruber_1976.iteration_limit_exceeded:
        pass
    else:
        raise Exception_expected
    assert not start.is_buerger_cell()
    assert not start.is_niggli_cell()
    assert buerger.is_buerger_cell()
    assert not buerger.is_niggli_cell()
    assert niggli.is_buerger_cell()
    assert niggli.is_niggli_cell()
    red = start.niggli_reduction()
    assert red.n_iterations() == 29
    assert start.niggli_cell().is_similar_to(niggli)
Ejemplo n.º 2
0
def exercise_gruber_1973_example():
  start = ucgmx((4,136,76,-155,-31,44))
  assert start.is_similar_to(uctbx.unit_cell(
    (2, 11.66, 8.718, 139+40/60., 152+45/60., 19+24/60.)))
  buerger = ucgmx((4,16,16,-16,-1,-3))
  assert buerger.is_similar_to(uctbx.unit_cell(
    (2, 4, 4, 120, 93.5833, 100.807)))
  niggli = ucgmx((4,16,16,16,3,4))
  assert niggli.is_similar_to(uctbx.unit_cell(
    (2, 4, 4, 60, 79.1931, 75.5225)))
  red = reduction_base.gruber_parameterization(start)
  assert not red.is_buerger_cell()
  assert approx_equal(red.as_gruber_matrix(), (4,136,76,-155,-31,44))
  assert approx_equal(red.as_niggli_matrix(), (4,136,76,-155/2.,-31/2.,44/2.))
  assert approx_equal(red.as_sym_mat3(), (4,136,76,44/2.,-31/2.,-155/2.))
  assert red.as_unit_cell().is_similar_to(start)
  red = reduction_base.gruber_parameterization(buerger)
  assert red.is_buerger_cell()
  assert not red.is_niggli_cell()
  red = reduction_base.gruber_parameterization(niggli)
  assert red.is_niggli_cell()
  red = reduce(start)
  assert red.as_unit_cell().is_similar_to(niggli)
  assert red.r_inv().elems == (-1, 5, 9, 0, -1, -1, 0, 0, 1)
  assert red.n_iterations() == 29
  red = reduce(buerger)
  assert red.as_unit_cell().is_similar_to(niggli)
  assert red.r_inv().elems == (-1, 0, 0, 0, 1, 1, 0, 1, 0)
  assert red.n_iterations() == 4
  red = reduce(niggli)
  assert red.as_unit_cell().is_similar_to(niggli)
  assert red.r_inv().elems == (1, 0, 0, 0, 1, 0, 0, 0, 1)
  assert red.n_iterations() == 1
  try:
    red = krivy_gruber_1976.reduction(buerger, iteration_limit=1)
  except krivy_gruber_1976.iteration_limit_exceeded:
    pass
  else:
    raise Exception_expected
  assert not start.is_buerger_cell()
  assert not start.is_niggli_cell()
  assert buerger.is_buerger_cell()
  assert not buerger.is_niggli_cell()
  assert niggli.is_buerger_cell()
  assert niggli.is_niggli_cell()
  red = start.niggli_reduction()
  assert red.n_iterations() == 29
  assert start.niggli_cell().is_similar_to(niggli)
Ejemplo n.º 3
0
def exercise_krivy_gruber_1976_example():
    start = ucgmx((9, 27, 4, -5, -4, -22))
    assert start.is_similar_to(
        uctbx.unit_cell(
            (3, 5.196, 2, 103 + 55 / 60., 109 + 28 / 60., 134 + 53 / 60.)))
    for gmx in ((4, 9, 9, -8, -1, -4), (4, 9, 9, 9, 1, 4)):
        red = reduction_base.gruber_parameterization(ucgmx(gmx))
        assert red.is_buerger_cell()
        assert not red.is_niggli_cell()
    niggli = ucgmx((4, 9, 9, 9, 3, 4))
    assert niggli.is_similar_to(
        uctbx.unit_cell((2, 3, 3, 60, 75 + 31 / 60., 70 + 32 / 60.)))
    red = reduction_base.gruber_parameterization(niggli)
    assert red.is_niggli_cell()
    red = reduce(start)
    assert red.as_unit_cell().is_similar_to(niggli)
    assert red.r_inv().elems == (0, 1, 2, 0, 0, 1, 1, 1, 2)
    assert red.n_iterations() == 11
Ejemplo n.º 4
0
def exercise_krivy_gruber_1976_example():
  start = ucgmx((9,27,4,-5,-4,-22))
  assert start.is_similar_to(uctbx.unit_cell(
    (3, 5.196, 2, 103+55/60., 109+28/60., 134+53/60.)))
  for gmx in ((4,9,9,-8,-1,-4),
              (4,9,9,9,1,4)):
    red = reduction_base.gruber_parameterization(ucgmx(gmx))
    assert red.is_buerger_cell()
    assert not red.is_niggli_cell()
  niggli = ucgmx((4,9,9,9,3,4))
  assert niggli.is_similar_to(uctbx.unit_cell(
    (2, 3, 3, 60, 75+31/60., 70+32/60.)))
  red = reduction_base.gruber_parameterization(niggli)
  assert red.is_niggli_cell()
  red = reduce(start)
  assert red.as_unit_cell().is_similar_to(niggli)
  assert red.r_inv().elems == (0, 1, 2, 0, 0, 1, 1, 1, 2)
  assert red.n_iterations() == 11
Ejemplo n.º 5
0
 def is_niggli_cell(self, relative_epsilon=None):
   from cctbx.uctbx.reduction_base import gruber_parameterization
   return gruber_parameterization(self, relative_epsilon).is_niggli_cell()
Ejemplo n.º 6
0
 def is_niggli_cell(self, relative_epsilon=None):
   from cctbx.uctbx.reduction_base import gruber_parameterization
   return gruber_parameterization(self, relative_epsilon).is_niggli_cell()
Ejemplo n.º 7
0
def exercise_gruber_types(n_trials_per_type, dump=0, verbose=0):
    mk2_sets = gruber_1973_table_1.get_mk2_sets()
    type_conditions = gruber_1973_table_1.get_type_conditions()
    random_unimodular = random_unimodular_integer_matrix_generator()
    have_errors = False
    for k in range(1, 29):
        set = mk2_sets[k]
        tc = type_conditions[k]
        if (0 or verbose):
            print(" ", tc.ck_types, tc.defks)
        n_errors = 0
        for i_trial in range(n_trials_per_type):
            gruber_matrix = random_gruber_matrix(tc)
            type_cell = ucgmx(gruber_matrix)
            if (0 or verbose):
                print(" ", gruber_matrix)
                print(" ", type_cell)
            red = reduction_base.gruber_parameterization(type_cell)
            assert red.is_niggli_cell()
            n_different_cells = 0
            for m in set:
                other_cell = type_cell.change_basis(
                    m.inverse().transpose().elems, 1)
                if (0 or verbose):
                    print(" ", m.elems, m.determinant())
                    print(" ", other_cell)
                red = reduction_base.gruber_parameterization(other_cell)
                if (not red.is_buerger_cell()):
                    print("  Error: Transformed cell is not a Buerger cell.")
                    print("  gruber_matrix:", gruber_matrix)
                    n_errors += 1
                else:
                    n_different_cells += 1
                    if (red.is_niggli_cell()):
                        if (not other_cell.is_similar_to(type_cell)):
                            print(
                                "  Error: Transformed cell is a Niggli cell.")
                            print("  gruber_matrix:", gruber_matrix)
                            n_errors += 1
                    else:
                        krivy_cell = reduce(type_cell).as_unit_cell()
                        assert krivy_cell.is_similar_to(type_cell)
                        krivy_cell = reduce(other_cell).as_unit_cell()
                        assert krivy_cell.is_similar_to(type_cell)
                        r_inv = random_unimodular.next().elems
                        random_cell = type_cell.change_basis(r_inv, 1)
                        if (0 or verbose):
                            print("  Random:", random_cell, r_inv)
                        red = reduce(random_cell)
                        krivy_cell = red.as_unit_cell()
                        if (dump):
                            print("type_cell:", type_cell)
                            print("random_cell:", random_cell)
                            print("krivy_cell:", krivy_cell)
                            print()
                        if (not krivy_cell.is_similar_to(type_cell)):
                            print("  Error: Random cell recovery.")
                            print("  gruber_matrix:", gruber_matrix)
                            print("  r_inv:", r_inv)
                            print("  red.as_gruber_matrix():",
                                  red.as_gruber_matrix())
                            n_errors += 1
            if (n_different_cells == 0):
                print(
                    "  Error: Transformation does not yield different cells.")
                n_errors += 1
                raise RuntimeError
        if ((0 or verbose) and n_errors != 0):
            print("Errors for type %d:" % k, n_errors)
        if (n_errors != 0):
            have_errors = True
    assert not have_errors
Ejemplo n.º 8
0
def exercise_gruber_types(n_trials_per_type, dump=0, verbose=0):
  mk2_sets = gruber_1973_table_1.get_mk2_sets()
  type_conditions = gruber_1973_table_1.get_type_conditions()
  random_unimodular = random_unimodular_integer_matrix_generator()
  have_errors = False
  for k in xrange(1,29):
    set = mk2_sets[k]
    tc = type_conditions[k]
    if (0 or verbose):
      print " ", tc.ck_types, tc.defks
    n_errors = 0
    for i_trial in xrange(n_trials_per_type):
      gruber_matrix = random_gruber_matrix(tc)
      type_cell = ucgmx(gruber_matrix)
      if (0 or verbose):
        print " ", gruber_matrix
        print " ", type_cell
      red = reduction_base.gruber_parameterization(type_cell)
      assert red.is_niggli_cell()
      n_different_cells = 0
      for m in set:
        other_cell = type_cell.change_basis(m.inverse().transpose().elems, 1)
        if (0 or verbose):
          print " ", m.elems, m.determinant()
          print " ", other_cell
        red = reduction_base.gruber_parameterization(other_cell)
        if (not red.is_buerger_cell()):
          print "  Error: Transformed cell is not a Buerger cell."
          print "  gruber_matrix:", gruber_matrix
          n_errors += 1
        else:
          n_different_cells += 1
          if (red.is_niggli_cell()):
            if (not other_cell.is_similar_to(type_cell)):
              print "  Error: Transformed cell is a Niggli cell."
              print "  gruber_matrix:", gruber_matrix
              n_errors += 1
          else:
            krivy_cell = reduce(type_cell).as_unit_cell()
            assert krivy_cell.is_similar_to(type_cell)
            krivy_cell = reduce(other_cell).as_unit_cell()
            assert krivy_cell.is_similar_to(type_cell)
            r_inv = random_unimodular.next().elems
            random_cell = type_cell.change_basis(r_inv, 1)
            if (0 or verbose):
              print "  Random:", random_cell, r_inv
            red = reduce(random_cell)
            krivy_cell = red.as_unit_cell()
            if (dump):
              print "type_cell:", type_cell
              print "random_cell:", random_cell
              print "krivy_cell:", krivy_cell
              print
            if (not krivy_cell.is_similar_to(type_cell)):
              print "  Error: Random cell recovery."
              print "  gruber_matrix:", gruber_matrix
              print "  r_inv:", r_inv
              print "  red.as_gruber_matrix():", red.as_gruber_matrix()
              n_errors += 1
      if (n_different_cells == 0):
        print "  Error: Transformation does not yield different cells."
        n_errors += 1
        raise RuntimeError
    if ((0 or verbose) and n_errors != 0):
      print "Errors for type %d:" % k, n_errors
    if (n_errors != 0):
      have_errors = True
  assert not have_errors