Commit 16251b83 authored by Ale's avatar Ale

flag strange rework

parent 786a7c12
#TODO: apply_rw with gaps
function apply_rw(data::Array{Float64}, W::Matrix{Float64})
function apply_rw(data::Array{Float64}, W::Matrix{Float64}, id::Union{String, Nothing}=nothing)
nc = size(data, 1)
W1 = W[1, 1:nc]
W2 = W[2, 1:nc]
data_r = data .* W1 .* W2
return (data_r, W1 .* W2)
if id == "J303" || id == "J303r003"
W_J303 = [1 for i in 1:length(data)]
W_J303[324] = W_J303[325] = W_J303[326] = -1
data_r = data .* W1 .* W2
return (data_r, W1 .* W2 .* W_J303)
elseif id == "H105r005"
flagged_cfg = [254, 255, 256, 257, 259, 260, 261, 264, 265, 266, 269, 280, 282, 283, 284, 285, 286, 287, 288, 289, 291, 299, 301, 313, 314, 315, 316, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342]
W_H105r005 = [1 for i in 1:length(data)]
for i in flagged_cfg
W_H105r005[i] = -1
end
data_r = data .* W1 .* W2
return (data_r, W1 .* W2 .* W_H105r005)
else
data_r = data .* W1 .* W2
return (data_r, W1 .* W2)
end
end
function apply_rw(data::Vector{<:Array{Float64}}, W::Vector{Matrix{Float64}})
function apply_rw(data::Vector{<:Array{Float64}}, W::Vector{Matrix{Float64}}, id::Union{String, Nothing}=nothing)
if length(W) != length(data)
error("Lenghts must match")
end
nc = size.(data, 1)
rw1 = [W[k][1, 1:nc[k]] for k=1:length(W)]
rw2 = [W[k][2, 1:nc[k]] for k=1:length(W)]
rw = [rw1[k] .* rw2[k] for k=1:length(W)]
data_r = [data[k] .* rw[k] for k=1:length(data)]
return (data_r, rw)
end
function apply_rw_flagged_strange(data::Array{Float64}, id::String)
if id == "J303r003" || id == "J303"
flagged_cfg = [324, 325, 326]
rew = juobs.mean(-2 * length(flagged_cfg) + length(data[:,1])) / length(data[:,1])
for i in flagged_cfg
data[i,:] = -data[i,:]
end
for i in 1:length(data[1,:])
data[:,i] = data[:,i] ./ rew
end
if id == "J303" || id == "J303r003"
W_J303 = [1 for i in 1:length(data[1])]
W_J303[324] = W_J303[325] = W_J303[326] = -1
rw1 = [W[k][1, 1:nc[k]] for k=1:length(W)]
rw2 = [W[k][2, 1:nc[k]] for k=1:length(W)]
rw3 = [W_J303]
rw = [rw1[k] .* rw2[k] .* rw3[k] for k=1:length(W)]
data_r = [data[k] .* rw[k] for k=1:length(data)]
return (data_r, rw)
elseif id == "H105r005"
flagged_cfg = [254, 255, 256, 257, 259, 260, 261, 264, 265, 266, 269, 280, 282, 283, 284, 285, 286, 287, 288, 289, 291, 299, 301, 313, 314, 315, 316, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342]
rew = juobs.mean(-2 * length(flagged_cfg) + length(data[:,1])) / length(data[:,1])
W_H105r005 = [1 for i in 1:length(data[1])]
for i in flagged_cfg
data[i,:] = -data[i,:]
W_H105r005[i] = -1
end
for i in 1:length(data[1,:])
data[:,i] = data[:,i] ./ rew
end
end
return data
end
rw1 = [W[k][1, 1:nc[k]] for k=1:length(W)]
rw2 = [W[k][2, 1:nc[k]] for k=1:length(W)]
rw3 = [W_H105r005]
rw = [rw1[k] .* rw2[k] .* rw3[k] for k=1:length(W)]
data_r = [data[k] .* rw[k] for k=1:length(data)]
return (data_r, rw)
elseif id == "H105r001" || id == "H105"
W_H105r001 = [1 for i in 1:length(data[1])]
W_H105r001[100] = W_H105r001[105] = W_H105r001[106] = -1
W_H105r002 = [1 for i in 1:length(data[2])]
W_H105r002[1] = -1
rw1 = [W[k][1, 1:nc[k]] for k=1:length(W)]
rw2 = [W[k][2, 1:nc[k]] for k=1:length(W)]
rw3 = [W_H105r001, W_H105r002]
rw = [rw1[k] .* rw2[k] .* rw3[k] for k=1:length(W)]
data_r = [data[k] .* rw[k] for k=1:length(data)]
return (data_r, rw)
else
rw1 = [W[k][1, 1:nc[k]] for k=1:length(W)]
rw2 = [W[k][2, 1:nc[k]] for k=1:length(W)]
function apply_rw_flagged_strange(data::Vector{<:Array{Float64}}, id::String)
if id == "H105r001" || id == "H105"
flagged_cfg_r001 = [100, 105, 106]
rew_r001 = juobs.mean(-2 * length(flagged_cfg_r001) + length(data[:,1])) / length(data[:,1])
flagged_cfg_r002 = [1]
rew_r002 = juobs.mean(-2 * length(flagged_cfg_r002) + length(data[:,1])) / length(data[:,1])
for i in flagged_cfg_r001
data[1][i,:] = -data[1][i,:]
end
for i in 1:length(data[1][1,:])
data[1][:,i] = data[1][:,i] ./ rew_r001
end
for i in flagged_cfg_r002
data[2][i,:] = -data[2][i,:]
end
for i in 1:length(data[2][1,:])
data[2][:,i] = data[2][:,i] ./ rew_r002
end
rw = [rw1[k] .* rw2[k] for k=1:length(W)]
data_r = [data[k] .* rw[k] for k=1:length(data)]
return (data_r, rw)
end
return data
end
function check_corr_der(obs::Corr, derm::Vector{Corr}; new_version::Bool=false)
g1 = Vector{String}(undef, 0)
g2 = Vector{String}(undef, 0)
......@@ -121,6 +126,8 @@ The correlator can be normalized with the volume factor if `L` is fixed.
The flag `info` provides extra output that contains information about the primary observables. The function returns the primary observables ``<WO>`` and ``<W>``
(it returns the observable <O> if rw=nothing)
If you turn `flag_strange=true` and `rw` is passed, will reweight to undo negative sign of the strange quark determinant.
```@example
#Single replica
data = read_mesons(path, "G5", "G5")
......@@ -143,7 +150,7 @@ corr_pp = corr_obs.(data)
corr_pp_r = corr_obs.(data, rw=[rw1, rw2])
```
"""
function corr_obs(cdata::CData; real::Bool=true, rw::Union{Array{Float64, 2}, Nothing}=nothing, L::Int64=1, info::Bool=false, flagged_strange::Bool=false)
function corr_obs(cdata::CData; real::Bool=true, rw::Union{Array{Float64, 2}, Nothing}=nothing, L::Int64=1, info::Bool=false, flag_strange::Bool=false)
real ? data = cdata.re_data ./ L^3 : data = cdata.im_data ./ L^3
nt = size(data)[2]
......@@ -151,8 +158,7 @@ function corr_obs(cdata::CData; real::Bool=true, rw::Union{Array{Float64, 2}, No
if isnothing(rw)
obs = [uwreal(data[:, x0], cdata.id) for x0 = 1:nt]
else
flagged_strange ? data = apply_rw_flagged_strange(data, cdata.id) : nothing
data_r, W = apply_rw(data, rw)
flag_strange ? data_r, W = apply_rw(data, rw, id=cdata.id) : data_r, W = apply_rw(data, rw)
ow = [uwreal(data_r[:, x0], cdata.id) for x0 = 1:nt]
W_obs = uwreal(W, cdata.id)
obs = [ow[x0] / W_obs for x0 = 1:nt]
......@@ -168,7 +174,7 @@ function corr_obs(cdata::CData; real::Bool=true, rw::Union{Array{Float64, 2}, No
end
#function corr_obs for R != 1
#TODO: vcfg with gaps
function corr_obs(cdata::Array{CData, 1}; real::Bool=true, rw::Union{Array{Array{Float64, 2}, 1}, Nothing}=nothing, L::Int64=1, info::Bool=false, flagged_strange::Bool=false)
function corr_obs(cdata::Array{CData, 1}; real::Bool=true, rw::Union{Array{Array{Float64, 2}, 1}, Nothing}=nothing, L::Int64=1, info::Bool=false, flag_strange::Bool=false)
nr = length(cdata)
id = getfield.(cdata, :id)
vcfg = getfield.(cdata, :vcfg)
......@@ -187,8 +193,7 @@ function corr_obs(cdata::Array{CData, 1}; real::Bool=true, rw::Union{Array{Array
[tmp = cat(tmp, data[k], dims=1) for k = 2:nr]
obs = [uwreal(tmp[:, x0], id[1], replica) for x0 = 1:nt]
else
flagged_strange ? data = apply_rw_flagged_strange(data, cdata[1].id) : nothing
data_r, W = apply_rw(data, rw)
flag_strange ? data_r, W = apply_rw(data, rw, id=cdata.id) : data_r, W = apply_rw(data, rw)
tmp = data_r[1]
tmp_W = W[1]
[tmp = cat(tmp, data_r[k], dims=1) for k = 2:nr]
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment