def test_correct(space_group_symbol):

    sgi = sgtbx.space_group_info(space_group_symbol)
    cs = sgi.any_compatible_crystal_symmetry(volume=1000)
    ms = cs.build_miller_set(anomalous_flag=True, d_min=1).expand_to_p1()

    # the reciprocal matrix
    B = scitbx.matrix.sqr(cs.unit_cell().fractionalization_matrix()).transpose()
    crystal = Crystal(B, sgtbx.space_group())
    expts = ExperimentList([Experiment(crystal=crystal)])

    refl = flex.reflection_table()
    refl["miller_index"] = ms.indices()
    refl["rlp"] = B.elems * ms.indices().as_vec3_double()
    refl["imageset_id"] = flex.int(len(refl))
    refl["xyzobs.mm.value"] = flex.vec3_double(len(refl))

    non_primitive_basis.correct(expts, refl, assign_indices.AssignIndicesGlobal())

    cs_corrected = expts.crystals()[0].get_crystal_symmetry()
    assert cs_corrected.change_of_basis_op_to_primitive_setting().is_identity_op()
    assert (
        cs.change_of_basis_op_to_primitive_setting().apply(ms.indices())
        == refl["miller_index"]
    )
Beispiel #2
0
def run_with_preparsed(experiments, reflections, params):
    from dxtbx.model import ExperimentList
    from scitbx.math import five_number_summary

    print("Found", len(reflections), "reflections", "and", len(experiments),
          "experiments")

    filtered_reflections = flex.reflection_table()
    filtered_experiments = ExperimentList()

    skipped_reflections = flex.reflection_table()
    skipped_experiments = ExperimentList()

    if params.detector is not None:
        culled_reflections = flex.reflection_table()
        culled_experiments = ExperimentList()
        detector = experiments.detectors()[params.detector]
        for expt_id, experiment in enumerate(experiments):
            refls = reflections.select(reflections['id'] == expt_id)
            if experiment.detector is detector:
                culled_experiments.append(experiment)
                refls['id'] = flex.int(len(refls), len(culled_experiments) - 1)
                culled_reflections.extend(refls)
            else:
                skipped_experiments.append(experiment)
                refls['id'] = flex.int(len(refls),
                                       len(skipped_experiments) - 1)
                skipped_reflections.extend(refls)

        print("RMSD filtering %d experiments using detector %d, out of %d" %
              (len(culled_experiments), params.detector, len(experiments)))
        reflections = culled_reflections
        experiments = culled_experiments

    difference_vector_norms = (reflections['xyzcal.mm'] -
                               reflections['xyzobs.mm.value']).norms()

    if params.max_delta is not None:
        sel = difference_vector_norms <= params.max_delta
        reflections = reflections.select(sel)
        difference_vector_norms = difference_vector_norms.select(sel)

    data = flex.double()
    counts = flex.double()
    for i in range(len(experiments)):
        dvns = difference_vector_norms.select(reflections['id'] == i)
        counts.append(len(dvns))
        if len(dvns) == 0:
            data.append(0)
            continue
        rmsd = math.sqrt(flex.sum_sq(dvns) / len(dvns))
        data.append(rmsd)
    data *= 1000
    subset = data.select(counts > 0)
    print(len(subset), "experiments with > 0 reflections")

    if params.show_plots:
        h = flex.histogram(subset, n_slots=40)
        fig = plt.figure()
        ax = fig.add_subplot('111')
        ax.plot(h.slot_centers().as_numpy_array(),
                h.slots().as_numpy_array(), '-')
        plt.title("Histogram of %d image RMSDs" % len(subset))

        fig = plt.figure()
        plt.boxplot(subset, vert=False)
        plt.title("Boxplot of %d image RMSDs" % len(subset))
        plt.show()

    outliers = counts == 0
    min_x, q1_x, med_x, q3_x, max_x = five_number_summary(subset)
    print(
        "Five number summary of RMSDs (microns): min %.1f, q1 %.1f, med %.1f, q3 %.1f, max %.1f"
        % (min_x, q1_x, med_x, q3_x, max_x))
    iqr_x = q3_x - q1_x
    cut_x = params.iqr_multiplier * iqr_x
    outliers.set_selected(data > q3_x + cut_x, True)
    #outliers.set_selected(col < q1_x - cut_x, True) # Don't throw away the images that are outliers in the 'good' direction!

    for i in range(len(experiments)):
        if outliers[i]:
            continue
        refls = reflections.select(reflections['id'] == i)
        refls['id'] = flex.int(len(refls), len(filtered_experiments))
        filtered_reflections.extend(refls)
        filtered_experiments.append(experiments[i])

    #import IPython;IPython.embed()
    zeroes = counts == 0
    n_zero = len(counts.select(zeroes))
    print(
        "Removed %d bad experiments and %d experiments with zero reflections, out of %d (%%%.1f)"
        %
        (len(experiments) - len(filtered_experiments) - n_zero, n_zero,
         len(experiments), 100 *
         ((len(experiments) - len(filtered_experiments)) / len(experiments))))

    if params.detector is not None:
        crystals = filtered_experiments.crystals()
        for expt_id, experiment in enumerate(skipped_experiments):
            if experiment.crystal in crystals:
                filtered_experiments.append(experiment)
                refls = skipped_reflections.select(
                    skipped_reflections['id'] == expt_id)
                refls['id'] = flex.int(len(refls),
                                       len(filtered_experiments) - 1)
                filtered_reflections.extend(refls)

    if params.delta_psi_filter is not None:
        delta_psi = filtered_reflections['delpsical.rad'] * 180 / math.pi
        sel = (delta_psi <= params.delta_psi_filter) & (
            delta_psi >= -params.delta_psi_filter)
        l = len(filtered_reflections)
        filtered_reflections = filtered_reflections.select(sel)
        print("Filtering by delta psi, removing %d out of %d reflections" %
              (l - len(filtered_reflections), l))

    print("Final experiment count", len(filtered_experiments))
    return filtered_experiments, filtered_reflections