コード例 #1
0
    def print_batch_values(self, int_keys):
        """Prints all of the batch/ensemble values."""
        beta_int_key_list = zip(self.batch_names_sorted, int_keys)

        values_header = [r"$\beta$", r"$L/a$", r"$t_0/a^2$",
                         r"$\langle Q^2 \rangle$", r"$\langle Q^4 \rangle$",
                         r"$\langle Q^4 \rangle_C$", r"$R$"]
        values_table = [
            [self.beta_values[bn] for bn in self.batch_names],
            ["{:.2f}".format(self.data_values[bn][k]["aL"])
                for bn, k in beta_int_key_list],
            [sciprint(self.data_values[bn][k]["Q2"],
                      self.data_values[bn][k]["Q2Err"])
                for bn, k in beta_int_key_list],
            [sciprint(self.t0[bn]["t0"], self.t0[bn]["t0err"])
                for bn, k in beta_int_key_list],
            [sciprint(self.data_values[bn][k]["Q4"],
                      self.data_values[bn][k]["Q4Err"])
                for bn, k in beta_int_key_list],
            [sciprint(self.data_values[bn][k]["Q4C"],
                      self.data_values[bn][k]["Q4CErr"])
                for bn, k in beta_int_key_list],
            [sciprint(self.data_values[bn][k]["R"],
                      self.data_values[bn][k]["RErr"])
                for bn, k in beta_int_key_list],
        ]

        values_table_printer = TablePrinter(values_header, values_table)
        values_table_printer.print_table(width=15)
コード例 #2
0
 def print_batch_values(self):
     """Prints all of the batch/ensemble values."""
     values_header = [
         r"Ensemble", r"$L/a$", r"$t_0/a^2$", r"$\langle Q^2 \rangle$",
         r"$\langle Q^4 \rangle$", r"$\langle Q^4 \rangle_C$", r"$R$"
     ]
     values_table = [
         [self.ensemble_names[bn] for bn in self.sorted_batch_names],
         [
             "{:.2f}".format(self.data_values[bn]["aL"])
             for bn in self.sorted_batch_names
         ],
         [
             sciprint(self.t0[bn]["t0"], self.t0[bn]["t0err"])
             for bn in self.sorted_batch_names
         ],
         [
             sciprint(self.data_values[bn]["Q2"],
                      self.data_values[bn]["Q2Err"])
             for bn in self.sorted_batch_names
         ],
         [
             sciprint(self.data_values[bn]["Q4"],
                      self.data_values[bn]["Q4Err"])
             for bn in self.sorted_batch_names
         ],
         [
             sciprint(self.data_values[bn]["Q4C"],
                      self.data_values[bn]["Q4CErr"])
             for bn in self.sorted_batch_names
         ],
         [
             sciprint(self.data_values[bn]["R"],
                      self.data_values[bn]["RErr"])
             for bn in self.sorted_batch_names
         ],
     ]
     values_table_printer = TablePrinter(values_header, values_table)
     values_table_printer.print_table(width=15)
     print "Reference scale: "
コード例 #3
0
    def _print_data(self, atype="bootstrap"):
        """Prints data."""

        article_param_header = [
            r"Lattice",
            r"$\beta$",
            r"$L/a$",
            r"$L[\fm]$",
            r"$a[\fm]$",
            r"$t_0/{a^2}$",
            r"$t_0/{r_0^2}$",
        ]

        art_flat = self.article_flattened
        article_param_table = [
            art_flat.keys(),
            [art_flat[k]["beta"] for k in art_flat],
            [art_flat[k]["L"] for k in art_flat],
            [art_flat[k]["aL"] for k in art_flat],
            [art_flat[k]["a"] for k in art_flat],
            [
                sciprint(art_flat[k]["t0"], art_flat[k]["t0err"], prec=4)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["t0r02"],
                         art_flat[k]["t0r02err"],
                         prec=4,
                         force_prec=True) for k in art_flat
            ],
        ]

        art_param_table_printer = TablePrinter(article_param_header,
                                               article_param_table,
                                               clean_column_duplicates=[1])
        art_param_table_printer.print_table(width=15,
                                            row_seperator=r"\addlinespace",
                                            row_seperator_positions=[5, 7, 9])

        article_values_header = [
            r"Lattice", r"$\langle Q^2 \rangle$", r"$\langle Q^4 \rangle$",
            r"$\langle Q^4 \rangle_C$", r"$R$"
        ]
        article_values_table = [
            art_flat.keys(),
            [
                sciprint(art_flat[k]["Q2"], art_flat[k]["Q2Err"], prec=3)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4"], art_flat[k]["Q4Err"], prec=2)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4C"], art_flat[k]["Q4CErr"], prec=3)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["R"], art_flat[k]["RErr"], prec=3)
                for k in art_flat
            ],
        ]

        art_values_table_printer = TablePrinter(article_values_header,
                                                article_values_table)
        art_values_table_printer.print_table(width=15,
                                             row_seperator=r"\addlinespace",
                                             row_seperator_positions=[5, 7, 9])

        article_normed_header = [
            r"Lattice", r"$\langle Q^2 \rangle_\text{normed}$",
            r"$\langle Q^4 \rangle_\text{normed}$",
            r"$\langle Q^4 \rangle_{C,\text{normed}}$", r"$R_\text{normed}$"
        ]
        article_normed_table = [
            art_flat.keys(),
            [
                sciprint(art_flat[k]["Q2_norm"],
                         art_flat[k]["Q2Err_norm"],
                         prec=3) for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4_norm"],
                         art_flat[k]["Q4Err_norm"],
                         prec=3) for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4C_norm"],
                         art_flat[k]["Q4CErr_norm"],
                         prec=3) for k in art_flat
            ],
            [
                sciprint(art_flat[k]["R_norm"],
                         art_flat[k]["RErr_norm"],
                         prec=3) for k in art_flat
            ],
        ]

        art_normed_table_printer = TablePrinter(article_normed_header,
                                                article_normed_table)
        art_normed_table_printer.print_table(width=15,
                                             row_seperator=r"\addlinespace",
                                             row_seperator_positions=[5, 7, 9])

        ratio_header = [
            r"Lattice", r"Ensemble", r"$\text{Ratio}(\langle Q^2 \rangle)$",
            r"$\text{Ratio}(\langle Q^4 \rangle)$",
            r"$\text{Ratio}(\langle Q^4 \rangle_C)$", r"$\text{Ratio}(R)$"
        ]
        ratio_table = []
        for fk in self.article_flattened:
            for bn in self.sorted_batch_names:
                sub_list = []

                sub_list.append(fk)
                sub_list.append(self.ensemble_names[bn])
                sub_list.append(
                    sciprint(self.data_ratios[fk][bn]["Q2"],
                             self.data_ratios[fk][bn]["Q2Err"]))
                sub_list.append(
                    sciprint(self.data_ratios[fk][bn]["Q4"],
                             self.data_ratios[fk][bn]["Q4Err"]))
                sub_list.append(
                    sciprint(self.data_ratios[fk][bn]["Q4C"],
                             self.data_ratios[fk][bn]["Q4CErr"]))
                sub_list.append(
                    sciprint(self.data_ratios[fk][bn]["R"],
                             self.data_ratios[fk][bn]["RErr"]))

                ratio_table.append(sub_list)

        ratio_table = np.asarray(ratio_table).T.tolist()
        ratio_tab_pos = (4 * np.arange(len(self.article_flattened))) - 1
        ratio_table_printer = TablePrinter(ratio_header,
                                           ratio_table,
                                           clean_column_duplicates=[0, 1])
        ratio_table_printer.print_table(width=15,
                                        row_seperator=r"\addlinespace",
                                        row_seperator_positions=ratio_tab_pos)

        print "Reference scale t0(my data): %s" % self.t0
