Model for Tristan experiment
This commit is contained in:
parent
39368b45aa
commit
d9bb3ada0a
@ -19,7 +19,7 @@ import inr.numass.data.SpectrumAdapter
|
|||||||
import inr.numass.data.SpectrumGenerator
|
import inr.numass.data.SpectrumGenerator
|
||||||
import inr.numass.models.NBkgSpectrum
|
import inr.numass.models.NBkgSpectrum
|
||||||
import inr.numass.models.NumassModelsKt
|
import inr.numass.models.NumassModelsKt
|
||||||
import inr.numass.models.misc.Gauss
|
import inr.numass.models.misc.ModGauss
|
||||||
import inr.numass.models.sterile.NumassBeta
|
import inr.numass.models.sterile.NumassBeta
|
||||||
import inr.numass.utils.DataModelUtils
|
import inr.numass.utils.DataModelUtils
|
||||||
|
|
||||||
@ -30,14 +30,16 @@ ctx.getPluginManager().load(PlotManager)
|
|||||||
ctx.getPluginManager().load(NumassPlugin)
|
ctx.getPluginManager().load(NumassPlugin)
|
||||||
|
|
||||||
new GrindShell(ctx).eval {
|
new GrindShell(ctx).eval {
|
||||||
|
PlotHelper ph = plots
|
||||||
|
|
||||||
def beta = new NumassBeta().getSpectrum(0)
|
def beta = new NumassBeta().getSpectrum(0)
|
||||||
def response = new Gauss(5.0)
|
def response = new ModGauss(5.0)
|
||||||
ParametricFunction spectrum = NumassModelsKt.convolute(beta, response)
|
ParametricFunction spectrum = NumassModelsKt.convolute(beta, response)
|
||||||
|
|
||||||
def model = new XYModel(Meta.empty(), new SpectrumAdapter(Meta.empty()), new NBkgSpectrum(spectrum));
|
def model = new XYModel(Meta.empty(), new SpectrumAdapter(Meta.empty()), new NBkgSpectrum(spectrum));
|
||||||
|
|
||||||
ParamSet params = morph(ParamSet, [:], "params") {
|
ParamSet params = morph(ParamSet, [:], "params") {
|
||||||
N(value: 1e+12, err: 30, lower: 0)
|
N(value: 1e+14, err: 30, lower: 0)
|
||||||
bkg(value: 5.0, err: 0.1)
|
bkg(value: 5.0, err: 0.1)
|
||||||
E0(value: 18575.0, err: 0.1)
|
E0(value: 18575.0, err: 0.1)
|
||||||
mnu2(value: 0, err: 0.01)
|
mnu2(value: 0, err: 0.01)
|
||||||
@ -47,35 +49,48 @@ new GrindShell(ctx).eval {
|
|||||||
//trap(value: 1.0, err: 0.05)
|
//trap(value: 1.0, err: 0.05)
|
||||||
w(value: 150, err: 5)
|
w(value: 150, err: 5)
|
||||||
//shift(value: 1, err: 1e-2)
|
//shift(value: 1, err: 1e-2)
|
||||||
tail(value: 1e-4, err: 1e-5)
|
tailAmp(value: 0.01, err: 1e-2)
|
||||||
|
tailW(value: 300, err: 1)
|
||||||
|
}
|
||||||
|
|
||||||
|
ph.plotFunction(-2000d, 500d, 400, "actual", "response") { double x ->
|
||||||
|
response.value(x, params)
|
||||||
}
|
}
|
||||||
|
|
||||||
SpectrumGenerator generator = new SpectrumGenerator(model, params, 12316);
|
SpectrumGenerator generator = new SpectrumGenerator(model, params, 12316);
|
||||||
|
|
||||||
PlotHelper ph = plots
|
ph.plot(data: (2000..19500).step(50).collectEntries {
|
||||||
|
[it, model.value(it, params)]
|
||||||
ph.plot(data: (2000..19500).step(50).collectEntries { [it, model.value(it, params)] }, name: "spectrum")
|
}, name: "spectrum", frame: "test")
|
||||||
.configure(showLine: true, showSymbol: false, showErrors: false, thickness: 2, connectionType: "spline", color: "red")
|
.configure(showLine: true, showSymbol: false, showErrors: false, thickness: 2, connectionType: "spline", color: "red")
|
||||||
|
|
||||||
|
|
||||||
Table data = generator.generateData(DataModelUtils.getUniformSpectrumConfiguration(10000, 19500, 1, 950));
|
Table data = generator.generateData(DataModelUtils.getUniformSpectrumConfiguration(10000, 19500, 1, 950));
|
||||||
|
|
||||||
//params.setParValue("w", 151)
|
params.setParValue("w", 151)
|
||||||
|
//params.setParValue("tailAmp", 0.011)
|
||||||
//params.setParValue("X", 0.01)
|
//params.setParValue("X", 0.01)
|
||||||
//params.setParValue("trap", 0.01)
|
//params.setParValue("trap", 0.01)
|
||||||
//params.setParValue("mnu2", 4)
|
//params.setParValue("mnu2", 4)
|
||||||
|
|
||||||
ph.plot(data: (2000..19500).step(50).collectEntries { [it, model.value(it, params)] }, name: "spectrum-mod")
|
|
||||||
|
ph.plotFunction(-2000d, 500d, 400, "supposed", "response") { double x ->
|
||||||
|
response.value(x, params)
|
||||||
|
}
|
||||||
|
|
||||||
|
ph.plot(data: (2000..19500).step(50).collectEntries {
|
||||||
|
[it, model.value(it, params)]
|
||||||
|
}, name: "spectrum-mod", frame: "test")
|
||||||
.configure(showLine: true, showSymbol: false, showErrors: false, thickness: 2, connectionType: "spline", color: "green")
|
.configure(showLine: true, showSymbol: false, showErrors: false, thickness: 2, connectionType: "spline", color: "green")
|
||||||
|
|
||||||
ph.plot(data: data, adapter: new SpectrumAdapter(Meta.empty()))
|
ph.plot(data: data, frame: "test", adapter: new SpectrumAdapter(Meta.empty()))
|
||||||
.configure(color: "blue")
|
.configure(color: "blue")
|
||||||
|
|
||||||
FitState state = new FitState(data, model, params);
|
FitState state = new FitState(data, model, params);
|
||||||
|
|
||||||
def fm = ctx.getFeature(FitManager)
|
def fm = ctx.getFeature(FitManager)
|
||||||
|
|
||||||
def res = fm.runStage(state, "QOW", FitStage.TASK_RUN, "N", "bkg", "E0", "U2");
|
def res = fm.runStage(state, "MINUIT", FitStage.TASK_RUN, "N", "bkg", "E0", "U2");
|
||||||
|
|
||||||
|
|
||||||
res.printState(ctx.io.out().newPrintWriter());
|
res.printState(ctx.io.out().newPrintWriter());
|
||||||
|
@ -24,19 +24,13 @@ import java.lang.Math.*
|
|||||||
/**
|
/**
|
||||||
* @author Darksnake
|
* @author Darksnake
|
||||||
*/
|
*/
|
||||||
class Gauss(private val cutoff: Double = 4.0) : AbstractParametricFunction(*list), FunctionSupport {
|
class Gauss(private val cutoff: Double = 4.0) : AbstractParametricFunction("w", "shift"), FunctionSupport {
|
||||||
|
|
||||||
private fun getShift(pars: ValueProvider): Double {
|
private fun getShift(pars: ValueProvider): Double = pars.getDouble("shift", 0.0)
|
||||||
return pars.getDouble("shift", 0.0)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getW(pars: ValueProvider): Double {
|
private fun getW(pars: ValueProvider): Double = pars.getDouble("w")
|
||||||
return pars.getDouble("w")
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun providesDeriv(name: String): Boolean {
|
override fun providesDeriv(name: String): Boolean = true
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
override fun value(d: Double, pars: Values): Double {
|
override fun value(d: Double, pars: Values): Double {
|
||||||
@ -72,10 +66,4 @@ class Gauss(private val cutoff: Double = 4.0) : AbstractParametricFunction(*list
|
|||||||
val w = getW(params)
|
val w = getW(params)
|
||||||
return Pair(shift - cutoff * w, shift + cutoff * w)
|
return Pair(shift - cutoff * w, shift + cutoff * w)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
companion object {
|
|
||||||
|
|
||||||
private val list = arrayOf("w", "shift")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,84 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2015 Alexander Nozik.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package inr.numass.models.misc
|
||||||
|
|
||||||
|
import hep.dataforge.stat.parametric.AbstractParametricFunction
|
||||||
|
import hep.dataforge.values.ValueProvider
|
||||||
|
import hep.dataforge.values.Values
|
||||||
|
|
||||||
|
import java.lang.Math.*
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Darksnake
|
||||||
|
*/
|
||||||
|
class ModGauss(private val cutoff: Double = 4.0) : AbstractParametricFunction("w", "shift", "tailAmp", "tailW"), FunctionSupport {
|
||||||
|
|
||||||
|
private fun getShift(pars: ValueProvider): Double = pars.getDouble("shift", 0.0)
|
||||||
|
|
||||||
|
private fun getTailAmp(pars: ValueProvider): Double = pars.getDouble("tailAmp", 0.0)
|
||||||
|
|
||||||
|
private fun getTailW(pars: ValueProvider): Double = pars.getDouble("tailW", 100.0)
|
||||||
|
|
||||||
|
private fun getW(pars: ValueProvider): Double = pars.getDouble("w")
|
||||||
|
|
||||||
|
override fun providesDeriv(name: String): Boolean = true
|
||||||
|
|
||||||
|
|
||||||
|
override fun value(d: Double, pars: Values): Double {
|
||||||
|
val shift = getShift(pars)
|
||||||
|
if (d - shift > cutoff * getW(pars)) {
|
||||||
|
return 0.0
|
||||||
|
}
|
||||||
|
val aux = (d - shift) / getW(pars)
|
||||||
|
val tail = if (d > getShift(pars)) {
|
||||||
|
0.0
|
||||||
|
} else {
|
||||||
|
val tailW = getTailW(pars)
|
||||||
|
getTailAmp(pars) / tailW * Math.exp((d - shift) / tailW)
|
||||||
|
}
|
||||||
|
return exp(-aux * aux / 2) / getW(pars) / sqrt(2 * Math.PI) + tail
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun derivValue(parName: String, d: Double, pars: Values): Double {
|
||||||
|
if (abs(d - getShift(pars)) > cutoff * getW(pars)) {
|
||||||
|
return 0.0
|
||||||
|
}
|
||||||
|
val pos = getShift(pars)
|
||||||
|
val w = getW(pars)
|
||||||
|
val tailW = getTailW(pars)
|
||||||
|
|
||||||
|
return when (parName) {
|
||||||
|
"shift" -> this.value(d, pars) * (d - pos) / w / w
|
||||||
|
"w" -> this.value(d, pars) * ((d - pos) * (d - pos) / w / w / w - 1 / w)
|
||||||
|
"tailAmp" -> if (d > pos) {
|
||||||
|
0.0
|
||||||
|
} else {
|
||||||
|
Math.exp((d - pos) / tailW) / tailW
|
||||||
|
}
|
||||||
|
else -> return 0.0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getSupport(params: Values): Pair<Double, Double> {
|
||||||
|
val shift = getShift(params)
|
||||||
|
return Pair(shift - cutoff * getTailW(params), shift + cutoff * getW(params))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getDerivSupport(parName: String, params: Values): Pair<Double, Double> {
|
||||||
|
val shift = getShift(params)
|
||||||
|
return Pair(shift - cutoff * getTailW(params), shift + cutoff * getW(params))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user