def prop_trace(prop_list, aq, sin=True): "Trace of qslash*inv(prop)*(1/12q^2). Supports two forms of q." N = len(prop_list) prop_inv = inv(sum(prop_list)/N) qslash = dw.slash(aq) qslash_sin = dw.slash(np.sin(aq)) qsquared = dw.inner(aq) qsquared_sin = dw.inner(np.sin(aq)) if sin: return (1./12)*trace(dot(qslash_sin, prop_inv)).imag/qsquared_sin else: return (1./12)*trace(dot(qslash, prop_inv)).imag/qsquared
def bilinear_Lambdas(Data): # type check? data loaded? amputated = amputate_bilinears(Data.inprop_list, Data.outprop_list, Data.bilinear_array) # Include Tr[qslash*inv(prop)] # Are you matching momenta to the prop correctly? Data.prop_trace_in = prop_trace(Data.inprop_list, Data.ap, sin=True)*Data.V #Data.prop_trace_out = prop_trace(Data.outprop_list, Data.ap2, sin=True)*Data.V Data.prop_trace_in2 = prop_trace(Data.inprop_list, Data.ap, sin=False)*Data.V #Data.prop_trace_out2 = prop_trace(Data.outprop_list, Data.ap2, sin=False)*Data.V norm = Data.V/12. Lambda = lambda x, y: (trace(dot(dw.hc(x), y)).real)*norm Data.Lambda = map(Lambda, Gc, amputated) # For the (X, g) schemes. Data.Lambda_V = (Data.Lambda[1] + Data.Lambda[2] + Data.Lambda[4] + Data.Lambda[8])*(1./4) Data.Lambda_A = (Data.Lambda[14] + Data.Lambda[13] + Data.Lambda[11] + Data.Lambda[7])*(1./4) Data.Lambda_VpA = (Data.Lambda[1] + Data.Lambda[2] + Data.Lambda[4] + Data.Lambda[8] + Data.Lambda[14] + Data.Lambda[13] + Data.Lambda[11] + Data.Lambda[7])*(1./8) Data.Lambda_VmA = 2*(Data.Lambda_V - Data.Lambda_A)/\ (Data.Lambda_V + Data.Lambda_A) Data.Lambda_PmS = 2*(Data.Lambda[15] - Data.Lambda[0])/\ (Data.Lambda[15] + Data.Lambda[0]) Data.Lambda_T = (Data.Lambda[3] + Data.Lambda[5] + Data.Lambda[6] + Data.Lambda[9] + Data.Lambda[10] + Data.Lambda[12])/6. # For the (X, q) schemes. aq = Data.aq Gmu = (amputated[1], amputated[2], amputated[4], amputated[8]) qmuGmu = sum([aq[i]*Gmu[i] for i in range(4)]) Data.Vq = (trace(dot(qmuGmu, dw.slash(aq))).real)*norm/Data.apSq Gmu5 = (amputated[14], -amputated[13], amputated[11], -amputated[7]) qmuGmu5 = sum([aq[i]*Gmu5[i] for i in range(4)]) tmp = reduce(dot, [qmuGmu5, Gc[15], dw.slash(aq)]).real Data.Vq5 = trace(tmp*norm)/Data.apSq Data.Vq_ = Data.Vq Data.Vq = (Data.Vq + Data.Vq5)/2 # Z-factors. Data.Z_S = dict(g=None, q=None) Data.Z_T = dict(g=None, q=None) Data.Z_S['g'] = Data.Lambda_VpA/Data.Lambda[0] Data.Z_S['q'] = Data.Vq/Data.Lambda[0] Data.Z_T['g'] = Data.Lambda_VpA/Data.Lambda_T Data.Z_T['q'] = Data.Vq/Data.Lambda_T
def proj_q5(amputated, aq): "Contract amputated fourquark correlator w/ qslash5 x qslash5 projector." qslash5 = dot(dw.slash(aq), Gc[15]) tmp = tensordot(qslash5, amputated, ([0,1], [1,0])) return tensordot(qslash5, tmp, ([0,1], [1,0]))
def proj_q(amputated, aq): "Contract amputated fourquark correlator w/ qslash x qslash projector." qslash = dw.slash(aq) tmp = tensordot(qslash, amputated, ([0,1], [1,0])) return tensordot(qslash, tmp, ([0,1], [1,0]))
def Vq5(amputated): Gmu5 = (amputated[14], -amputated[13], amputated[11], -amputated[7]) qmuGmu5 = sum([aq[i]*Gmu5[i] for i in range(4)]) tmp = reduce(dot, [qmuGmu5, Gc[15], dw.slash(aq)]).real return trace(tmp*norm)/Data.apSq
def Vq(amputated): Gmu = (amputated[1], amputated[2], amputated[4], amputated[8]) qmuGmu = sum([aq[i]*Gmu[i] for i in range(4)]) return (trace(dot(qmuGmu, dw.slash(aq))).real)*norm/apSq