def main(): data = make_data('etas-Ds.data') models = make_models() prior = make_prior(8) fitter = CorrFitter(models=make_models()) p0 = None for N in [1, 2, 3, 4]: print(30 * '=', 'nterm =', N) prior = make_prior(N) fit = fitter.chained_lsqfit(data=data, prior=prior, p0=p0) p0 = fit.pmean print_results(fit, prior, data) if DISPLAYPLOTS: fitter.display_plots() # polish fit print('--- polish fit') fit = fitter.lsqfit(data=data, prior=fit.p, svdcut=1e-4) print_results(fit, prior, data) if DISPLAYPLOTS: fitter.display_plots() # fit with structured models print('--- refit with structured models') models = [models[:2]] + models[2:] fitter = CorrFitter(models=make_models()) fit = fitter.chained_lsqfit(data=data, prior=prior, p0=p0) # polish print('--- polish fit') fit = fitter.lsqfit(data=data, prior=fit.p, svdcut=1e-4) print_results(fit, prior, data)
def doProcess(tmin,tmax,data=data,mdef=mdef): ## -- do a single fit ... set up for parallelizing for key in data: mdef[key]['tfit'] = range(tmin,tmax) models = make_models(data=data,lkey=df.lkey,mdef=mdef) pdict0 = utf.get_prior_dict(df.define_prior, df.define_prior['nkey'],df.define_prior['okey'],df.num_nst,df.num_ost) prior = make_prior(models,prior_dict=pdict0,nst=df.num_nst,ost=df.num_ost) fitter = CorrFitter(models=models,maxit=df.maxit) #try: ## -- if catching value error, just exit ## -- p0 = initial values (dictionary) if df.do_initial: try: p0={} for key in df.define_init: eokey = utf.get_evenodd(key) if eokey == 'o': p0[key] = df.define_init[key][:df.num_ost] else: p0[key] = df.define_init[key][:df.num_nst] fit = fitter.lsqfit(data=data,prior=prior,p0=p0,svdcut=df.svdcut) except KeyError: print "Could not use initial point definitions" fit = fitter.lsqfit(data=data,prior=prior,svdcut=df.svdcut) else: fit = fitter.lsqfit(data=data,prior=prior,svdcut=df.svdcut) ## -- print_fit(fit,prior) print_error_budget(fit) save_data('fit-timevary/fit_'+str(tmin)+'_'+str(tmax)+'.out',fit,data)
def single_fit(tag_, tstar, CHARGED=False): w0 = gv.gvar('0.1715(9)') w0overa = gv.gvar('1.1367(5)') ZV = gv.gvar('0.9837(20)') ZVqed = gv.gvar('0.999544(14)') * ZV hbarc = 0.197326968 a_vcoarse = (w0 / w0overa) / hbarc if CHARGED == True: ZV = ZVqed else: ZV = ZV dataf = dsetavg[tag_] tmin = 2 # replace data after t* with fit # t* can be changed fitter = CorrFitter(models=build_models(tmin, 48, tag_)) svdcut = 1e-6 for nexp in [4]: print('=== nexp =', nexp, ' tmin = ', tmin, ' svdcut = ', svdcut) fit = fitter.lsqfit(data=dsetavg, prior=build_prior(nexp), p0=pfile, maxit=10000, svdcut=svdcut) #,fitter='gsl_multifit') print(fit) newdata = dataf[:tstar] #print("Before append/concatenate") #print(newdata, len(newdata)) fitdata = Corr2(datatag=tag_, tdata=range(48), a=('a:rho', 'a:rhoo'), b=('b:rho', 'b:rhoo'), dE=('dE:rho', 'dE:rhoo'), s=(1, -1)).fitfcn(fit.p) newdata = np.append(np.array(newdata), fitdata[tstar:]) #print(fitdata[tstar:], fitdata[tstar:].size) #print("After append/concatenate") #print(newdata, newdata.size) #sys.exit(0) # use Z_V from appendix of 1909.00756; divided by u_0 to make the 1-link currents used match vpol = g2.fourier_vacpol(newdata, Z=ZV, ainv=1 / a_vcoarse, periodic=False) a_mu = g2.a_mu(vpol, Q=1. / 3.) print('a_mu:', a_mu, "for", tag_, "t* = ", tstar) return a_mu
def main(): data, basis = make_data('etab.data') fitter = CorrFitter(models=make_models(basis)) p0 = None for N in range(1, 10): print(30 * '=', 'nterm =', N) prior = make_prior(N, basis) fit = fitter.lsqfit(data=data, prior=prior, p0=p0, svdcut=0.0004) p0 = fit.pmean print_results(fit, basis, prior, data) if DISPLAYPLOTS: fitter.display_plots()
def main(): data = make_data('etas-Ds.data') models = make_models() prior = make_prior(8) fitter = CorrFitter(models=make_models(), ratio=False) # 1 p0 = None for N in [1, 2]: # 2 print(30 * '=', 'nterm =', N) prior = make_prior(8) # 3 fit = fitter.lsqfit(data=data, prior=prior, p0=p0, nterm=(N, N)) # 4 p0 = fit.pmean print_results(fit, prior, data) if DISPLAYPLOTS: fitter.display_plots() test_fit(fitter, 'etas-Ds.data')
def __init__(self, dic, params, childfit, parentfit): self.name = dic['name'] self.Texts = dic['Text'] self.child_index = dic['child_index'] self.parent_index = dic['parent_index'] self.include2ptdata = dic['include2ptdata'] self.priorfile = dic['priorfile'] self.child = childfit self.parent = parentfit self.tmin = childfit.tmin self.tmax = parentfit.tmin self.nexp = self.child.nexp self.dofit = True if childfit.name == 'pimom0': self.Von=None self.Voo=None else: self.Von='Von' self.Voo='Voo' self.Vnn='Vnn' self.Vno='Vno' self.model = self.build_3pt_models(params) self.fitter = CorrFitter(self.model) self.prior = self.build_prior(params) self.prior.update( self.child.prior ) self.prior.update( self.parent.prior )
def __init__(self, dic, params): #print('Creating 2pt fit') #print(dic) self.name = dic['name'] self.tmin = dic['tmin'] self.tmax = dic['tmax'] self.nexp = dic['nexp'] self.noxp = dic['noxp'] self.priorfile = dic['priorfile'] self.p0file = dic['p0file'] self.savep0 = dic['savep0'] self.type = dic['type'] self.dofit = dic['dofit'] name = self.name if name == 'pimom0': self.a=(name+':a') self.dE=(name+':dE') else: self.a=(name+':a',name+':ao') self.dE=(name+':dE',name+':dEo') # build model self.model = self.build_model(params) self.fitter = CorrFitter(self.model) # build prior self.prior = self.build_prior(params)
def main(tstr): dfile = '/home/gray/Desktop/lattice-analysis/data/qed/coarse/rho_coarse_ms.gpl' madedata = make_data( dfile, norm=3.) # factor of 3 for colour (missed in extraction) data = madedata[0] T = data.size / len(madedata[1]) # extent in time dir tag01 = madedata[1][0] tag02 = madedata[1][1] print("time extent is: ", T) print(dfile) suggestedsvdcut = madedata[2] pfile = None #"vector_fit.p" # last fit tmin = 2 svdcut = 1e-10 #suggestedsvdcut fitter = CorrFitter(models=build_models(tag01, tag02, tmin, T)) for nexp in [2, 3, 4, 5]: fit = fitter.lsqfit(data=data, prior=build_prior(nexp), p0=None, maxit=20000, svdcut=svdcut, add_svdnoise=False) print(fit) tdata = range(T) tfit = range(tmin, T + 1 - tmin) # all ts tp = T tstar = tstr tcut = 200 newdata = {} tags = ['nocharge', 'charge'] newdata[tags[0]] = data[tag01][:tstar + 1] newdata[tags[1]] = data[tag02][:tstar + 1] # do replacement of data with fit fitdatauncharged = Corr2(datatag=tags[0], tdata=range(T), a=('a1:vec:s', 'ao:vec:s'), b=('a1:vec:s', 'ao:vec:s'), dE=('dE:vec:s', 'dEo:vec:s'), s=(1., -1.)).fitfcn(fit.p) for index in range(T): if index >= tcut: newdata[tags[0]] = np.append(newdata[tags[0]], 0.) elif index > tstar: newdata[tags[0]] = np.append(newdata[tags[0]], fitdatauncharged[index]) fitdatachargeddown = Corr2(datatag=tags[1], tdata=range(T), a=('a1:vec:qed:s', 'ao:vec:qed:s'), b=('a1:vec:qed:s', 'ao:vec:qed:s'), dE=('dE:vec:qed:s', 'dEo:vec:qed:s'), s=(1., -1.)).fitfcn(fit.p) for index in range(T): if index >= tcut: newdata[tags[1]] = np.append(newdata[tags[1]], 0.) elif index > tstar: newdata[tags[1]] = np.append(newdata[tags[1]], fitdatachargeddown[index]) print('THIS IS THE INFORMATION CENTRE') print(len(newdata[tags[0]]), len(newdata[tags[1]])) print('tmin, tstar', tmin, tstar) vpol = g2.fourier_vacpol(newdata[tags[0]], Z=ZV, ainv=1 / a, periodic=False) unchargedamus = g2.a_mu(vpol, 1 / 3.) vpol = g2.fourier_vacpol(newdata[tags[1]], Z=ZVqed, ainv=1 / a, periodic=False) chargedamus = g2.a_mu(vpol, 1 / 3.) amus_rt = chargedamus / unchargedamus amu_diff = chargedamus - unchargedamus amu_diff_rt = amu_diff / unchargedamus print( '[s] a_mu[QCD+QED]{0:>20}\n|a_mu[QCD+QED]-a_mu[QCD]{1:>20}\n|a_mu/a_mu {2:>20}' .format(chargedamus, amu_diff, amu_diff_rt))
init3[key] = utf.truncate_upper_triangle(init3[key],df.num_ost_3pt) elif eokey == 'no': init3[key] = np.resize(df.define_init_3pt[key],(df.num_nst_3pt,df.num_ost_3pt)) elif eokey == 'on': ## -- is this correct for symmetric v? #init3[key] = np.resize(df.define_init_3pt[key],(df.num_ost_3pt,df.num_nst_3pt)) pass elif eokey == 'n': init3[key] = df.define_init_3pt[key][:df.num_nst] elif eokey == 'o': init3[key] = df.define_init_3pt[key][:df.num_ost] else: init3=None pass fitter2 = CorrFitter(models=models2,maxit=df.maxit) fitter3 = CorrFitter(models=models,maxit=df.maxit) fitterc = CorrFitter(models=[models2,models],maxit=df.maxit) if df.do_2pt: print "starting 2pt fit..." fit2 = fitter2.lsqfit(data=dall,prior=priors2,p0=init2,svdcut=df.svdcut) ## -- fits take a long time, so print prematurely print_fit(fit2,priors2) if df.do_3pt: print "starting 3pt fit..." fit3 = fitter3.lsqfit(data=dall,prior=priors,p0=init3,svdcut=df.svdcut) else: print "Ignoring 3pt fit!" fit3=None #fit3 = fitter3.lsqfit(data=dall,prior=priors,svdcut=df.svdcut)
def main(tstr): dfile = '/home/gray/Desktop/lattice-analysis/data/qed/vcoarse/self_b/rho_vcoarse_7ml.gpl' madedata = make_data(dfile,norm=3.) # factor of 3 for colour (missed in extraction) data = madedata[0] T = data.size / len(madedata[1]) # extent in time dir tag01 = madedata[1][0] tag02 = madedata[1][1] tag03 = madedata[1][2] # =tag01 if no isospin breaking print("time extent is: ", T) print(dfile) suggestedsvdcut = madedata[2] pfile = None #"vector_fit.p" # last fit tmin = 2 svdcut = 1e-10 #suggestedsvdcut fitter = CorrFitter(models=build_models(tag01,tag02,tag03,tmin,T)) for nexp in [2,3,4,5]: fit = fitter.lsqfit(data=data,prior=build_prior(nexp),p0=None,maxit=20000,svdcut=svdcut,add_svdnoise=False) print(fit) tdata = range(T) tfit = range(tmin,T+1-tmin) # all ts tp = T tstar = tstr tcut = 200 newdata = {} tags = ['nocharge', 'up_charge', 'down-charge'] newdata[tags[0]] = data[tag01][:tstar+1] newdata[tags[1]] = data[tag02][:tstar+1] newdata[tags[2]] = data[tag03][:tstar+1] # do replacement of data with fit fitdatauncharged = Corr2(datatag=tags[0],tdata=range(T),a=('a1:vec:u','ao:vec:u'),b=('a1:vec:u','ao:vec:u'),dE=('dE:vec:u','dEo:vec:u'),s=(1.,-1.)).fitfcn(fit.p) for index in range(T): if index >= tcut: newdata[tags[0]] = np.append(newdata[tags[0]],0.) elif index > tstar: newdata[tags[0]] = np.append(newdata[tags[0]],fitdatauncharged[index]) fitdatachargedup = Corr2(datatag=tags[1],tdata=range(T),a=('a1:vec:qed:u','ao:vec:qed:u'),b=('a1:vec:qed:u','ao:vec:qed:u'),dE=('dE:vec:qed:u','dEo:vec:qed:u'),s=(1.,-1.)).fitfcn(fit.p) fitdatachargedown = Corr2(datatag=tags[2],tdata=range(T),a=('a1:vec:qed:d','ao:vec:qed:d'),b=('a1:vec:qed:d','ao:vec:qed:d'),dE=('dE:vec:qed:d','dEo:vec:qed:d'),s=(1.,-1.)).fitfcn(fit.p) for index in range(T): if index >= tcut: newdata[tags[1]] = np.append(newdata[tags[1]],0.) newdata[tags[2]] = np.append(newdata[tags[2]],0.) elif index > tstar: newdata[tags[1]] = np.append(newdata[tags[1]],fitdatachargedup[index]) newdata[tags[2]] = np.append(newdata[tags[2]],fitdatachargedown[index]) print('THIS IS THE INFORMATION CENTRE') print(len(newdata[tags[0]]), len(newdata[tags[1]]), len(newdata[tags[2]])) print('tmin, tstar', tmin, tstar) vpol = g2.fourier_vacpol(newdata[tags[0]], Z=ZV, ainv=1/a, periodic=False) unchargedamuu = g2.a_mu(vpol,2/3.) vpol = g2.fourier_vacpol(newdata[tags[1]], Z=ZVqed, ainv=1/a, periodic=False) chargedamuu = g2.a_mu(vpol,2/3.) vpol = g2.fourier_vacpol(newdata[tags[0]], Z=ZV, ainv=1/a, periodic=False) unchargedamud = g2.a_mu(vpol,1/3.) vpol = g2.fourier_vacpol(newdata[tags[2]], Z=ZVqed, ainv=1/a, periodic=False) chargedamud = g2.a_mu(vpol,1/3.) d_rt = chargedamud/unchargedamud u_rt = chargedamuu/unchargedamuu amu_qcd = unchargedamud+unchargedamuu amu_qcdqed = chargedamuu+chargedamud amu_rt = amu_qcdqed/amu_qcd amu_diff = (amu_qcdqed-amu_qcd)/amu_qcd amu_diff2 = amu_qcdqed-amu_qcd print('[d] a_mu[QCD+QED]||a_mu[QCD+QED]/a_mu[QCD]{0:>20}||{1}'.format(chargedamud,d_rt)) print('[u] a_mu[QCD+QED]||a_mu[QCD+QED]/a_mu[QCD]{0:>20}||{1}'.format(chargedamuu,u_rt)) print('\n[u+d] a_mu[QCD+QED]||a_mu[QCD]||ratio||diff\n{0:20}{1:20}{2:20}{3:20}'.format(amu_qcdqed, amu_qcd, amu_rt, amu_diff))
class Fit2: def __init__(self, dic, params): #print('Creating 2pt fit') #print(dic) self.name = dic['name'] self.tmin = dic['tmin'] self.tmax = dic['tmax'] self.nexp = dic['nexp'] self.noxp = dic['noxp'] self.priorfile = dic['priorfile'] self.p0file = dic['p0file'] self.savep0 = dic['savep0'] self.type = dic['type'] self.dofit = dic['dofit'] name = self.name if name == 'pimom0': self.a=(name+':a') self.dE=(name+':dE') else: self.a=(name+':a',name+':ao') self.dE=(name+':dE',name+':dEo') # build model self.model = self.build_model(params) self.fitter = CorrFitter(self.model) # build prior self.prior = self.build_prior(params) def build_model(self,params): model = Corr2( datatag='2pt'+self.name,tp=params.NT,tdata=range(params.NT), tfit=range(self.tmin,self.tmax+1), a=self.a,b=self.a,dE=self.dE,s=(1.,-1.) ) return model def build_prior(self,params): """build prior from file""" prior = BufferDict() name = self.name nexp = self.nexp noxp = self.noxp prior_file = open(self.priorfile,'r') pp = yaml.load(prior_file) prior['log('+name+':dE)'] = [ gvar(0,0) for i in range(nexp) ] prior['log('+name+':a)'] = [ gvar(0,0) for i in range(nexp) ] # non-osc. state priors prior['log('+name+':dE)'][0] = log(gvar(pp['e0'][0],pp['e0'][1])) prior['log('+name+':a)'][0] = log(gvar(pp['a0'][0],pp['a0'][1])) for i in range(1,nexp): prior['log('+name+':dE)'][i] = log(gvar(pp['e1'][0],pp['e1'][1])) prior['log('+name+':a)'][i] = log(gvar(pp['a1'][0],pp['a1'][1])) # osc. state priors if self.name != 'pimom0': prior['log('+name+':dEo)'] = [ 0 for i in range(noxp) ] prior['log('+name+':ao)'] = [ 0 for i in range(noxp) ] prior['log('+name+':dEo)'][0] = log(gvar(pp['o0'][0],pp['o0'][1])) prior['log('+name+':ao)'][0] = log(gvar(pp['b0'][0],pp['b0'][1])) for i in range(1,noxp): prior['log('+name+':dEo)'][i] = log(gvar(pp['o1'][0],pp['o1'][1])) prior['log('+name+':ao)'][i] = log(gvar(pp['b1'][0],pp['b1'][1])) #print(prior) return prior def print_fit(self,par,outfile): """print the energy and amplitude results from a fit""" fit = self.results name = self.name p = fit.p self.chi2_cal() self.chi2_aug_part() self.Q = conf_int(self.chi2/2, par.ncon, self.dof/2) dE = exp(p['log('+name+':dE)']) E = [sum(dE[:i+1]) for i in range(self.nexp)] a = exp(p['log('+name+':a)']) if self.name != 'pimom0': dEo = exp(p['log('+name+':dEo)']) Eo = [sum(dEo[:i+1]) for i in range(self.nexp)] ao = exp(p['log('+name+':ao)']) ofile = open(outfile,'a') if self.dof > 0: chi2dof = self.chi2/self.dof else: chi2dof = 99.9 if chi2dof > 99: chi2dof = 99.9 form = "{:s} & {:2d} - {:2d} & {:d}+{:d} & {:4.1f} & {:3d} & {:4.2f} " ena = "& {:<11s} & {:<11s} " ofile.write( form.format( self.name,self.tmin,self.tmax,self.nexp,self.noxp,chi2dof,self.dof,self.Q ) ) for i in range(self.nexp): ofile.write( ena.format(E[i].fmt(ndecimal=4),a[i].fmt(ndecimal=4),Eo[i].fmt(ndecimal=4),ao[i].fmt(ndecimal=4)) ) ofile.write(" \\\\ \n") def print_prior(self,par,outfile): """print the priors and result for comparison""" fit = self.results p = self.prior name = self.name f = fit.p dE = exp(f['log('+name+':dE)']) E = [sum(dE[:i+1]) for i in range(self.nexp)] a = exp(f['log('+name+':a)']) if self.name != 'pimom0': dEo = exp(f['log('+name+':dEo)']) Eo = [sum(dEo[:i+1]) for i in range(self.nexp)] ao = exp(f['log('+name+':ao)']) pdE = exp(p['log('+name+':dE)']) pa = exp(p['log('+name+':a)']) if self.name != 'pimom0': pdEo = exp(p['log('+name+':dEo)']) pao = exp(p['log('+name+':ao)']) ofile = open(outfile,'a') ofile.write("{:s} & Prior & Value & & Prior & Value \\\\ # {:d}-{:d} {:d}+{:d} \n".format( name,self.tmin,self.tmax,self.nexp,self.nexp)) form = "$a_{:d}$ & {:<11s} & {:<11s} & $dE_{:d}$ & {:<11s} & {:<11s} \\\\ \n" for state in range(self.nexp): ofile.write( form.format( state,pa[state].fmt(),a[state].fmt(), state,pdE[state].fmt(),dE[state].fmt() ) ) if self.name != 'pimom0': form = "$a'_{:d}$ & {:<11s} & {:<11s} & $dE'_{:d}$ & {:<11s} & {:<11s} \\\\ \n" for state in range(self.nexp): ofile.write( form.format( state,pao[state].fmt(),ao[state].fmt(), state,pdEo[state].fmt(),dEo[state].fmt() ) ) def print_model(self,par,outfile): """print the fit data and model and the difference""" fit = self.results t,g,dg,gth,dgth = self.fitter.collect_fitresults()['2pt'+self.name] ofile = open(outfile,'a') ofile.write( " t | {:12s} value | sigma_m sigma_v \n".format('2pt'+self.name) ) for it in range(0,self.tmax-self.tmin): data = gvar(g[it],dg[it]) model = gvar(gth[it],dgth[it]) diff1 = (data.mean-model.mean)/data.sdev diff2 = (data.mean-model.mean)/model.sdev ofile.write( " {:3d} | {:<20s} {:<20s} | {:+5.3f} {:+5.3f} \n".format( t[it],data.fmt(),model.fmt(),diff1,diff2) ) def chi2_cal(self): """calculate chi2 of fit""" t,g,dg,gth,dgth = self.fitter.collect_fitresults()['2pt'+self.name] chi2 = 0. for it in range(0,self.tmax-self.tmin): chi2 = ( (g[it]-gth[it])/dg )**2 total = sum(chi2) #print(chi2,total) parameters = 0 for key in self.prior.keys(): parameters = parameters + len(self.results.p[key]) self.dof = len(g)-parameters self.chi2 = total return total,self.dof def chi2_aug_part(self): """calculate the part of the chi2 coming from the priors""" pth = self.results.p p = self.prior aug = 0 for key in p.keys(): for exp in range(self.nexp): aug = aug + ( (p[key][exp].mean-pth[key][exp].mean)/p[key][exp].sdev )**2 self.aug = aug return aug
class Fit3: def __init__(self, dic, params, childfit, parentfit): self.name = dic['name'] self.Texts = dic['Text'] self.child_index = dic['child_index'] self.parent_index = dic['parent_index'] self.include2ptdata = dic['include2ptdata'] self.priorfile = dic['priorfile'] self.child = childfit self.parent = parentfit self.tmin = childfit.tmin self.tmax = parentfit.tmin self.nexp = self.child.nexp self.dofit = True if childfit.name == 'pimom0': self.Von=None self.Voo=None else: self.Von='Von' self.Voo='Voo' self.Vnn='Vnn' self.Vno='Vno' self.model = self.build_3pt_models(params) self.fitter = CorrFitter(self.model) self.prior = self.build_prior(params) self.prior.update( self.child.prior ) self.prior.update( self.parent.prior ) def build_3pt_models(self,params): models_3pt = [] for T in self.Texts: models_3pt.append( Corr3( datatag="3pt"+self.name+"T"+str(T),T=T,tdata=range(T+1), tfit=range(self.tmin,T-self.tmax+1), a=self.child.a,dEa=self.child.dE,sa=(1.,-1.), b=self.parent.a,dEb=self.parent.dE,sb=(1.,-1.), Vnn=self.Vnn,Vno=self.Vno,Von=self.Von,Voo=self.Voo) ) if self.include2ptdata: models_3pt.append( self.child.build_model(params) ) models_3pt.append( self.parent.build_model(params) ) return models_3pt def build_prior(self,params): """build interaction matrix prior""" prior = BufferDict() nexp = self.child.nexp noxp = self.child.noxp prior_file = open(self.priorfile,'r') pp = yaml.load(prior_file) prior['Vnn'] = [[ gvar(pp['v22'][0],pp['v22'][1]) for i in range(nexp)] for j in range(nexp)] prior['Vno'] = [[ gvar(pp['v22'][0],pp['v22'][1]) for i in range(nexp)] for j in range(nexp)] prior['Vnn'][0][0] = gvar(pp['v00'][0],pp['v00'][1]) prior['Vno'][0][0] = gvar(pp['v11'][0],pp['v11'][1]) for i in range(1,nexp): for j in range(1,nexp): if i<1 or j<1: prior['Vnn'][i][j] = gvar(pp['v11'][0],pp['v11'][1]) prior['Vno'][i][j] = gvar(pp['v11'][0],pp['v11'][1]) if self.name != "DPm0": prior['Voo'] = [[ gvar(pp['v22'][0],pp['v22'][1]) for i in range(nexp)] for j in range(nexp)] prior['Von'] = [[ gvar(pp['v22'][0],pp['v22'][1]) for i in range(nexp)] for j in range(nexp)] prior['Voo'][0][0] = gvar(pp['v11'][0],pp['v11'][1]) prior['Von'][0][0] = gvar(pp['v11'][0],pp['v11'][1]) for i in range(1,nexp): for j in range(1,nexp): if i<1 or j<1: prior['Voo'][i][j] = gvar(pp['v11'][0],pp['v11'][1]) prior['Von'][i][j] = gvar(pp['v11'][0],pp['v11'][1]) return prior def print_fit(self,par,outfile): """print the energy and amplitude results from a fit""" fit = self.results name = self.name p = fit.p self.chi2_cal() #self.chi2_aug_part() self.Q = conf_int(self.chi2/2, par.ncon, self.dof/2) nexp = self.child.nexp name = self.child.name CdE = exp(p['log('+name+':dE)']) CE = [sum(CdE[:i+1]) for i in range(nexp)] a = exp(p['log('+name+':a)']) if self.name != 'pimom0': CdEo = exp(p['log('+name+':dEo)']) CEo = [sum(CdEo[:i+1]) for i in range(nexp)] ao = exp(p['log('+name+':ao)']) name = self.parent.name PdE = exp(p['log('+name+':dE)']) PE = [sum(PdE[:i+1]) for i in range(nexp)] b = exp(p['log('+name+':a)']) if self.name != 'pimom0': PdEo = exp(p['log('+name+':dEo)']) PEo = [sum(PdEo[:i+1]) for i in range(nexp)] bo = exp(p['log('+name+':ao)']) # calculating f_0 # DOESN"T WORK FOR D TO K YET!!!!!!!!! if self.child.name == 'pimom0': mpi = CE[0] else: mpi = gvar(par.pi0,par.pi0_err) if self.child.name == 'pimom0' or self.child.name == 'pimom2': m_q = par.m_l else: m_q = par.m_s Epi = CE[0] mD = PE[0] v = p['Vnn'][0][0] self.f_0 = v*sqrt(Epi*mD)*(par.m_c-m_q)/(mD**2-mpi**2) self.qsq = mpi**2+mD**2-2*mD*Epi ofile = open(outfile,'a') if self.dof != 0: chi2dof = self.chi2/self.dof else: chi2dof = 99.9 if chi2dof > 99: chi2dof = 99.9 pars = "{:s} & {:2d}-{:2d} & {:2d}-{:2d} & {:d}+{:d} & {:4.1f} & {:3d} & {:4.2f} & " energies = "{:s} & {:<11s} & {:<11s} & " form = "{:<12s} & {:<12s} \\\\ \n" ofile.write( pars.format( self.name,self.tmin,self.child.tmax,self.tmax,self.parent.tmax, nexp,nexp,chi2dof,self.dof,self.Q ) +energies.format( self.child.name,CE[0].fmt(ndecimal=4),a[0].fmt(ndecimal=4) ) +energies.format( self.parent.name,PE[0].fmt(ndecimal=4),b[0].fmt(ndecimal=4) ) +form.format( self.f_0.fmt(ndecimal=4), self.qsq.fmt(ndecimal=4) ) ) def print_model(self,par,outfile): """print the fit data and model and the difference""" fit = self.results names = ["2pt"+self.child.name,"2pt"+self.parent.name] [names.append("3pt"+self.name+"T"+str(T)) for T in self.Texts] print(names) ofile = open(outfile,'a') ofile.write("{:5s} models, {:d}+{:d} fit, {:d} to T-{:d} window "+strftime("%H:%M:%S")+"\n".format(self.name,self.nexp,self.nexp,self.child.tmin,self.child.tmax)) for name in names: t,g,dg,gth,dgth = self.fitter.collect_fitresults()[name] ofile.write( " t | {:<11s} theory | sigma_data sigma_th \n".format(name) ) for it in range(0,len(t)): data = gvar(g[it],dg[it]) model = gvar(gth[it],dgth[it]) diff1 = (data.mean-model.mean)/data.sdev diff2 = (data.mean-model.mean)/model.sdev ofile.write( " {:3d} | {:<20s} {:<20s} | {:+6.3f} {:+6.3f} \n".format( t[it],data.fmt(),model.fmt(),diff1,diff2) ) def print_prior(self,par,outfile): """print the priors and result for comparison""" fit = self.results p = self.prior name = self.name f = fit.p ofile = open(outfile,'a') ofile.write("{:5s} priors, {:d}+{:d} fit, {:d} to T-{:d} window "+strftime("%H:%M:%S")+"\n".format(name,self.nexp,self.nexp,self.child.tmin,self.child.tmax)) self.print_2pt_prior(par,ofile,self.child.name) self.print_2pt_prior(par,ofile,self.parent.name) ofile.write("V \n") form = "{:<8s} " self.V_prior_line(ofile,"Vnn prior",form,self.nexp,p['Vnn']) self.V_prior_line(ofile,"Vnn fittd",form,self.nexp,f['Vnn']) self.V_prior_line(ofile,"Vno prior",form,self.nexp,p['Vno']) self.V_prior_line(ofile,"Vno fittd",form,self.nexp,f['Vno']) if self.child.name != 'pimom0': self.V_prior_line(ofile,"Von prior",form,self.nexp,p['Von']) self.V_prior_line(ofile,"Von fittd",form,self.nexp,f['Von']) self.V_prior_line(ofile,"Voo prior",form,self.nexp,p['Voo']) self.V_prior_line(ofile,"Voo fittd",form,self.nexp,f['Voo']) def print_2pt_prior(self,par,ofile,name): fit = self.results p = self.prior f = fit.p dE = exp(f['log('+name+':dE)']) E = [sum(dE[:i+1]) for i in range(self.nexp)] a = exp(f['log('+name+':a)']) if self.name != 'pimom0': dEo = exp(f['log('+name+':dEo)']) Eo = [sum(dEo[:i+1]) for i in range(self.nexp)] ao = exp(f['log('+name+':ao)']) pdE = exp(p['log('+name+':dE)']) pa = exp(p['log('+name+':a)']) if self.name != 'pimom0': pdEo = exp(p['log('+name+':dEo)']) pao = exp(p['log('+name+':ao)']) ofile.write("{:5s} \n".format(name)) form = "{:<12s} {:<12s} " self.prior_line(ofile,"odd prior",form,self.nexp,pa,pdE) self.prior_line(ofile,"odd fittd",form,self.nexp,a,dE) if self.name != 'pimom0': self.prior_line(ofile,"evn prior",form,self.nexp,pao,pdEo) self.prior_line(ofile,"evn fittd",form,self.nexp,ao,dEo) def prior_line(self,ofile,name,form,nexp,a,E): ofile.write(name+": ") ofile.write(form.format(a[0].fmt(),E[0].fmt())) for state in range(1,self.nexp): ofile.write("| "+form.format(a[state].fmt(),E[state].fmt())) ofile.write(" \n") def V_prior_line(self,ofile,name,form,nexp,V): ofile.write(name+": ") ofile.write(form.format(V[0][0].fmt())) for i in range(1,self.nexp): for j in range(1,self.nexp): ofile.write("| "+form.format(V[i][j].fmt())) ofile.write(" \n") def chi2_cal(self): """calculate chi2 of fit""" chi2 = 0. points = 0 for fit in (self.child,self.parent): t,g,dg,gth,dgth = self.fitter.collect_fitresults()["2pt"+fit.name] for it in range(0,fit.tmax-fit.tmin): chi2 = ( (g[it]-gth[it])/dg )**2 total2pt = sum(chi2) points = points + len(g) for T in self.Texts: t,g,dg,gth,dgth = self.fitter.collect_fitresults()["3pt"+self.name+"T"+str(T)] for it in range(0,T-fit.tmax-fit.tmin): chi2 = ( (g[it]-gth[it])/dg )**2 total3pt = sum(chi2) points = points + len(g) parameters = 0 for key in self.prior.keys(): parameters = parameters + len(self.results.p[key]) self.dof = points-parameters self.chi2 = total2pt+total3pt return self.chi2,self.dof def chi2_aug_part(self): """calculate the part of the chi2 coming from the priors""" ####### NOT WORKING ATM ##### pth = self.results.p p = self.prior aug = 0 print(pth.values()) qth = np.fromiter(pth.values(),np.float) q = np.fromiter(p.values(),np.float) print(qth) print(q) for exp in range(self.nexp): aug = aug + ( (p[key][exp].mean-pth[key][exp].mean)/p[key][exp].sdev )**2 self.aug = aug return aug
models = make_models(data=data,lkey=df.lkey) prior = make_prior(models) ## -- ## -- DEPRICATED #if df.do_uncorr: # ## -- remove the correlations from the data # dataCorr = data # datlen = len(gv.evalcov(data)['Gaa','Gaa']) # fakecov = np.zeros((datlen,datlen)) # for i in range(datlen): # fakecov[i,i] = np.diag(gv.evalcov(data)['Gaa','Gaa'])[i] # data['Gaa'] = gv.gvar([data['Gaa'][i].mean for i in range(datlen)],np.array(fakecov)) ## -- fitter = CorrFitter(models=models,maxit=df.maxit) #fit = fitter.chained_lsqfit(data=data, prior=prior) #fit = fitter.lsqfit(data=data, prior=fit.p) #fit = fitter.lsqfit(data=data,prior=prior,p0="test.init.out",svdcut=df.svdcut) if df.do_2pt: if df.do_initial: try: p0={} for key in df.define_init: eokey = utf.get_evenodd(key) if eokey == 'o': p0[key] = df.define_init[key][:df.num_ost] else: p0[key] = df.define_init[key][:df.num_nst] fit = fitter.lsqfit(data=data,prior=prior,p0=p0,svdcut=df.svdcut) except KeyError:
## -- temporary fix if df.do_init3: #init3={} #if argsin['override_init']: init3 = make_adv_init_from_fit_file_3pt(models3,'fit_adv_'+irrepStr+'_3pt',\ fresh_overlap=True,fresh_amplitude=True) else: init3=None pass ## -- temporary init2=None #init3=None #print init3 fitter2 = CorrFitter(models=models2,maxit=df.maxit) fitter3 = CorrFitter(models=models,maxit=df.maxit) #print models #raise ValueError('test') print print 'prior: ' for key in sorted(priors): print key,priors[key] #print #print 'init : ',init3 #for key in init3: # print key,init3[key] print if df.do_2pt: print "starting 2pt fit..." fit2 = fitter2.lsqfit(data=dall,prior=priorsa2,p0=init2,svdcut=df.svdcut)
def doProcess(nst,ost,n3st=1,o3st=1,data=dall): ## -- do a single fit ... set up for parallelizing if df.do_2pt and not(df.do_3pt): pdict3 = utf.get_prior_dict(df.define_prior, df.define_prior['nkey'],df.define_prior['okey'],nst,ost,do_v_symm=True) models = make_models(data=dall,lkey=df.lkey) prior = make_prior(models,prior_dict=pdict3,nst=nst,ost=ost) fitter = CorrFitter(models=models,maxit=df.maxit) if df.do_init2: init={} if argsin['override_init']: init = make_init_from_fit_file_3pt(models,'fit_dict') else: for key in df.define_init: ## -- does this interfere with underscore tags? eokey = utf.get_evenodd(key) if eokey == 'n': init[key] = df.define_init[key][:nst] elif eokey == 'o': init[key] = df.define_init[key][:ost] else: init=None else: pdict = utf.get_prior_dict(df.define_prior, df.define_prior['nkey'],df.define_prior['okey'], nst,ost,do_v_symm=True) pdict3 = utf.get_prior_dict(df.define_prior_3pt, df.define_prior_3pt['nkey'],df.define_prior_3pt['okey'], nst,ost,df.define_prior_3pt['vkey'],nst,ost,do_v_symm=True) for key in pdict: pdict3[key] = pdict[key] models2 = make_models(data=dall,lkey=df.lkey,use_advanced=True) #models3 = make_models_3pt(data=dall,lkey=df.lkey3) models3 = make_models_advanced(data=dall,lkey=df.lkey3) models = list() for model in models2: models.append(model) for model in models3: models.append(model) #prior2 = make_prior(models2,prior_dict=pdict,nst=nst,ost=ost) #prior3 = make_prior_3pt(models3,prior_dict=pdict3,nst=nst,ost=ost,n3st=nst,o3st=ost) #priors = gv.BufferDict() #for key in prior2: # priors[key] = prior2[key] #for key in prior3: # priors[key] = prior3[key] priorsa = truncate_prior_states(df.define_prior_adv, nst,ost,n3st,o3st) fitter = CorrFitter(models=models,maxit=df.maxit) if df.do_init3: #init3={} #if argsin['override_init']: init = make_adv_init_from_fit_file_3pt(models3,'fit_adv_'+irrepStr+'_3pt',\ fresh_overlap=True,fresh_amplitude=True) else: init=None pass #fit = fitter.lsqfit(data=dall,prior=priors,p0=init,svdcut=df.svdcut) #print priorsa #print init fit = fitter.lsqfit(data=dall,prior=priorsa,p0=init,svdcut=df.svdcut) ## -- print_fit(fit,priorsa,do_v_symm=True) print_error_budget(fit) #save_data('fit-stability/fit_'+str(nst)+'_'+str(ost)+'.out',fit,dall) if df.do_2pt and not(df.do_3pt): save_init_from_fit(fit,'fit-adv/fit_'+str(nst)+'_'+str(ost)+'.py',do_v_symm=True) else: save_init_from_fit(fit,'fit-adv/fit_n'+str(nst)+'_o'+str(ost)\ +'_ng'+str(n3st)+'_og'+str(o3st)+'.py',do_v_symm=True)
def doProcess(nst,ost,data=dall): ## -- do a single fit ... set up for parallelizing if df.do_2pt and not(df.do_3pt): pdict3 = utf.get_prior_dict(df.define_prior, df.define_prior['nkey'],df.define_prior['okey'],nst,ost,do_v_symm=df.do_v_symmetric) models = make_models(data=dall,lkey=df.lkey) prior = make_prior(models,prior_dict=pdict3,nst=nst,ost=ost) fitter = CorrFitter(models=[models],maxit=df.maxit) if df.do_init2: init={} if argsin['override_init']: init = make_init_from_fit_file_3pt(models,'fit_dict') else: for key in df.define_init: eokey = utf.get_evenodd(key) if eokey == 'n': init[key] = df.define_init[key][:nst] elif eokey == 'o': init[key] = df.define_init[key][:ost] else: init=None else: pdict = utf.get_prior_dict(df.define_prior, df.define_prior['nkey'],df.define_prior['okey'], nst,ost,do_v_symm=df.do_v_symmetric) pdict3 = utf.get_prior_dict(df.define_prior_3pt, df.define_prior_3pt['nkey'],df.define_prior_3pt['okey'], nst,ost,df.define_prior_3pt['vkey'],nst,ost,do_v_symm=df.do_v_symmetric) for key in pdict: pdict3[key] = pdict[key] models2 = make_models(data=dall,lkey=df.lkey) models3 = make_models_3pt(data=dall,lkey=df.lkey3) models = list() for model in models2: models.append(model) for model in models3: models.append(model) #print df.lkey+df.lkey3 #for model in models: # model.all_datatags #raise ValueError("test") prior2 = make_prior(models2,prior_dict=pdict,nst=nst,ost=ost) prior3 = make_prior_3pt(models3,prior_dict=pdict3,nst=nst,ost=ost,n3st=nst,o3st=ost) priors = gv.BufferDict() for key in prior2: priors[key] = prior2[key] for key in prior3: priors[key] = prior3[key] fitter = CorrFitter(models=[models2,models],maxit=df.maxit) if df.do_init3: init={} if argsin['override_init']: init = make_init_from_fit_file_3pt(models,'fit_dict') else: for key in df.define_init_3pt: eokey = utf.get_evenodd(key) if eokey == 'nn': init[key] = np.resize(df.define_init_3pt[key],(nst,nst)) elif eokey == 'no': init[key] = np.resize(df.define_init_3pt[key],(nst,ost)) elif eokey == 'on': init[key] = np.resize(df.define_init_3pt[key],(ost,nst)) elif eokey == 'oo': init[key] = np.resize(df.define_init_3pt[key],(ost,ost)) elif eokey == 'n': init[key] = df.define_init_3pt[key][:nst] elif eokey == 'o': init[key] = df.define_init_3pt[key][:ost] else: init=None fit = fitter.chained_lsqfit(data=dall,prior=priors,p0=init,svdcut=df.svdcut) ## -- print_fit(fit,priors,do_v_symm=df.do_v_symmetric) print_error_budget(fit) #save_data('fit-stability/fit_'+str(nst)+'_'+str(ost)+'.out',fit,dall) if df.do_2pt and not(df.do_3pt): save_init_from_fit(fit,'fit-stability/fit_'+str(nst)+'_'+str(ost)+'.py',do_v_symm=df.do_v_symmetric) else: save_init_from_fit(fit,'fit-stability/fit_n'+str(nst)+'_o'+str(ost)\ +'_ng'+str(nst)+'_og'+str(ost)+'.py',do_v_symm=df.do_v_symmetric)
def main(tstr): dfile = '/home/gray/Desktop/lattice-analysis/data/qed/vcoarse/comb/comb_rho_vcoarse_physud.gpl' # tag01 = 'rho_m' + str(mq) # tag02 = 'rho_m' + str(mq) + '_ucav' # tag03 = 'rho_m' + str(mq) # tag04 = 'rho_m' + str(mq) + '_dcav' madedata = make_data( dfile, norm=3.) # factor of 3 for colour (missed in extraction) data = madedata[0] T = data.size / len(madedata[1]) # extent in time dir tag01 = madedata[1][0] tag02 = madedata[1][1] tag03 = madedata[1][2] # =tag01 if no isospin breaking tag04 = madedata[1][3] #sys.exit(0) #ratiodata = {} #ratiodata['up'] = data[tag02]/data[tag01] #ratiodata['down'] = data[tag04]/data[tag03] suggestedsvdcut = madedata[2] pfile = "vector_fit.p" # last fit tmin = 2 svdcut = 1e-10 #suggestedsvdcut fitter = CorrFitter( models=build_models(tag01, tag02, tag03, tag04, tmin, T)) for nexp in [2, 3, 4, 5]: fit = fitter.lsqfit(data=data, prior=build_prior(nexp), p0=None, maxit=20000, svdcut=svdcut, add_svdnoise=False) print(fit) tdata = range(T) tfit = range(tmin, T + 1 - tmin) # all ts tp = T tstar = tstr tcut = 200 newdata = {} tags = ['up', 'up_qed', 'down', 'down_qed'] newdata[tags[0]] = data[tag01][:tstar + 1] newdata[tags[1]] = data[tag02][:tstar + 1] newdata[tags[2]] = data[tag03][:tstar + 1] newdata[tags[3]] = data[tag04][:tstar + 1] # do replacement of data with fit fitdataunchargedup = Corr2(datatag=tags[0], tdata=range(T), a=('a1:vec:u', 'ao:vec:u'), b=('a1:vec:u', 'ao:vec:u'), dE=('dE:vec:u', 'dEo:vec:u'), s=(1., -1.)).fitfcn(fit.p) fitdataunchargeddown = Corr2(datatag=tags[2], tdata=range(T), a=('a1:vec:d', 'ao:vec:d'), b=('a1:vec:d', 'ao:vec:d'), dE=('dE:vec:d', 'dEo:vec:d'), s=(1., -1.)).fitfcn(fit.p) for index in range(48): if index >= tcut: newdata[tags[0]] = np.append(newdata[tags[0]], 0.) newdata[tags[2]] = np.append(newdata[tags[2]], 0.) elif index > tstar: newdata[tags[0]] = np.append(newdata[tags[0]], fitdataunchargedup[index]) newdata[tags[2]] = np.append(newdata[tags[2]], fitdataunchargeddown[index]) fitdatachargedup = Corr2(datatag=tags[1], tdata=range(T), a=('a1:vec:qed:u', 'ao:vec:qed:u'), b=('a1:vec:qed:u', 'ao:vec:qed:u'), dE=('dE:vec:qed:u', 'dEo:vec:qed:u'), s=(1., -1.)).fitfcn(fit.p) fitdatachargedown = Corr2(datatag=tags[3], tdata=range(T), a=('a1:vec:qed:d', 'ao:vec:qed:d'), b=('a1:vec:qed:d', 'ao:vec:qed:d'), dE=('dE:vec:qed:d', 'dEo:vec:qed:d'), s=(1., -1.)).fitfcn(fit.p) for index in range(48): if index >= tcut: newdata[tags[1]] = np.append(newdata[tags[1]], 0.) newdata[tags[3]] = np.append(newdata[tags[3]], 0.) elif index > tstar: newdata[tags[1]] = np.append(newdata[tags[1]], fitdatachargedup[index]) newdata[tags[3]] = np.append(newdata[tags[3]], fitdatachargedown[index]) w0 = gv.gvar('0.1715(9)') w0overa = gv.gvar('1.1367(5)') ZV = gv.gvar('0.9837(20)') ZVqed = gv.gvar('0.999544(14)') * ZV hbarc = 0.197326968 a = (w0 / w0overa) / hbarc print('THIS IS THE INFORMATION CENTRE') print(len(newdata[tags[0]]), len(newdata[tags[1]]), len(newdata[tags[2]]), len(newdata[tags[3]])) print('tmin, tstar', tmin, tstar) #moments = g2.moments(newdata[tags[0]],Z=ZV,ainv=1/a,periodic=False) #vpol = g2.vacpol(moments,order=(2,1)) vpol = g2.fourier_vacpol(newdata[tags[0]], Z=ZV, ainv=1 / a, periodic=False) unchargedamuu = g2.a_mu(vpol, 2 / 3.) #moments = g2.moments(newdata[tags[1]],Z=ZVqed,ainv=1/a,periodic=False) #vpol = g2.vacpol(moments,order=(2,1)) vpol = g2.fourier_vacpol(newdata[tags[1]], Z=ZVqed, ainv=1 / a, periodic=False) chargedamuu = g2.a_mu(vpol, 2 / 3.) #moments = g2.moments(newdata[tags[2]],Z=ZV,ainv=1/a,periodic=False) #vpol = g2.vacpol(moments,order=(2,1)) vpol = g2.fourier_vacpol(newdata[tags[2]], Z=ZV, ainv=1 / a, periodic=False) unchargedamud = g2.a_mu(vpol, 1 / 3.) #moments = g2.moments(newdata[tags[3]],Z=ZVqed,ainv=1/a,periodic=False) #vpol = g2.vacpol(moments,order=(2,1)) vpol = g2.fourier_vacpol(newdata[tags[3]], Z=ZVqed, ainv=1 / a, periodic=False) chargedamud = g2.a_mu(vpol, 1 / 3.) d_rt = chargedamud / unchargedamud u_rt = chargedamuu / unchargedamuu amu_qcd = unchargedamud + unchargedamuu amu_qcdqed = chargedamuu + chargedamud amu_rt = amu_qcdqed / amu_qcd amu_diff = (amu_qcdqed - amu_qcd) / amu_qcd print('[d] a_mu[QCD+QED]||a_mu[QCD+QED]/a_mu[QCD]{0:>20}||{1}'.format( chargedamud, d_rt)) print('[u] a_mu[QCD+QED]||a_mu[QCD+QED]/a_mu[QCD]{0:>20}||{1}'.format( chargedamuu, u_rt)) print( '\n[u+d] a_mu[QCD+QED]||a_mu[QCD]||ratio||diff\n{0:20}{1:20}{2:20}{3:20}' .format(amu_qcdqed, amu_qcd, amu_rt, amu_diff))