コード例 #4
0
    def _print_data(self, int_keys, atype="bootstrap"):
        """Prints data."""

        article_param_header = [
            r"Lattice",
            r"$\beta$",
            r"$L/a$",
            r"$L[\fm]$",
            r"$a[\fm]$",
            r"$t_0/{a^2}$",
            r"$t_0/{r_0^2}$",
        ]

        art_flat = self.article_flattened
        article_param_table = [
            art_flat.keys(),
            [art_flat[k]["beta"] for k in art_flat],
            [art_flat[k]["L"] for k in art_flat],
            [art_flat[k]["aL"] for k in art_flat],
            [art_flat[k]["a"] for k in art_flat],
            [
                sciprint(art_flat[k]["t0"], art_flat[k]["t0err"], prec=4)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["t0r02"],
                         art_flat[k]["t0r02err"],
                         prec=4,
                         force_prec=True) for k in art_flat
            ],
        ]

        art_param_table_printer = TablePrinter(article_param_header,
                                               article_param_table)
        art_param_table_printer.print_table(width=15,
                                            row_seperator_positions=[5, 7, 9])

        article_values_header = [
            r"Lattice", r"$\langle Q^2 \rangle$", r"$\langle Q^4 \rangle$",
            r"$\langle Q^4 \rangle_C$", r"$R$"
        ]
        article_values_table = [
            art_flat.keys(),
            [
                sciprint(art_flat[k]["Q2"], art_flat[k]["Q2Err"], prec=3)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4"], art_flat[k]["Q4Err"], prec=2)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4C"], art_flat[k]["Q4CErr"], prec=3)
                for k in art_flat
            ],
            [
                sciprint(art_flat[k]["R"], art_flat[k]["RErr"], prec=3)
                for k in art_flat
            ],
        ]

        art_values_table_printer = TablePrinter(article_values_header,
                                                article_values_table)
        art_values_table_printer.print_table(width=15,
                                             row_seperator_positions=[5, 7, 9])

        article_normed_header = [
            r"Lattice", r"$\langle Q^2 \rangle_\text{normed}$",
            r"$\langle Q^4 \rangle_\text{normed}$",
            r"$\langle Q^4 \rangle_{C,\text{normed}}$", r"$R_\text{normed}$"
        ]
        article_normed_table = [
            art_flat.keys(),
            [
                sciprint(art_flat[k]["Q2_norm"],
                         art_flat[k]["Q2Err_norm"],
                         prec=3) for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4_norm"],
                         art_flat[k]["Q4Err_norm"],
                         prec=3) for k in art_flat
            ],
            [
                sciprint(art_flat[k]["Q4C_norm"],
                         art_flat[k]["Q4CErr_norm"],
                         prec=3) for k in art_flat
            ],
            [
                sciprint(art_flat[k]["R_norm"],
                         art_flat[k]["RErr_norm"],
                         prec=3) for k in art_flat
            ],
        ]

        art_normed_table_printer = TablePrinter(article_normed_header,
                                                article_normed_table)
        art_normed_table_printer.print_table(width=15,
                                             row_seperator_positions=[5, 7, 9])

        beta_int_key_list = zip(self.beta_values, int_keys)

        values_header = [
            r"$\beta$", r"$L/a$", r"$t_0/a^2$", r"$\langle Q^2 \rangle$",
            r"$\langle Q^4 \rangle$", r"$\langle Q^4 \rangle_C$", r"$R$"
        ]
        values_table = [
            [b for b in self.beta_values],
            [
                "{:.2f}".format(self.data_values[b][k]["aL"])
                for b, k in beta_int_key_list
            ],
            [
                sciprint(self.data_values[b][k]["Q2"],
                         self.data_values[b][k]["Q2Err"])
                for b, k in beta_int_key_list
            ],
            [
                sciprint(self.t0[b]["t0"], self.t0[b]["t0err"])
                for b, k in beta_int_key_list
            ],
            [
                sciprint(self.data_values[b][k]["Q4"],
                         self.data_values[b][k]["Q4Err"])
                for b, k in beta_int_key_list
            ],
            [
                sciprint(self.data_values[b][k]["Q4C"],
                         self.data_values[b][k]["Q4CErr"])
                for b, k in beta_int_key_list
            ],
            [
                sciprint(self.data_values[b][k]["R"],
                         self.data_values[b][k]["RErr"])
                for b, k in beta_int_key_list
            ],
        ]

        values_table_printer = TablePrinter(values_header, values_table)
        values_table_printer.print_table(width=15)

        ratio_header = [
            r"Lattice", r"$\beta$", r"$\text{Ratio}(\langle Q^2 \rangle)$",
            r"$\text{Ratio}(\langle Q^4 \rangle)$",
            r"$\text{Ratio}(\langle Q^4 \rangle_C)$", r"$\text{Ratio}(R)$"
        ]
        ratio_table = []
        for fk in self.article_flattened:
            for b, k in beta_int_key_list:
                sub_list = []

                sub_list.append(fk)
                sub_list.append(b)
                sub_list.append(
                    sciprint(self.data_ratios[fk][b][k]["Q2"],
                             self.data_ratios[fk][b][k]["Q2Err"]))
                sub_list.append(
                    sciprint(self.data_ratios[fk][b][k]["Q4"],
                             self.data_ratios[fk][b][k]["Q4Err"]))
                sub_list.append(
                    sciprint(self.data_ratios[fk][b][k]["Q4C"],
                             self.data_ratios[fk][b][k]["Q4CErr"]))
                sub_list.append(
                    sciprint(self.data_ratios[fk][b][k]["R"],
                             self.data_ratios[fk][b][k]["RErr"]))

                ratio_table.append(sub_list)

        ratio_table = np.asarray(ratio_table).T.tolist()
        ratio_tab_pos = (4 * np.arange(len(self.article_flattened))) - 1
        ratio_table_printer = TablePrinter(ratio_header, ratio_table)
        ratio_table_printer.print_table(width=15,
                                        row_seperator_positions=ratio_tab_pos)

        print "Reference scale t0(my data): %s" % self.t0
