Пример #1
0
    def find_space_group(self):
        decorated_symmetry_pool = []
        denominator = 12**3
        for i, (r, d) in enumerate(self.cross_correlation_peaks()):
            t = sgtbx.tr_vec((d * denominator).as_int(), tr_den=denominator)
            cb_op = sgtbx.change_of_basis_op(sgtbx.rt_mx(r, t))
            phi_sym = self.f_in_p1.symmetry_agreement_factor(
                cb_op, assert_is_similar_symmetry=False)
            if phi_sym < self.phi_sym_acceptance_cutoff:
                status = possible_symmetry.accepted
            elif phi_sym < self.phi_sym_rejection_cutoff:
                status = possible_symmetry.unsure
            else:
                status = possible_symmetry.rejected
            decorated_symmetry_pool.append(
                (-status, i, possible_symmetry(r, d, phi_sym, status)))
        decorated_symmetry_pool.sort()
        self.symmetry_pool = [item[-1] for item in decorated_symmetry_pool]

        self.origin = mat.mutable_zeros(3)
        for symm in self.symmetry_pool:
            if symm.status != symm.accepted: continue
            symm.set_components_of_global_origin(self.origin)
            if self.origin.elems.count(0) == 0: break
        for symm in self.symmetry_pool:
            if symm.status != symm.accepted: continue
            symm.change_origin(self.origin)
            self.space_group.expand_smx(symm.rt)
Пример #2
0
  def find_space_group(self):
    decorated_symmetry_pool = []
    denominator = 12**3
    for i, (r, d) in enumerate(self.cross_correlation_peaks()):
      t = sgtbx.tr_vec((d*denominator).as_int(), tr_den=denominator)
      cb_op = sgtbx.change_of_basis_op(sgtbx.rt_mx(r, t))
      phi_sym = self.f_in_p1.symmetry_agreement_factor(
        cb_op, assert_is_similar_symmetry=False)
      if phi_sym < self.phi_sym_acceptance_cutoff:
        status = possible_symmetry.accepted
      elif phi_sym < self.phi_sym_rejection_cutoff:
        status = possible_symmetry.unsure
      else:
        status = possible_symmetry.rejected
      decorated_symmetry_pool.append(
        (-status, i, possible_symmetry(r, d, phi_sym, status)))
    decorated_symmetry_pool.sort()
    self.symmetry_pool = [ item[-1] for item in decorated_symmetry_pool ]

    self.origin = mat.mutable_zeros(3)
    for symm in self.symmetry_pool:
      if symm.status != symm.accepted: continue
      symm.set_components_of_global_origin(self.origin)
      if self.origin.elems.count(0) == 0: break
    for symm in self.symmetry_pool:
      if symm.status != symm.accepted: continue
      symm.change_origin(self.origin)
      self.space_group.expand_smx(symm.rt)
