Example #1
0
    def run(self):
        """Run the script."""
        from dials.util.options import flatten_reflections, flatten_experiments

        # Parse the command line arguments
        params, options = self.parser.parse_args(show_diff_phil=True)

        # Show the help
        if len(params.input.reflections) != 1 and not len(
                params.input.experiments):
            self.parser.print_help()
            exit(0)

        from dials.util.options import flatten_reflections, flatten_experiments

        reflections = flatten_reflections(params.input.reflections)[0]
        experiments = flatten_experiments(params.input.experiments)

        assert len(experiments) == 1
        report = generate_integration_report(
            experiments[0],
            reflections,
            n_resolution_bins=params.n_resolution_bins,
            d_max=params.d_max,
            d_min=params.d_min,
        )

        # Construct the per resolution table
        from dials.util.report import Table

        table = Table()
        table.name = "integration.resolution.summary"
        table.title = "Summary vs resolution"
        table.cols.append(("d_max", "d_max"))
        table.cols.append(("d_mid", "d_mid"))
        table.cols.append(("d_min", "d_min"))
        table.cols.append(("n_full", "# full"))
        table.cols.append(("n_part", "# part"))
        table.cols.append(("n_over", "# over"))
        table.cols.append(("n_ice", "# ice"))
        table.cols.append(("n_sum", "# sum"))
        table.cols.append(("n_prf", "# prf"))
        table.cols.append(("ibg", "Ibg"))
        table.cols.append(("i_sum", "<I>\n (sum)"))
        table.cols.append(("ios_sum", "I/sigI\n (sum)"))
        table.cols.append(("ios_prf", "I/sigI\n (prf)"))
        table.cols.append(("cc_prf", "CC prf"))
        table.cols.append(("rmsd_xy", "RMSD XY"))

        # extract resolution report
        report = report["resolution"]
        report["d_mid"] = []
        for i in range(len(report["bins"]) - 1):
            report["d_mid"].append(
                (report["bins"][i + 1] + report["bins"][i]) / 2.0)
            table.rows.append([
                "%.2f" % report["bins"][i + 1],
                "%.2f" % report["d_mid"][i],
                "%.2f" % report["bins"][i],
                "%d" % report["n_full"][i],
                "%d" % report["n_partial"][i],
                "%d" % report["n_overload"][i],
                "%d" % report["n_ice"][i],
                "%d" % report["n_summed"][i],
                "%d" % report["n_fitted"][i],
                "%.4f" % report["mean_background"][i],
                "%.4f" % report["i_sum"][i],
                "%.4f" % report["ios_sum"][i],
                "%.4f" % report["ios_prf"][i],
                "%.4f" % report["cc_prf"][i],
                "%.4f" % report["rmsd_xy"][i],
            ])
        print(table.as_str())

        # plot mean background first
        # from matplotlib import pyplot
        # fig = pyplot.figure()
        # ax = fig.add_subplot(111)
        # ax.set_xlabel(r'resolution ($\AA$)')
        # ax.set_ylabel(r'$\langle I_b \rangle$')
        # d_mid = flex.double(report['d_mid'])
        # I_bg = flex.double(report['mean_background'][:-1])
        # dm2 = 1/flex.pow2(d_mid)
        # ax.plot(dm2, I_bg)
        # xticks = ax.get_xticks()
        # from math import sqrt
        # x_tick_labs = ["" if e <= 0.0 else "{:.2f}".format(sqrt(1./e))
        #               for e in xticks]
        # ax.set_xticklabels(x_tick_labs)
        #
        # pyplot.show()

        # try plot of log intensity and background
        templ = experiments[0].imageset.get_template()
        import os

        title = os.path.basename(templ)
        import matplotlib

        matplotlib.use("Agg")
        from matplotlib import pyplot

        fig = pyplot.figure()
        ax = fig.add_subplot(111)
        ax.set_xlabel(r"$d_{mid}$ ($\AA$)")
        ax.set_ylabel(r"$\langle Intensity \rangle$")
        d_mid = flex.double(report["d_mid"])
        I_bg = flex.double(report["mean_background"][:-1])
        I_sum = flex.double(report["i_sum"][:-1])
        dm2 = 1 / flex.pow2(d_mid)
        ax.plot(dm2, I_bg, label="Background")
        ax.plot(dm2, I_sum, label="Peak")
        ax.legend(loc="upper right")
        ax.set_title(title)
        ax.set_ylim(-2, 100)
        pyplot.minorticks_on()
        ax.grid(True, which="both")
        xticks = ax.get_xticks()
        from math import sqrt

        x_tick_labs = [
            "" if e <= 0.0 else "{:.2f}".format(sqrt(1.0 / e)) for e in xticks
        ]
        ax.set_xticklabels(x_tick_labs)

        pyplot.savefig("intensity_vs_resolution.png")