def box_iterator(self):
     p = self.xrs.unit_cell().parameters()
     b = maptbx.boxes_by_dimension(n_real=self.n_real,
                                   dim=self.box_dimension,
                                   abc=p[:3])
     i_box = 0
     for s, e in zip(b.starts, b.ends):
         i_box += 1
         map_box_obs = maptbx.copy(self.map_data_obs, s, e)
         map_box_calc = maptbx.copy(self.map_data_calc, s, e)
         map_box_obs.reshape(flex.grid(map_box_obs.all()))
         map_box_calc.reshape(flex.grid(map_box_calc.all()))
         #######
         # XXX Copy-paste from map_box
         abc = []
         for i in range(3):
             abc.append(p[i] * map_box_calc.all()[i] / self.n_real[i])
         ucb = uctbx.unit_cell(parameters=(abc[0], abc[1], abc[2], p[3],
                                           p[4], p[5]))
         cs = crystal.symmetry(unit_cell=ucb, space_group="P1")
         #######
         diff_map = scale_two_real_maps_in_fourier_space(
             m1=map_box_obs,
             m2=map_box_calc,
             cs=cs,
             d_min=self.d_min,
             vector_map=self.vector_map)
         maptbx.set_box(map_data_from=diff_map,
                        map_data_to=self.map_result,
                        start=s,
                        end=e)
     sd = self.map_result.sample_standard_deviation()
     if (sd != 0):
         self.map_result = self.map_result / sd
Esempio n. 2
0
    def __init__(self,
                 crystal_gridding,
                 fmodel,
                 map_type,
                 max_boxes,
                 box_size_as_fraction=None):
        sgt = fmodel.f_obs().space_group().type()
        assert sgt.number() == 1

        def get_map(fmodel, map_type, external_complete_set=None):
            f_map = fmodel.electron_density_map().map_coefficients(
                map_type=map_type, isotropize=True, fill_missing=False)
            fft_map = miller.fft_map(crystal_gridding=crystal_gridding,
                                     fourier_coefficients=f_map)
            return fft_map.real_map_unpadded()

        f_model = fmodel.f_model_scaled_with_k1()
        fft_map = miller.fft_map(crystal_gridding=crystal_gridding,
                                 fourier_coefficients=f_model)
        f_model_map_data = fft_map.real_map_unpadded()
        zero_complex_ma = f_model.customized_copy(
            data=flex.complex_double(f_model.data().size(), 0))
        b = maptbx.boxes(fraction=0.3,
                         n_real=f_model_map_data.focus(),
                         max_boxes=max_boxes,
                         log=sys.stdout)
        self.map_result = flex.double(flex.grid(b.n_real))
        self.r = flex.double()
        for s, e in zip(b.starts, b.ends):
            f_model_map_data_omit = maptbx.set_box_copy(
                value=0, map_data_to=f_model_map_data, start=s, end=e)
            f_model_omit = f_model.structure_factors_from_map(
                map=f_model_map_data_omit,
                use_scale=True,
                anomalous_flag=False,
                use_sg=False)
            fmodel_ = mmtbx.f_model.manager(f_obs=fmodel.f_obs(),
                                            r_free_flags=fmodel.r_free_flags(),
                                            f_calc=f_model_omit,
                                            f_mask=zero_complex_ma)
            self.r.append(fmodel_.r_work())
            f_map_data = get_map(fmodel=fmodel_, map_type=map_type)
            etmp = [e[0] - 1, e[1] - 1,
                    e[2] - 1]  # because .copy() includes right edge
            box = maptbx.copy(f_map_data, s, etmp)
            box.reshape(flex.grid(box.all()))
            maptbx.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
        self.map_coefficients = fmodel.f_obs().structure_factors_from_map(
            map=self.map_result,
            use_scale=True,
            anomalous_flag=False,
            use_sg=False)
Esempio n. 3
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.")
Esempio n. 4
0
    def modify_mask_box(self, mask_data, sites_frac):
        box_buffer = self.params.box_buffer
        # Number of selected atoms
        n_selected = self.selection_bool.count(True)
        na = mask_data.all()
        n_selected_p1 = sites_frac.size()
        n_boxes = int(n_selected_p1 / n_selected)
        box_list = [[] for i in range(n_boxes)]
        for n_box in range(n_boxes):
            for i in range(n_selected):
                box_list[n_box].append(sites_frac[n_box + n_boxes * i])
        na = self.mask_data_all.all()
        k = 0
        for box in box_list:
            k += 1
            x_min = min(frac[0] for frac in box)
            y_min = min(frac[1] for frac in box)
            z_min = min(frac[2] for frac in box)
            x_max = max(frac[0] for frac in box)
            y_max = max(frac[1] for frac in box)
            z_max = max(frac[2] for frac in box)
            frac_min = [x_min, y_min, z_min]
            frac_max = [x_max, y_max, z_max]

            cs = self.xray_structure.crystal_symmetry()

            # Add buffer to box if indicated.
            if (box_buffer is not None):
                cushion = flex.double(cs.unit_cell().fractionalize(
                    (box_buffer, ) * 3))
                frac_min = list(flex.double(frac_min) - cushion)
                frac_max = list(flex.double(frac_max) + cushion)

            gridding_first = [ifloor(f * n) for f, n in zip(frac_min, na)]
            gridding_last = [iceil(f * n) for f, n in zip(frac_max, na)]

            for j in range(3):
                if (gridding_last[j] - gridding_first[j] >= na[j]):
                    raise Sorry(
                        "The box is too big. Decrease box_buffer or use a " +
                        "different selection")

            maptbx.set_box(value=0,
                           map_data_to=mask_data,
                           start=gridding_first,
                           end=gridding_last)
        return mask_data
