def __init__(self, mtz_object, custom_cif_labels_dict=None, log=None, test_flag_value=None): self.cif_blocks = {'xray': None, 'neutron': None} if log is None: log = sys.stdout miller_arrays = mtz_object.as_miller_arrays() miller_arrays_as_cif_block = None input_observations_xray = None input_observations_neutron = None r_free_xray = None r_free_neutron = None f_obs_filtered_xray = None f_obs_filtered_neutron = None mtz_to_cif_labels_dict = {} mtz_to_cif_labels_dict.update(phenix_to_cif_labels_dict) mtz_to_cif_labels_dict.update(ccp4_to_cif_labels_dict) if custom_cif_labels_dict is not None: mtz_to_cif_labels_dict.update(custom_cif_labels_dict) unknown_mtz_labels = [] for array in miller_arrays: labels = array.info().labels label = labels[0] if reflection_file_utils.looks_like_r_free_flags_info( array.info()): if "(+)" in label: array = array.average_bijvoet_mates() labels = [label.replace("(+)", "")] if label.endswith(("neutron", "_N")): r_free_neutron = array else: r_free_xray = array continue # deal with these later elif label.startswith("F-obs-filtered"): if label.endswith(("neutron", "_N")): f_obs_filtered_neutron = array else: f_obs_filtered_xray = array elif label.startswith("F-obs") or label.startswith("I-obs"): if label.strip("(+)").endswith(("neutron", "_N")): input_observations_neutron = array else: input_observations_xray = array #elif label.startswith("R-free-flags"): column_names = [] for mtz_label in labels: cif_label = mtz_to_cif_label(mtz_to_cif_labels_dict, mtz_label) column_names.append(cif_label) if column_names.count(None) > 0: # I don't know what to do with this array for i, mtz_label in enumerate(labels): if column_names[i] is None: unknown_mtz_labels.append(mtz_label) continue assert column_names.count(None) == 0 if labels[0].strip("(+)").endswith(("neutron", "_N")): data_type = "neutron" else: data_type = "xray" if column_names[0].startswith( ("_refln.F_meas", "_refln.F_squared_meas", "_refln.pdbx_F_", "_refln.pdbx_I_")): if data_type == "neutron": input_observations_neutron = array else: input_observations_xray = array if self.cif_blocks.get(data_type) is None: self.cif_blocks[ data_type] = iotbx.cif.miller_arrays_as_cif_block( array=array, column_names=column_names, format="mmcif") else: self.cif_blocks[data_type].add_miller_array( array, column_names=column_names) if len(unknown_mtz_labels): print >> log, "Warning: Unknown mtz label%s: %s" % (plural_s( len(unknown_mtz_labels))[1], ", ".join(unknown_mtz_labels)) print >> log, " Use mtz_labels and cif_labels keywords to provide translation for custom labels." data_types = set(["xray"]) if self.cif_blocks['neutron'] is not None: data_types.add("neutron") if input_observations_xray is None and f_obs_filtered_xray is not None: self.cif_blocks["xray"].add_miller_array( array=f_obs_filtered_xray, column_names=('_refln.F_meas_au', '_refln.F_meas_sigma_au')) if input_observations_neutron is None and f_obs_filtered_neutron is not None: self.cif_blocks["neutron"].add_miller_array( array=f_obs_filtered_neutron, column_names=('_refln.F_meas_au', '_refln.F_meas_sigma_au')) for data_type in data_types: if data_type == "xray": r_free = r_free_xray input_obs = input_observations_xray f_obs_filtered = f_obs_filtered_xray if (self.cif_blocks["xray"] is None and r_free_xray is not None and self.cif_blocks["neutron"] is not None and r_free_neutron is None): r_free_neutron = r_free_xray elif data_type == "neutron": r_free = r_free_neutron input_obs = input_observations_neutron f_obs_filtered = f_obs_filtered_neutron if self.cif_blocks[data_type] is not None and r_free is not None: self.cif_blocks[data_type].add_miller_array( array=r_free, column_name='_refln.pdbx_r_free_flag') if input_obs is None or r_free is None: continue if (test_flag_value is None): test_flag_value = reflection_file_utils.guess_r_free_flag_value( miller_array=r_free) assert (test_flag_value is not None) refln_status = r_free.array( data=flex.std_string(r_free.size(), ".")) input_obs_non_anom = input_obs.average_bijvoet_mates() match = r_free.match_indices(input_obs_non_anom) refln_status.data().set_selected(match.pair_selection(0), "o") refln_status.data().set_selected(r_free.data() == test_flag_value, "f") if f_obs_filtered is not None: f_obs_filtered_non_anom = f_obs_filtered.average_bijvoet_mates( ) match = r_free.match_indices(f_obs_filtered_non_anom) refln_status.data().set_selected(match.single_selection(0), "<") # XXX self.cif_blocks[data_type].add_miller_array( array=refln_status, column_name="_refln.status")
def __init__(self, mtz_object, custom_cif_labels_dict=None, log=None, test_flag_value=None): self.cif_blocks = { 'xray': None, 'neutron': None } if log is None: log = sys.stdout miller_arrays = mtz_object.as_miller_arrays() miller_arrays_as_cif_block = None input_observations_xray = None input_observations_neutron = None r_free_xray = None r_free_neutron = None f_obs_filtered_xray = None f_obs_filtered_neutron = None mtz_to_cif_labels_dict = {} mtz_to_cif_labels_dict.update(phenix_to_cif_labels_dict) mtz_to_cif_labels_dict.update(ccp4_to_cif_labels_dict) if custom_cif_labels_dict is not None: mtz_to_cif_labels_dict.update(custom_cif_labels_dict) unknown_mtz_labels = [] for array in miller_arrays: labels = array.info().labels label = labels[0] if reflection_file_utils.looks_like_r_free_flags_info(array.info()): if "(+)" in label: array = array.average_bijvoet_mates() labels = [label.replace("(+)", "")] if label.endswith(("neutron", "_N")): r_free_neutron = array else: r_free_xray = array continue # deal with these later elif label.startswith("F-obs-filtered"): if label.endswith(("neutron", "_N")): f_obs_filtered_neutron = array else: f_obs_filtered_xray = array elif label.startswith("F-obs") or label.startswith("I-obs"): if label.strip("(+)").endswith(("neutron", "_N")): input_observations_neutron = array else: input_observations_xray = array #elif label.startswith("R-free-flags"): column_names = [] for mtz_label in labels: cif_label = mtz_to_cif_label(mtz_to_cif_labels_dict, mtz_label) column_names.append(cif_label) if column_names.count(None) > 0: # I don't know what to do with this array for i, mtz_label in enumerate(labels): if column_names[i] is None: unknown_mtz_labels.append(mtz_label) continue assert column_names.count(None) == 0 if labels[0].strip("(+)").endswith(("neutron", "_N")): data_type = "neutron" else: data_type = "xray" if column_names[0].startswith(("_refln.F_meas", "_refln.F_squared_meas", "_refln.pdbx_F_", "_refln.pdbx_I_")): if data_type == "neutron": input_observations_neutron = array else: input_observations_xray = array if self.cif_blocks.get(data_type) is None: self.cif_blocks[data_type] = iotbx.cif.miller_arrays_as_cif_block( array=array, column_names=column_names, format="mmcif") else: self.cif_blocks[data_type].add_miller_array(array, column_names=column_names) if len(unknown_mtz_labels): print >> log, "Warning: Unknown mtz label%s: %s" %( plural_s(len(unknown_mtz_labels))[1], ", ".join(unknown_mtz_labels)) print >> log, " Use mtz_labels and cif_labels keywords to provide translation for custom labels." data_types = set(["xray"]) if self.cif_blocks['neutron'] is not None: data_types.add("neutron") if input_observations_xray is None and f_obs_filtered_xray is not None: self.cif_blocks["xray"].add_miller_array( array=f_obs_filtered_xray, column_names=('_refln.F_meas_au','_refln.F_meas_sigma_au')) if input_observations_neutron is None and f_obs_filtered_neutron is not None: self.cif_blocks["neutron"].add_miller_array( array=f_obs_filtered_neutron, column_names=('_refln.F_meas_au','_refln.F_meas_sigma_au')) for data_type in data_types: if data_type == "xray": r_free = r_free_xray input_obs = input_observations_xray f_obs_filtered = f_obs_filtered_xray if (self.cif_blocks["xray"] is None and r_free_xray is not None and self.cif_blocks["neutron"] is not None and r_free_neutron is None): r_free_neutron = r_free_xray elif data_type == "neutron": r_free = r_free_neutron input_obs = input_observations_neutron f_obs_filtered = f_obs_filtered_neutron if self.cif_blocks[data_type] is not None and r_free is not None: self.cif_blocks[data_type].add_miller_array( array=r_free, column_name='_refln.pdbx_r_free_flag') if input_obs is None or r_free is None: continue if (test_flag_value is None) : test_flag_value = reflection_file_utils.guess_r_free_flag_value( miller_array=r_free) assert (test_flag_value is not None) refln_status = r_free.array(data=flex.std_string(r_free.size(), ".")) input_obs_non_anom = input_obs.average_bijvoet_mates() match = r_free.match_indices(input_obs_non_anom) refln_status.data().set_selected(match.pair_selection(0), "o") refln_status.data().set_selected(r_free.data() == test_flag_value, "f") if f_obs_filtered is not None: f_obs_filtered_non_anom = f_obs_filtered.average_bijvoet_mates() match = r_free.match_indices(f_obs_filtered_non_anom) refln_status.data().set_selected(match.single_selection(0), "<") # XXX self.cif_blocks[data_type].add_miller_array( array=refln_status, column_name="_refln.status")
def exercise_get_r_free_flags(): crystal_symmetry = crystal.symmetry( unit_cell=(30,31,32,85,95,100), space_group_symbol="P 1") miller_set = miller.build_set( crystal_symmetry=crystal_symmetry, anomalous_flag=False, d_min=3) n = miller_set.indices().size() exercise_flag_arrays = [] exercise_flag_arrays.append( flex.int(list(flex.random_permutation(size=n)%10))) exercise_flag_arrays.append(flex.int(xrange(n))) exercise_flag_arrays.append(flex.int(n, 0)) for style in ["ccp4", "cns", "shelx", "bool"]: for i_exercise,exercise_flag_array in enumerate(exercise_flag_arrays): for reversed in [False, True]: if (style == "ccp4"): if (reversed): break data = exercise_flag_array test_flag_value = 3 else: if (not reversed): data = (exercise_flag_array == 0) test_flag_value = True else: data = (exercise_flag_array != 0) test_flag_value = False if (style == "cns"): data = data.as_int() test_flag_value = int(test_flag_value) elif (style == "shelx"): data = -data.as_int() data.set_selected((data == 0), 1) if (not reversed): test_flag_value = -1 else: test_flag_value = 1 input_array = miller_set.array(data=data) mtz_dataset = input_array.as_mtz_dataset( column_root_label="FreeRflags") mtz_dataset.mtz_object().write("tmp.mtz") reflection_files = [reflection_file_reader.any_reflection_file( file_name="tmp.mtz")] err = StringIO() reflection_file_srv = reflection_file_server( crystal_symmetry=crystal_symmetry, force_symmetry=True, reflection_files=reflection_files, err=err) for trial_test_flag_value in [None, test_flag_value]: for trial_label in [None, "free", "foo"]: try: r_free_flags, actual_test_flag_value = \ reflection_file_srv.get_r_free_flags( file_name=None, label=trial_label, test_flag_value=trial_test_flag_value, disable_suitability_test=False, parameter_scope="r_free_flags") except Sorry, e: if (trial_label != "foo"): assert i_exercise > 0 if (trial_label is None): assert str(e) == """\ No array of R-free flags found. For manual selection define: r_free_flags.label r_free_flags.test_flag_value r_free_flags.disable_suitability_test=True""" else: assert str(e) == \ "Not a suitable array of R-free flags:" \ + " r_free_flags.label=free\n" \ + "To override the suitability test define:" \ + " r_free_flags.disable_suitability_test=True" else: assert str(e) == "No matching array: r_free_flags.label=foo" if (i_exercise == 0): assert err.getvalue() == """\ No matching array: r_free_flags.label=foo Possible choices: tmp.mtz:FreeRflags Please use r_free_flags.label to specify an unambiguous substring of the target label. """ else: assert err.getvalue() == """\ No matching array: r_free_flags.label=foo """ err = reflection_file_srv.err = StringIO() else: assert i_exercise == 0 actual_test_flag_value_2 = guess_r_free_flag_value( miller_array=r_free_flags, test_flag_value=trial_test_flag_value) assert (actual_test_flag_value_2 == actual_test_flag_value)
def exercise_get_r_free_flags(): crystal_symmetry = crystal.symmetry( unit_cell=(30,31,32,85,95,100), space_group_symbol="P 1") miller_set = miller.build_set( crystal_symmetry=crystal_symmetry, anomalous_flag=False, d_min=3) n = miller_set.indices().size() exercise_flag_arrays = [] exercise_flag_arrays.append( flex.int(list(flex.random_permutation(size=n)%10))) exercise_flag_arrays.append(flex.int(range(n))) exercise_flag_arrays.append(flex.int(n, 0)) for style in ["ccp4", "cns", "shelx", "bool"]: for i_exercise,exercise_flag_array in enumerate(exercise_flag_arrays): for reversed in [False, True]: if (style == "ccp4"): if (reversed): break data = exercise_flag_array test_flag_value = 3 else: if (not reversed): data = (exercise_flag_array == 0) test_flag_value = True else: data = (exercise_flag_array != 0) test_flag_value = False if (style == "cns"): data = data.as_int() test_flag_value = int(test_flag_value) elif (style == "shelx"): data = -data.as_int() data.set_selected((data == 0), 1) if (not reversed): test_flag_value = -1 else: test_flag_value = 1 input_array = miller_set.array(data=data) mtz_dataset = input_array.as_mtz_dataset( column_root_label="FreeRflags") mtz_dataset.mtz_object().write("tmp.mtz") reflection_files = [reflection_file_reader.any_reflection_file( file_name="tmp.mtz")] err = StringIO() reflection_file_srv = reflection_file_server( crystal_symmetry=crystal_symmetry, force_symmetry=True, reflection_files=reflection_files, err=err) for trial_test_flag_value in [None, test_flag_value]: for trial_label in [None, "free", "foo"]: try: r_free_flags, actual_test_flag_value = \ reflection_file_srv.get_r_free_flags( file_name=None, label=trial_label, test_flag_value=trial_test_flag_value, disable_suitability_test=False, parameter_scope="r_free_flags") except Sorry as e: if (trial_label != "foo"): assert i_exercise > 0 if (trial_label is None): assert str(e) == """\ No array of R-free flags found. For manual selection define: r_free_flags.label r_free_flags.test_flag_value r_free_flags.disable_suitability_test=True""" else: assert str(e) == \ "Not a suitable array of R-free flags:" \ + " r_free_flags.label=free\n" \ + "To override the suitability test define:" \ + " r_free_flags.disable_suitability_test=True" else: assert str(e) == "No matching array: r_free_flags.label=foo" if (i_exercise == 0): assert err.getvalue() == """\ No matching array: r_free_flags.label=foo Possible choices: tmp.mtz:FreeRflags Please use r_free_flags.label to specify an unambiguous substring of the target label. """ else: assert err.getvalue() == """\ No matching array: r_free_flags.label=foo """ err = reflection_file_srv.err = StringIO() else: assert i_exercise == 0 actual_test_flag_value_2 = guess_r_free_flag_value( miller_array=r_free_flags, test_flag_value=trial_test_flag_value) assert (actual_test_flag_value_2 == actual_test_flag_value) for second_label in ["test", "foo"]: input_array = miller_set.array(data=exercise_flag_arrays[0]) mtz_dataset = input_array.as_mtz_dataset( column_root_label="FreeRflags") mtz_dataset.add_miller_array( miller_array=input_array, column_root_label=second_label) mtz_dataset.mtz_object().write("tmp.mtz") reflection_files = [reflection_file_reader.any_reflection_file( file_name="tmp.mtz")] err = StringIO() reflection_file_srv = reflection_file_server( crystal_symmetry=crystal_symmetry, force_symmetry=True, reflection_files=reflection_files, err=err) try: reflection_file_srv.get_r_free_flags( file_name=None, label=None, test_flag_value=None, disable_suitability_test=False, parameter_scope="r_free_flags") except Sorry as e: assert str(e)=="Multiple equally suitable arrays of R-free flags found." assert err.getvalue() == """\ Multiple equally suitable arrays of R-free flags found. Possible choices: tmp.mtz:FreeRflags tmp.mtz:test Please use r_free_flags.label to specify an unambiguous substring of the target label. """ err = reflection_file_srv.err = StringIO() else: assert str(r_free_flags.info()) == "tmp.mtz:FreeRflags" r_free_flags, actual_test_flag_value = \ reflection_file_srv.get_r_free_flags( file_name=None, label="FreeRflags", test_flag_value=3, disable_suitability_test=True, parameter_scope="r_free_flags") assert r_free_flags.info().label_string() == "FreeRflags" assert actual_test_flag_value == 3 for label,test_flag_value in [(None,3), ("FreeRflags",None)]: try: reflection_file_srv.get_r_free_flags( file_name=None, label=label, test_flag_value=test_flag_value, disable_suitability_test=True, parameter_scope="r_free_flags") except Sorry as e: assert str(e) == "r_free_flags.disable_suitability_test=True:" \ " Suitability test for R-free flags can only be disabled if both" \ " r_free_flags.label and r_free_flags.test_flag_value are defined." else: raise Exception_expected # test corrupted R-free flags r_free_flags = miller_set.generate_r_free_flags() int_flags = r_free_flags.data().as_int() int_flags[100] = 10000000 r_free_flags = r_free_flags.customized_copy(data=int_flags) mtz_dataset = r_free_flags.as_mtz_dataset( column_root_label="TEST") mtz_dataset.mtz_object().write("tmp.mtz") reflection_files = [reflection_file_reader.any_reflection_file( file_name="tmp.mtz")] err = StringIO() reflection_file_srv = reflection_file_server( crystal_symmetry=crystal_symmetry, force_symmetry=True, reflection_files=reflection_files, err=err) flags, value = reflection_file_srv.get_r_free_flags( file_name=None, label=None, test_flag_value=None, disable_suitability_test=False, parameter_scope="r_free_flags") assert (value == 1)