29 using TMath::PoissonI;
60 this->push_back(
mean);
61 this->push_back(
sigma);
78 inline result_type
g1(
const JGauss&
gauss,
const JElement_t& point)
82 const double u = (point.getX() -
gauss[0]) /
gauss[1];
83 const double fs =
gauss[2] * exp(-0.5*u*u) / (sqrt(2.0*PI) *
gauss[1]);
84 const double fb =
gauss[3];
85 const double f1 = fs + fb;
87 const double p = PoissonI(point.getY(), f1);
96 result.gradient *= 1.0 - point.getY()/
f1;
122 JParser<> zap(
"Program to test JGandalf algorithm.");
132 catch(
const exception& error) {
133 FATAL(error.what() << endl);
136 using namespace JFIT;
138 ASSERT(numberOfEvents > 0);
142 TF1 fs(
"fs",
"exp(-0.5 * (x-[0])*(x-[0]) / ([1]*[1]))");
145 fs.FixParameter(0,
gauss[0]);
146 fs.FixParameter(1,
gauss[1]);
149 const Double_t xmin = -5.0;
150 const Double_t xmax = +5.0;
157 TH1D
H[] = { TH1D(
"ha",
"", 101, -0.1, +0.1),
158 TH1D(
"hb",
"", 101, -0.1, +0.1),
159 TH1D(
"hc",
"", 101, -100.0, +100.0),
160 TH1D(
"hd",
"", 101, -100.0, +100.0) };
164 for (
int i = 0; i != numberOfEvents; ++i) {
166 STATUS(
"event: " << setw(10) << i <<
'\r');
DEBUG(endl);
168 TH1D h0(
"h0", NULL, nx, xmin, xmax);
172 h0.FillRandom(
"fs", (Int_t)
gauss[2]);
173 h0.FillRandom(
"fb", (Int_t)
gauss[3]);
177 for (Int_t i = 1; i <= h0.GetNbinsX(); ++i) {
178 data.push_back(JElement_t(h0.GetBinCenter (i),
179 h0.GetBinContent(i)));
184 fit.parameters.resize(4);
186 for (
size_t i = 0; i != 4; ++i) {
187 fit.parameters[i] = i;
190 fit.value =
JGauss(h0.GetMean(),
192 h0.GetEntries() * (xmax - xmin) / nx - h0.GetMinimum(),
195 DEBUG(
"Start value " << fit.value << endl);
199 const double chi2 = fit(
g1, data.begin(), data.end());
203 DEBUG(
"Final value " << fit.value << endl);
204 DEBUG(
"Chi2 " << chi2 << endl);
206 const double Y[] = { fit.value[0] -
gauss[0],
207 fit.value[1] -
gauss[1],
208 fit.value[2] * nx / (xmax - xmin) -
gauss[2],
209 fit.value[3] * nx -
gauss[3] };
211 for (
int i = 0; i !=
sizeof(Q)/
sizeof(Q[0]); ++i) {
217 for (
int i = 0; i !=
sizeof(Q)/
sizeof(Q[0]); ++i) {
229 for (
int i = 0; i !=
sizeof(
H)/
sizeof(
H[0]); ++i) {
237 for (
int i = 0; i !=
sizeof(Q)/
sizeof(Q[0]); ++i) {
241 ASSERT(Q[0].getSTDev() < precision[0]);
242 ASSERT(Q[1].getSTDev() < precision[1]);
243 ASSERT(Q[2].getSTDev() < precision[2]);
244 ASSERT(Q[3].getSTDev() < precision[3]);
double getMean(vector< double > &v)
get mean of vector content
The elements in a collection are sorted according to their abscissa values and a given distance opera...
int main(int argc, char **argv)
std::ostream & longprint(std::ostream &out)
Set long printing.
std::ostream & shortprint(std::ostream &out)
Set short printing.
General purpose messaging.
#define DEBUG(A)
Message macros.
#define ASSERT(A,...)
Assert macro.
Utility class to parse command line options.
#define make_field(A,...)
macro to convert parameter to JParserTemplateElement object
I/O formatting auxiliaries.
Double_t g1(const Double_t x)
Function.
Place holder for custom implementation.
Auxiliary class for CPU timing and usage.
void print(std::ostream &out, const JScale_t scale=milli_t) const
Print timer data.
Utility class to parse command line options.
const JPolynome f1(1.0, 2.0, 3.0)
Function.
Auxiliary classes and methods for linear and iterative data regression.
double gauss(const double x, const double sigma)
Gauss function (normalised to 1 at x = 0).
static const double H
Planck constant [eV s].
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Data structure for return value of fit function.
JGauss()
Default constructor.