Esempio n. 5
0
def get_diff_map(symmetry, fcalc_map, expt_map, d_min):
    """Compute a difference map between the calculated and experimental maps.
  Modified from mmtbx.command_line.real_space_diff_map class compdiff."""
    scale = scale_k1(x=expt_map, y=fcalc_map)
    scaled_fcalc_map = fcalc_map * scale  # should already be scaled but okay
    origin = expt_map.origin()
    shifted_expt_map = expt_map.shift_origin()
    shifted_diff_map = flex.double(flex.grid(expt_map.all()))
    diff_map = flex.double(flex.grid(expt_map.origin(), expt_map.focus()))
    ucell_params = symmetry.unit_cell().parameters()
    boxes = maptbx.boxes_by_dimension(n_real=expt_map.all(),
                                      dim=30,
                                      abc=ucell_params[:3])
    i_box = 0
    test_map_box_obs_all = None
    for start, end in zip(boxes.starts, boxes.ends):
        i_box += 1
        map_box_obs = maptbx.copy(shifted_expt_map, start, end)
        map_box_calc = maptbx.copy(scaled_fcalc_map, start, end)
        map_box_obs.reshape(flex.grid(map_box_obs.all()))
        map_box_calc.reshape(flex.grid(map_box_calc.all()))
        # abc = [ucell_params[i]/expt_map.all()[i] for i in range(3)]
        # ucb = uctbx.unit_cell(parameters=(
        # abc[0],abc[1],abc[2],ucell_params[3],ucell_params[4],ucell_params[5]))
        # cs = crystal.symmetry(unit_cell=ucb, space_group="P1")
        cs = symmetry
        diff_map_part = scale_two_real_maps_in_fourier_space(
            m1=map_box_obs,
            m2=map_box_calc,
            cs=cs,
            d_min=d_min,
            vector_map=True)  # this means yes, use the phases from fcalc
        maptbx.set_box(map_data_from=diff_map_part,
                       map_data_to=shifted_diff_map,
                       start=start,
                       end=end)
    # skip this additional scaling step -- it explodes everything
    # sd = diff_map.sample_standard_deviation()
    # if(sd!=0):
    # diff_map = diff_map/sd
    # somehow put the contents of shifted_diff_map into diff_map but keep origin?
    for i in xrange(len(shifted_diff_map)):
        diff_map[i] = shifted_diff_map[i]
        # FIXME SUPER SLOW but it should work for now
    return diff_map