コード例 #5
0
    def get_w0_scale(self, extrapolation_method="bootstrap", W0=0.3, **kwargs):
        """
        Method for retrieving the w0 reference scale setting, based on paper:
        http://xxx.lanl.gov/pdf/1203.4469v2
        """
        if self.verbose:
            print "Scale w0 extraction method:      " + extrapolation_method
            print "Scale w0 extraction data:        " + self.analysis_data_type

        # Retrieves t0 values from data
        a_values = []
        a_values_err = []
        w0_values = []
        w0err_values = []
        w0a_values = []
        w0aerr_values = []

        # Since we are slicing tau int, and it will only be ignored
        # if it is None in extract_fit_targets, we set it manually
        # if we have provided it.

        for bn in self.sorted_batch_names:
            bval = self.plot_values[bn]

            # Sets correct tau int to pass to fit extraction
            if "blocked" in self.analysis_data_type:
                _tmp_tau_int = None
                _tmp_tau_int_err = None
            else:
                _tmp_tau_int = bval["tau_int"][1:-1]
                _tmp_tau_int_err = bval["tau_int_err"][1:-1]

            y0, t_w0, t_w0_err, _, _ = extract_fit_target(
                W0,
                bval["tder"],
                bval["W"],
                y_err=bval["W_err"],
                y_raw=bval["W_raw"],
                tau_int=_tmp_tau_int,
                tau_int_err=_tmp_tau_int_err,
                extrapolation_method=extrapolation_method,
                plateau_size=10,
                inverse_fit=True,
                **kwargs)

            # NOTE: w0 has units of [fm].
            # t_w0 = a^2 * t_f / r0^2
            # Returns t_w0 = (w0)^2 / r0^2.

            # Lattice spacing
            a_values.append(bval["a"]**2)
            a_values_err.append(2 * bval["a_err"] * bval["a"])

            # Plain w_0 retrieval
            w0_values.append(np.sqrt(t_w0))
            w0err_values.append(0.5 * t_w0_err / np.sqrt(t_w0))

            # w_0 / a
            w0a_values.append(np.sqrt(t_w0) / bval["a"])
            w0aerr_values.append(
                np.sqrt((t_w0_err / (2 * np.sqrt(t_w0)) / bval["a"])**2 +
                        (np.sqrt(t_w0) * bval["a_err"] / bval["a"]**2)**2))

        # Reverse lists and converts them to arrays
        a_values = np.asarray(a_values[::-1])
        a_values_err = np.asarray(a_values_err[::-1])
        w0_values = np.asarray(w0_values[::-1])
        w0err_values = np.asarray(w0err_values[::-1])
        w0a_values, w0aerr_values = map(np.asarray,
                                        (w0a_values, w0aerr_values))

        # Extrapolates t0 to continuum
        N_cont = 1000
        a_squared_cont = np.linspace(-0.00025, a_values[-1] * 1.1, N_cont)

        # Fits to continuum and retrieves values to be plotted
        continuum_fit = LineFit(a_values, w0_values, y_err=w0err_values)
        y_cont, y_cont_err, fit_params, chi_squared = \
            continuum_fit.fit_weighted(a_squared_cont)

        res = continuum_fit(0, weighted=True)
        self.w0_cont = res[0][0]
        self.w0_cont_error = (res[1][-1][0] - res[1][0][0]) / 2
        # self.sqrt8w0_cont = np.sqrt(8*self.w0_cont)
        # self.sqrt8w0_cont_error = 4*self.w0_cont_error/np.sqrt(8*self.w0_cont)

        # Creates continuum extrapolation plot
        fname = os.path.join(
            self.output_folder_path,
            "post_analysis_extrapmethod%s_w0reference_continuum_%s.pdf" %
            (extrapolation_method, self.analysis_data_type))
        self.plot_continuum_fit(a_squared_cont,
                                y_cont,
                                y_cont_err,
                                chi_squared,
                                a_values,
                                a_values_err,
                                w0_values,
                                w0err_values,
                                0,
                                0,
                                self.w0_cont,
                                self.w0_cont_error,
                                r"w_{0,\mathrm{cont}}",
                                fname,
                                r"$w_0[\mathrm{fm}]$",
                                r"$a^2[\mathrm{GeV}^{-2}]$",
                                y_limits=[0.1625, 0.1750],
                                cont_label_unit=" fm")

        # Reverses values for storage.
        a_values, a_values_err, w0_values, w0err_values, = map(
            lambda k: np.flip(k, 0),
            (a_values, a_values_err, w0_values, w0err_values))

        # Populates dictionary with w0 values for each batch
        _tmp_batch_dict = {
            bn: {
                "w0":
                w0_values[i],
                "w0err":
                w0err_values[i],
                "w0a":
                w0a_values[i],
                "w0aerr":
                w0aerr_values[i],
                "w0r0":
                w0_values[i] / self.r0,
                "w0r0err":
                w0err_values[i] / self.r0,
                "aL":
                self.plot_values[bn]["a"] * self.lattice_sizes[bn][0],
                "aLerr":
                (self.plot_values[bn]["a_err"] * self.lattice_sizes[bn][0]),
                "L":
                self.lattice_sizes[bn][0],
                "a":
                self.plot_values[bn]["a"],
                "a_err":
                self.plot_values[bn]["a_err"],
            }
            for i, bn in enumerate(self.sorted_batch_names)
        }

        # Populates dictionary with continuum w0 value
        w0_dict = {
            "w0cont": self.w0_cont,
            "w0cont_err": self.w0_cont_error,
        }
        w0_dict.update(_tmp_batch_dict)

        if self.verbose:
            print "w0 reference values table: "
            print "w0 = %.16f +/- %.16f" % (self.w0_cont, self.w0_cont_error)
            print "chi^2/dof = %.16f" % chi_squared
            for bn in self.sorted_batch_names:
                msg = "beta = %.2f" % self.beta_values[bn]
                msg += " || w0 = %10f +/- %-10f" % (w0_dict[bn]["w0"],
                                                    w0_dict[bn]["w0err"])
                msg += " || w0/a = %10f +/- %-10f" % (w0_dict[bn]["w0a"],
                                                      w0_dict[bn]["w0aerr"])
                msg += " || w0/r0 = %10f +/- %-10f" % (w0_dict[bn]["w0r0"],
                                                       w0_dict[bn]["w0r0err"])
                print msg

        if self.print_latex:
            # Header:
            # beta  w0  a^2  L/a  L  a

            header = [
                r"Ensemble",
                r"$w_0[\fm]$",
                # r"$a^2[\mathrm{GeV}^{-2}]$",
                r"$w_0/a$",
                r"$L/a$",
                r"$L[\fm]$",
                r"$a[\fm]$"
            ]

            bvals = self.sorted_batch_names
            tab = [
                [r"{0:s}".format(self.ensemble_names[bn]) for bn in bvals],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(w0_dict[bn]["w0"],
                                          w0_dict[bn]["w0err"]))
                    for bn in bvals
                ],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(w0_dict[bn]["w0a"],
                                          w0_dict[bn]["w0aerr"]))
                    for bn in bvals
                ],
                # [r"{0:s}".format(sciprint.sciprint(
                #     self.plot_values[bn]["a"]**2,
                #     self.plot_values[bn]["a_err"]*2*self.plot_values[bn]["a"]))
                #  for bn in bvals],
                [r"{0:d}".format(self.lattice_sizes[bn][0]) for bn in bvals],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(
                            self.lattice_sizes[bn][0] *
                            self.plot_values[bn]["a"],
                            self.lattice_sizes[bn][0] *
                            self.plot_values[bn]["a_err"])) for bn in bvals
                ],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(self.plot_values[bn]["a"],
                                          self.plot_values[bn]["a_err"]))
                    for bn in bvals
                ],
            ]

            table_filename = "energy_w0_" + self.analysis_data_type
            table_filename += "-".join(self.batch_names) + ".txt"
            ptab = TablePrinter(header, tab)
            ptab.print_table(latex=True, width=15, filename=table_filename)

        return w0_dict
