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