def fit_rotatable(pdb_hierarchy, xray_structure, map_data, rotatable_h_selection): unit_cell = xray_structure.unit_cell() sites_cart = xray_structure.sites_cart() scatterers = xray_structure.scatterers() for sel_ in rotatable_h_selection: ed_val = -1 angle = 0. angular_step = 1 axis = sel_[0] points_i_seqs = sel_[1] sites_frac_best = flex.vec3_double(len(points_i_seqs)) while angle <= 360: sites_frac_tmp = flex.vec3_double(len(points_i_seqs)) ed_val_ = 0 for i_seq, point_i_seq in enumerate(points_i_seqs): site_cart_new = rotate_point_around_axis( axis_point_1=sites_cart[axis[0]], axis_point_2=sites_cart[axis[1]], point=sites_cart[point_i_seq], angle=angle, deg=True) site_frac_new = unit_cell.fractionalize(site_cart_new) ed_val_ += abs( maptbx.eight_point_interpolation(map_data, site_frac_new)) sites_frac_tmp[i_seq] = site_frac_new if (ed_val_ > ed_val): ed_val = ed_val_ sites_frac_best = sites_frac_tmp.deep_copy() angle += angular_step for i_seq, point_i_seq in enumerate(points_i_seqs): scatterers[point_i_seq].site = sites_frac_best[i_seq] pdb_hierarchy.adopt_xray_structure(xray_structure)
def __init__(self,map_data,unit_cell,label,site_cart_1,site_cart_2,step=0.005): x1,y1,z1 = site_cart_1 x2,y2,z2 = site_cart_2 self.one_dim_point = None self.peak_value = None self.peak_site_cart = None self.status = None self.bond_length = math.sqrt((x1-x2)**2+(y1-y2)**2+(z1-z2)**2) alp = 0 self.data = flex.double() self.dist = flex.double() self.peak_sites = flex.vec3_double() i_seq = 0 while alp <= 1.0+1.e-6: xp = x1+alp*(x2-x1) yp = y1+alp*(y2-y1) zp = z1+alp*(z2-z1) site_frac = unit_cell.fractionalize((xp,yp,zp)) ed_ = maptbx.eight_point_interpolation(map_data, site_frac) self.dist.append( math.sqrt((x1-xp)**2+(y1-yp)**2+(z1-zp)**2) ) self.data.append(ed_) self.peak_sites.append(unit_cell.orthogonalize(site_frac)) alp += step i_seq += 1 i_seq_left, i_seq_right, max_peak_i_seq = self.find_peak() self.b_estimated, self.q_estimated = None, None self.a, self.b = None, None self.peak_data, self.peak_dist = None, None if([i_seq_left, i_seq_right].count(None) == 0): self.one_dim_point = self.dist[max_peak_i_seq] self.peak_value = self.data[max_peak_i_seq] self.peak_site_cart = self.peak_sites[max_peak_i_seq] self.peak_data = self.data[i_seq_left:i_seq_right+1] self.peak_dist = self.dist[i_seq_left:i_seq_right+1] assert (self.peak_data < 0.0).count(True) == 0 origin = self.dist[max_peak_i_seq] dist = (self.peak_dist - origin).deep_copy() sel = self.peak_data > 0.0 data = self.peak_data.select(sel) dist = dist.select(sel) if(data.size() > 0): approx_obj = maptbx.one_gaussian_peak_approximation( data_at_grid_points = data, distances = dist, use_weights = False, optimize_cutoff_radius = False) a_real = approx_obj.a_real_space() b_real = approx_obj.b_real_space() gof = approx_obj.gof() self.a = ias_scattering_dict[label].array_of_a()[0] self.b = ias_scattering_dict[label].array_of_b()[0] self.b_estimated = approx_obj.b_reciprocal_space()-self.b self.q_estimated = approx_obj.a_reciprocal_space()/self.a #print "%.2f %.2f"%(self.q_estimated, self.b_estimated) if(self.b_estimated <= 0.0): self.b_estimated = self.b if(self.q_estimated <= 0.0): self.q_estimated = self.a self.set_status()
def fit_rotatable( pdb_hierarchy, xray_structure, map_data, rotatable_h_selection): unit_cell = xray_structure.unit_cell() sites_cart = xray_structure.sites_cart() scatterers = xray_structure.scatterers() for sel_ in rotatable_h_selection: ed_val = -1 angle = 0. angular_step = 1 axis = sel_[0] points_i_seqs = sel_[1] sites_frac_best = flex.vec3_double(len(points_i_seqs)) while angle <= 360: sites_frac_tmp = flex.vec3_double(len(points_i_seqs)) ed_val_ = 0 for i_seq, point_i_seq in enumerate(points_i_seqs): site_cart_new = rotate_point_around_axis( axis_point_1 = sites_cart[axis[0]], axis_point_2 = sites_cart[axis[1]], point = sites_cart[point_i_seq], angle = angle, deg = True) site_frac_new = unit_cell.fractionalize(site_cart_new) ed_val_ += abs(maptbx.eight_point_interpolation(map_data,site_frac_new)) sites_frac_tmp[i_seq] = site_frac_new if(ed_val_ > ed_val): ed_val = ed_val_ sites_frac_best = sites_frac_tmp.deep_copy() angle += angular_step for i_seq, point_i_seq in enumerate(points_i_seqs): scatterers[point_i_seq].site = sites_frac_best[i_seq] pdb_hierarchy.adopt_xray_structure(xray_structure)
def exercise_eight_point_interpolation(): map = flex.double(flex.grid(2,3,5), 10) for shift in [0,1,-1]: for index in flex.nested_loop(map.focus()): x_frac = [float(i)/n+shift for i,n in zip(index, map.focus())] assert approx_equal(maptbx.eight_point_interpolation(map, x_frac), 10) assert approx_equal( maptbx.eight_point_interpolation_with_gradients(map, x_frac,[1,1,1])[0], 10) assert maptbx.closest_grid_point(map.accessor(), x_frac) == index for i in xrange(100): x_frac = [3*random.random()-1 for i in xrange(3)] assert approx_equal(map.eight_point_interpolation(x_frac), 10) assert approx_equal( map.eight_point_interpolation_with_gradients(x_frac,[1,1,1])[0], 10) map = flex.double(range(30)) map.resize(flex.grid(2,3,5)) for shift in [0,1,-1]: v = 0 for index in flex.nested_loop(map.focus()): x_frac = [float(i)/n+shift for i,n in zip(index, map.focus())] assert approx_equal(map.eight_point_interpolation(x_frac), v) assert approx_equal( map[maptbx.closest_grid_point(map.accessor(), x_frac)], v) assert approx_equal(map.value_at_closest_grid_point(x_frac), v) v += 1 map = flex.double() for i in xrange(48): map.append(i%2) map.resize(flex.grid(2,4,6)) for shift in [0,1,-1]: for offs in [.0,.5,.25,.75]: v = offs for index in flex.nested_loop(map.focus()): x_frac = [(i+offs)/n+shift for i,n in zip(index, map.focus())] assert approx_equal(map.eight_point_interpolation(x_frac), v) if (offs != .5): assert maptbx.closest_grid_point(map.accessor(), x_frac) == tuple( [int(i+offs+.5)%n for i,n in zip(index,map.focus())]) v = 1-v