コード例 #6
0
    def get_t0_scale(self,
                     extrapolation_method="plateau_mean",
                     E0=0.3,
                     **kwargs):
        """
        Method for retrieveing reference value t0 based on Luscher(2010),
        Properties and uses of the Wilson flow in lattice QCD.
        t^2<E_t>|_{t=t_0} = 0.3
        Will return t0 values and make a plot of the continuum value 
        extrapolation.

        Args:
                extrapolation_method: str, optional. Method of t0 extraction. 
                        Default is plateau_mean.
                E0: float, optional. Default is 0.3.

        Returns:
                t0: dictionary of t0 values for each of the batches, and a 
                        continuum value extrapolation.
        """
        if self.verbose:
            print "Scale t0 extraction method:      " + extrapolation_method
            print "Scale t0 extraction data:        " + self.analysis_data_type

        # Retrieves t0 values from data
        a_values = []
        a_values_err = []
        t0_values = []
        t0err_values = []

        for bn in self.sorted_batch_names:
            bval = self.plot_values[bn]
            y0, t0, t0_err, _, _ = extract_fit_target(
                E0,
                bval["t"],
                bval["y"],
                y_err=bval["y_err"],
                y_raw=bval[self.analysis_data_type],
                tau_int=bval["tau_int"],
                tau_int_err=bval["tau_int_err"],
                extrapolation_method=extrapolation_method,
                plateau_size=10,
                inverse_fit=True,
                **kwargs)

            a_values.append(bval["a"]**2 / t0)
            a_values_err.append(
                np.sqrt((2 * bval["a_err"] * bval["a"] / t0)**2 +
                        (bval["a"]**2 * t0_err / t0**2)**2))

            t0_values.append(t0)
            t0err_values.append(t0_err)

        a_values = np.asarray(a_values[::-1])
        a_values_err = np.asarray(a_values_err[::-1])
        t0_values = np.asarray(t0_values[::-1])
        t0err_values = np.asarray(t0err_values[::-1])

        # Functions for t0 and propagating uncertainty
        def t0_func(_t0):
            return np.sqrt(8 * _t0) / self.r0

        def t0err_func(_t0, _t0_err):            return _t0_err * \
