Example #1
0
  def __init__(self, unmerged_intensities):
    self._intensities_original_index = unmerged_intensities

    self._observations = {}
    from cctbx import miller, sgtbx
    sg = self._intensities_original_index.space_group()
    sg_type = sg.type()
    asu = sgtbx.reciprocal_space_asu(sg_type)
    anomalous_flag = self._intensities_original_index.anomalous_flag()

    ma = self._intensities_original_index
    original_indices = ma.indices()
    unique_indices = original_indices.deep_copy()
    isym = flex.int(unique_indices.size())

    miller.map_to_asu_isym(sg_type, anomalous_flag, unique_indices, isym)

    n_plus, n_minus = 0, 0

    for iref in range(len(original_indices)):
      h_orig = original_indices[iref]
      h_uniq = unique_indices[iref]
      h_isym = isym[iref]

      h_eq = miller.sym_equiv_indices(sg, h_uniq)
      if h_eq.is_centric():
        flag = observation_group.CENTRIC
      else:
        asu_which = asu.which(h_uniq)
        assert asu_which != 0
        if asu_which == 1:
          flag = observation_group.PLUS
        else:
          flag = observation_group.MINUS
          h_uniq = tuple(-1*h for h in h_uniq)

      group = self._observations.get(h_uniq)
      if group is None:
        group = observation_group(
          h_uniq, is_centric=(flag == observation_group.CENTRIC))
        self._observations[h_uniq] = group
      if flag == observation_group.MINUS:
        n_minus += 1
        group.add_iminus(iref)
      else:
        n_plus += 1
        group.add_iplus(iref)
Example #2
0
File: PyChef.py Project: xia2/xia2
  def __init__(self, unmerged_intensities):
    self._intensities_original_index = unmerged_intensities

    self._observations = {}
    from cctbx import miller, sgtbx
    sg = self._intensities_original_index.space_group()
    sg_type = sg.type()
    asu = sgtbx.reciprocal_space_asu(sg_type)
    anomalous_flag = self._intensities_original_index.anomalous_flag()

    ma = self._intensities_original_index
    original_indices = ma.indices()
    unique_indices = original_indices.deep_copy()
    isym = flex.int(unique_indices.size())

    miller.map_to_asu_isym(sg_type, anomalous_flag, unique_indices, isym)

    n_plus, n_minus = 0, 0

    for iref in range(len(original_indices)):
      h_orig = original_indices[iref]
      h_uniq = unique_indices[iref]
      h_isym = isym[iref]

      h_eq = miller.sym_equiv_indices(sg, h_uniq)
      if h_eq.is_centric():
        flag = observation_group.CENTRIC
      else:
        asu_which = asu.which(h_uniq)
        assert asu_which != 0
        if asu_which == 1:
          flag = observation_group.PLUS
        else:
          flag = observation_group.MINUS
          h_uniq = tuple(-1*h for h in h_uniq)

      group = self._observations.get(h_uniq)
      if group is None:
        group = observation_group(
          h_uniq, is_centric=(flag == observation_group.CENTRIC))
        self._observations[h_uniq] = group
      if flag == observation_group.MINUS:
        n_minus += 1
        group.add_iminus(iref)
      else:
        n_plus += 1
        group.add_iplus(iref)
def tst_map_to_asu_isym(anomalous_flag):
    from cctbx import sgtbx
    from cctbx.miller import map_to_asu_isym
    from cctbx.array_family import flex

    mi = flex.miller_index()
    i = flex.int()

    import random

    nhkl = 1000

    for j in range(nhkl):
        hkl = [random.randint(-10, 10) for j in range(3)]
        mi.append(hkl)
        i.append(0)

    spacegroup = sgtbx.space_group_symbols(195).hall()
    sg = sgtbx.space_group(spacegroup)
    mi_, isym_ = reference_map(sg, mi)
    map_to_asu_isym(sg.type(), anomalous_flag, mi, i)

    for j in range(nhkl):
        assert (i[j] == isym_[j])
