Ejemplo n.º 1
0
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
Ejemplo n.º 2
0
    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
Ejemplo n.º 3
0
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
Ejemplo n.º 4
0
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
Ejemplo n.º 5
0
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
Ejemplo n.º 6
0
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))