np.sqrt(8/_t0)/(2.0*self.r0)

        # Sets up t0 and t0_error values to plot
        y = t0_func(t0_values)
        yerr = t0err_func(t0_values, t0err_values)

        # Extrapolates t0 to continuum
        N_cont = 1000
        a_squared_cont = np.linspace(-0.025, a_values[-1] * 1.1, N_cont)

        # Fits to continuum and retrieves values to be plotted
        continuum_fit = LineFit(a_values, y, y_err=yerr)
        y_cont, y_cont_err, fit_params, chi_squared = \
            continuum_fit.fit_weighted(a_squared_cont)

        res = continuum_fit(0, weighted=True)
        self.sqrt_8t0_cont = res[0][0]
        self.sqrt_8t0_cont_error = (res[1][-1][0] - res[1][0][0]) / 2
        self.t0_cont = self.sqrt_8t0_cont**2 / 8
        self.t0_cont_error = self.sqrt_8t0_cont_error * np.sqrt(
            self.t0_cont / 2.0)

        # Creates continuum extrapolation figure
        fname = os.path.join(
            self.output_folder_path,
            "post_analysis_extrapmethod%s_t0reference_continuum_%s.pdf" %
            (extrapolation_method, self.analysis_data_type))
        self.plot_continuum_fit(a_squared_cont, y_cont, y_cont_err,
                                chi_squared, a_values, a_values_err, y, yerr,
                                0, 0, self.sqrt_8t0_cont,
                                self.sqrt_8t0_cont_error,
                                r"\frac{\sqrt{8t_{0,\mathrm{cont}}}}{r_0}",
                                fname, r"$\frac{\sqrt{8t_0}}{r_0}$",
                                r"$a^2/t_0$")

        self.extrapolation_method = extrapolation_method

        # Reverses values for storage.
        a_values, a_values_err, t0_values, t0err_values = map(
            lambda k: np.flip(k, 0),
            (a_values, a_values_err, t0_values, t0err_values))

        _tmp_batch_dict = {
            bn: {
                "t0": t0_values[i],
                "t0err": t0err_values[i],
                "t0a2": t0_values[i]/self.plot_values[bn]["a"]**2,
                # Including error term in lattice spacing, a
                "t0a2err": np.sqrt((t0err_values[i] / \
                                    self.plot_values[bn]["a"]**2)**2 \
                                   + (2*self.plot_values[bn]["a_err"] * \
                                      t0_values[i] /\
                                      self.plot_values[bn]["a"]**3)**2),
                "t0r02": t0_values[i]/self.r0**2,
                "t0r02err": t0err_values[i]/self.r0**2,
                "aL": self.plot_values[bn]["a"]*self.lattice_sizes[bn][0],
                "aLerr": (self.plot_values[bn]["a_err"] \
                          * self.lattice_sizes[bn][0]),
                "L": self.lattice_sizes[bn][0],
                "a": self.plot_values[bn]["a"],
                "a_err": self.plot_values[bn]["a_err"],
            }
            for i, bn in enumerate(self.batch_names)
        }

        t0_dict = {"t0cont": self.t0_cont, "t0cont_err": self.t0_cont_error}
        t0_dict.update(_tmp_batch_dict)

        if self.verbose:
            print "t0 reference values table: "
            print "sqrt(8t0)/r0 = %.16f +/- %.16f" % (self.sqrt_8t0_cont,
                                                      self.sqrt_8t0_cont_error)
            print "t0/r0^2 = %.16f +/- %.16f" % (self.t0_cont,
                                                 self.t0_cont_error)
            print "chi^2/dof = %.16f" % chi_squared
            for bn in self.batch_names:
                msg = "beta = %.2f || t0 = %10f +/- %-10f" % (
                    self.beta_values[bn], t0_dict[bn]["t0"],
                    t0_dict[bn]["t0err"])
                msg += " || t0/a^2 = %10f +/- %-10f" % (t0_dict[bn]["t0a2"],
                                                        t0_dict[bn]["t0a2err"])
                msg += " || t0/r0^2 = %10f +/- %-10f" % (
                    t0_dict[bn]["t0r02"], t0_dict[bn]["t0r02err"])
                print msg

        if self.print_latex:
            # Header:
            # beta   t0a2   t0r02   L/a   L   a

            header = [
                r"$\beta$", r"$t_0$[fm]", r"$t_0/a^2$", r"$t_0/r_0^2$",
                r"$L/a$", r"$L[\fm]$", r"$a[\fm]$"
            ]

            bvals = self.batch_names
            tab = [
                [r"{0:s}".format(self.ensemble_names[bn]) for bn in bvals],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(t0_dict[bn]["t0"],
                                          t0_dict[bn]["t0err"]))
                    for bn in bvals
                ],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(t0_dict[bn]["t0a2"],
                                          t0_dict[bn]["t0a2err"]))
                    for bn in bvals
                ],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(t0_dict[bn]["t0r02"],
                                          t0_dict[bn]["t0r02err"]))
                    for bn in bvals
                ],
                [r"{0:d}".format(self.lattice_sizes[bn][0]) for bn in bvals],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(
                            self.lattice_sizes[bn][0] *
                            self.plot_values[bn]["a"],
                            self.lattice_sizes[bn][0] *
                            self.plot_values[bn]["a_err"])) for bn in bvals
                ],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(self.plot_values[bn]["a"],
                                          self.plot_values[bn]["a_err"]))
                    for bn in bvals
                ],
            ]

            table_filename = "energy_t0_" + self.analysis_data_type
            table_filename += "-".join(self.batch_names) + ".txt"
            ptab = TablePrinter(header, tab)
            ptab.print_table(latex=True, width=15, filename=table_filename)

        return t0_dict