def tst_map_to_asu_isym(anomalous_flag):
  from cctbx import sgtbx
  from cctbx.miller import map_to_asu_isym
  from cctbx.array_family import flex

  mi = flex.miller_index()
  i = flex.int()

  import random

  nhkl = 1000

  for j in range(nhkl):
    hkl = [random.randint(-10, 10) for j in range(3)]
    mi.append(hkl)
    i.append(0)

  spacegroup = sgtbx.space_group_symbols(195).hall()
  sg = sgtbx.space_group(spacegroup)
  mi_, isym_ = reference_map(sg, mi)
  map_to_asu_isym(sg.type(), anomalous_flag, mi, i)

  for j in range(nhkl):
    assert(i[j] == isym_[j])
Example #5
0
def writer(
    i_obs,
    file_object=None,
    file_name=None,
    batch_numbers=None,
    spindle_flags=None,
    scale_intensities_for_scalepack_merge=False,
    out=sys.stdout):
  n_refl = len(i_obs.indices())
  #assert (not i_obs.is_unique_set_under_symmetry()) # TT 2014-01-12 not necessary?
  assert i_obs.is_xray_intensity_array() and i_obs.sigmas() is not None
  # create substitute for batch number and spindle flag - these are impossible
  # to determine from the input array
  if (type(batch_numbers).__name__ == "array"):
    assert batch_numbers.indices().all_eq(i_obs.indices())
    batch_numbers = batch_numbers.data()
  elif (batch_numbers is None):
    batch_numbers = flex.int(n_refl, 0)
  if (type(spindle_flags).__name__ == "array"):
    assert spindle_flags.indices().all_eq(i_obs.indices())
    spindle_flags = spindle_flags.data()
  elif (spindle_flags is None):
    spindle_flags = flex.int(n_refl, 0)
  assert len(batch_numbers) == len(spindle_flags) == n_refl
  assert ([file_object, file_name].count(None) == 1)
  if (file_object is None):
    file_object = open(file_name, "w")
  f = file_object
  space_group = i_obs.space_group()
  # generate array for the centric/I+/I- flag
  centric_flags = i_obs.centric_flags().data()
  i_obs_asu = i_obs.as_non_anomalous_array().map_to_asu()
  i_obs_asu_anom = i_obs.map_to_asu()
  friedel_mate_flags = ~(i_obs_asu.indices() == i_obs_asu_anom.indices())
  centric_tags = flex.int(n_refl, 1)
  centric_tags.set_selected(friedel_mate_flags.iselection(), 2)
  centric_tags.set_selected(centric_flags.iselection(), 0)
  # generate isym array
  uniq_indices = i_obs.indices().deep_copy()
  #uniq_indices_anom = i_obs.indices().deep_copy()
  isym = flex.int(n_refl, 0)
  miller.map_to_asu_isym(space_group.type(), False, uniq_indices, isym)
  #miller.map_to_asu_isym(space_group.type(), False, uniq_indices_anom,
  #  isym)
  # write out symmetry operators
  n_smx = space_group.n_smx()
  f.write("%5d %s\n" % (n_smx, i_obs.space_group_info()))
  for smx in space_group.smx():
    smx_rot = smx.as_int_array()[0:9]
    smx_tra = smx.as_int_array()[9:]
    for r in smx_rot :
      f.write("%3d" % r)
    f.write("\n")
    for t in smx_tra :
      f.write("%3d" % t)
    f.write("\n")
  # write out reflections

  if scale_intensities_for_scalepack_merge: # 2014-01-07 TT
    from iotbx.scalepack.merge import scale_intensities_if_necessary
    i_obs=scale_intensities_if_necessary(i_obs,out=out)

  from iotbx.scalepack.merge import format_f8_1_or_i8 # Sorry if out of range
  for i_refl, (h,k,l) in enumerate(i_obs.indices()):
    (h_asu, k_asu, l_asu) = uniq_indices[i_refl]
    c_flag = centric_tags[i_refl]
    asu_number = abs(isym[i_refl]) + 1 # XXX is this correct?
    spindle_flag = spindle_flags[i_refl]
    batch = batch_numbers[i_refl]
    i_formatted=format_f8_1_or_i8((h,k,l),"intensity",i_obs.data()[i_refl])
    s_formatted=format_f8_1_or_i8((h,k,l),"sigma",i_obs.sigmas()[i_refl])

    f.write("%4d%4d%4d%4d%4d%4d%6d%2d%2d%3d%s%s\n" %
      (h, k, l, h_asu, k_asu, l_asu, batch, c_flag, spindle_flag,
      asu_number, i_formatted,s_formatted,))
  file_object.close()
