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
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()
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]
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
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()
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, ))
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, ))
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,))
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 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]
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 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)
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)