コード例 #7
0
    def get_w0_scale(self,
                     extrapolation_method="plateau_mean",
                     W0=0.3,
                     **kwargs):
        """
        Method for retrieving the w0 reference scale setting, based on paper:
        http://xxx.lanl.gov/pdf/1203.4469v2
        """
        if self.verbose:
            print "Scale w0 extraction method:      " + extrapolation_method
            print "Scale w0 extraction data:        " + self.analysis_data_type

        # Retrieves t0 values from data
        a_values = []
        a_values_err = []
        w0_values = []
        w0err_values = []

        for bn in self.sorted_batch_names:
            bval = self.plot_values[bn]
            y0, w0, w0_err, _, _ = extract_fit_target(
                W0,
                bval["xraw"],
                bval["y"],
                y_err=bval["y_err"],
                y_raw=bval[self.analysis_data_type],
                tau_int=bval["tau_int"][1:-1],
                tau_int_err=bval["tau_int_err"][1:-1],
                extrapolation_method=extrapolation_method,
                plateau_size=10,
                inverse_fit=True,
                **kwargs)

            # TODO: fix a lattice spacing error here @ w_t
            a_values.append(bval["a"]**2)
            a_values_err.append(2 * bval["a"] * bval["a_err"])
            w0_values.append(np.sqrt(w0) * bval["a"])
            w0err_values.append(0.5 * w0_err / np.sqrt(w0))

        a_values = np.asarray(a_values[::-1])
        a_values_err = np.asarray(a_values_err[::-1])
        w0_values = np.asarray(w0_values[::-1])
        w0err_values = np.asarray(w0err_values[::-1])

        # # Functions for t0 and propagating uncertainty
        # t0_func = lambda _t0: np.sqrt(8*_t0)/self.r0
        # t0err_func = lambda _t0, _t0_err: _t0_err*np.sqrt(8/_t0)/(2.0*self.r0)

        # # Sets up t0 and t0_error values to plot
        # y = t0_func(t0_values)
        # yerr = t0err_func(t0_values, t0err_values)

        # Extrapolates t0 to continuum
        N_cont = 1000
        a_squared_cont = np.linspace(-0.00025, a_values[-1] * 1.1, N_cont)

        # Fits to continuum and retrieves values to be plotted
        continuum_fit = LineFit(a_values, w0_values, y_err=w0err_values)
        y_cont, y_cont_err, fit_params, chi_squared = \
            continuum_fit.fit_weighted(a_squared_cont)

        res = continuum_fit(0, weighted=True)
        self.w0_cont = res[0][0]
        self.w0_cont_error = (res[1][-1][0] - res[1][0][0]) / 2
        # self.t0_cont = self.sqrt_8t0_cont**2/8
        # self.t0_cont_error = self.sqrt_8t0_cont_error*np.sqrt(self.t0_cont/2.0)

        # Creates figure and plot window
        fig = plt.figure()
        ax = fig.add_subplot(111)
        # Plots linefit with errorband
        ax.plot(a_squared_cont,
                y_cont,
                color="tab:red",
                alpha=0.5,
                label=r"$\chi=%.2f$" % chi_squared)
        ax.fill_between(a_squared_cont,
                        y_cont_err[0],
                        y_cont_err[1],
                        alpha=0.5,
                        edgecolor='',
                        facecolor="tab:red")
        ax.axvline(0, linestyle="dashed", color="tab:red")
        ax.errorbar(a_values,
                    w0_values,
                    xerr=a_values_err,
                    yerr=w0err_values,
                    fmt="o",
                    capsize=5,
                    capthick=1,
                    color="#000000",
                    ecolor="#000000")
        ax.set_ylabel(r"$w_0[\mathrm{fm}]$")
        ax.set_xlabel(r"$a^2[\mathrm{GeV}^{-2}]$")
        ax.set_xlim(a_squared_cont[0], a_squared_cont[-1])
        ax.legend()
        ax.grid(True)

        # Saves figure
        fname = os.path.join(
            self.output_folder_path,
            "post_analysis_extrapmethod%s_w0reference_continuum_%s.pdf" %
            (extrapolation_method, self.analysis_data_type))
        fig.savefig(fname, dpi=self.dpi)
        if self.verbose:
            print "Figure saved in %s" % fname

        plt.close(fig)

        w0_values = w0_values[::-1]
        w0err_values = w0err_values[::-1]

        _tmp_beta_dict = {
            b: {
                "w0": w0_values[i],
                "w0err": w0err_values[i],
                "aL": self.plot_values[b]["a"]*self.lattice_sizes[b][0],
                "aLerr": (self.plot_values[b]["a_err"] \
                    * self.lattice_sizes[b][0]),
                "L": self.lattice_sizes[b][0],
                "a": self.plot_values[bn]["a"],
                "a_err": self.plot_values[b]["a_err"],
            }
            for i, b in enumerate(self.batch_names)
        }

        w0_dict = {"w0cont": self.w0_cont, "w0cont_err": self.w0_cont_error}
        w0_dict.update(_tmp_beta_dict)

        if self.verbose:
            print "w0 reference values table: "
            print "w0 = %.16f +/- %.16f" % (self.w0_cont, self.w0_cont_error)
            for b in self.batch_names:
                msg = "beta = %.2f || w0 = %10f +/- %-10f" % (
                    self.beta_values[b], w0_dict[b]["w0"], w0_dict[b]["w0err"])
                print msg

        if self.print_latex:
            # Header:
            # beta  w0  a^2  L/a  L  a

            header = [
                r"$\beta$", r"$w_0[\fm]$", r"$a^2[\mathrm{GeV}^{-2}]$",
                r"$L/a$", r"$L[\fm]$", r"$a[\fm]$"
            ]

            bvals = self.sorted_batch_names
            tab = [
                [r"{0:.2f}".format(self.beta_values[b]) for b in bvals],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(w0_dict[b]["w0"],
                                          w0_dict[b]["w0err"])) for b in bvals
                ],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(
                            self.plot_values[b]["a"]**2,
                            self.plot_values[b]["a_err"] * 2 *
                            self.plot_values[b]["a"])) for b in bvals
                ],
                [r"{0:d}".format(self.lattice_sizes[b][0]) for b in bvals],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(
                            self.lattice_sizes[b][0] *
                            self.plot_values[b]["a"],
                            self.lattice_sizes[b][0] *
                            self.plot_values[b]["a_err"])) for b in bvals
                ],
                [
                    r"{0:s}".format(
                        sciprint.sciprint(self.plot_values[b]["a"],
                                          self.plot_values[b]["a_err"]))
                    for b in bvals
                ],
            ]

            ptab = TablePrinter(header, tab)
            ptab.print_table(latex=True, width=15)
