diff --git a/numass-core/src/main/java/inr/numass/data/SpectrumDataAdapter.java b/numass-core/src/main/java/inr/numass/data/SpectrumDataAdapter.java index 9c46ab1b..7beaa930 100644 --- a/numass-core/src/main/java/inr/numass/data/SpectrumDataAdapter.java +++ b/numass-core/src/main/java/inr/numass/data/SpectrumDataAdapter.java @@ -16,7 +16,6 @@ package inr.numass.data; import hep.dataforge.exceptions.DataFormatException; -import hep.dataforge.exceptions.NameNotFoundException; import hep.dataforge.meta.Meta; import hep.dataforge.meta.MetaBuilder; import hep.dataforge.tables.ValueMap; @@ -25,6 +24,8 @@ import hep.dataforge.tables.XYAdapter; import hep.dataforge.values.Value; import hep.dataforge.values.Values; +import java.util.Objects; + /** * @author Darksnake */ @@ -59,7 +60,7 @@ public class SpectrumDataAdapter extends XYAdapter { } public double getTime(Values point) { - return this.getFrom(point, POINT_LENGTH_NAME, 1d).doubleValue(); + return this.getComponent(point, POINT_LENGTH_NAME, 1d).doubleValue(); } public Values buildSpectrumDataPoint(double x, long count, double t) { @@ -79,30 +80,37 @@ public class SpectrumDataAdapter extends XYAdapter { return true; } - @Override - public Value getYerr(Values point) throws NameNotFoundException { - if (super.providesYError(point)) { - return Value.of(super.getYerr(point).doubleValue() / getTime(point)); - } else { - double y = super.getY(point).doubleValue(); - if (y < 0) { - throw new DataFormatException(); - } else if (y == 0) { - //avoid infinite weights - return Value.of(1d / getTime(point)); - } else { - return Value.of(Math.sqrt(y) / getTime(point)); - } - } - } - public long getCount(Values point) { return super.getY(point).numberValue().longValue(); } @Override - public Value getY(Values point) { - return Value.of(super.getY(point).doubleValue() / getTime(point)); + public Value getValue(Values point, String axis) { + if (Objects.equals(axis, XYAdapter.Y_AXIS)) { + return Value.of(getComponent(point, Y_VALUE_KEY).doubleValue() / getTime(point)); + } else { + return super.getValue(point, axis); + } } + @Override + public Value getError(Values point, String axis) { + if (Objects.equals(axis, XYAdapter.Y_AXIS)) { + if (super.providesYError(point)) { + return Value.of(getComponent(point, Y_ERROR_KEY).doubleValue() / getTime(point)); + } else { + double y = getComponent(point, Y_VALUE_KEY).doubleValue(); + if (y < 0) { + throw new DataFormatException(); + } else if (y == 0) { + //avoid infinite weights + return Value.of(1d / getTime(point)); + } else { + return Value.of(Math.sqrt(y) / getTime(point)); + } + } + } else { + return super.getError(point, axis); + } + } } diff --git a/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy b/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy index f620ea64..481eaa15 100644 --- a/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy +++ b/numass-main/src/main/groovy/inr/numass/scripts/models/TristanModel.groovy @@ -18,7 +18,7 @@ import inr.numass.data.SpectrumDataAdapter import inr.numass.data.SpectrumGenerator import inr.numass.models.NBkgSpectrum import inr.numass.models.NumassModelsKt -import inr.numass.models.misc.GaussFunction +import inr.numass.models.misc.Gauss import inr.numass.models.sterile.NumassBeta import inr.numass.utils.DataModelUtils @@ -30,37 +30,45 @@ ctx.getPluginManager().load(NumassPlugin) new GrindShell(ctx).eval { def beta = new NumassBeta().getSpectrum(0) - def response = new GaussFunction(4.0) + def response = new Gauss(5.0) ParametricFunction spectrum = NumassModelsKt.convolute(beta, response) def model = new XYModel(Meta.empty(), new SpectrumDataAdapter(), new NBkgSpectrum(spectrum)); ParamSet params = morph(ParamSet, [:], "params") { N(value: 1e+12, err: 30, lower: 0) - bkg(value: 1.0, err: 0.1) + bkg(value: 5.0, err: 0.1) E0(value: 18575.0, err: 0.1) mnu2(value: 0, err: 0.01) msterile2(value: 1000**2, err: 1) U2(value: 0.0, err: 1e-3) - X(value: 0.0, err: 0.01, lower: 0) - trap(value: 1.0, err: 0.05) + //X(value: 0.0, err: 0.01, lower: 0) + //trap(value: 1.0, err: 0.05) w(value: 150, err: 5) + //shift(value: 1, err: 1e-2) + tail(value: 1e-4, err: 1e-5) } SpectrumGenerator generator = new SpectrumGenerator(model, params, 12316); PlotHelper ph = plots - ph.plot((2000..19500).step(100).collectEntries { - [it, model.value(it, params)] - }, "spectrum").configure(showLine: true, showSymbol: false, showErrors: false, thickness: 3, color: "red") + ph.plot(data: (2000..19500).step(50).collectEntries { [it, model.value(it, params)] }, name: "spectrum") + .configure(showLine: true, showSymbol: false, showErrors: false, thickness: 2, connectionType: "spline", color: "red") Table data = generator.generateData(DataModelUtils.getUniformSpectrumConfiguration(10000, 19500, 1, 950)); //params.setParValue("w", 151) + //params.setParValue("X", 0.01) + //params.setParValue("trap", 0.01) + //params.setParValue("mnu2", 4) - ph.plot(data).configure(color: "blue") + ph.plot(data: (2000..19500).step(50).collectEntries { [it, model.value(it, params)] }, name: "spectrum-mod") + .configure(showLine: true, showSymbol: false, showErrors: false, thickness: 2, connectionType: "spline", color: "green") + + ph.plot(data: data, adapter: new SpectrumDataAdapter()) + .configure(color: "blue") FitState state = new FitState(data, model, params); diff --git a/numass-main/src/main/kotlin/inr/numass/models/misc/GaussFunction.kt b/numass-main/src/main/kotlin/inr/numass/models/misc/Gauss.kt similarity index 92% rename from numass-main/src/main/kotlin/inr/numass/models/misc/GaussFunction.kt rename to numass-main/src/main/kotlin/inr/numass/models/misc/Gauss.kt index 476eb58c..dddc1c6f 100644 --- a/numass-main/src/main/kotlin/inr/numass/models/misc/GaussFunction.kt +++ b/numass-main/src/main/kotlin/inr/numass/models/misc/Gauss.kt @@ -24,7 +24,7 @@ import java.lang.Math.* /** * @author Darksnake */ -class GaussFunction(private val cutoff: Double = 4.0) : AbstractParametricFunction(list), FunctionSupport { +class Gauss(private val cutoff: Double = 4.0) : AbstractParametricFunction(*list), FunctionSupport { private fun getShift(pars: ValueProvider): Double { return pars.getDouble("shift", 0.0) diff --git a/numass-main/src/main/kotlin/inr/numass/models/misc/TailFunctions.kt b/numass-main/src/main/kotlin/inr/numass/models/misc/TailFunctions.kt new file mode 100644 index 00000000..95f98922 --- /dev/null +++ b/numass-main/src/main/kotlin/inr/numass/models/misc/TailFunctions.kt @@ -0,0 +1,41 @@ +package inr.numass.models.misc + +import hep.dataforge.stat.parametric.AbstractParametricFunction +import hep.dataforge.values.Values + +class ConstantTail(private val defaultTail: Double = 0.0) : AbstractParametricFunction("tail") { + override fun derivValue(parName: String, x: Double, set: Values): Double { + if (parName == "tail" && x <= 0) { + return 1.0 + } else { + return 0.0 + } + } + + override fun value(x: Double, set: Values): Double { + return if (x <= 0) { + set.getDouble("tail", defaultTail) + } else { + 0.0 + } + } + + override fun providesDeriv(name: String): Boolean { + return true; + } +} + +class exponentialTail : AbstractParametricFunction("tail") { + override fun derivValue(parName: String?, x: Double, set: Values?): Double { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun value(x: Double, set: Values?): Double { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + + override fun providesDeriv(name: String?): Boolean { + TODO("not implemented") //To change body of created functions use File | Settings | File Templates. + } + +} \ No newline at end of file diff --git a/numass-main/src/main/kotlin/inr/numass/models/sterile/NumassBeta.kt b/numass-main/src/main/kotlin/inr/numass/models/sterile/NumassBeta.kt index 0b7ead19..c03c539f 100644 --- a/numass-main/src/main/kotlin/inr/numass/models/sterile/NumassBeta.kt +++ b/numass-main/src/main/kotlin/inr/numass/models/sterile/NumassBeta.kt @@ -204,7 +204,7 @@ class NumassBeta : AbstractParametricBiFunction(list) { return BetaSpectrum(fs); } - inner class BetaSpectrum(val fs: Double) : AbstractParametricFunction(list) { + inner class BetaSpectrum(val fs: Double) : AbstractParametricFunction(*list) { override fun providesDeriv(name: String): Boolean { return this@NumassBeta.providesDeriv(name) diff --git a/numass-main/src/main/kotlin/inr/numass/models/sterile/SterileNeutrinoSpectrum.kt b/numass-main/src/main/kotlin/inr/numass/models/sterile/SterileNeutrinoSpectrum.kt index c079725a..62335835 100644 --- a/numass-main/src/main/kotlin/inr/numass/models/sterile/SterileNeutrinoSpectrum.kt +++ b/numass-main/src/main/kotlin/inr/numass/models/sterile/SterileNeutrinoSpectrum.kt @@ -47,7 +47,7 @@ class SterileNeutrinoSpectrum @JvmOverloads constructor( configuration: Meta, val source: ParametricBiFunction = NumassBeta(), val transmission: NumassTransmission = NumassTransmission(context, configuration.getMetaOrEmpty("transmission")), - val resolution: ParametricBiFunction = NumassResolution(context, configuration.getMeta("resolution", Meta.empty()))) : AbstractParametricFunction(list) { + val resolution: ParametricBiFunction = NumassResolution(context, configuration.getMeta("resolution", Meta.empty()))) : AbstractParametricFunction(*list) { /**