Пример #3
0
    def change_of_basis_op_to(self, other):
        """ The change of basis from self to other.
    This method strives to return a mere origin shift.
    """
        self_to_ref_op = self.change_of_basis_op_to_reference_setting()
        other_to_ref_op = other.change_of_basis_op_to_reference_setting()

        # early exit if other is not the same space group in a different setting
        self_as_reference = self.change_basis(self_to_ref_op)
        other_as_reference = other.change_basis(other_to_ref_op)
        if self_as_reference.group() != other_as_reference.group(): return None

        # the obvious answer: if it is a mere shift, return it
        obvious_result = other_to_ref_op.inverse() * self_to_ref_op
        if obvious_result.c().r().is_unit_mx(): return obvious_result

        # otherwise, let's try to find an origin shift by hand
        # see test case exercise_change_of_basis_between_arbitrary_space_groups
        # in regression/tst_sgtbx.py for the motivation for this code.
        self_z2p_op = self.change_of_basis_op_to_primitive_setting()
        other_z2p_op = other.change_of_basis_op_to_primitive_setting()
        primitive_self = self.change_basis(self_z2p_op)
        primitive_other = other.change_basis(other_z2p_op)
        if (set([op.r() for op in primitive_self.group()
                 ]) == set([op.r() for op in primitive_other.group()])):
            self_tr_info_for_r = dict([(op.r(), translation_part_info(op))
                                       for op in primitive_self.group()])
            origin_shift = matrix.mutable_zeros(3)
            for op in primitive_other.group():
                self_ti = self_tr_info_for_r[op.r()]
                other_ti = translation_part_info(op)
                if self_ti.intrinsic_part() != other_ti.intrinsic_part():
                    origin_shift = None
                    break
                delta = other_ti.origin_shift().minus(
                    self_ti.origin_shift()).mod_positive()
                delta_num = delta.num()
                for i in range(3):
                    if origin_shift[i] == 0:
                        origin_shift[i] = 24 // delta.den() * delta_num[i]
                if origin_shift.elems.count(0) == 0: break
            if origin_shift is not None:
                origin_shift = tr_vec(origin_shift, tr_den=24)
                if not origin_shift.is_zero():
                    cb_op = change_of_basis_op(
                        rt_mx(origin_shift)).new_denominators(24, 144)
                    cb_op = other_z2p_op.inverse() * cb_op * self_z2p_op
                    cb_op.mod_positive_in_place()
                    tentative_other = self.change_basis(cb_op)
                    if tentative_other.group() == other.group():
                        return cb_op

        # no origin shift has been found, so return the obvious answer
        return obvious_result
Пример #4
0
  def change_of_basis_op_to(self, other):
    """ The change of basis from self to other.
    This method strives to return a mere origin shift.
    """
    self_to_ref_op = self.change_of_basis_op_to_reference_setting()
    other_to_ref_op = other.change_of_basis_op_to_reference_setting()

    # early exit if other is not the same space group in a different setting
    self_as_reference = self.change_basis(self_to_ref_op)
    other_as_reference = other.change_basis(other_to_ref_op)
    if self_as_reference.group() != other_as_reference.group(): return None

    # the obvious answer: if it is a mere shift, return it
    obvious_result = other_to_ref_op.inverse()*self_to_ref_op
    if obvious_result.c().r().is_unit_mx(): return obvious_result

    # otherwise, let's try to find an origin shift by hand
    # see test case exercise_change_of_basis_between_arbitrary_space_groups
    # in regression/tst_sgtbx.py for the motivation for this code.
    self_z2p_op = self.change_of_basis_op_to_primitive_setting()
    other_z2p_op = other.change_of_basis_op_to_primitive_setting()
    primitive_self = self.change_basis(self_z2p_op)
    primitive_other = other.change_basis(other_z2p_op)
    if (   set([ op.r() for op in primitive_self.group() ])
        == set([ op.r() for op in primitive_other.group() ])):
      self_tr_info_for_r = dict([ (op.r(), translation_part_info(op))
                                  for op in primitive_self.group() ])
      origin_shift = matrix.mutable_zeros(3)
      for op in primitive_other.group():
        self_ti = self_tr_info_for_r[op.r()]
        other_ti = translation_part_info(op)
        if self_ti.intrinsic_part() != other_ti.intrinsic_part():
          origin_shift = None
          break
        delta = other_ti.origin_shift().minus(
             self_ti.origin_shift()).mod_positive()
        delta_num = delta.num()
        for i in xrange(3):
          if origin_shift[i] == 0:
            origin_shift[i] = 24//delta.den()*delta_num[i]
        if origin_shift.elems.count(0) == 0: break
      if origin_shift is not None:
        origin_shift = tr_vec(origin_shift, tr_den=24)
        if not origin_shift.is_zero():
          cb_op = change_of_basis_op(
            rt_mx(origin_shift)).new_denominators(24, 144)
          cb_op = other_z2p_op.inverse()*cb_op*self_z2p_op
          cb_op.mod_positive_in_place()
          tentative_other = self.change_basis(cb_op)
          if tentative_other.group() == other.group():
            return cb_op

    # no origin shift has been found, so return the obvious answer
    return obvious_result