def rt_mx_analysis(s):
  print "<tr>"
  print "<td><tt>" + str(s) + "</tt>"
  r_info = sgtbx.rot_mx_info(s.r())
  t_info = sgtbx.translation_part_info(s)
  if (r_info.type() == 1):
    print "<td>1<td>-<td>-<td>-"
  elif (r_info.type() == -1):
    print "<td>%d<td>-<td>-<td>%s" % (
      r_info.type(),
      str(t_info.origin_shift()))
  elif (abs(r_info.type()) == 2):
    print "<td>%d<td>%s<td>%s<td>%s" % (
      r_info.type(),
      str_ev(r_info.ev()),
      str(t_info.intrinsic_part()),
      str(t_info.origin_shift()))
  else:
    print "<td>%d^%d<td>%s<td>%s<td>%s" % (
       r_info.type(),
       r_info.sense(),
       str_ev(r_info.ev()),
       str(t_info.intrinsic_part()),
       str(t_info.origin_shift()))
  print "</tr>"
  def __init__(self, r, d, symmetry_agreement, status):
    assert r.den() == 1
    self.r = r
    order = r.order()
    self.r_info = sgtbx.rot_mx_info(r)
    type = self.r_info.type()
    axis = self.r_info.ev()

    self.symmetry_agreement = symmetry_agreement
    self.status = status

    # compute intrinsic and location part of d, using p, which is
    # the order times the projector onto r's invariant space
    p = mat.sqr(r.accumulate().as_double())
    t_i_num = (p*d).as_int()
    t_l = d - t_i_num/order
    t_i = sgtbx.tr_vec(sg_t_den//order*t_i_num, tr_den=sg_t_den)

    # compute the origin corresponding to t_l by solving
    # (1 - r) o = t_l
    one_minus_r = -mat.sqr(self.r.minus_unit_mx().num())
    one_minus_r_row_echelon = one_minus_r.as_flex_int_matrix()
    q = mat.identity(3).as_flex_int_matrix()
    rank = scitbx.math.row_echelon_form_t(one_minus_r_row_echelon, q)
    qd = flex.double(mat.sqr(q)*t_l)[:rank]
    o = flex.double((0,0,0))
    scitbx.math.row_echelon_back_substitution_float(
      one_minus_r_row_echelon, qd, o)

    # construct object state
    self.t_i, self.raw_origin = t_i, mat.col(o)
    self.origin = None
    self.one_minus_r = one_minus_r
Example #3
0
  def __init__(self, s ):
    r_info = sgtbx.rot_mx_info( s.r() )
    t_info = sgtbx.translation_part_info( s )

    self.type = r_info.type()
    self.ev   = r_info.ev()
    self.trans= t_info.intrinsic_part()
Example #4
0
 def possible_point_group_generators(self):
     lattice_group = lattice_symmetry.group(self.f_in_p1.unit_cell(),
                                            max_delta=1)
     lattice_group.expand_inv(sgtbx.tr_vec((0, 0, 0)))
     rot_parts = set()
     decorated_rot_parts = []
     for op in lattice_group:
         r = op.r()
         if r.is_unit_mx(): continue
         if op.inverse() in rot_parts: continue
         r_info = sgtbx.rot_mx_info(r)
         if r_info.type() < -2: continue
         rot_parts.add(op)
         decorated_rot_parts.append((
             r_info.type() == -1,  # inversion shall come first,
             list(r_info.ev()).count(
                 0),  # axes // to unit cell shall come first
             # note Python 2.5- compatibility
             r_info.type() == -2,  # mirrors preferred.
             r.order(),  # higher order preferred
             op))
     decorated_rot_parts.sort()
     decorated_rot_parts.reverse()
     for item in decorated_rot_parts:
         yield item[-1]
Example #5
0
    def __init__(self, r, d, symmetry_agreement, status):
        assert r.den() == 1
        self.r = r
        order = r.order()
        self.r_info = sgtbx.rot_mx_info(r)
        type = self.r_info.type()
        axis = self.r_info.ev()

        self.symmetry_agreement = symmetry_agreement
        self.status = status

        # compute intrinsic and location part of d, using p, which is
        # the order times the projector onto r's invariant space
        p = mat.sqr(r.accumulate().as_double())
        t_i_num = (p * d).as_int()
        t_l = d - t_i_num / order
        t_i = sgtbx.tr_vec(sg_t_den // order * t_i_num, tr_den=sg_t_den)

        # compute the origin corresponding to t_l by solving
        # (1 - r) o = t_l
        one_minus_r = -mat.sqr(self.r.minus_unit_mx().num())
        one_minus_r_row_echelon = one_minus_r.as_flex_int_matrix()
        q = mat.identity(3).as_flex_int_matrix()
        rank = scitbx.math.row_echelon_form_t(one_minus_r_row_echelon, q)
        qd = flex.double(mat.sqr(q) * t_l)[:rank]
        o = flex.double((0, 0, 0))
        scitbx.math.row_echelon_back_substitution_float(
            one_minus_r_row_echelon, qd, o)

        # construct object state
        self.t_i, self.raw_origin = t_i, mat.col(o)
        self.origin = None
        self.one_minus_r = one_minus_r
Example #6
0
    def __init__(self, s):
        r_info = sgtbx.rot_mx_info(s.r())
        t_info = sgtbx.translation_part_info(s)

        self.type = r_info.type()
        self.ev = r_info.ev()
        self.trans = t_info.intrinsic_part()
Example #7
0
def rt_mx_analysis(s):
    r_info = sgtbx.rot_mx_info(s.r())
    t_info = sgtbx.translation_part_info(s)
    t_intrinsic = str(t_info.intrinsic_part().mod_positive())
    t_shift = str(t_info.origin_shift().mod_positive())
    if (r_info.type() == 1):
        return ("1", "-", "-", "-")
    if (r_info.type() == -1):
        return (str(r_info.type()), "-", "-", "(%s)" % (t_shift, ))
    if (abs(r_info.type()) == 2):
        return (str(r_info.type()), str_ev(r_info.ev()),
                "(%s)" % (t_intrinsic, ), "(%s)" % (t_shift, ))
    return (str(r_info.type()), str_ev(r_info.ev()), "(%s)" % (t_intrinsic, ),
            "(%s)" % (t_shift, ))
Example #8
0
def rt_mx_analysis(s):
    r_info = sgtbx.rot_mx_info(s.r())
    t_info = sgtbx.translation_part_info(s)
    t_intrinsic = str(t_info.intrinsic_part().mod_positive())
    t_shift = str(t_info.origin_shift().mod_positive())
    if (r_info.type() == 1):
        return ("1", "-", "-", "-")
    if (r_info.type() == -1):
        return (str(r_info.type()), "-", "-", "location=(%s)" % (t_shift, ))
    if (abs(r_info.type()) == 2):
        return (str(r_info.type()), "axis=" + str_ev(r_info.ev()),
                "(%s)" % (t_intrinsic, ), "location=(%s)" % (t_shift, ))
    sense = "+"
    if (r_info.sense() < 0):
        sense = "-"
    return (str(r_info.type()) + sense, "axis=" + str_ev(r_info.ev()),
            "(%s)" % (t_intrinsic, ), "location=(%s)" % (t_shift, ))
Example #9
0
def rt_mx_analysis(s):
  r_info = sgtbx.rot_mx_info(s.r())
  t_info = sgtbx.translation_part_info(s)
  t_intrinsic = str(t_info.intrinsic_part().mod_positive())
  t_shift = str(t_info.origin_shift().mod_positive())
  if (r_info.type() == 1):
    return ("1", "-", "-", "-")
  if (r_info.type() == -1):
    return (str(r_info.type()), "-", "-", "(%s)" % (t_shift,))
  if (abs(r_info.type()) == 2):
    return (str(r_info.type()),
            str_ev(r_info.ev()),
            "(%s)" % (t_intrinsic,),
            "(%s)" % (t_shift,))
  return (str(r_info.type()),
          str_ev(r_info.ev()),
          "(%s)" % (t_intrinsic,),
          "(%s)" % (t_shift,))
Example #10
0
def rt_mx_analysis(s):
    print("<tr>")
    print("<td><tt>" + str(s) + "</tt>")
    r_info = sgtbx.rot_mx_info(s.r())
    t_info = sgtbx.translation_part_info(s)
    if (r_info.type() == 1):
        print("<td>1<td>-<td>-<td>-")
    elif (r_info.type() == -1):
        print("<td>%d<td>-<td>-<td>%s" %
              (r_info.type(), str(t_info.origin_shift())))
    elif (abs(r_info.type()) == 2):
        print("<td>%d<td>%s<td>%s<td>%s" %
              (r_info.type(), str_ev(r_info.ev()), str(
                  t_info.intrinsic_part()), str(t_info.origin_shift())))
    else:
        print("<td>%d^%d<td>%s<td>%s<td>%s" %
              (r_info.type(), r_info.sense(), str_ev(r_info.ev()),
               str(t_info.intrinsic_part()), str(t_info.origin_shift())))
    print("</tr>")
Example #11
0
 def possible_point_group_generators(self):
   lattice_group = lattice_symmetry.group(self.f_in_p1.unit_cell(),
                                          max_delta=1)
   lattice_group.expand_inv(sgtbx.tr_vec((0,0,0)))
   rot_parts = set()
   decorated_rot_parts = []
   for op in lattice_group:
     r = op.r()
     if r.is_unit_mx(): continue
     if op.inverse() in rot_parts: continue
     r_info = sgtbx.rot_mx_info(r)
     if r_info.type() < -2: continue
     rot_parts.add(op)
     decorated_rot_parts.append(
       (r_info.type() == -1, # inversion shall come first,
        list(r_info.ev()).count(0), # axes // to unit cell shall come first
                                    # note Python 2.5- compatibility
        r_info.type() == -2, # mirrors preferred.
        r.order(), # higher order preferred
        op))
   decorated_rot_parts.sort()
   decorated_rot_parts.reverse()
   for item in decorated_rot_parts: yield item[-1]
Example #12
0
 def __init__(self,
       input_symmetry,
       angular_tolerance=None,
       best_monoclinic_beta=True):
   if (angular_tolerance is None):
     angular_tolerance = 3
   self._all_cells = []
   space_group_number = input_symmetry.space_group_info().type().number()
   if (space_group_number == 1):
     self._cb_op = input_symmetry.change_of_basis_op_to_niggli_cell()
     self._symmetry = input_symmetry.change_basis(self._cb_op)
     self._all_cells.append(self._symmetry)
     return
   if (space_group_number < 3 or space_group_number >= 75):
     self._cb_op = sgtbx.change_of_basis_op()
     self._symmetry = input_symmetry
     self._all_cells.append(self._symmetry)
     return
   standard_info = sgtbx.space_group_info(
     symbol=space_group_number,
     table_id="A1983")
   cb_op_inp_ref = input_symmetry.space_group_info().type().cb_op()
   cb_op_std_ref = standard_info.type().cb_op()
   cb_op_std_inp = cb_op_inp_ref.inverse() * cb_op_std_ref
   assert standard_info.group().change_basis(cb_op_std_inp) == input_symmetry.space_group()
   best_cb_op = sgtbx.change_of_basis_op()
   best_symmetry = input_symmetry
   if (space_group_number <= 15):
     two_fold_info = sgtbx.rot_mx_info(input_symmetry.space_group()(1).r())
     assert abs(two_fold_info.type()) == 2
     ev = list(two_fold_info.ev())
     assert ev.count(0) == 2
     unique_axis = ev.index(1)
     affine = sgtbx.find_affine(input_symmetry.space_group())
     for cb_mx in affine.cb_mx():
       cb_op = sgtbx.change_of_basis_op(cb_mx).new_denominators(best_cb_op)
       alt_symmetry = input_symmetry.change_basis(cb_op)
       if (alt_symmetry.space_group() == input_symmetry.space_group()):
         if (best_monoclinic_beta and unique_axis == 1):
           cb_op_best_beta = alt_symmetry.unit_cell() \
             .change_of_basis_op_for_best_monoclinic_beta()
           if (not cb_op_best_beta.is_identity_op()):
             cb_op.update(cb_op_best_beta)
             alt_symmetry = input_symmetry.change_basis(cb_op)
         self._all_cells.append(alt_symmetry)
         cmp_result = best_symmetry.unit_cell().compare_monoclinic(
           other=alt_symmetry.unit_cell(),
           unique_axis=unique_axis,
           angular_tolerance=angular_tolerance)
         if (cmp_result > 0):
           best_cb_op = cb_op
           best_symmetry = alt_symmetry
   else:
     assert not str(standard_info).endswith(":2")
     affine_group = sgtbx.space_group("P 4 3*").change_basis(
       cb_op_std_inp)
     for affine_s in affine_group:
       cb_op = sgtbx.change_of_basis_op(affine_s) \
         .new_denominators(best_cb_op)
       alt_symmetry = input_symmetry.change_basis(cb_op)
       if (alt_symmetry.space_group() == input_symmetry.space_group()):
         self._all_cells.append(alt_symmetry)
         cmp_result = best_symmetry.unit_cell().compare_orthorhombic(
           alt_symmetry.unit_cell())
         if (cmp_result > 0):
           best_cb_op = cb_op
           best_symmetry = alt_symmetry
   self._cb_op = best_cb_op
   self._symmetry = best_symmetry
Example #13
0
def rlc_RTMxAnalysis(M):
    r_info = sgtbx.rot_mx_info(M.r())
    t_info = sgtbx.translation_part_info(M)
    t_intrinsic = t_info.intrinsic_part().mod_positive().as_double()
    t_shift = t_info.origin_shift().mod_positive().as_double()

    #End = list_plus(Start + map(None,r_info.ev()))
    ####debug
    ###  trans = 0
    ###  length = 0
    ####debug

    #if r_info.type() == 1:
    if r_info.type() < 2:
        #(rt, start, end) = ('1',(0,0,0),(0,0,0))
        return None
    #elif r_info.type() == -1:
    #  (rt, start, end) = (str(r_info.type()),t_shift,())
    elif abs(r_info.type()) == 2:
        trans = sum(t_intrinsic)
        if trans == 0:
            maxr = max([abs(x) for x in r_info.ev()])
            r = [float(x) / maxr for x in r_info.ev()]
            (rt, start, end) = (str(r_info.type()), t_shift,
                                tuple(list_plus(t_shift, r)))
            #(rt, start, end) = (str(r_info.type()),t_shift,tuple(list_plus(t_shift,r_info.ev())))
        else:
            maxr = max([abs(x) for x in r_info.ev()])
            r = [float(x) / maxr for x in r_info.ev()]
            (rt, start, end) = (str(r_info.type()) + "^1", t_shift,
                                tuple(list_plus(t_shift, r)))
            #(rt, start, end) = (str(r_info.type())+"^1",t_shift,tuple(list_plus(t_shift,r_info.ev())))
    elif r_info.type() == 3:
        if r_info.sense() >= 0:
            # ignore opposite sense of rotation axes since they superimpose
            trans = N.sqrt(
                sum((map(lambda x, y: (y - x) * (y - x), (0, 0, 0),
                         t_intrinsic))))
            #      trans = N.sqrt(t_intrinsic[0]**2 + t_intrinsic[1]**2 + t_intrinsic[2]**2)
            if trans == 0:
                maxr = max([abs(x) for x in r_info.ev()])
                r = [float(x) / maxr for x in r_info.ev()]
                # fudge to make sure that PyMOL actually draws the axis (move it slightly off [1,-1,1]) !!!
                r[0] = r[0] * 1.000001
                (rt, start, end) = (str(r_info.type()), t_shift,
                                    tuple(list_plus(t_shift, r)))
                #(rt, start, end) = (str(r_info.type()),t_shift, tuple(list_plus(t_shift,r_info.ev())))
            else:
                maxr = max([abs(x) for x in r_info.ev()])
                r = [float(x) / maxr for x in r_info.ev()]
                #(rt, start, end) = (str(r_info.type())+ "^" + subscript ,t_shift,tuple(list_plus(t_shift,r)))
                (start, end) = (t_shift, tuple(list_plus(t_shift, r)))
                length = N.sqrt(
                    sum((map(lambda x, y: (y - x) * (y - x), start, end))))

                #  r_info.sense() for 3^1 and 3^2 seems always to be "1" ???
                #        if r_info.sense() < 0:
                #          subscript = str(1-r_info.sense())
                #        else:
                #          subscript = str(r_info.sense())

                # use ratio of trans to length to get the correct axis symbol:
                # fudged the value to get the right numbers. (using length/2., rather than length/3.)
                if trans < length * 0.5:
                    subscript = '1'
                else:
                    subscript = '2'

                rt = str(r_info.type()) + "^" + subscript
                #(rt, start, end) = (str(r_info.type()) + "^" + subscript,t_shift, tuple(list_plus(t_shift,r_info.ev())))
###        print "Type, sense, Start, End, length, trans", rt, r_info.sense(), start, end, length, trans
#        print "type: %s, sense: %s, trans: %s, length: %s," % (r_info.type(), r_info.sense(), trans, length)
#        print "(rt, start, end)", (rt,start,end)
        else:
            return None
    #return (r_info.type(),r_info.ev(), t_intrinsic, t_shift)
    elif r_info.sense() > 0:
        # ignore opposite sense of rotation axes since they superimpose
        trans = sum(t_intrinsic)
        if trans == 0:
            maxr = max([abs(x) for x in r_info.ev()])
            r = [float(x) / maxr for x in r_info.ev()]
            (rt, start, end) = (str(r_info.type()), t_shift,
                                tuple(list_plus(t_shift, r)))
            #(rt, start, end) = (str(r_info.type()),t_shift, tuple(list_plus(t_shift,r_info.ev())))
        else:
            maxr = max([abs(x) for x in r_info.ev()])
            r = [float(x) / maxr for x in r_info.ev()]
            subscript = str(int(trans * r_info.type() +
                                .5))  # add 0.5 to fix rounding errors
            (rt, start, end) = (str(r_info.type()) + "^" + subscript, t_shift,
                                tuple(list_plus(t_shift, r)))
            #(rt, start, end) = (str(r_info.type()) + "^" + subscript,t_shift, tuple(list_plus(t_shift,r_info.ev())))
    #return (r_info.type(),r_info.ev(), t_intrinsic, t_shift)
    else:
        return None


#  print "type: %s, sense: %s, trans: %s, length: %s," % (r_info.type(), r_info.sense(), trans, length),
#  print "(rt, start, end)", (rt,start,end)
    return (rt, start, end)
def rlc_RTMxAnalysis(M):
  r_info = sgtbx.rot_mx_info(M.r())
  t_info = sgtbx.translation_part_info(M)
  t_intrinsic = t_info.intrinsic_part().mod_positive().as_double()
  t_shift = t_info.origin_shift().mod_positive().as_double()

  #End = list_plus(Start + map(None,r_info.ev()))
####debug
###  trans = 0
###  length = 0
####debug
  
  #if (r_info.type() == 1):
  if (r_info.type() < 2):
    #(rt, start, end) = ('1',(0,0,0),(0,0,0))
    return None
  #elif (r_info.type() == -1):
  #  (rt, start, end) = (str(r_info.type()),t_shift,())
  elif (abs(r_info.type()) == 2):
    trans = reduce(lambda x,y:x+y,t_intrinsic)
    if trans == 0:
      maxr = max([abs(x) for x in r_info.ev()])
      r = [float(x)/maxr for x in r_info.ev()]
      (rt, start, end) = (str(r_info.type()),t_shift,tuple(list_plus(t_shift,r)))
      #(rt, start, end) = (str(r_info.type()),t_shift,tuple(list_plus(t_shift,r_info.ev())))
    else:
      maxr = max([abs(x) for x in r_info.ev()])
      r = [float(x)/maxr for x in r_info.ev()]
      (rt, start, end) = (str(r_info.type())+"^1",t_shift,tuple(list_plus(t_shift,r)))
      #(rt, start, end) = (str(r_info.type())+"^1",t_shift,tuple(list_plus(t_shift,r_info.ev())))
  elif (r_info.type() == 3):
    if (r_info.sense() >= 0) :
      # ignore opposite sense of rotation axes since they superimpose
      trans = N.sqrt(reduce(lambda x,y:x+y,(map(lambda x,y:(y-x)*(y-x),(0,0,0),t_intrinsic))))
#      trans = N.sqrt(t_intrinsic[0]**2 + t_intrinsic[1]**2 + t_intrinsic[2]**2)
      if trans == 0:
        maxr = max([abs(x) for x in r_info.ev()])
        r = [float(x)/maxr for x in r_info.ev()]
# fudge to make sure that PyMOL actually draws the axis (move it slightly off [1,-1,1]) !!!
        r[0] = r[0]*1.000001
        (rt, start, end) = (str(r_info.type()),t_shift,tuple(list_plus(t_shift,r)))
        #(rt, start, end) = (str(r_info.type()),t_shift, tuple(list_plus(t_shift,r_info.ev())))
      else:
        maxr = max([abs(x) for x in r_info.ev()])
        r = [float(x)/maxr for x in r_info.ev()]
        #(rt, start, end) = (str(r_info.type())+ "^" + subscript ,t_shift,tuple(list_plus(t_shift,r)))
        (start, end) = (t_shift,tuple(list_plus(t_shift,r)))
        length = N.sqrt(reduce(lambda x,y:x+y,(map(lambda x,y:(y-x)*(y-x),start, end))))

#  r_info.sense() for 3^1 and 3^2 seems always to be "1" ???
#        if r_info.sense() < 0:
#          subscript = str(1-r_info.sense())
#        else:
#          subscript = str(r_info.sense())

# use ratio of trans to length to get the correct axis symbol:
# fudged the value to get the right numbers. (using length/2., rather than length/3.)
        if trans < length*0.5 :
          subscript = '1'
        else:
          subscript = '2'

        rt = str(r_info.type())+ "^" + subscript 
        #(rt, start, end) = (str(r_info.type()) + "^" + subscript,t_shift, tuple(list_plus(t_shift,r_info.ev())))
###        print "Type, sense, Start, End, length, trans", rt, r_info.sense(), start, end, length, trans
#        print "type: %s, sense: %s, trans: %s, length: %s," % (r_info.type(), r_info.sense(), trans, length)
#        print "(rt, start, end)", (rt,start,end)
    else:
      return None
  #return (r_info.type(),r_info.ev(), t_intrinsic, t_shift)
  elif (r_info.sense() > 0):
    # ignore opposite sense of rotation axes since they superimpose
    trans = reduce(lambda x,y:x+y,t_intrinsic)
    if trans == 0:
      maxr = max([abs(x) for x in r_info.ev()])
      r = [float(x)/maxr for x in r_info.ev()]
      (rt, start, end) = (str(r_info.type()),t_shift,tuple(list_plus(t_shift,r)))
      #(rt, start, end) = (str(r_info.type()),t_shift, tuple(list_plus(t_shift,r_info.ev())))
    else:
      maxr = max([abs(x) for x in r_info.ev()])
      r = [float(x)/maxr for x in r_info.ev()]
      subscript =  str(int(trans*r_info.type()+.5))  # add 0.5 to fix rounding errors
      (rt, start, end) = (str(r_info.type())+ "^" + subscript ,t_shift,tuple(list_plus(t_shift,r)))
      #(rt, start, end) = (str(r_info.type()) + "^" + subscript,t_shift, tuple(list_plus(t_shift,r_info.ev())))
  #return (r_info.type(),r_info.ev(), t_intrinsic, t_shift)
  else:
    return None
#  print "type: %s, sense: %s, trans: %s, length: %s," % (r_info.type(), r_info.sense(), trans, length),
#  print "(rt, start, end)", (rt,start,end)
  return (rt, start, end)
 def __init__(self,symop):
   self.symop = symop # an instance of rt_mx
   from cctbx import sgtbx
   self.r_info = sgtbx.rot_mx_info(self.symop.r())
   self.t_info = sgtbx.translation_part_info(self.symop)
Example #16
0
 def __init__(self,
              input_symmetry,
              angular_tolerance=None,
              best_monoclinic_beta=True):
     if (angular_tolerance is None):
         angular_tolerance = 3
     self._all_cells = []
     space_group_number = input_symmetry.space_group_info().type().number()
     if (space_group_number == 1):
         self._cb_op = input_symmetry.change_of_basis_op_to_niggli_cell()
         self._symmetry = input_symmetry.change_basis(self._cb_op)
         self._all_cells.append(self._symmetry)
         return
     if (space_group_number < 3 or space_group_number >= 75):
         self._cb_op = sgtbx.change_of_basis_op()
         self._symmetry = input_symmetry
         self._all_cells.append(self._symmetry)
         return
     standard_info = sgtbx.space_group_info(symbol=space_group_number,
                                            table_id="A1983")
     cb_op_inp_ref = input_symmetry.space_group_info().type().cb_op()
     cb_op_std_ref = standard_info.type().cb_op()
     cb_op_std_inp = cb_op_inp_ref.inverse() * cb_op_std_ref
     assert standard_info.group().change_basis(
         cb_op_std_inp) == input_symmetry.space_group()
     best_cb_op = sgtbx.change_of_basis_op()
     best_symmetry = input_symmetry
     if (space_group_number <= 15):
         two_fold_info = sgtbx.rot_mx_info(
             input_symmetry.space_group()(1).r())
         assert abs(two_fold_info.type()) == 2
         ev = list(two_fold_info.ev())
         assert ev.count(0) == 2
         unique_axis = ev.index(1)
         affine = sgtbx.find_affine(input_symmetry.space_group())
         for cb_mx in affine.cb_mx():
             cb_op = sgtbx.change_of_basis_op(cb_mx).new_denominators(
                 best_cb_op)
             alt_symmetry = input_symmetry.change_basis(cb_op)
             if (alt_symmetry.space_group() == input_symmetry.space_group()
                 ):
                 if (best_monoclinic_beta and unique_axis == 1):
                     cb_op_best_beta = alt_symmetry.unit_cell() \
                       .change_of_basis_op_for_best_monoclinic_beta()
                     if (not cb_op_best_beta.is_identity_op()):
                         cb_op.update(cb_op_best_beta)
                         alt_symmetry = input_symmetry.change_basis(cb_op)
                 self._all_cells.append(alt_symmetry)
                 cmp_result = best_symmetry.unit_cell().compare_monoclinic(
                     other=alt_symmetry.unit_cell(),
                     unique_axis=unique_axis,
                     angular_tolerance=angular_tolerance)
                 if (cmp_result > 0):
                     best_cb_op = cb_op
                     best_symmetry = alt_symmetry
     else:
         assert not str(standard_info).endswith(":2")
         affine_group = sgtbx.space_group("P 4 3*").change_basis(
             cb_op_std_inp)
         for affine_s in affine_group:
             cb_op = sgtbx.change_of_basis_op(affine_s) \
               .new_denominators(best_cb_op)
             alt_symmetry = input_symmetry.change_basis(cb_op)
             if (alt_symmetry.space_group() == input_symmetry.space_group()
                 ):
                 self._all_cells.append(alt_symmetry)
                 cmp_result = best_symmetry.unit_cell(
                 ).compare_orthorhombic(alt_symmetry.unit_cell())
                 if (cmp_result > 0):
                     best_cb_op = cb_op
                     best_symmetry = alt_symmetry
     self._cb_op = best_cb_op
     self._symmetry = best_symmetry
 def __init__(self, symop):
     self.symop = symop  # an instance of rt_mx
     from cctbx import sgtbx
     self.r_info = sgtbx.rot_mx_info(self.symop.r())
     self.t_info = sgtbx.translation_part_info(self.symop)