1 #include <ecl/digitization/ECLDspFitterPure.h>
10 using namespace Belle2::ECL;
13 double Belle2::ECL::func(
int i,
int ifine,
25 double Belle2::ECL::func1(
int i,
int ifine,
41 for (
int i = 0; i < 16; i++) {
45 else params.f[i][k] = func(i, k, signal);
52 for (
int h = 0; h < 16; h++) {
54 for (
int j = 0; j < 16; j++) {
55 params.c001[h] -= params.invC[h][j];
56 params.c002 += params.invC[h][j];
67 for (
int i = 0; i < 16; i++) {
68 for (
int j = 0; j < 16; j++) {
69 params.c110[k] += kdt * func1(i, k, signal) * params.invC[i][j] * func(j, k, signal);
70 params.c200[k] += func(i, k, signal) * params.invC[i][j] * func(j, k, signal);
71 params.c020[k] += kdt * func1(i, k, signal) * params.invC[i][j] * func1(j, k, signal) * kdt;
72 params.c101[k] += func(i, k, signal) * params.invC[i][j];
73 params.c011[k] += kdt * func1(i, k, signal) * params.invC[i][j];
83 params.c110[k + off] = 0;
84 params.c200[k + off] = 0;
85 params.c020[k + off] = 0;
86 params.c101[k + off] = 0;
87 params.c011[k + off] = 0;
88 for (
int i = 0; i < 16; i++) {
89 for (
int j = 0; j < 16; j++) {
90 params.c110[k + off] += kdt * func1(i, -k, signal) * params.invC[i][j] * func(j, -k, signal);
91 params.c200[k + off] += func(i, -k, signal) * params.invC[i][j] * func(j, -k, signal);
92 params.c020[k + off] += kdt * func1(i, -k, signal) * params.invC[i][j] * func1(j, -k, signal) * kdt;
93 params.c101[k + off] += func(i, -k, signal) * params.invC[i][j];
94 params.c011[k + off] += kdt * func1(i, -k, signal) * params.invC[i][j];
97 params.c110[k + off] *= 2;
98 params.c101[k + off] *= 2;
99 params.c011[k + off] *= 2;
103 for (
int h = 0; h < 16; h++) {
106 params.c100[h][k] = 0;
107 params.c010[h][k] = 0;
108 for (
int i = 0; i < 16; i++) {
109 params.c100[h][k] -= func(i, k, signal) * params.invC[i][h];
110 params.c010[h][k] -= kdt * func1(i, k, signal) * params.invC[i][h];
112 params.c100[h][k] *= 2;
113 params.c010[h][k] *= 2;
116 params.c100[h][k + off] = 0;
117 params.c010[h][k + off] = 0;
118 for (
int i = 0; i < 16; i++) {
119 params.c100[h][k + off] -= func(i, -k, signal) * params.invC[i][h];
120 params.c010[h][k + off] -= kdt * func1(i, -k, signal) * params.invC[i][h];
122 params.c100[h][k + off] *= 2;
123 params.c010[h][k + off] *= 2;
130 double& time,
double& chi2,
int& iter)
132 int baseline = accumulate(FitA, FitA + 16, 0) / 16;
135 amp = *imax - baseline;
147 double k100 { 0 }, k010{ 0 }, k001{ 0 };
149 if (dt < 0) dt = offset - 1 - dt;
150 for (
int i = 0; i < 16; i++) {
151 k100 += f.c100[i][dt] * y[i];
152 k010 += f.c010[i][dt] * y[i];
153 k001 += f.c001[i] * y[i];
156 double a[] = { 2 * f.c200[dt], f.c110[dt], f.c101[dt] ,
157 f.c110[dt], 2 * f.c020[dt], f.c011[dt],
158 f.c101[dt], f.c011[dt], 2 * f.c002
162 M1.SetMatrixArray(a);
176 TDecompLU solver(M1);
178 C = solver.Solve(C, ok);
207 chi2 = f.c200[dt] * A * A + f.c020[dt] * B * B + f.c002 * P * P +
208 f.c110[dt] * A * B + f.c101[dt] * A * P + f.c011[dt] * B * P +
209 k100 * A + k010 * B + k001 * P ;
210 for (
int i = 0; i < 16; i++)
211 for (
int j = 0; j < 16; j++)
212 chi2 += y[i] * f.invC[i][j] * y[j];
215 double deltaT = C[1] / C[0] ;
216 int intTime = ttrig + round(deltaT) ;
218 time = -(ttrig + deltaT);
221 if (iter < 3 && intime) {
223 DSPFitterPure(f, FitA, intTime, amp, time, chi2, iter);
226 if (intime && abs(deltaT) > 0.5 && iter++ < 10)
227 DSPFitterPure(f, FitA, intTime, amp, time, chi2, iter);