Esempio n. 6
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.)
Esempio n. 7
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.")
 else: raise Exception_expected
 # test 1: transform entire unit cell
 b1 = box.deep_copy()
 maptbx.set_box(
   value       = -1,
   map_data_to = b1,
   start       = [0,0,0],
   end         = b1.all())
 assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [-1.0, -1.0, -1.0])
 # test 2: transform entire unit cell, this time translated
 b1 = box.deep_copy()
 maptbx.set_box(
   value       = 1,
   map_data_to = b1,
   start       = [-30,-30,-30],
   end         = [-20,-20,-20])
 assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [1.0, 1.0, 1.0])
 # test 3: start in neighboring cell and end at 0,0,0
 b1 = box.deep_copy()
 maptbx.set_box(
   value       = 1,
 def __init__(
       self,
       crystal_gridding,
       fmodel,
       map_type,
       max_boxes,
       box_size_as_fraction=None):
   sgt = fmodel.f_obs().space_group().type()
   assert sgt.number() == 1
   def get_map(fmodel, map_type, external_complete_set=None):
     f_map = fmodel.electron_density_map().map_coefficients(
         map_type     = map_type,
         isotropize   = True,
         fill_missing = False)
     fft_map = miller.fft_map(
       crystal_gridding     = crystal_gridding,
       fourier_coefficients = f_map)
     return fft_map.real_map_unpadded()
   f_model = fmodel.f_model_scaled_with_k1()
   fft_map = miller.fft_map(
     crystal_gridding     = crystal_gridding,
     fourier_coefficients = f_model)
   f_model_map_data = fft_map.real_map_unpadded()
   zero_complex_ma = f_model.customized_copy(
     data = flex.complex_double(f_model.data().size(), 0))
   b = maptbx.boxes(
     fraction = 0.3,
     n_real   = f_model_map_data.focus(),
     max_boxes=max_boxes,
     log=sys.stdout)
   self.map_result = flex.double(flex.grid(b.n_real))
   self.r = flex.double()
   for s,e in zip(b.starts, b.ends):
     f_model_map_data_omit = maptbx.set_box_copy(
       value         = 0,
       map_data_to   = f_model_map_data,
       start         = s,
       end           = e)
     f_model_omit = f_model.structure_factors_from_map(
       map            = f_model_map_data_omit,
       use_scale      = True,
       anomalous_flag = False,
       use_sg         = False)
     fmodel_ = mmtbx.f_model.manager(
       f_obs        = fmodel.f_obs(),
       r_free_flags = fmodel.r_free_flags(),
       f_calc       = f_model_omit,
       f_mask       = zero_complex_ma)
     self.r.append(fmodel_.r_work())
     f_map_data = get_map(fmodel=fmodel_, map_type=map_type)
     etmp = [e[0]-1, e[1]-1, e[2]-1] # because .copy() includes right edge
     box = maptbx.copy(f_map_data, s, etmp)
     box.reshape(flex.grid(box.all()))
     maptbx.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
   self.map_coefficients = fmodel.f_obs().structure_factors_from_map(
     map            = self.map_result,
     use_scale      = True,
     anomalous_flag = False,
     use_sg         = False)
Esempio n. 9
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 as e:
    assert str(e).endswith("CCTBX_ASSERT(end[i] > start[i]) failure.")
  else: raise Exception_expected
  # test 1: transform entire unit cell
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = -1,
    map_data_to = b1,
    start       = [0,0,0],
    end         = b1.all())
  assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [-1.0, -1.0, -1.0])
  # test 2: transform entire unit cell, this time translated
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [-30,-30,-30],
    end         = [-20,-20,-20])
  assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [1.0, 1.0, 1.0])
  # test 3: start in neighboring cell and end at 0,0,0
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [-5,-5,-5],
    end         = [0,0,0])
  assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [0.0, 1.0, 0.125])
  # test 4: slice instead of a box
  b1 = box.deep_copy()
  try:
    maptbx.set_box(
      value       = -1,
      map_data_to = b1,
      start       = [1,2,3],
      end         = [2,2,3])
  except RuntimeError as e:
    assert str(e).endswith("CCTBX_ASSERT(end[i] > start[i]) failure.")
  else: raise Exception_expected
  # test 5: another slice
  b1 = box.deep_copy()
  try:
    maptbx.set_box(
      value       = -1,
      map_data_to = b1,
      start       = [-1,0,2],
      end         = [0,0,3])
  except RuntimeError as e:
    assert str(e).endswith("CCTBX_ASSERT(end[i] > start[i]) failure.")
  else: raise Exception_expected
  # test 6: one point changed
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [0,0,0],
    end         = [1,1,1])
  assert (b1==0).count(True)==999
  assert (b1==1).count(True)==1
  # test 7: change 1/8 of the unit cell
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [0,0,0],
    end         = [5,5,5])
  assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [0.0, 1.0, 0.125])
  # test 8: change one point
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [-1,-1,-1],
    end         = [0,0,0])
  assert (b1==0).count(True)==999
  assert (b1==1).count(True)==1
  # test 9: entire cell, end point is 0,0,0
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [-10,-10,-10],
    end         = [0,0,0])
  assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [1.0, 1.0, 1.0])
  # test 10: slice of a box
  b1 = box.deep_copy()
  try:
    maptbx.set_box(
      value       = 1,
      map_data_to = b1,
      start       = [0,0,0],
      end         = [9,0,0])
  except RuntimeError as e:
    assert str(e).endswith("CCTBX_ASSERT(end[i] > start[i]) failure.")
  else: raise Exception_expected
  # test 11: box within unit cell one period apart
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [14,14,14],
    end         = [19,19,19])
  assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [0.0, 1.0, 0.125])
  # test 12 box between cells, translated by a period
  b1 = box.deep_copy()
  maptbx.set_box(
    value       = 1,
    map_data_to = b1,
    start       = [-14,-14,-14],
    end         = [-9,-9,-9])
  assert approx_equal(b1.as_1d().min_max_mean().as_tuple(), [0.0, 1.0, 0.125])
  # TEST 13: Reset map values in a box within a unit cell
  n_real = (100, 60, 80)
  n = n_real[0]*n_real[1]*n_real[2]
  m1 = flex.double([1 for i in range(n)])
  m1.resize(flex.grid(n_real))
  maptbx.set_box(
    value       = -1,
    map_data_to = m1,
    start       = [20,30,40],
    end         = [80,40,60])
  assert m1.as_1d().min_max_mean().as_tuple() == (-1.,1.,0.95)
  # TEST 14: reset map values in a box crossing the border of the unit cell
  n_real = (60, 100, 80)
  n = n_real[0]*n_real[1]*n_real[2]
  m2 = flex.double([1 for i in range(n)])
  m2.resize(flex.grid(n_real))
  maptbx.set_box(
    value       = -1,
    map_data_to = m2,
    start       = [-10,-20,20],
    end         = [30,40,50])
  assert m2.as_1d().min_max_mean().as_tuple() == (-1.,1.,0.7)