Skip to content

Commit ad6a122

Browse files
committed
initial commit
0 parents  commit ad6a122

11 files changed

+702
-0
lines changed

README.md

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# CombinationTool
2+
---
3+
## Idea:
4+
Tool to constrain the parameters of physics models using Bayesian inference by combining measurements of (different) observables. Especially suitable for EFT models. Bayesian inference is performed using the <a target="_blank" href="https://github.com/bat/BAT.jl">*Bayesian Analysis Toolkit - BAT.jl*</a>.
5+
6+
The likelihood used in the CombinationTool is based on the
7+
<a target="_blank" href="https://link.springer.com/article/10.1140/epjc/s10052-016-4280-9">EFT*fitter* </a>
8+
9+
* **Assumption**: Measurements of physical quantities are approximately gaussian. This allows to combine the measurements using the following likelihood:
10+
11+
<img src="http://latex2png.com/pngs/9fcbfbebe11bc63f39c64ac44e6bf790.png" width="1000" height="55" />
12+
13+
* **Likelihood**:
14+
15+
<img src="http://latex2png.com/output//latex_9bcf1dbba64bc349f0c0d81e817d269c.png" width="600" height="65" />
16+
17+
with the **covariance matrix**:
18+
19+
<img src="http://latex2png.com/pngs/5ceee38a8fa4eefd3b91ec36ce075746.png" width="550" height="65" />
20+
21+
22+
23+
## Input needed:
24+
* **Model:** Predicting physical observables as a function of the model parameters
25+
* **Measurements:** Measured values of the observables, including (various types of) uncertainties
26+
* **Correlations:** Correlation matrices for all types of uncertainties
27+
28+
29+
## Current structure of the Julia package *EFTfitter_julia.jl*
30+
* /
31+
* *runCombinationTool.jl:* Main routine for performing a run of the CombinationTool
32+
* *inputs.jl:* Input file. Providing observables, measurements, uncertainties and correlations.
33+
34+
* /src
35+
* *CombinationTool.jl:* module definition
36+
37+
* *datahandling.jl:* type definitions for observables, measurements, uncertainties and correlations. Functions to add these objects to arrays.
38+
39+
* *combination.jl:* Calculation of the covariance matrix and the combination likelihood
40+
41+
* *callingBAT.jl:* passing the combination likelihood to BAT.jl
42+
43+
* /test:
44+
* Unit tests for parts of the code

examples/inputs.jl

+30
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
#============= Observables =============================================#
2+
function obs2(params)
3+
2*params.p1.^2 + 4*params.p2
4+
end
5+
6+
observables = [
7+
Observable("Obs1", params -> params.p1.^4-params.p2.^2),
8+
Observable("Obs2", obs2)
9+
]
10+
11+
12+
#============= Measurements ============================================#
13+
measurements = [
14+
Measurement("Meas1","Obs1", 42.0, Uncertainties("stat"=>1.1,
15+
"syst"=>1.2)),
16+
17+
Measurement("Meas2","Obs2", 22.0, Uncertainties("stat"=>2.1,
18+
"syst"=>2.2))
19+
]
20+
21+
22+
#============= Correlations ============================================#
23+
correlations = [
24+
Correlation("stat", [1.0 0.0
25+
0.0 1.0], active=false),
26+
27+
Correlation("syst", [1.0 0.5
28+
0.5 1.0])
29+
]
30+
#=======================================================================#

examples/runCombination.jl

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#using CombinationTool
2+
using BAT
3+
using LinearAlgebra
4+
using ValueShapes
5+
using IntervalSets
6+
using Plots
7+
8+
push!(LOAD_PATH, "1_BAT2.0")
9+
using CombinationTool
10+
11+
include("inputs.jl")
12+
13+
m = createmodel(observables, measurements, correlations)
14+
#CombinationTool.printmodel(m)
15+
16+
likelihood = CombinationDensity(m)
17+
18+
prior = NamedTupleDist(
19+
p1 = [-10.0..10.0],
20+
p2 = [-20.0..20.0]
21+
)
22+
23+
posterior = PosteriorDensity(likelihood, prior)
24+
25+
nchains = 4
26+
nsamples = 10^4
27+
algorithm = MetropolisHastings()
28+
29+
samples, stats = bat_sample(posterior, (nsamples, nchains), algorithm)

src/CombinationTool.jl

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
__precompile__(true)
2+
3+
module CombinationTool
4+
5+
using BAT, StatsBase, IntervalSets
6+
using LinearAlgebra
7+
8+
9+
include("datahandling.jl")
10+
include("combination.jl")
11+
include("callBAT.jl")
12+
include("utils.jl")
13+
14+
end # module

src/callBAT.jl

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
export CombinationDensity
2+
3+
4+
struct CombinationDensity <: AbstractDensity
5+
model::Model
6+
invcov::Matrix{Real}
7+
sqrtdetcov::Real
8+
end
9+
10+
function CombinationDensity(m::Model)
11+
covariance = calculate_covariancematrix(m.uncertainties, m.correlationmatrices)
12+
sqrtdetcov = sqrt(abs(det(covariance)))
13+
14+
CombinationDensity(m, inv(covariance), sqrtdetcov)
15+
end
16+
17+
18+
function BAT.density_logval(
19+
dens::CombinationDensity,
20+
params
21+
)
22+
23+
combinemeasurements(
24+
dens.model,
25+
dens.invcov,
26+
dens.sqrtdetcov,
27+
params
28+
)
29+
end

src/combination.jl

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
function calculate_covariancematrix(
2+
uncertainties::AbstractArray{Real, 2},
3+
correlationmatrices::Vector{Array{Real,2}}
4+
)
5+
6+
nmeas= size(uncertainties, 1)
7+
nunc = size(uncertainties, 2)
8+
covariance = zeros(nmeas, nmeas)
9+
10+
for i in 1:nunc
11+
for j in 1:nmeas
12+
for k in j:nmeas
13+
if(j == k)
14+
covariance[j, k] += uncertainties[j, i]^2
15+
else
16+
covariance[j, k] += correlationmatrices[i][j, k] * uncertainties[j, i] * uncertainties[k, i]
17+
covariance[k, j] = covariance[j, k]
18+
end
19+
end
20+
end
21+
end
22+
23+
return covariance
24+
end
25+
26+
27+
28+
function combinemeasurements(
29+
m::Model,
30+
invcov::Matrix{<:Real},
31+
sqrtdetcov::Real,
32+
parameters
33+
)
34+
35+
result::Float64=0.0
36+
37+
nmeas=length(m.measurement_values)
38+
39+
for i in 1:nmeas
40+
r1 = m.measurement_values[i] - m.observable_functions[m.measurement_observables[i]].f.obj.x(parameters)[1]
41+
for j in (i+1):nmeas
42+
r2 = m.measurement_values[j] - m.observable_functions[m.measurement_observables[j]].f.obj.x(parameters)[1]
43+
result += r1 * invcov[i,j] * r2
44+
end
45+
result += 0.5 * r1 * invcov[i,i] * r1
46+
end
47+
48+
final_result::Float64 = -result - log((2*π)^(0.5*nmeas) * sqrtdetcov)
49+
return final_result
50+
end

0 commit comments

Comments
 (0)