def get_f_masks(xrs, miller_array):
  crystal_gridding = maptbx.crystal_gridding(
    unit_cell          = xrs.unit_cell(),
    d_min              = miller_array.d_min(),
    resolution_factor  = 1./4,
    symmetry_flags     = maptbx.use_space_group_symmetry,
    space_group_info   = xrs.space_group_info())
  mp = mmtbx.masks.mask_master_params.extract()
  mask_data = mmtbx.masks.mask_from_xray_structure(
    xray_structure           = xrs,
    p1                       = True,
    solvent_radius           = mp.solvent_radius,
    shrink_truncation_radius = mp.shrink_truncation_radius,
    for_structure_factors    = True,
    n_real                   = crystal_gridding.n_real()).mask_data
  n = mask_data.all()
  mask_data1 = flex.double(flex.grid(n), 0)
  mask_data2 = flex.double(flex.grid(n), 0)
  I,J,K = xrange(n[0]), xrange(n[1]), xrange(n[2])
  for i in I:
    for j in J:
      for k in K:
        if(i < n[0]//2 and j < n[1]//2 and k < n[2]//2):
          mask_data1[i,j,k]=mask_data[i,j,k]
        else:
          mask_data2[i,j,k]=mask_data[i,j,k]
  f_mask1 = miller_array.structure_factors_from_map(map=mask_data1,
    use_scale = True, anomalous_flag = False, use_sg = False)
  f_mask2 = miller_array.structure_factors_from_map(map=mask_data2,
    use_scale = True, anomalous_flag = False, use_sg = False)
  return [f_mask1.data(), f_mask2.data()]
Пример #2
0
def exercise_flood_fill():
  uc = uctbx.unit_cell('10 10 10 90 90 90')
  for uc in (uctbx.unit_cell('10 10 10 90 90 90'),
             uctbx.unit_cell('9 10 11 87 91 95')):
    gridding = maptbx.crystal_gridding(
      unit_cell=uc,
      pre_determined_n_real=(5,5,5))
    corner_cube = (0,4,20,24,100,104,120,124) # cube across all 8 corners
    channel = (12,37,38,39,42,43,62,63,67,68,87,112)
    data = flex.int(flex.grid(gridding.n_real()))
    for i in (corner_cube + channel): data[i] = 1
    flood_fill = masks.flood_fill(data, uc)
    assert data.count(0) == 105
    for i in corner_cube: assert data[i] == 2
    for i in channel: assert data[i] == 3
    assert approx_equal(flood_fill.centres_of_mass(),
                        ((-0.5, -0.5, -0.5), (-2.5, 7/3, 2.5)))
    assert approx_equal(flood_fill.centres_of_mass_frac(),
                        ((-0.1, -0.1, -0.1), (-0.5, 7/15, 0.5)))
    assert approx_equal(flood_fill.centres_of_mass_cart(),
                        uc.orthogonalize(flood_fill.centres_of_mass_frac()))
    assert flood_fill.n_voids() == 2
    assert approx_equal(flood_fill.grid_points_per_void(), (8, 12))
    if 0:
      from crys3d import wx_map_viewer
      wx_map_viewer.display(raw_map=data.as_double(), unit_cell=uc, wires=False)
    #
    gridding = maptbx.crystal_gridding(
      unit_cell=uc,
      pre_determined_n_real=(10,10,10))
    data = flex.int(flex.grid(gridding.n_real()))
    # parallelogram
    points = [(2,4,5),(3,4,5),(4,4,5),(5,4,5),(6,4,5),
              (3,5,5),(4,5,5),(5,5,5),(6,5,5),(7,5,5),
              (4,6,5),(5,6,5),(6,6,5),(7,6,5),(8,6,5)]
    points_frac = flex.vec3_double()
    for p in points:
      data[p] = 1
      points_frac.append([p[i]/gridding.n_real()[i] for i in range(3)])
    points_cart = uc.orthogonalize(points_frac)
    flood_fill = masks.flood_fill(data, uc)
    assert data.count(2) == 15
    assert approx_equal(flood_fill.centres_of_mass_frac(), ((0.5,0.5,0.5),))
    pai_cart = math.principal_axes_of_inertia(
      points=points_cart, weights=flex.double(points_cart.size(),1.0))
    F = matrix.sqr(uc.fractionalization_matrix())
    O = matrix.sqr(uc.orthogonalization_matrix())
    assert approx_equal(
      pai_cart.center_of_mass(), flood_fill.centres_of_mass_cart()[0])
    assert approx_equal(
      flood_fill.covariance_matrices_cart()[0],
      (F.transpose() * matrix.sym(
        sym_mat3=flood_fill.covariance_matrices_frac()[0]) * F).as_sym_mat3())
    assert approx_equal(
      pai_cart.inertia_tensor(), flood_fill.inertia_tensors_cart()[0])
    assert approx_equal(pai_cart.eigensystem().vectors(),
                        flood_fill.eigensystems_cart()[0].vectors())
    assert approx_equal(pai_cart.eigensystem().values(),
                        flood_fill.eigensystems_cart()[0].values())
  return
Пример #3
0
  def plot_grid(values, grid, file_name, cmap=pyplot.cm.Reds,
                vmin=None, vmax=None, invalid='white'):
    values = values.as_double()
    # At DLS, fast direction appears to be largest direction
    if grid[0] > grid[1]:
      values.reshape(flex.grid(reversed(grid)))
      values = values.matrix_transpose()
    else:
      values.reshape(flex.grid(grid))

    Z = values.as_numpy_array()

    #f, (ax1, ax2) = pyplot.subplots(2)
    f, ax1 = pyplot.subplots(1)

    mesh1 = ax1.pcolormesh(
      values.as_numpy_array(), cmap=cmap, vmin=vmin, vmax=vmax)
    mesh1.cmap.set_under(color=invalid, alpha=None)
    mesh1.cmap.set_over(color=invalid, alpha=None)
    #mesh2 = ax2.contour(Z, cmap=cmap, vmin=vmin, vmax=vmax)
    #mesh2 = ax2.contourf(Z, cmap=cmap, vmin=vmin, vmax=vmax)
    ax1.set_aspect('equal')
    ax1.invert_yaxis()
    #ax2.set_aspect('equal')
    #ax2.invert_yaxis()
    pyplot.colorbar(mesh1, ax=ax1)
    #pyplot.colorbar(mesh2, ax=ax2)
    pyplot.savefig(file_name, dpi=600)
    pyplot.clf()
Пример #4
0
def get_f_masks(xrs, miller_array):
    crystal_gridding = maptbx.crystal_gridding(
        unit_cell=xrs.unit_cell(),
        d_min=miller_array.d_min(),
        resolution_factor=1. / 4,
        symmetry_flags=maptbx.use_space_group_symmetry,
        space_group_info=xrs.space_group_info())
    mp = mmtbx.masks.mask_master_params.extract()
    mask_data = mmtbx.masks.mask_from_xray_structure(
        xray_structure=xrs,
        p1=True,
        solvent_radius=mp.solvent_radius,
        shrink_truncation_radius=mp.shrink_truncation_radius,
        for_structure_factors=True,
        n_real=crystal_gridding.n_real()).mask_data
    n = mask_data.all()
    mask_data1 = flex.double(flex.grid(n), 0)
    mask_data2 = flex.double(flex.grid(n), 0)
    I, J, K = range(n[0]), range(n[1]), range(n[2])
    for i in I:
        for j in J:
            for k in K:
                if (i < n[0] // 2 and j < n[1] // 2 and k < n[2] // 2):
                    mask_data1[i, j, k] = mask_data[i, j, k]
                else:
                    mask_data2[i, j, k] = mask_data[i, j, k]
    f_mask1 = miller_array.structure_factors_from_map(map=mask_data1,
                                                      use_scale=True,
                                                      anomalous_flag=False,
                                                      use_sg=False)
    f_mask2 = miller_array.structure_factors_from_map(map=mask_data2,
                                                      use_scale=True,
                                                      anomalous_flag=False,
                                                      use_sg=False)
    return [f_mask1.data(), f_mask2.data()]
Пример #5
0
def get_proposal_score(reports_as_lists):
    n_proposal_score = 0
    NN = len(reports_as_lists)  # = n_tranches x n_operators
    rij = flex.double(flex.grid(NN, NN), 0.)
    wij = flex.double(flex.grid(NN, NN), 1.)

    for ix in range(len(reports_as_lists)):
        base_report = reports_as_lists[ix]
        # compute the unions
        base_all = set(base_report[0])
        for icoset in range(1, len(base_report)):
            base_all = base_all.union(set(base_report[icoset]))

        for iy in range(len(reports_as_lists)):
            test_report = reports_as_lists[iy]
            matches = 0
            # compute the unions
            test_all = set(test_report[0])
            for icoset in range(1, len(test_report)):
                test_all = test_all.union(set(test_report[icoset]))
            # total overlap between base and test irrespective of cosets;
            total_overlay = len(base_all.intersection(test_all))

            for icoset in range(len(test_report)):
                matches += len(
                    set(base_report[icoset]).intersection(
                        set(test_report[icoset])))
            print('%3d/%3d' % (matches, total_overlay), end=' ')
            rij[(ix,
                 iy)] = matches / total_overlay if total_overlay > 0 else 0.
            wij[(ix, iy)] = total_overlay if total_overlay > 0 else 1.
            n_proposal_score += matches
        print()
    return rij, wij
Пример #6
0
    def plot_grid(
        values,
        grid,
        file_name,
        cmap=pyplot.cm.Reds,
        vmin=None,
        vmax=None,
        invalid="white",
    ):
        values = values.as_double()
        # At DLS, fast direction appears to be largest direction
        if grid[0] > grid[1]:
            values.reshape(flex.grid(reversed(grid)))
            values = values.matrix_transpose()
        else:
            values.reshape(flex.grid(grid))

        f, ax1 = pyplot.subplots(1)

        mesh1 = ax1.pcolormesh(values.as_numpy_array(), cmap=cmap, vmin=vmin, vmax=vmax)
        mesh1.cmap.set_under(color=invalid, alpha=None)
        mesh1.cmap.set_over(color=invalid, alpha=None)
        ax1.set_aspect("equal")
        ax1.invert_yaxis()
        pyplot.colorbar(mesh1, ax=ax1)
        pyplot.savefig(file_name, dpi=600)
        pyplot.clf()
Пример #7
0
 def __init__(
       self,
       crystal_gridding,
       crystal_symmetry,
       f_map=None,
       map_data=None,
       miller_array=None,
       d_min = None): #XXX =1: more features and noise
   # process inputs
   assert [f_map, map_data].count(None) == 1
   if(f_map is not None):
     import cctbx.miller
     fft_map = cctbx.miller.fft_map(
       crystal_gridding     = crystal_gridding,
       fourier_coefficients = f_map)
     fft_map.apply_sigma_scaling()
     map_data = fft_map.real_map_unpadded()
   #
   self.map_result = None
   self.map_coefficients = None
   b = boxes(
     n_real   = crystal_gridding.n_real(),
     fraction = 0.03)
   # Loop over boxes, fill map_result with one box at a time
   self.map_result = flex.double(flex.grid(b.n_real))
   for s,e in zip(b.starts, b.ends):
     box = copy(map_data, s, e)
     box.reshape(flex.grid(box.all()))
     mi,ma,me = box.as_1d().min_max_mean().as_tuple()
     if(mi < ma):
       box = volume_scale(map = box, n_bins = 1000).map_data()
     set_box(
       map_data_from = box,
       map_data_to   = self.map_result,
       start         = s,
       end           = e)
   sd = self.map_result.sample_standard_deviation()
   self.map_result = self.map_result/sd
   if(miller_array is not None):
     complete_set = miller_array
     if(d_min is not None):
       d_min = miller_array.d_min()
       complete_set = miller_array.complete_set(d_min=d_min)
     self.map_coefficients = complete_set.structure_factors_from_map(
       map            = self.map_result,
       use_scale      = True,
       anomalous_flag = False,
       use_sg         = False)
Пример #8
0
 def peak_search(self, parameters, map, verify_symmetry=True):
   if (parameters is None):
     parameters = peak_search_parameters()
   if (verify_symmetry and libtbx.env.full_testing):
     assert self._tags.verify(map)
   if (map.accessor().is_padded()):
     map = copy(map, flex.grid(map.focus()))
   grid_peaks = peak_list(
     data=map,
     tags=self._tags.tag_array(),
     peak_search_level=parameters.peak_search_level(),
     max_peaks=parameters.max_peaks(),
     peak_cutoff=parameters.peak_cutoff(),
     interpolate=parameters.interpolate())
   if (parameters.min_distance_sym_equiv() is None):
     return grid_peaks
   return peak_cluster_analysis(
     peak_list=grid_peaks,
     special_position_settings=crystal.special_position_settings(
       crystal_symmetry=self.crystal_symmetry(),
       min_distance_sym_equiv=parameters.min_distance_sym_equiv()),
     general_positions_only=parameters.general_positions_only(),
     effective_resolution=parameters.effective_resolution(),
     significant_height_fraction=parameters.significant_height_fraction(),
     cluster_height_fraction=parameters.cluster_height_fraction(),
     min_cross_distance=parameters.min_cross_distance(),
     max_clusters=parameters.max_clusters(),
     min_cubicle_edge=parameters.min_cubicle_edge())
def exercise_f000():
  miller_indices = flex.miller_index([(0,0,0)])
  data = flex.complex_double([1-2j])
  n_real = [1,2,3]
  conjugate_flag = True
  for hall_symbol in ["P 1", "P 3", "R 3*"]:
    for is_centric in [False, True]:
      if (not is_centric):
        space_group = sgtbx.space_group(hall_symbol)
      else:
        space_group.expand_smx("-x,-y,-z")
      for anomalous_flag in [False, True]:
        if (not anomalous_flag):
          rfft = fftpack.real_to_complex_3d(n_real)
          n_complex = rfft.n_complex()
        else:
          cfft = fftpack.complex_to_complex_3d(n_real)
          n_complex = cfft.n()
        for treat_restricted in [False, True]:
          map = maptbx.structure_factors.to_map(
            space_group=space_group,
            anomalous_flag=anomalous_flag,
            miller_indices=miller_indices,
            structure_factors=data,
            n_real=n_real,
            map_grid=flex.grid(n_complex),
            conjugate_flag=conjugate_flag,
            treat_restricted=treat_restricted)
          if (treat_restricted):
            assert approx_equal(
              map.complex_map()[0], data[0])
          else:
            assert approx_equal(
              map.complex_map()[0], data[0]*space_group.order_p())
Пример #10
0
  def plot_positions(values, positions, file_name, cmap=pyplot.cm.Reds,
                     vmin=None, vmax=None, invalid='white'):
    values = values.as_double()
    assert positions.size() >= values.size()
    positions = positions[:values.size()]

    if vmin is None:
      vmin = flex.min(values)
    if vmax is None:
      vmax = flex.max(values)

    x, y = positions.parts()
    dx = flex.abs(x[1:] - x[:-1])
    dy = flex.abs(y[1:] - y[:-1])
    dx = dx.select(dx > 0)
    dy = dy.select(dy > 0)

    scale = 1/flex.min(dx)
    #print scale
    x = (x * scale).iround()
    y = (y * scale).iround()

    from libtbx.math_utils import iceil
    z = flex.double(flex.grid(iceil(flex.max(y))+1, iceil(flex.max(x))+1), -2)
    #print z.all()
    for x_, y_, z_ in zip(x, y, values):
      z[y_, x_] = z_

    plot_grid(z.as_1d(), z.all(), file_name, cmap=cmap, vmin=vmin, vmax=vmax,
              invalid=invalid)
    return
Пример #11
0
  def hessian_transform(self,
                        original_hessian,
                        adp_constraints):
    constraint_matrix_tensor = matrix.rec(
      adp_constraints.gradient_sum_matrix(),
      adp_constraints.gradient_sum_matrix().focus())

    hessian_matrix = matrix.rec( original_hessian,
                                 original_hessian.focus())
      ## now create an expanded matrix
    rows=adp_constraints.gradient_sum_matrix().focus()[0]+1
    columns=adp_constraints.gradient_sum_matrix().focus()[1]+1
    expanded_constraint_array = flex.double(rows*columns,0)
    count_new=0
    count_old=0
    for ii in range(rows):
      for jj in range(columns):
        if (ii>0):
          if (jj>0):
            expanded_constraint_array[count_new]=\
               constraint_matrix_tensor[count_old]
            count_old+=1
        count_new+=1
      ## place the first element please
    expanded_constraint_array[0]=1
    result=matrix.rec(  expanded_constraint_array,
                        (rows, columns) )
    #print result.mathematica_form()
    new_hessian = result *  hessian_matrix * result.transpose()
    result = flex.double(new_hessian)
    result.resize(flex.grid( new_hessian.n ) )
    return(result)
Пример #12
0
  def plot_positions(values, positions, file_name, cmap=pyplot.cm.Reds,
                     vmin=None, vmax=None, invalid='white'):
    values = values.as_double()
    assert positions.size() >= values.size()
    positions = positions[:values.size()]

    if vmin is None:
      vmin = flex.min(values)
    if vmax is None:
      vmax = flex.max(values)

    x, y = positions.parts()
    dx = flex.abs(x[1:] - x[:-1])
    dy = flex.abs(y[1:] - y[:-1])
    dx = dx.select(dx > 0)
    dy = dy.select(dy > 0)

    scale = 1/flex.min(dx)
    #print scale
    x = (x * scale).iround()
    y = (y * scale).iround()

    from libtbx.math_utils import iceil
    z = flex.double(flex.grid(iceil(flex.max(y))+1, iceil(flex.max(x))+1), -2)
    #print z.all()
    for x_, y_, z_ in zip(x, y, values):
      z[y_, x_] = z_

    plot_grid(z.as_1d(), z.all(), file_name, cmap=cmap, vmin=vmin, vmax=vmax,
              invalid=invalid)
    return
  def map_to_grid(self, sweep, centroids):
    b_iso = 200
    beam = sweep.get_beam()
    wavelength = beam.get_wavelength()
    d_min = self.d_min

    n_points = self.gridding[0]
    rlgrid = 2 / (d_min * n_points)

    # real space FFT grid dimensions
    cell_lengths = [n_points * d_min/2 for i in range(3)]
    self.fft_cell = uctbx.unit_cell(cell_lengths+[90]*3)
    self.crystal_symmetry = crystal.symmetry(unit_cell=self.fft_cell,
                                             space_group_symbol="P1")

    print "FFT gridding: (%i,%i,%i)" %self.gridding

    grid = flex.double(flex.grid(self.gridding), 0)

    reflections_used_for_indexing = flex.size_t()

    for i_pnt, point in enumerate(centroids):
      point = scitbx.matrix.col(point)
      spot_resolution = 1/point.length()
      if spot_resolution < d_min:
        continue

      grid_coordinates = [int(round(point[i]/rlgrid)+n_points/2) for i in range(3)]
      if max(grid_coordinates) >= n_points: continue # this reflection is outside the grid
      if min(grid_coordinates) < 0: continue # this reflection is outside the grid
      T = math.exp(b_iso * point.length()**2 / 4)
      grid[grid_coordinates] = T

    self.reciprocal_space_grid = grid
def exercise_f000():
    miller_indices = flex.miller_index([(0, 0, 0)])
    data = flex.complex_double([1 - 2j])
    n_real = [1, 2, 3]
    conjugate_flag = True
    for hall_symbol in ["P 1", "P 3", "R 3*"]:
        for is_centric in [False, True]:
            if (not is_centric):
                space_group = sgtbx.space_group(hall_symbol)
            else:
                space_group.expand_smx("-x,-y,-z")
            for anomalous_flag in [False, True]:
                if (not anomalous_flag):
                    rfft = fftpack.real_to_complex_3d(n_real)
                    n_complex = rfft.n_complex()
                else:
                    cfft = fftpack.complex_to_complex_3d(n_real)
                    n_complex = cfft.n()
                for treat_restricted in [False, True]:
                    map = maptbx.structure_factors.to_map(
                        space_group=space_group,
                        anomalous_flag=anomalous_flag,
                        miller_indices=miller_indices,
                        structure_factors=data,
                        n_real=n_real,
                        map_grid=flex.grid(n_complex),
                        conjugate_flag=conjugate_flag,
                        treat_restricted=treat_restricted)
                    if (treat_restricted):
                        assert approx_equal(map.complex_map()[0], data[0])
                    else:
                        assert approx_equal(map.complex_map()[0],
                                            data[0] * space_group.order_p())
Пример #15
0
def exercise_sample_all_mask_regions():
  cmap = flex.double(flex.grid(30,30,30))
  cmap.fill(1)
  for i in range(0,10):
    for j in range(0,10):
      for k in range(0,10):
        cmap[i,j,k] = 10
  for i in range(15,25):
    for j in range(15,25):
      for k in range(15,25):
        cmap[i,j,k] = 20
  co = maptbx.connectivity(map_data=cmap, threshold=5, wrapping=False)
  uc = uctbx.unit_cell((10,10,10))
  mask_result = co.result()

  sample_regs_obj = maptbx.sample_all_mask_regions(
      mask=mask_result,
      volumes=flex.int([0, 1000,1000]),
      sampling_rates=flex.int([0, 10,10]),
      unit_cell=uc)
  a = sample_regs_obj.get_array(1)
  b = sample_regs_obj.get_array(2)

  assert a.size() == b.size() == 101
  assert approx_equal(a[0], (0,0,0))
  assert approx_equal(b[0], (5,5,5))
Пример #16
0
 def get_map():
   av = [random.random() for i in xrange(10*20*30)]
   m = flex.double(av)
   m = m-flex.min(m)
   m = m/flex.max(m)
   m.resize(flex.grid((10,20,30)))
   return m
Пример #17
0
  def prepare_target_map(self): # XXX This may need to go external
    if self.map_data is None:
      # This just makes dummy map to allow functionality working without it.
      self.map_data = flex.double(flex.grid(50,50,50), 0)

    map_data = self.map_data.deep_copy()
    # truncate map
    selection = self.atom_selection_cache.selection(
      string = "element C or element O or element N")
    mean_atom = flex.double()
    for i_a, a in enumerate(list(self.pdb_hierarchy.atoms())):
      if(selection[i_a]):
        site_frac = self.crystal_symmetry.unit_cell().fractionalize(a.xyz)
        mean_atom.append(map_data.eight_point_interpolation(site_frac))
    mean_atom = flex.mean(mean_atom)
    map_data = map_data.set_selected(map_data>mean_atom, mean_atom)
    # Blend maps if applicable
    if(self.diff_map_data is not None):
      diff_map_data = self.diff_map_data.deep_copy()
      sel = diff_map_data < 2.
      diff_map_data = diff_map_data.set_selected(sel, 0)
      sel = diff_map_data > 3.
      diff_map_data = diff_map_data.set_selected(sel, 3)
      diff_map_data = diff_map_data/3.
      maptbx.combine_1(map_data=map_data, diff_map=diff_map_data)
    return map_data
Пример #18
0
def calculate_exp_i_two_phi_peaks(xray_structure, d_min,
                                  min_peak_distance,
                                  max_reduced_peaks):
  f_h = xray_structure.structure_factors(
    anomalous_flag=False,
    d_min=d_min).f_calc()
  two_i_phi_h = miller.array(
    miller_set=f_h,
    data=flex.polar(1, flex.arg(f_h.data())*2))
  fft_map = two_i_phi_h.fft_map(
    d_min=d_min,
    symmetry_flags=maptbx.use_space_group_symmetry)
  real_map = fft_map.real_map()
  real_map = maptbx.copy(real_map, flex.grid(real_map.focus()))
  stats = maptbx.statistics(real_map)
  if (stats.max() != 0):
    real_map /= abs(stats.max())
  grid_tags = maptbx.grid_tags(real_map.focus())
  grid_tags.build(fft_map.space_group_info().type(), fft_map.symmetry_flags())
  grid_tags.verify(real_map)
  peak_list = maptbx.peak_list(
    data=real_map,
    tags=grid_tags.tag_array(),
    max_peaks=10*max_reduced_peaks,
    interpolate=True)
  reduced_peaks = peak_cluster_reduction(
    crystal_symmetry=xray_structure,
    peak_list=peak_list,
    min_peak_distance=min_peak_distance,
    max_reduced_peaks=max_reduced_peaks)
  return reduced_peaks
Пример #19
0
 def peak_search(self, parameters, map, verify_symmetry=True):
     if (parameters is None):
         parameters = peak_search_parameters()
     if (verify_symmetry and libtbx.env.full_testing):
         assert self._tags.verify(map)
     if (map.accessor().is_padded()):
         map = copy(map, flex.grid(map.focus()))
     grid_peaks = peak_list(
         data=map,
         tags=self._tags.tag_array(),
         peak_search_level=parameters.peak_search_level(),
         max_peaks=parameters.max_peaks(),
         peak_cutoff=parameters.peak_cutoff(),
         interpolate=parameters.interpolate())
     if (parameters.min_distance_sym_equiv() is None):
         return grid_peaks
     return peak_cluster_analysis(
         peak_list=grid_peaks,
         special_position_settings=crystal.special_position_settings(
             crystal_symmetry=self.crystal_symmetry(),
             min_distance_sym_equiv=parameters.min_distance_sym_equiv()),
         general_positions_only=parameters.general_positions_only(),
         effective_resolution=parameters.effective_resolution(),
         significant_height_fraction=parameters.significant_height_fraction(
         ),
         cluster_height_fraction=parameters.cluster_height_fraction(),
         min_cross_distance=parameters.min_cross_distance(),
         max_clusters=parameters.max_clusters(),
         min_cubicle_edge=parameters.min_cubicle_edge())
Пример #20
0
def exercise_average_density():
  map = test_map.deep_copy()
  map.resize(flex.grid(4,5,6))
  sites_frac = flex.vec3_double([
    (-0.8492400683111605, 0.49159543530354166, 0.55624239788303198),
    (0.10631567870879444, -0.38726326483005269, -0.13581656178827783),
    (0.1895918946688977, -0.25027164520003642, -0.61981792226895172),
    (-0.88980846616667897, -0.79492758628794169, 0.015347308715653485)])
  unit_cell = uctbx.unit_cell((130,130,288,90,90,120))
  densities = maptbx.average_densities(
    unit_cell=unit_cell,
    data=map,
    sites_frac=sites_frac,
    radius=5)
  assert approx_equal(densities, [0,0,0,0])
  densities = maptbx.average_densities(
    unit_cell=unit_cell,
    data=map,
    sites_frac=sites_frac,
    radius=50)
  assert approx_equal(densities, [
    -0.27089094117647061,
    -0.34313799999999994,
    -0.2644232307692308,
    -0.20403226666666666])
Пример #21
0
  def map_centroids_to_reciprocal_space_grid(self):
    d_min = self.params.fft3d.reciprocal_space_grid.d_min

    n_points = self.gridding[0]
    rlgrid = 2 / (d_min * n_points)

    # real space FFT grid dimensions
    cell_lengths = [n_points * d_min/2 for i in range(3)]
    self.fft_cell = uctbx.unit_cell(cell_lengths+[90]*3)
    self.crystal_symmetry = crystal.symmetry(unit_cell=self.fft_cell,
                                             space_group_symbol="P1")

    logger.info("FFT gridding: (%i,%i,%i)" %self.gridding)

    grid = flex.double(flex.grid(self.gridding), 0)

    selection = self.reflections['id'] == -1

    if self.params.b_iso is libtbx.Auto:
      self.params.b_iso = -4 * d_min**2 * math.log(0.05)
      logger.debug("Setting b_iso = %.1f" %self.params.b_iso)
    from dials.algorithms.indexing import map_centroids_to_reciprocal_space_grid
    map_centroids_to_reciprocal_space_grid(
      grid, self.reflections['rlp'], selection,
      d_min, b_iso=self.params.b_iso)
    reflections_used_for_indexing = selection.iselection()

    self.reciprocal_space_grid = grid
    self.reflections_used_for_indexing = reflections_used_for_indexing
Пример #22
0
            def show_plot(widegrid, excursi):
                excursi.reshape(flex.grid(widegrid, widegrid))
                plot_max = flex.max(excursi)
                idx_max = flex.max_index(excursi)

                def igrid(x):
                    return x - (widegrid // 2)

                idxs = [igrid(i) * plot_px_sz for i in xrange(widegrid)]

                from matplotlib import pyplot as plt
                plt.figure()
                CS = plt.contour(
                    [igrid(i) * plot_px_sz for i in xrange(widegrid)],
                    [igrid(i) * plot_px_sz for i in xrange(widegrid)],
                    excursi.as_numpy_array())
                plt.clabel(CS, inline=1, fontsize=10, fmt="%6.3f")
                plt.title("Wide scope search for detector origin offset")
                plt.scatter([0.0], [0.0], color='g', marker='o')
                plt.scatter([new_offset[0]], [new_offset[1]],
                            color='r',
                            marker='*')
                plt.scatter([idxs[idx_max % widegrid]],
                            [idxs[idx_max // widegrid]],
                            color='k',
                            marker='s')
                plt.axes().set_aspect("equal")
                plt.xlabel("offset (mm) along beamr1 vector")
                plt.ylabel("offset (mm) along beamr2 vector")
                plt.savefig("search_scope.png")

                #changing value
                trial_origin_offset = (idxs[idx_max % widegrid]) * beamr1 + (
                    idxs[idx_max // widegrid]) * beamr2
                return trial_origin_offset
Пример #23
0
 def _massage_map(self):
     self.ma.add("  input map (min,max,mean): %s" % self._map_mmm_str())
     #
     self.map_data = self.map_data - flex.mean(self.map_data)
     self.map_data = self.map_data.set_selected(self.map_data < 0, 0)
     sd = self.map_data.sample_standard_deviation()
     assert sd != 0
     self.map_data = self.map_data / sd
     self.ma.add("  re-scaled map (min,max,mean): %s" % self._map_mmm_str())
     if (self.debug):
         self._write_map(file_name="rescaled.mrc")
     #
     a, b, c = self.unit_cell.parameters()[:3]
     n_real = self.map_data.accessor().all()
     sx, sy, sz = a / n_real[0], b / n_real[1], c / n_real[2]
     self.ma.add("  input map dimenstions: %d %d %d" % n_real)
     self.ma.add("  input map grid steps (A): %s %s %s" %
                 (("%6.3f" % sx).strip(), ("%6.3f" % sy).strip(),
                  ("%6.3f" % sz).strip()))
     if (max(sx, sy, sz) > self.step):
         n_real_fine = (int(a / self.step), int(b / self.step),
                        int(c / self.step))
         self.ma.add("  re-sampled map dimenstions: %d %d %d" % n_real_fine)
         map_fine = flex.double(flex.grid(n_real_fine), 0)
         maptbx.resample(map_data=self.map_data,
                         map_data_new=map_fine,
                         unit_cell=self.unit_cell)
         self.map_data = map_fine
         self.ma.add("  input map (min,max,mean): %s" % self._map_mmm_str())
     if (self.debug):
         self._write_map(file_name="resampled.mrc")
      def show_plot(widegrid,excursi):
        excursi.reshape(flex.grid(widegrid, widegrid))
        plot_max = flex.max(excursi)
        idx_max = flex.max_index(excursi)

        def igrid(x): return x - (widegrid//2)
        idxs = [igrid(i)*plot_px_sz for i in xrange(widegrid)]

        from matplotlib import pyplot as plt
        plt.figure()
        CS = plt.contour([igrid(i)*plot_px_sz for i in xrange(widegrid)],
                         [igrid(i)*plot_px_sz for i in xrange(widegrid)], excursi.as_numpy_array())
        plt.clabel(CS, inline=1, fontsize=10, fmt="%6.3f")
        plt.title("Wide scope search for detector origin offset")
        plt.scatter([0.0],[0.0],color='g',marker='o')
        plt.scatter([new_offset[0]] , [new_offset[1]],color='r',marker='*')
        plt.scatter([idxs[idx_max%widegrid]] , [idxs[idx_max//widegrid]],color='k',marker='s')
        plt.axes().set_aspect("equal")
        plt.xlabel("offset (mm) along beamr1 vector")
        plt.ylabel("offset (mm) along beamr2 vector")
        plt.show()

        #changing value
        trial_origin_offset =  (idxs[idx_max%widegrid])*beamr1 + (idxs[idx_max//widegrid])*beamr2
        return trial_origin_offset
Пример #25
0
def direct_space_squaring(start, selection_fixed):
    map_gridding = miller.index_span(
        miller.set.expand_to_p1(start).indices()).map_grid()
    if (selection_fixed is None):
        fixed = start
        var = start
    else:
        fixed = start.select(selection_fixed)
        var = start.select(~selection_fixed)
    rfft = fftpack.real_to_complex_3d([n * 3 // 2 for n in map_gridding])
    conjugate_flag = True
    structure_factor_map = maptbx.structure_factors.to_map(
        space_group=fixed.space_group(),
        anomalous_flag=fixed.anomalous_flag(),
        miller_indices=fixed.indices(),
        structure_factors=fixed.data(),
        n_real=rfft.n_real(),
        map_grid=flex.grid(rfft.n_complex()),
        conjugate_flag=conjugate_flag)
    real_map = rfft.backward(structure_factor_map.complex_map())
    squared_map = flex.pow2(real_map)
    squared_sf_map = rfft.forward(squared_map)
    allow_miller_indices_outside_map = False
    from_map = maptbx.structure_factors.from_map(
        anomalous_flag=var.anomalous_flag(),
        miller_indices=var.indices(),
        complex_map=squared_sf_map,
        conjugate_flag=conjugate_flag,
        allow_miller_indices_outside_map=allow_miller_indices_outside_map)
    if (selection_fixed is None):
        return from_map.data()
    result = start.data().deep_copy()
    result.set_selected(~selection_fixed, from_map.data())
    assert result.select(selection_fixed).all_eq(fixed.data())
    return result
Пример #26
0
  def hessian_transform(self,
                        original_hessian,
                        adp_constraints):
    constraint_matrix_tensor = matrix.rec(
      adp_constraints.gradient_sum_matrix(),
      adp_constraints.gradient_sum_matrix().focus())

    hessian_matrix = matrix.rec( original_hessian,
                                 original_hessian.focus())
      ## now create an expanded matrix
    rows=adp_constraints.gradient_sum_matrix().focus()[0]+1
    columns=adp_constraints.gradient_sum_matrix().focus()[1]+1
    expanded_constraint_array = flex.double(rows*columns,0)
    count_new=0
    count_old=0
    for ii in range(rows):
      for jj in range(columns):
        if (ii>0):
          if (jj>0):
            expanded_constraint_array[count_new]=\
               constraint_matrix_tensor[count_old]
            count_old+=1
        count_new+=1
      ## place the first element please
    expanded_constraint_array[0]=1
    result=matrix.rec(  expanded_constraint_array,
                        (rows, columns) )
    #print result.mathematica_form()
    new_hessian = result *  hessian_matrix * result.transpose()
    result = flex.double(new_hessian)
    result.resize(flex.grid( new_hessian.n ) )
    return(result)
Пример #27
0
def python_tensor_constraints(self, reciprocal_space):
    """row-reduced echelon form of coefficients
       r.transpose() * t * r - t = 0
     Mathematica code:
       r={{r0,r1,r2},{r3,r4,r5},{r6,r7,r8}}
       t={{t0,t3,t4},{t3,t1,t5},{t4,t5,t2}}
       FortranForm[Expand[Transpose[r].t.r - t]]
  """
    result = flex.int()
    for s in self.smx():
        r = s.r()
        if (reciprocal_space):
            r = r.transpose()
        r0, r1, r2, r3, r4, r5, r6, r7, r8 = r.num()
        result.extend(
            flex.int(
                (r0 * r0 - 1, r3 * r3, r6 * r6, 2 * r0 * r3, 2 * r0 * r6,
                 2 * r3 * r6, r1 * r1, r4 * r4 - 1, r7 * r7, 2 * r1 * r4,
                 2 * r1 * r7, 2 * r4 * r7, r2 * r2, r5 * r5, r8 * r8 - 1,
                 2 * r2 * r5, 2 * r2 * r8, 2 * r5 * r8, r0 * r1, r3 * r4,
                 r6 * r7, r1 * r3 + r0 * r4 - 1, r1 * r6 + r0 * r7,
                 r4 * r6 + r3 * r7, r0 * r2, r3 * r5, r6 * r8,
                 r2 * r3 + r0 * r5, r2 * r6 + r0 * r8 - 1, r5 * r6 + r3 * r8,
                 r1 * r2, r4 * r5, r7 * r8, r2 * r4 + r1 * r5,
                 r2 * r7 + r1 * r8, r5 * r7 + r4 * r8 - 1)))
    result.resize(flex.grid(result.size() // 6, 6))
    scitbx.math.row_echelon_form(result)
    return result
Пример #28
0
  def show_plot(OO,excursi,rmsdpos,minimum):
      excursi.reshape(flex.grid(len(OO.grid), len(OO.grid)))
      rmsdpos.reshape(flex.grid(len(OO.grid), len(OO.grid)))

      from matplotlib import pyplot as plt
      plt.figure()
      CS = plt.contour([i*0.02 for i in OO.grid],[i*0.02 for i in OO.grid], excursi.as_numpy_array())
      plt.clabel(CS, inline=1, fontsize=10, fmt="%6.3f"+unichr(176))
      plt.plot([minimum[1]*180./math.pi],[minimum[0]*180./math.pi], "r+")
      plt.title("Rms rotational excursion to reflection condition, degrees")
      plt.axes().set_aspect("equal")
      plt.figure()
      CS = plt.contour([i*0.02 for i in OO.grid],[i*0.02 for i in OO.grid], rmsdpos.as_numpy_array())
      plt.clabel(CS, inline=1, fontsize=10, fmt="%7.4f px")
      plt.title("Rms position shift, obs vs. model, pixels")
      plt.axes().set_aspect("equal")
      plt.show()
Пример #29
0
  def show_plot(OO,excursi,rmsdpos,minimum):
      excursi.reshape(flex.grid(len(OO.grid), len(OO.grid)))
      rmsdpos.reshape(flex.grid(len(OO.grid), len(OO.grid)))

      from matplotlib import pyplot as plt
      plt.figure()
      CS = plt.contour([i*0.02 for i in OO.grid],[i*0.02 for i in OO.grid], excursi.as_numpy_array())
      plt.clabel(CS, inline=1, fontsize=10, fmt="%6.3f"+unichr(176))
      plt.plot([minimum[1]*180./math.pi],[minimum[0]*180./math.pi], "r+")
      plt.title("Rms rotational excursion to reflection condition, degrees")
      plt.axes().set_aspect("equal")
      plt.figure()
      CS = plt.contour([i*0.02 for i in OO.grid],[i*0.02 for i in OO.grid], rmsdpos.as_numpy_array())
      plt.clabel(CS, inline=1, fontsize=10, fmt="%7.4f px")
      plt.title("Rms position shift, obs vs. model, pixels")
      plt.axes().set_aspect("equal")
      plt.show()
Пример #30
0
def exercise_peak_search():
  t = flex.long(flex.grid((3,4,5)))
  for flex_type in flex_types():
    d = flex_type(flex.grid((3,4,5)))
    l = maptbx.peak_list(d, t, peak_search_level=0, interpolate=False)
    assert l.gridding() == d.focus()
    assert l.grid_indices(0) == (0,0,0)
    assert list(l.grid_heights()) == [0]
    assert list(l.sites()) == [(0,0,0)]
    assert list(l.heights()) == [0]
    l = maptbx.peak_list(
      d, t, peak_search_level=0,peak_cutoff=-1, interpolate=False)
    assert l.gridding() == d.focus()
    assert l.grid_indices(0) == (0,0,0)
    assert list(l.grid_heights()) == [0]
    assert list(l.sites()) == [(0,0,0)]
    assert list(l.heights()) == [0]
Пример #31
0
 def get_ma(n1,n2,n3, points):
   ma = maptbx.map_accumulator(n_real = (n1,n2,n3), use_max_map=False)
   for value in points:
     m = [value for i in xrange(n1*n2*n3)]
     m = flex.double(m)
     m.resize(flex.grid((n1,n2,n3)))
     ma.add(map_data=m)
   return ma
Пример #32
0
 def compute_i_mask_asu(self, selection, volume):
     mask_i = flex.double(flex.grid(self.n_real), 0)
     mask_i = mask_i.set_selected(selection, 1)
     if (self.write_masks):
         write_map_file(crystal_symmetry=self.crystal_symmetry,
                        map_data=mask_i,
                        file_name="mask_%s.mrc" % str(round(volume, 3)))
     return asu_map_ext.asymmetric_map(
         self.crystal_symmetry.space_group().type(), mask_i).data()
Пример #33
0
def main(filenames, map_file, npoints=192, max_resolution=6, reverse_phi=False):
    rec_range = 1 / max_resolution

    image = ImageFactory(filenames[0])
    panel = image.get_detector()[0]
    beam = image.get_beam()
    s0 = beam.get_s0()
    pixel_size = panel.get_pixel_size()
    
    xlim, ylim = image.get_raw_data().all()
    
    xy = recviewer.get_target_pixels(panel, s0, xlim, ylim, max_resolution)
    
    s1 = panel.get_lab_coord(xy * pixel_size[0]) # FIXME: assumed square pixel
    s1 = s1 / s1.norms() * (1 / beam.get_wavelength()) # / is not supported...
    S = s1 - s0
    
    grid = flex.double(flex.grid(npoints, npoints, npoints), 0)
    cnts = flex.int(flex.grid(npoints, npoints, npoints), 0)
    
    for filename in filenames:
        print "Processing image", filename
        try:
            fill_voxels(ImageFactory(filename), grid, cnts, S, xy, reverse_phi, rec_range)
        except:
            print " Failed to process. Skipped this."
        
    recviewer.normalize_voxels(grid, cnts)
    
    uc = uctbx.unit_cell((npoints, npoints, npoints, 90, 90, 90))
    ccp4_map.write_ccp4_map(map_file, uc, sgtbx.space_group("P1"), 
                            (0, 0, 0), grid.all(), grid, 
                            flex.std_string(["cctbx.miller.fft_map"]))
    return
    from scitbx import fftpack
    fft = fftpack.complex_to_complex_3d(grid.all())
    grid_complex = flex.complex_double(
                            reals=flex.pow2(grid),
                            imags=flex.double(grid.size(), 0))
    grid_transformed = flex.abs(fft.backward(grid_complex))
    print flex.max(grid_transformed), flex.min(grid_transformed), grid_transformed.all()
    ccp4_map.write_ccp4_map(map_file, uc, sgtbx.space_group("P1"), 
                            (0, 0, 0), grid.all(), grid_transformed,
                            flex.std_string(["cctbx.miller.fft_map"]))
Пример #34
0
 def __init__(self,
              crystal_gridding,
              crystal_symmetry,
              f_map=None,
              map_data=None,
              miller_array=None,
              d_min=None):  #XXX =1: more features and noise
     # process inputs
     assert [f_map, map_data].count(None) == 1
     if (f_map is not None):
         import cctbx.miller
         fft_map = cctbx.miller.fft_map(crystal_gridding=crystal_gridding,
                                        fourier_coefficients=f_map)
         fft_map.apply_sigma_scaling()
         map_data = fft_map.real_map_unpadded()
     #
     self.map_result = None
     self.map_coefficients = None
     b = boxes(n_real=crystal_gridding.n_real(), fraction=0.03)
     # Loop over boxes, fill map_result with one box at a time
     self.map_result = flex.double(flex.grid(b.n_real))
     for s, e in zip(b.starts, b.ends):
         box = copy(map_data, s, e)
         box.reshape(flex.grid(box.all()))
         mi, ma, me = box.as_1d().min_max_mean().as_tuple()
         if (mi < ma):
             box = volume_scale(map=box, n_bins=1000).map_data()
         set_box(map_data_from=box,
                 map_data_to=self.map_result,
                 start=s,
                 end=e)
     sd = self.map_result.sample_standard_deviation()
     self.map_result = self.map_result / sd
     if (miller_array is not None):
         complete_set = miller_array
         if (d_min is not None):
             d_min = miller_array.d_min()
             complete_set = miller_array.complete_set(d_min=d_min)
         self.map_coefficients = complete_set.structure_factors_from_map(
             map=self.map_result,
             use_scale=True,
             anomalous_flag=False,
             use_sg=False)
Пример #35
0
def intersection(cuts):
  assert len(cuts) == 3
  m = flex.int()
  t = flex.int()
  denominator = 1
  for cut in cuts:
    denominator = cut.lcm_of_denominators(start_lcm=denominator)
  for cut in cuts:
    for e in cut.n: m.append(int(e * denominator))
    t.append(-int(cut.c * denominator))
  m.reshape(flex.grid(3,3))
  t.reshape(flex.grid(3,1))
  r = scitbx.math.row_echelon_form_t(m, t)
  assert r in (2,3)
  if (r != 3): return None
  t.reshape(flex.grid(3))
  sol = flex.int(3)
  d = scitbx.math.row_echelon_back_substitution_int(m, t, sol)
  assert d > 0
  return tuple([rational.int(s,d) for s in sol])
Пример #36
0
def d2_dw_d_u_star_d_u_star_finite(h, u_star, eps=1.e-6):
  result = flex.double()
  for ip in xrange(len(u_star)):
    vs = []
    for signed_eps in [eps,-eps]:
      u_star_eps = list(u_star)
      u_star_eps[ip] += signed_eps
      vs.append(d_dw_d_u_star_analytical(h, u_star_eps))
    result.extend((vs[0]-vs[1])/(2*eps))
  result.reshape(flex.grid(6,6))
  return result.matrix_symmetric_as_packed_u(relative_epsilon=1.e-5)
Пример #37
0
    def compute_shoebox_overlap_fraction(self, overlaps):
        '''
    Compute the fraction of shoebox overlapping.

    :param overlaps: The list of overlaps
    :return: The fraction of shoebox overlapped with other reflections

    '''
        from dials.array_family import flex
        result = flex.double(len(self))
        bbox = self['bbox']
        for i in range(len(self)):
            b1 = bbox[i]
            xs = b1[1] - b1[0]
            ys = b1[3] - b1[2]
            zs = b1[5] - b1[4]
            assert (xs > 0)
            assert (ys > 0)
            assert (zs > 0)
            mask = flex.bool(flex.grid(zs, ys, xs), False)
            for edge in overlaps.adjacent_vertices(i):
                b2 = bbox[edge]
                x0 = b2[0] - b1[0]
                x1 = b2[1] - b1[0]
                y0 = b2[2] - b1[2]
                y1 = b2[3] - b1[2]
                z0 = b2[4] - b1[4]
                z1 = b2[5] - b1[4]
                if x0 < 0: x0 = 0
                if y0 < 0: y0 = 0
                if z0 < 0: z0 = 0
                if x1 > xs: x1 = xs
                if y1 > ys: y1 = ys
                if z1 > zs: z1 = zs
                assert (x1 > x0)
                assert (y1 > y0)
                assert (z1 > z0)
                m2 = flex.bool(flex.grid(z1 - z0, y1 - y0, x1 - x0), True)
                mask[z0:z1, y0:y1, x0:x1] = m2
            result[i] = (1.0 * mask.count(True)) / mask.size()
        return result
Пример #38
0
  def compute_shoebox_overlap_fraction(self, overlaps):
    '''
    Compute the fraction of shoebox overlapping.

    :param overlaps: The list of overlaps
    :return: The fraction of shoebox overlapped with other reflections

    '''
    from dials.array_family import flex
    result = flex.double(len(self))
    bbox = self['bbox']
    for i in range(len(self)):
      b1 = bbox[i]
      xs = b1[1] - b1[0]
      ys = b1[3] - b1[2]
      zs = b1[5] - b1[4]
      assert(xs > 0)
      assert(ys > 0)
      assert(zs > 0)
      mask = flex.bool(flex.grid(zs,ys,xs),False)
      for edge in overlaps.adjacent_vertices(i):
        b2 = bbox[edge]
        x0 = b2[0]-b1[0]
        x1 = b2[1]-b1[0]
        y0 = b2[2]-b1[2]
        y1 = b2[3]-b1[2]
        z0 = b2[4]-b1[4]
        z1 = b2[5]-b1[4]
        if x0 < 0: x0 = 0
        if y0 < 0: y0 = 0
        if z0 < 0: z0 = 0
        if x1 > xs: x1 = xs
        if y1 > ys: y1 = ys
        if z1 > zs: z1 = zs
        assert(x1 > x0)
        assert(y1 > y0)
        assert(z1 > z0)
        m2 = flex.bool(flex.grid(z1-z0,y1-y0,x1-x0),True)
        mask[z0:z1,y0:y1,x0:x1] = m2
      result[i] = (1.0*mask.count(True)) / mask.size()
    return result
Пример #39
0
def d2_dw_d_u_indep_d_u_indep_finite(adp_constraints, h, u_indep, eps=1.e-6):
  result = flex.double()
  for i_indep in xrange(len(u_indep)):
    vs = []
    for signed_eps in [eps,-eps]:
      u_indep_eps = list(u_indep)
      u_indep_eps[i_indep] += signed_eps
      vs.append(d_dw_d_u_indep_finite(adp_constraints, h, u_indep_eps))
    result.extend((vs[0]-vs[1])/(2*eps))
  np = len(u_indep)
  result.reshape(flex.grid(np,np))
  return result.matrix_symmetric_as_packed_u(relative_epsilon=1.e-5)
Пример #40
0
def intersection(cuts):
    assert len(cuts) == 3
    m = flex.int()
    t = flex.int()
    denominator = 1
    for cut in cuts:
        denominator = cut.lcm_of_denominators(start_lcm=denominator)
    for cut in cuts:
        for e in cut.n:
            m.append(int(e * denominator))
        t.append(-int(cut.c * denominator))
    m.reshape(flex.grid(3, 3))
    t.reshape(flex.grid(3, 1))
    r = scitbx.math.row_echelon_form_t(m, t)
    assert r in (2, 3)
    if (r != 3): return None
    t.reshape(flex.grid(3))
    sol = flex.int(3)
    d = scitbx.math.row_echelon_back_substitution_int(m, t, sol)
    assert d > 0
    return tuple([rational.int(s, d) for s in sol])
Пример #41
0
def exercise_covariance():
  xs = xray.structure(
    crystal_symmetry=crystal.symmetry(
      (5.01,5.01,5.47,90,90,120), "P6222"),
    scatterers=flex.xray_scatterer([
      xray.scatterer("Si", (1/2.,1/2.,1/3.)),
      xray.scatterer("O", (0.197,-0.197,0.83333))]))
  uc = xs.unit_cell()
  flags = xs.scatterer_flags()
  for f in flags:
    f.set_grad_site(True)
  xs.set_scatterer_flags(flags)
  cov = flex.double((1e-8,1e-9,2e-9,3e-9,4e-9,5e-9,
                          2e-8,1e-9,2e-9,3e-9,4e-9,
                               3e-8,1e-9,2e-9,3e-9,
                                    2e-8,1e-9,2e-9,
                                         3e-8,1e-9,
                                              4e-8))
  param_map = xs.parameter_map()
  assert approx_equal(cov,
    covariance.extract_covariance_matrix_for_sites(flex.size_t([0,1]), cov, param_map))
  cov_cart = covariance.orthogonalize_covariance_matrix(cov, uc, param_map)
  O = matrix.sqr(uc.orthogonalization_matrix())
  for i in range(param_map.n_scatterers):
    cov_i = covariance.extract_covariance_matrix_for_sites(flex.size_t([i]), cov, param_map)
    cov_i_cart = covariance.extract_covariance_matrix_for_sites(flex.size_t([i]), cov_cart, param_map)
    assert approx_equal(
      O * matrix.sym(sym_mat3=cov_i) * O.transpose(),
      matrix.sym(sym_mat3=cov_i_cart).as_mat3())
  for f in flags: f.set_grads(False)
  flags[0].set_grad_u_aniso(True)
  flags[0].set_use_u_aniso(True)
  flags[1].set_grad_u_iso(True)
  flags[1].set_use_u_iso(True)
  xs.set_scatterer_flags(flags)
  param_map = xs.parameter_map()
  cov = flex.double(7*7, 0)
  cov.reshape(flex.grid(7,7))
  cov.matrix_diagonal_set_in_place(flex.double([i for i in range(7)]))
  cov = cov.matrix_symmetric_as_packed_u()
  assert approx_equal([i for i in range(6)],
                      covariance.extract_covariance_matrix_for_u_aniso(
                        0, cov, param_map).matrix_packed_u_diagonal())
  assert covariance.variance_for_u_iso(1, cov, param_map) == 6
  try: covariance.variance_for_u_iso(0, cov, param_map)
  except RuntimeError: pass
  else: raise Exception_expected
  try: covariance.extract_covariance_matrix_for_u_aniso(1, cov, param_map)
  except RuntimeError: pass
  else: raise Exception_expected
  approx_equal(covariance.extract_covariance_matrix_for_sites(
    flex.size_t([1]), cov, param_map), (0,0,0,0,0,0))
Пример #42
0
        def build_up(pfh, objective_only=False):
          residuals = pfh.fvec_callable(pfh.x)

          pfh.reset()
          if objective_only:
            pfh.add_residuals(residuals, weights=None)
          else:
            grad_r = pfh.jacobian_callable(pfh.x)
            jacobian = flex.double(
              flex.grid(len(I_ref), pfh.n_parameters))
            for j, der_r in enumerate(grad_r):
              jacobian.matrix_paste_column_in_place(der_r,j)
            pfh.add_equations(residuals, jacobian, weights=None)
Пример #43
0
def map_of_coeff_scaled(mask_map,structure,nxyz):
     assert mask_map.is_0_based()
     assert not mask_map.is_padded()
     fft_manager = fftpack.real_to_complex_3d(mask_map.focus())
     padded_data = maptbx.copy(mask_map,
                               flex.grid(fft_manager.m_real()
                              ).set_focus(fft_manager.n_real()))
     map_of_coeff = fft_manager.forward(padded_data)
     scale = matrix.col(nxyz).product()/structure.unit_cell().volume()
     sc = matrix.col(mask_map.focus()).product()/structure.unit_cell().volume()
     assert sc == scale
     map_of_coeff /= scale
     return map_of_coeff
Пример #44
0
def exercise_set_box():
  n_real = (60, 100, 160)
  n = n_real[0]*n_real[1]*n_real[2]
  cs=crystal.symmetry(
    unit_cell=(21,37,58,80,111,117),
    space_group_symbol="P1")
  be = maptbx.boxes(n_real = n_real, fraction=0.1)
  #
  m1 = flex.double([-1 for i in xrange(n)])
  m1.resize(flex.grid(n_real))
  m2 = flex.double([1 for i in xrange(n)])
  m2.resize(flex.grid(n_real))
  #
  for s,e in zip(be.starts, be.ends):
    box = maptbx.copy(m2, s, e)
    box.reshape(flex.grid(box.all()))
    maptbx.set_box(
      map_data_from = box,
      map_data_to   = m1,
      start         = s,
      end           = e)
  assert m2.as_1d().min_max_mean().as_tuple() == (1.,1.,1.)
Пример #45
0
 def hessian(self, x):
   result = hessian(
     self.two_thetas_obs, self.miller_indices, self.wavelength,
     unit_cell=uctbx.unit_cell(iter(x)))
   if (self.mode == 1):
     d = result.matrix_diagonal()
     result = flex.double(flex.grid(6,6), 0)
     result.matrix_diagonal_set_in_place(diagonal=d)
   if (0):
     from scitbx import matrix
     print("hessian:")
     print(matrix.sqr(result))
   return result
Пример #46
0
def exercise_asu_eight_point_interpolation():
  map = flex.double(flex.grid(2,3,5), 10)
  cs = crystal.symmetry(
    unit_cell=(1,1,1,90,90,90),
    space_group="P1")
  asu_mappings=cs.asu_mappings(buffer_thickness=0)
  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.asu_eight_point_interpolation(map, asu_mappings, x_frac), 10)
  assert approx_equal(
    maptbx.asu_eight_point_interpolation(map, asu_mappings, (10,11,12)), 10)
Пример #47
0
def exercise_set_box_0():
  # Create a grid of size 10x10x10 having value 0 everywhere
  box = flex.double(flex.grid(10,10,10), 0)
  # test 0: same start and end
  b1 = box.deep_copy()
  try:
    maptbx.set_box(
      value       = -1,
      map_data_to = b1,
      start       = b1.all(),
      end         = b1.all())
  except RuntimeError, e:
    assert str(e).endswith("CCTBX_ASSERT(end[i] > start[i]) failure.")
Пример #48
0
 def hessian(self, x):
   result = hessian(
     self.two_thetas_obs, self.miller_indices, self.wavelength,
     unit_cell=uctbx.unit_cell(iter(x)))
   if (self.mode == 1):
     d = result.matrix_diagonal()
     result = flex.double(flex.grid(6,6), 0)
     result.matrix_diagonal_set_in_place(diagonal=d)
   if (0):
     from scitbx import matrix
     print "hessian:"
     print matrix.sqr(result)
   return result
Пример #49
0
 def _gradient_map_coeff_to_map(self, coeff):
   if (not coeff.anomalous_flag()):
     n_complex = self.manager().rfft().n_complex()
   else:
     n_complex = self.manager().rfft().n_real()
   return maptbx.structure_factors.to_map(
     space_group=coeff.space_group(),
     anomalous_flag=coeff.anomalous_flag(),
     miller_indices=coeff.indices(),
     structure_factors=coeff.data(),
     n_real=self.manager().rfft().n_real(),
     map_grid=flex.grid(n_complex),
     conjugate_flag=True,
     treat_restricted=False)
Пример #50
0
def exercise_factor_u_star_u_iso():
    for i_trial in xrange(100):
        a = flex.random_double(size=9, factor=3)
        a.resize(flex.grid(3, 3))
        u = a.matrix_transpose().matrix_multiply(a)  # always positive-definite
        u_cart = [u[0], u[4], u[8], u[1], u[2], u[5]]
        unit_cell = uctbx.unit_cell((3, 5, 7, 80, 100, 110))
        u_star = adptbx.u_cart_as_u_star(unit_cell, u_cart)
        airlie = u_star_minus_u_iso_airlie(unit_cell, u_star)
        ralf = u_star_minus_u_iso_ralf(unit_cell, u_star)
        assert approx_equal(ralf, airlie, 1.0e-10)
        f = adptbx.factor_u_star_u_iso(unit_cell=unit_cell, u_star=u_star)
        assert approx_equal(f.u_iso, adptbx.u_cart_as_u_iso(u_cart))
        assert approx_equal(f.u_star_minus_u_iso, airlie, 1.0e-10)
Пример #51
0
def mask_grid(xrs, buffer, map_data, n_real):
  # XXX move to C++
  frac_min, frac_max = xrs.unit_cell().box_frac_around_sites(
    sites_cart = xrs.sites_cart(), buffer = buffer-1.5)
  gridding_first=[ifloor(f*n) for f,n in zip(frac_min,n_real)]
  gridding_last=[iceil(f*n) for f,n in zip(frac_max,n_real)]
  new_map = flex.double(flex.grid(n_real),0)
  for i in range(gridding_first[0], gridding_last[0]):
    for j in xrange(gridding_first[1], gridding_last[1]):
      for k in xrange(gridding_first[2], gridding_last[2]):
        if(i> 0 and i<n_real[0] and
           j> 0 and j<n_real[1] and
           k> 0 and k<n_real[2]):
          new_map[(i,j,k)] = map_data[(i,j,k)]
  return new_map
Пример #52
0
 def map_data(self):
   m_data = self.data.as_double()
   n_real = self.unit_cell_grid
   if(n_real == m_data.all()):
     return m_data
   else:
     # XXX hideously SLOW! MOVE TO C++
     map_new = flex.double(flex.grid(n_real), 0)
     o = m_data.origin()
     f = m_data.focus()
     for i in range(o[0],f[0]):
       for j in range(o[1],f[1]):
         for k in range(o[2],f[2]):
           map_new[i%n_real[0], j%n_real[1], k%n_real[2]] = m_data[i, j, k]
     return map_new
Пример #53
0
 def finite_differences(unit_cell, eps=1e-6):
   grads = []
   for i in range(6):
     params = list(unit_cell.parameters())
     params[i] += eps
     uc = uctbx.unit_cell(parameters=params)
     qm = matrix.col(uc.metrical_matrix())
     params[i] -= 2*eps
     uc = uctbx.unit_cell(parameters=params)
     qp = matrix.col(uc.metrical_matrix())
     dq = (qm-qp)/(2*eps)
     grads.extend(list(dq))
   grads = flex.double(grads)
   grads.resize(flex.grid((6,6)))
   return grads.matrix_transpose()
Пример #54
0
        def build_up(pfh, objective_only=False):
          if OO.pvr_fix:
            residuals = pfh.fvec_callable_pvr(pfh.x)
          else:
            residuals = pfh.fvec_callable_NOT_USED_AFTER_BUGFIX(pfh.x)

          pfh.reset()
          if objective_only:
            pfh.add_residuals(residuals, weights=None)
          else:
            grad_r = pfh.jacobian_callable(pfh.x)
            jacobian = flex.double(
              flex.grid(len(OO.parent.indexed_pairs), pfh.n_parameters))
            for j, der_r in enumerate(grad_r):
              jacobian.matrix_paste_column_in_place(der_r,j)
            pfh.add_equations(residuals, jacobian, weights=None)
Пример #55
0
def hessian(
      two_thetas_obs, miller_indices, wavelength, unit_cell, eps=1.e-6):
  result = flex.double()
  for i in xrange(6):
    rs = []
    for signed_eps in [eps, -eps]:
      params_eps = list(unit_cell.parameters())
      params_eps[i] += signed_eps
      rs.append(
        gradients(
          two_thetas_obs, miller_indices, wavelength,
          uctbx.unit_cell(params_eps)))
    result.extend((rs[0]-rs[1])/(2*eps))
  result.reshape(flex.grid(6,6))
  u = result.matrix_symmetric_as_packed_u(relative_epsilon=eps*10)
  return u.matrix_packed_u_as_symmetric()
def d2f_d_site_finite(h, site_constraints, independent_params, eps=1.e-8):
  result = flex.double()
  independent_params_eps = list(independent_params)
  for ip in xrange(len(independent_params)):
    vs = []
    for signed_eps in [eps, -eps]:
      independent_params_eps[ip] = independent_params[ip] + signed_eps
      ca = cos_alpha(
        h=h,
        site_constraints=site_constraints,
        independent_params=independent_params_eps)
      vs.append(ca.df_d_site())
    result.extend((vs[0]-vs[1])/(2*eps))
    independent_params_eps[ip] = independent_params[ip]
  np = len(independent_params)
  result.reshape(flex.grid(np,np))
  return result.matrix_symmetric_as_packed_u(relative_epsilon=1.e-5)