def writer (
    i_obs,
    file_object=None,
    file_name=None,
    batch_numbers=None,
    spindle_flags=None,
    scale_intensities_for_scalepack_merge=False,
    out=sys.stdout) :
  n_refl = len(i_obs.indices())
  #assert (not i_obs.is_unique_set_under_symmetry()) # TT 2014-01-12 not necessary?
  assert i_obs.is_xray_intensity_array() and i_obs.sigmas() is not None
  # create substitute for batch number and spindle flag - these are impossible
  # to determine from the input array
  if (type(batch_numbers).__name__ == "array") :
    assert batch_numbers.indices().all_eq(i_obs.indices())
    batch_numbers = batch_numbers.data()
  elif (batch_numbers is None) :
    batch_numbers = flex.int(n_refl, 0)
  if (type(spindle_flags).__name__ == "array") :
    assert spindle_flags.indices().all_eq(i_obs.indices())
    spindle_flags = spindle_flags.data()
  elif (spindle_flags is None) :
    spindle_flags = flex.int(n_refl, 0)
  assert len(batch_numbers) == len(spindle_flags) == n_refl
  assert ([file_object, file_name].count(None) == 1)
  if (file_object is None) :
    file_object = open(file_name, "w")
  f = file_object
  space_group = i_obs.space_group()
  # generate array for the centric/I+/I- flag
  centric_flags = i_obs.centric_flags().data()
  i_obs_asu = i_obs.as_non_anomalous_array().map_to_asu()
  i_obs_asu_anom = i_obs.map_to_asu()
  friedel_mate_flags = ~(i_obs_asu.indices() == i_obs_asu_anom.indices())
  centric_tags = flex.int(n_refl, 1)
  centric_tags.set_selected(friedel_mate_flags.iselection(), 2)
  centric_tags.set_selected(centric_flags.iselection(), 0)
  # generate isym array
  uniq_indices = i_obs.indices().deep_copy()
  #uniq_indices_anom = i_obs.indices().deep_copy()
  isym = flex.int(n_refl, 0)
  miller.map_to_asu_isym(space_group.type(), False, uniq_indices, isym)
  #miller.map_to_asu_isym(space_group.type(), False, uniq_indices_anom,
  #  isym)
  # write out symmetry operators
  n_smx = space_group.n_smx()
  f.write("%5d %s\n" % (n_smx, i_obs.space_group_info()))
  for smx in space_group.smx() :
    smx_rot = smx.as_int_array()[0:9]
    smx_tra = smx.as_int_array()[9:]
    for r in smx_rot :
      f.write("%3d" % r)
    f.write("\n")
    for t in smx_tra :
      f.write("%3d" % t)
    f.write("\n")
  # write out reflections

  if scale_intensities_for_scalepack_merge: # 2014-01-07 TT
    from iotbx.scalepack.merge import scale_intensities_if_necessary
    i_obs=scale_intensities_if_necessary(i_obs,out=out)

  from iotbx.scalepack.merge import format_f8_1_or_i8 # Sorry if out of range
  for i_refl, (h,k,l) in enumerate(i_obs.indices()) :
    (h_asu, k_asu, l_asu) = uniq_indices[i_refl]
    c_flag = centric_tags[i_refl]
    asu_number = abs(isym[i_refl]) + 1 # XXX is this correct?
    spindle_flag = spindle_flags[i_refl]
    batch = batch_numbers[i_refl]
    i_formatted=format_f8_1_or_i8((h,k,l),"intensity",i_obs.data()[i_refl])
    s_formatted=format_f8_1_or_i8((h,k,l),"sigma",i_obs.sigmas()[i_refl])

    f.write("%4d%4d%4d%4d%4d%4d%6d%2d%2d%3d%s%s\n" %
      (h, k, l, h_asu, k_asu, l_asu, batch, c_flag, spindle_flag,
      asu_number, i_formatted,s_formatted,))
  file_object.close()