def refine_subgroup(args): assert len(args) == 5 from dials.command_line.check_indexing_symmetry \ import get_symop_correlation_coefficients, normalise_intensities params, subgroup, used_reflections, experiments, refiner_verbosity = args used_reflections = copy.deepcopy(used_reflections) triclinic_miller = used_reflections['miller_index'] cb_op = subgroup['cb_op_inp_best'] higher_symmetry_miller = cb_op.apply(triclinic_miller) used_reflections['miller_index'] = higher_symmetry_miller unrefined_crystal = copy.deepcopy(subgroup.unrefined_crystal) for expt in experiments: expt.crystal = unrefined_crystal from dials.algorithms.indexing.refinement import refine subgroup.max_cc = None subgroup.min_cc = None subgroup.correlation_coefficients = [] subgroup.cc_nrefs = [] try: logger = logging.getLogger() disabled = logger.disabled logger.disabled = True iqr_multiplier = params.refinement.reflections.outlier.tukey.iqr_multiplier params.refinement.reflections.outlier.tukey.iqr_multiplier = 2 * iqr_multiplier refinery, refined, outliers = refine(params, used_reflections, experiments, verbosity=refiner_verbosity) params.refinement.reflections.outlier.tukey.iqr_multiplier = iqr_multiplier refinery, refined, outliers = refine(params, used_reflections, refinery.get_experiments(), verbosity=refiner_verbosity) except RuntimeError, e: if (str(e) == "scitbx Error: g0 - astry*astry -astrz*astrz <= 0." or str(e) == "scitbx Error: g1-bstrz*bstrz <= 0."): subgroup.refined_crystal = None subgroup.rmsd = None subgroup.Nmatches = None subgroup.scan = None subgroup.goniometer = None subgroup.beam = None subgroup.detector = None else: raise
def refine(self, experiments, reflections): from dials.algorithms.indexing.refinement import refine refiner, refined, outliers = refine( self.all_params, reflections, experiments, verbosity=self.params.refinement_protocol.verbosity, ) if outliers is not None: reflections["id"].set_selected(outliers, -1) predicted = refiner.predict_for_indexed() reflections["xyzcal.mm"] = predicted["xyzcal.mm"] reflections["entering"] = predicted["entering"] reflections.unset_flags(flex.bool(len(reflections), True), reflections.flags.centroid_outlier) assert (reflections.get_flags( reflections.flags.centroid_outlier).count(True) == 0) reflections.set_flags( predicted.get_flags(predicted.flags.centroid_outlier), reflections.flags.centroid_outlier, ) reflections.set_flags( refiner.selection_used_for_refinement(), reflections.flags.used_in_refinement, ) return refiner.get_experiments(), reflections
def refine_subgroup(args): assert len(args) == 5 from dials.command_line.check_indexing_symmetry \ import get_symop_correlation_coefficients, normalise_intensities params, subgroup, used_reflections, experiments, refiner_verbosity = args used_reflections = copy.deepcopy(used_reflections) triclinic_miller = used_reflections['miller_index'] cb_op = subgroup['cb_op_inp_best'] higher_symmetry_miller = cb_op.apply(triclinic_miller) used_reflections['miller_index'] = higher_symmetry_miller unrefined_crystal = copy.deepcopy(subgroup.unrefined_crystal) for expt in experiments: expt.crystal = unrefined_crystal from dials.algorithms.indexing.refinement import refine subgroup.max_cc = None subgroup.min_cc = None subgroup.correlation_coefficients = [] subgroup.cc_nrefs = [] try: logger = logging.getLogger() disabled = logger.disabled logger.disabled = True iqr_multiplier = params.refinement.reflections.outlier.tukey.iqr_multiplier params.refinement.reflections.outlier.tukey.iqr_multiplier = 2 * iqr_multiplier refinery, refined, outliers = refine( params, used_reflections, experiments, verbosity=refiner_verbosity) params.refinement.reflections.outlier.tukey.iqr_multiplier = iqr_multiplier refinery, refined, outliers = refine( params, used_reflections, refinery.get_experiments(), verbosity=refiner_verbosity) except RuntimeError, e: if (str(e) == "scitbx Error: g0 - astry*astry -astrz*astrz <= 0." or str(e) == "scitbx Error: g1-bstrz*bstrz <= 0."): subgroup.refined_crystal = None subgroup.rmsd = None subgroup.Nmatches = None subgroup.scan = None subgroup.goniometer = None subgroup.beam = None subgroup.detector = None else: raise
def refine_subgroup(args): assert len(args) == 5 from dials.command_line.check_indexing_symmetry \ import get_symop_correlation_coefficients, normalise_intensities params, subgroup, used_reflections, experiments, refiner_verbosity = args used_reflections = copy.deepcopy(used_reflections) triclinic_miller = used_reflections['miller_index'] cb_op = subgroup['cb_op_inp_best'] higher_symmetry_miller = cb_op.apply(triclinic_miller) used_reflections['miller_index'] = higher_symmetry_miller unrefined_crystal = copy.deepcopy(subgroup.unrefined_crystal) for expt in experiments: expt.crystal = unrefined_crystal from dials.algorithms.indexing.refinement import refine subgroup.max_cc = None subgroup.min_cc = None subgroup.correlation_coefficients = [] subgroup.cc_nrefs = [] try: logger = logging.getLogger() disabled = logger.disabled logger.disabled = True iqr_multiplier = params.refinement.reflections.outlier.tukey.iqr_multiplier params.refinement.reflections.outlier.tukey.iqr_multiplier = 2 * iqr_multiplier refinery, refined, outliers = refine(params, used_reflections, experiments, verbosity=refiner_verbosity) params.refinement.reflections.outlier.tukey.iqr_multiplier = iqr_multiplier refinery, refined, outliers = refine(params, used_reflections, refinery.get_experiments(), verbosity=refiner_verbosity) except RuntimeError as e: if (str(e) == "scitbx Error: g0 - astry*astry -astrz*astrz <= 0." or str(e) == "scitbx Error: g1-bstrz*bstrz <= 0."): subgroup.refined_experiments = None subgroup.rmsd = None subgroup.Nmatches = None else: raise else: dall = refinery.rmsds() dx = dall[0] dy = dall[1] subgroup.rmsd = math.sqrt(dx * dx + dy * dy) subgroup.Nmatches = len(refinery.get_matches()) subgroup.refined_experiments = refinery.get_experiments() assert len(subgroup.refined_experiments.crystals()) == 1 subgroup.refined_crystal = subgroup.refined_experiments.crystals()[0] cs = crystal.symmetry( unit_cell=subgroup.refined_crystal.get_unit_cell(), space_group=subgroup.refined_crystal.get_space_group()) if 'intensity.sum.value' in used_reflections: # remove refl with -ve variance sel = used_reflections['intensity.sum.variance'] > 0 good_reflections = used_reflections.select(sel) from cctbx import miller ms = miller.set(cs, good_reflections['miller_index']) ms = ms.array( good_reflections['intensity.sum.value'] / flex.sqrt(good_reflections['intensity.sum.variance'])) if params.normalise: if params.normalise_bins: ms = normalise_intensities(ms, n_bins=params.normalise_bins) else: ms = normalise_intensities(ms) if params.cc_n_bins is not None: ms.setup_binner(n_bins=params.cc_n_bins) ccs, nrefs = get_symop_correlation_coefficients( ms, use_binning=(params.cc_n_bins is not None)) subgroup.correlation_coefficients = ccs subgroup.cc_nrefs = nrefs ccs = ccs.select(nrefs > 10) if len(ccs) > 1: subgroup.max_cc = flex.max(ccs[1:]) subgroup.min_cc = flex.min(ccs[1:]) finally: logger.disabled = disabled return subgroup
def refine_subgroup(args): assert len(args) == 4 from dials.command_line.check_indexing_symmetry import ( get_symop_correlation_coefficients, normalise_intensities, ) params, subgroup, used_reflections, experiments = args used_reflections = copy.deepcopy(used_reflections) triclinic_miller = used_reflections["miller_index"] cb_op = subgroup["cb_op_inp_best"] higher_symmetry_miller = cb_op.apply(triclinic_miller) used_reflections["miller_index"] = higher_symmetry_miller unrefined_crystal = copy.deepcopy(subgroup.unrefined_crystal) for expt in experiments: expt.crystal = unrefined_crystal from dials.algorithms.indexing.refinement import refine subgroup.max_cc = None subgroup.min_cc = None subgroup.correlation_coefficients = [] subgroup.cc_nrefs = [] with LoggingContext("dials.algorithms.refinement", level=logging.ERROR): try: outlier_algorithm = params.refinement.reflections.outlier.algorithm sel = used_reflections.get_flags( used_reflections.flags.used_in_refinement) if sel.all_eq(False): # Soft outlier rejection if no used_in_refinement flag is set params.refinement.reflections.outlier.algorithm = "tukey" iqr_multiplier = ( params.refinement.reflections.outlier.tukey.iqr_multiplier) params.refinement.reflections.outlier.tukey.iqr_multiplier = ( 2 * iqr_multiplier) sel = ~sel else: # Remove reflections not previously used in refinement params.refinement.reflections.outlier.algorithm = "null" refinery, refined, outliers = refine(params, used_reflections.select(sel), experiments) params.refinement.reflections.outlier.algorithm = outlier_algorithm refinery, refined, outliers = refine(params, used_reflections, refinery.get_experiments()) except RuntimeError as e: if (str(e) == "scitbx Error: g0 - astry*astry -astrz*astrz <= 0." or str(e) == "scitbx Error: g1-bstrz*bstrz <= 0."): subgroup.refined_experiments = None subgroup.rmsd = None subgroup.Nmatches = None else: raise else: dall = refinery.rmsds() dx = dall[0] dy = dall[1] subgroup.rmsd = math.sqrt(dx * dx + dy * dy) subgroup.Nmatches = len(refinery.get_matches()) subgroup.refined_experiments = refinery.get_experiments() assert len(subgroup.refined_experiments.crystals()) == 1 subgroup.refined_crystal = subgroup.refined_experiments.crystals( )[0] cs = crystal.symmetry( unit_cell=subgroup.refined_crystal.get_unit_cell(), space_group=subgroup.refined_crystal.get_space_group(), ) if "intensity.sum.value" in used_reflections: # remove refl with -ve variance sel = used_reflections["intensity.sum.variance"] > 0 good_reflections = used_reflections.select(sel) from cctbx import miller ms = miller.set(cs, good_reflections["miller_index"]) ms = ms.array( good_reflections["intensity.sum.value"] / flex.sqrt(good_reflections["intensity.sum.variance"])) if params.normalise: if params.normalise_bins: ms = normalise_intensities( ms, n_bins=params.normalise_bins) else: ms = normalise_intensities(ms) if params.cc_n_bins is not None: ms.setup_binner(n_bins=params.cc_n_bins) ccs, nrefs = get_symop_correlation_coefficients( ms, use_binning=(params.cc_n_bins is not None)) subgroup.correlation_coefficients = ccs subgroup.cc_nrefs = nrefs ccs = ccs.select(nrefs > 10) if len(ccs) > 1: subgroup.max_cc = flex.max(ccs[1:]) subgroup.min_cc = flex.min(ccs[1:]) return subgroup
def run(): random_seed = 35 flex.set_random_seed(random_seed) random.seed(random_seed) data = merge_close_spots.merge_close_spots() # unit cell and space group for lysozyme known_symmetry = crystal.symmetry("78,78,37,90,90,90", "P43212") sim = data.two_color_sim merged_spot_info = data.spot_proximity(sim) merged_refl = merged_spot_info[0] detector = data.detector beams = data.beams # to make sure input crystal and indexed crystal model are the same # orientation before using the refiner A = sim['input_orientation'] A_inv = A.inverse() a = A_inv[:3] b = A_inv[3:6] c = A_inv[6:] crystinp = Crystal(a, b, c, space_group=known_symmetry.space_group()) result = index(merged_refl, detector, known_symmetry, beams) print("RESULTS ARE IN") cm = result.refined_experiments.crystals()[0] R, best_axis, best_angle, change_of_basis = difference_rotation_matrix_axis_angle( crystal_a=cm, crystal_b=crystinp) euler_angles = euler.xyz_angles(R) print "input crystal: %s" % crystinp print "Indexed crystal: %s" % cm print "rotation of: %s" % R print "euler angles:", euler_angles print "change of basis:", change_of_basis.as_hkl() # cmd_line = command_line.argument_interpreter(master_params=master_phil_scope) # working_phil = cmd_line.process_and_fetch(args=[]) params = master_phil_scope.extract() params.refinement.parameterisation.beam.fix = "all" params.refinement.parameterisation.detector.fix = "all" params.indexing.known_symmetry.space_group = known_symmetry.space_group_info( ) params.refinement.verbosity = 3 params.indexing.refinement_protocol.d_min_start = 3 params.indexing.refinement_protocol.n_macro_cycles = 1 params.indexing.known_symmetry.unit_cell = known_symmetry.unit_cell() params.indexing.multiple_lattice_search.max_lattices = 1 params.indexing.debug = True params.indexing.known_symmetry.absolute_angle_tolerance = 5.0 params.indexing.known_symmetry.relative_length_tolerance = 0.3 expts = copy.deepcopy(result.refined_experiments) expts.crystals()[0].change_basis(change_of_basis) print(expts.crystals()[0]) refined = refine(params, result.reflections, expts, verbosity=1) print(refined[0].get_experiments().crystals()[0]) # from annlib_ext import AnnAdaptor # ann = AnnAdaptor(merged_refl['xyzobs.px.value'].as_double(), dim=3, k=1) # ann.query(result.reflections['xyzobs.px.value'].as_double()+1e-6) indices_sim = change_of_basis.apply(merged_refl['set_miller_index']) id_sim = merged_refl['set_id'] # only get those that refined: idx = align_merged_and_refined_refl(merged_refl, result.refined_reflections) indices_sim = flex.miller_index([indices_sim[i] for i in idx]) id_sim = flex.int([id_sim[i] for i in idx]) indices_result = result.refined_reflections['miller_index'] id_result = result.refined_reflections['id'] correct_ind = (indices_sim == indices_result) wrong_wavelength = (id_sim != id_result) & (id_sim != 2) wrong_index = (indices_sim != indices_result) correct_wavelength = (id_sim == id_result) | (id_sim == 2) correct = correct_ind & correct_wavelength print "Correct index and wavelength: %i/%i" % (correct.count(True), len(correct)) print "Correct index but wrong wavelength: %i/%i" % ( wrong_wavelength.count(True), len(wrong_wavelength)) print "Wrong index but correct wavelength: %i/%i" % ( wrong_index.count(True), len(correct_wavelength))