예제 #1
0
    def cosh_effective_mass_errors(self, dt, fast=True, period=None):
        if fast: logging.info("cosh emass computed fast method")
        period = self.period
        T = self.period_check(period)

        jkasv = self.jackknife_average_sub_vev()
        jkemass = {}
        for cfg in self.configs:
            asvc = jkasv[cfg]
            emass = {}
            for t in self.times[dt:-dt]:
                if t in self.emass_skip_times:
                    emass[t] = 0.0
                    continue

                try:
                    guess = (1.0 / float(dt))*math.acosh((asvc[t+dt] + asvc[t-dt])/(2.0*asvc[t]))
                    if fast:
                        emass[t] = guess
                    else:
                        emass[t] = newton.newton_cosh_for_m(t,t+dt,asvc, guess,T)
                except ValueError:
                    #logging.debug("invalid argument to log, setting to zero")
                    emass[t] = 0.0
                except ZeroDivisionError:
                    logging.debug("div by zero, setting to zero")
                    emass[t] = 0.0
                except KeyError:
                    logging.error("index out of range")
            jkemass[cfg] = emass
        jkemassobj = configtimeobj.Cfgtimeobj.fromDataDict(jkemass)
        effmass_dt = self.cosh_effective_mass(dt, fast=fast, period=period)
        return {t: jackknife.errorbars(effmass_dt[t], jkemassobj.get(time=t))
                for t in self.times[dt:-dt]}
예제 #2
0
    def cosh_effective_mass(self, dt, fast=True, period=None):
        if fast: logging.info("cosh emass computed fast method")

        T = self.period_check(period)
        asv = self.average_sub_vev()
        emass = {}
        for t in self.times[dt:-dt]:
            if t in self.emass_skip_times:
                emass[t] = 0.0
                continue
            try:
                guess = (1.0 / float(dt))*math.acosh((asv[t+dt] + asv[t-dt])/(2.0*asv[t]))
                if fast:
                    emass[t] = guess
                else:
                    emass[t] = newton.newton_cosh_for_m(t,t+dt,asv, guess, T)
            except ValueError:
                logging.debug("invalid argument to acosh, setting to zero")
                emass[t] = float('NaN')
            except KeyError:
                logging.error("index out of range")
            except ZeroDivisionError:
                logging.error("Div by zero either dt:{} or average value sub vev {}".format(dt,asv[t]))
                emass[t] = float('NaN')
        return emass
예제 #3
0
def plot(cors, funct, time_starts, time_ends, averages, stds, chi, options):
    import plot_helpers
    import newton
    dt = 1

    fig = plt.figure()

    corplots = {}
    corplots[0] = plt.subplot(221)
    corplots[1] = plt.subplot(222)
    emassplots = {}
    emassplots[0] = plt.subplot(223)
    emassplots[1] = plt.subplot(224)


    for i in [0,1]:
        corplots[i].errorbar(cors[i].times,
                             cors[i].average_sub_vev().values(),
                             yerr=cors[i].jackknifed_errors().values(), fmt='o')

        emass = cors[i].periodic_effective_mass(dt, fast=False, period=options.period)
        emass_errs = cors[i].periodic_effective_mass_errors(dt, fast=False).values()
        emassplots[i].errorbar(emass.keys(), emass.values(),
                               yerr=emass_errs, fmt='o')

    fn = funct.individual(Nt=options.period)
    for i in [0, 1]:
        #X = np.array(cors[i].times)
        X = np.linspace(time_starts[i], time_ends[i])
        X = np.arange(time_starts[i], time_ends[i]+1, 1)
        Xe = np.arange(time_starts[i], time_ends[i], 1)

        Y = fn.formula((averages[0], averages[i+1]), X)
        Ydt = fn.formula((averages[0], averages[i+1]), X+dt)
        corplots[i].plot(X, Y)
        guess = (1.0 / float(dt)) * np.log(Y/Ydt)
        fitemass = {}
        Yd = dict(enumerate(Y, start=time_starts[i]))
        guess = dict(enumerate(guess, start=time_starts[i]))
        for t in range(time_starts[i], time_ends[i]):
            fitemass[t] = newton.newton_cosh_for_m(t, t+dt, Yd, guess[t], options.period)
        emassplots[i].plot(fitemass.keys(),fitemass.values())

    if options.output_stub:
        filestub = options.output_stub
        logging.info("Saving plot to {}".format(filestub+".png"))
        fig.set_size_inches(18.5, 10.5)
        plt.savefig(filestub+".png")
    else:
        plt.show()