コード例 #8
0
	def get_t0_scale(self, extrapolation_method="plateau_mean", E0=0.3, **kwargs):
		"""
		Method for retrieveing reference value t0 based on Luscher(2010),
		Properties and uses of the Wilson flow in lattice QCD.
		t^2<E_t>|_{t=t_0} = 0.3
		Will return t0 values and make a plot of the continuum value 
		extrapolation.

		Args:
			extrapolation_method: str, optional. Method of t0 extraction. 
				Default is plateau_mean.
			E0: float, optional. Default is 0.3.

		Returns:
			t0: dictionary of t0 values for each of the betas, and a continuum
				value extrapolation.
		"""
		if self.verbose:
			print "Scale t0 extraction method:      " + extrapolation_method
			print "Scale t0 extraction data:        " + self.analysis_data_type

		# Retrieves t0 values from data
		a_values = []
		a_values_err = []
		t0_values = []
		t0err_values = []

		for beta, bval in sorted(self.plot_values.items(), key=lambda i: i[0]):
			y0, t0, t0_err, _, _ = extract_fit_target(E0, bval["t"], bval["y"],
				y_err=bval["y_err"], y_raw=bval[self.analysis_data_type], 
				tau_int=bval["tau_int"], tau_int_err=bval["tau_int_err"],
				extrapolation_method=extrapolation_method, plateau_size=10,
				inverse_fit=True, **kwargs)

			a_values.append(bval["a"]**2/t0)
			a_values_err.append(np.sqrt((2*bval["a_err"]*bval["a"]/t0)**2 \
				+ (bval["a"]**2*t0_err/t0**2)**2))

			t0_values.append(t0)
			t0err_values.append(t0_err)

		a_values = np.asarray(a_values[::-1])
		a_values_err = np.asarray(a_values_err[::-1])
		t0_values = np.asarray(t0_values[::-1])
		t0err_values = np.asarray(t0err_values[::-1])		

		# Functions for t0 and propagating uncertainty
		t0_func = lambda _t0: np.sqrt(8*_t0)/self.r0
		t0err_func = lambda _t0, _t0_err: _t0_err*np.sqrt(8/_t0)/(2.0*self.r0)

		# Sets up t0 and t0_error values to plot
		y = t0_func(t0_values)
		yerr = t0err_func(t0_values, t0err_values)

		# Extrapolates t0 to continuum
		N_cont = 1000
		a_squared_cont = np.linspace(-0.025, a_values[-1]*1.1, N_cont)

		# Fits to continuum and retrieves values to be plotted
		continuum_fit = LineFit(a_values, y, y_err=yerr)
		y_cont, y_cont_err, fit_params, chi_squared = \
			continuum_fit.fit_weighted(a_squared_cont)

		res = continuum_fit(0, weighted=True)
		self.sqrt_8t0_cont = res[0][0]
		self.sqrt_8t0_cont_error = (res[1][-1][0] - res[1][0][0])/2
		self.t0_cont = self.sqrt_8t0_cont**2/8
		self.t0_cont_error = self.sqrt_8t0_cont_error*np.sqrt(self.t0_cont/2.0)

		# Creates figure and plot window
		fig = plt.figure()
		ax = fig.add_subplot(111)
		# Plots linefit with errorband
		ax.plot(a_squared_cont, y_cont, color="tab:red", alpha=0.5,
			label=r"$\chi=%.2f$" % chi_squared)
		ax.fill_between(a_squared_cont, y_cont_err[0], 
			y_cont_err[1], alpha=0.5, edgecolor='',
			facecolor="tab:red")
		ax.axvline(0, linestyle="dashed", color="tab:red")
		ax.errorbar(a_values, y, xerr=a_values_err, yerr=yerr, fmt="o", capsize=5,
			capthick=1, color="#000000", ecolor="#000000")
		ax.set_ylabel(r"$\sqrt{8t_0}/r_0$")
		ax.set_xlabel(r"$a^2/t_0$")
		ax.set_xlim(a_squared_cont[0], a_squared_cont[-1])
		ax.legend()
		ax.grid(True)

		# Saves figure
		fname = os.path.join(self.output_folder_path, 
			"post_analysis_extrapmethod%s_t0reference_continuum_%s.png" % (
				extrapolation_method, self.analysis_data_type))
		fig.savefig(fname, dpi=self.dpi)
		if self.verbose:
			print "Figure saved in %s" % fname

		plt.close(fig)

		self.extrapolation_method = extrapolation_method

		_tmp_beta_dict = {
			b: {
				"t0": t0_values[i],
				"t0err": t0err_values[i],
				"t0a2": t0_values[i]/self.plot_values[b]["a"]**2,
				# Including error term in lattice spacing, a
				"t0a2err": np.sqrt((t0err_values[i]/self.plot_values[b]["a"]**2)**2 \
					+ (2*self.plot_values[b]["a_err"]*t0_values[i]/self.plot_values[b]["a"]**3)**2),
				"t0r02": t0_values[i]/self.r0**2,
				"t0r02err": t0err_values[i]/self.r0**2,
				"aL": self.plot_values[b]["a"]*self.lattice_sizes[b][0],
				"aLerr": (self.plot_values[b]["a_err"] \
					* self.lattice_sizes[b][0]),
				"L": self.lattice_sizes[b][0],
				"a": self.plot_values[beta]["a"],
				"a_err": self.plot_values[b]["a_err"],
			}
			for i, b in enumerate(self.beta_values)
		}

		t0_dict = {"t0cont": self.t0_cont, "t0cont_err": self.t0_cont_error}
		t0_dict.update(_tmp_beta_dict)

		if self.verbose:
			print "t0 reference values table: "
			print "sqrt(8t0)/r0 = %.16f +/- %.16f" % (self.sqrt_8t0_cont,
				self.sqrt_8t0_cont_error)
			print "t0 = %.16f +/- %.16f" % (self.t0_cont,
				self.t0_cont_error)
			for b in self.beta_values:
				msg = "beta = %.2f || t0 = %10f +/- %-10f" % (b, 
					t0_dict[b]["t0"], t0_dict[b]["t0err"])
				msg += " || t0/a^2 = %10f +/- %-10f" % (t0_dict[b]["t0a2"], 
					t0_dict[b]["t0a2err"])
				msg += " || t0/a^2 = %10f +/- %-10f" % (t0_dict[b]["t0a2"], 
					t0_dict[b]["t0a2err"])
				msg += " || t0/r0^2 = %10f +/- %-10f" % (t0_dict[b]["t0r02"],
					t0_dict[b]["t0r02err"])
				print msg

		if self.print_latex:
			# Header:
			# beta   t0a2   t0r02   L/a   L   a

			header = [r"$\beta$", r"$t_0/a^2$", r"$t_0/{r_0^2}$", r"$L/a$",
				r"$L[\fm]$", r"$a[\fm]$"]

			bvals = self.beta_values
			tab = [
				[r"{0:.2f}".format(b) for b in bvals],
				[r"{0:s}".format(sciprint.sciprint(t0_dict[b]["t0a2"], 
					t0_dict[b]["t0a2err"])) for b in bvals],
				[r"{0:s}".format(sciprint.sciprint(t0_dict[b]["t0r02"], 
					t0_dict[b]["t0r02err"])) for b in bvals],
				[r"{0:d}".format(self.lattice_sizes[b][0]) for b in bvals],
				[r"{0:s}".format(sciprint.sciprint(
					self.lattice_sizes[b][0]*self.plot_values[b]["a"], 
					self.lattice_sizes[b][0]*self.plot_values[b]["a_err"])) 
					for b in bvals],
				[r"{0:s}".format(sciprint.sciprint(
					self.plot_values[b]["a"],
					self.plot_values[b]["a_err"])) for b in bvals],
			]

			ptab = TablePrinter(header, tab)			
			ptab.print_table(latex=True, width=15)

		return t0_dict