31 declareInterface<ICscStripFitter>(
this);
69 return StatusCode::SUCCESS;
76 ATH_MSG_DEBUG(
" Number of charges =" << chgs.size() <<
" Charges: " << chgs);
82 <<
" the identifier is ");
85 ATH_MSG_DEBUG(
"CalibCscStripFitter:: " << stripId <<
" " << (
unsigned int)stripHash);
92 for (
int i = 0;
i < 3; ++
i) { initValues[
i] = 0.; }
105 res.charge = initValues[0];
106 res.time = initValues[1];
108 initValues[1] =
res.time - 2.5;
119 res.dcharge = sqrt(
res.dcharge *
res.dcharge + dqprop * dqprop);
131 double peakingTime = -99.;
132 double amplitude = -99.;
135 const int numSample = 4;
138 for (
int j = 1; j < numSample; j++) {
143 if (amin >
x[j]) amin =
x[j];
148 if ((
imax == 0) || (
imax == numSample - 1))
159 peakingTime = -0.5 *
b /
a;
160 amplitude =
a * peakingTime * peakingTime +
b * peakingTime +
c;
164 initValues[0] = amplitude;
165 initValues[1] = peakingTime;
178 int ii = correspdim[0];
181 }
else if (
dim == 2) {
182 int ii = correspdim[0];
183 int jj = correspdim[1];
187 double i00 =
matrix[ii][ii];
189 matrix[jj][jj] = i00 / determinant;
193 }
else if (
dim == 3) {
212 matrix[0][0] = i00 / determinant;
213 matrix[1][1] = i11 / determinant;
214 matrix[2][2] = i22 / determinant;
219 printf(
"this is not a 1x1 or 2x2 or 3x3 matrix\n");
225 W[0][3] *
W[0][3] *
W[1][2] *
W[1][2] - 2. *
W[0][2] *
W[0][3] *
W[1][2] *
W[1][3] +
W[0][2] *
W[0][2] *
W[1][3] *
W[1][3] -
226 W[0][3] *
W[0][3] *
W[1][1] *
W[2][2] + 2. *
W[0][1] *
W[0][3] *
W[1][3] *
W[2][2] -
W[0][0] *
W[1][3] *
W[1][3] *
W[2][2] +
227 2. *
W[0][2] *
W[0][3] *
W[1][1] *
W[2][3] - 2. *
W[0][1] *
W[0][3] *
W[1][2] *
W[2][3] -
228 2. *
W[0][1] *
W[0][2] *
W[1][3] *
W[2][3] + 2. *
W[0][0] *
W[1][2] *
W[1][3] *
W[2][3] +
W[0][1] *
W[0][1] *
W[2][3] *
W[2][3] -
229 W[0][0] *
W[1][1] *
W[2][3] *
W[2][3] -
W[0][2] *
W[0][2] *
W[1][1] *
W[3][3] + 2. *
W[0][1] *
W[0][2] *
W[1][2] *
W[3][3] -
230 W[0][0] *
W[1][2] *
W[1][2] *
W[3][3] -
W[0][1] *
W[0][1] *
W[2][2] *
W[3][3] +
W[0][0] *
W[1][1] *
W[2][2] *
W[3][3];
232 W[0][1] =
W[3][0] *
W[3][1] *
W[2][2] -
W[3][0] *
W[2][1] *
W[3][2] -
W[2][0] *
W[3][1] *
W[3][2] +
W[1][0] *
W[3][2] *
W[3][2] +
233 W[2][0] *
W[2][1] *
W[3][3] -
W[1][0] *
W[2][2] *
W[3][3];
234 W[0][2] = -
W[3][0] *
W[2][1] *
W[3][1] +
W[2][0] *
W[3][1] *
W[3][1] +
W[3][0] *
W[1][1] *
W[3][2] -
W[1][0] *
W[3][1] *
W[3][2] -
235 W[2][0] *
W[1][1] *
W[3][3] +
W[1][0] *
W[2][1] *
W[3][3];
236 W[0][3] =
W[3][0] *
W[2][1] *
W[2][1] -
W[2][0] *
W[2][1] *
W[3][1] -
W[3][0] *
W[1][1] *
W[2][2] +
W[1][0] *
W[3][1] *
W[2][2] +
237 W[2][0] *
W[1][1] *
W[3][2] -
W[1][0] *
W[2][1] *
W[3][2];
238 W[1][2] =
W[3][0] *
W[3][0] *
W[2][1] -
W[2][0] *
W[3][0] *
W[3][1] -
W[1][0] *
W[3][0] *
W[3][2] +
W[0][0] *
W[3][1] *
W[3][2] +
239 W[1][0] *
W[2][0] *
W[3][3] -
W[0][0] *
W[2][1] *
W[3][3];
241 W[1][3] = -
W[2][0] *
W[3][0] *
W[2][1] +
W[2][0] *
W[2][0] *
W[3][1] +
W[1][0] *
W[3][0] *
W[2][2] -
W[0][0] *
W[3][1] *
W[2][2] -
242 W[1][0] *
W[2][0] *
W[3][2] +
W[0][0] *
W[2][1] *
W[3][2];
243 W[2][3] =
W[2][0] *
W[3][0] *
W[1][1] -
W[1][0] *
W[3][0] *
W[2][1] -
W[1][0] *
W[2][0] *
W[3][1] +
W[0][0] *
W[2][1] *
W[3][1] +
244 W[1][0] *
W[1][0] *
W[3][2] -
W[0][0] *
W[1][1] *
W[3][2];
246 double W00 = -
W[3][1] *
W[3][1] *
W[2][2] + 2. *
W[2][1] *
W[3][1] *
W[3][2] -
W[1][1] *
W[3][2] *
W[3][2] -
247 W[2][1] *
W[2][1] *
W[3][3] +
W[1][1] *
W[2][2] *
W[3][3];
248 double W11 = -
W[3][0] *
W[3][0] *
W[2][2] + 2. *
W[2][0] *
W[3][0] *
W[3][2] -
W[0][0] *
W[3][2] *
W[3][2] -
249 W[2][0] *
W[2][0] *
W[3][3] +
W[0][0] *
W[2][2] *
W[3][3];
250 double W22 = -
W[3][0] *
W[3][0] *
W[1][1] + 2. *
W[1][0] *
W[3][0] *
W[3][1] -
W[0][0] *
W[3][1] *
W[3][1] -
251 W[1][0] *
W[1][0] *
W[3][3] +
W[0][0] *
W[1][1] *
W[3][3];
252 double W33 = -
W[2][0] *
W[2][0] *
W[1][1] + 2. *
W[1][0] *
W[2][0] *
W[2][1] -
W[0][0] *
W[2][1] *
W[2][1] -
253 W[1][0] *
W[1][0] *
W[2][2] +
W[0][0] *
W[1][1] *
W[2][2];
255 for (
int i = 0;
i < 3;
i++) {
256 for (
int j = 1; j < 4; j++) {
257 if (
i >= j)
continue;
258 W[
i][j] =
W[
i][j] / Determinant;
262 W[0][0] = W00 / Determinant;
263 W[1][1] = W11 / Determinant;
264 W[2][2] = W22 / Determinant;
265 W[3][3] = W33 / Determinant;
270 double norm = p0[0][0];
272 for (
int i = 0;
i < imeas;
i++) {
275 double repquant = 0.;
276 double dFdzNormalized = 0.;
279 dFdzNormalized = repquant * (
m_n /
z +
z / (
m_n2 + 1) - (
m_n + 1.) / (
m_n2 + 1.) - 1.);
282 A[ii][0] = repquant * (1. -
z / (
m_n2 + 1.));
287 double commonpart =
norm * dFdzNormalized;
289 A[ii][2] = commonpart * (-
z / p0[2][0]);
297 const int maxIter = 7;
299 double fitTolerance0 = 0.1;
300 double fitTolerance1 = 0.01;
303 for (
int j = 0; j < 3; j++) p0[j][0] = initValues[j];
309 for (
int i = 0;
i < 4;
i++) {
314 W[0][1] = 0.03 * ex * ex;
315 W[0][2] = -0.411 * ex * ex;
316 W[0][3] = -0.188 * ex * ex;
317 W[1][2] = 0.0275 * ex * ex;
318 W[1][3] = -0.4303 * ex * ex;
319 W[2][3] = 0. * ex * ex;
336 for (
int i = 0;
i < 4; ++
i) {
338 for (
int j = 0; j < 3; ++j) {
A[
i][j] = 0.; }
345 bool converged =
false;
346 double amplitudeChangeOld = 0.;
347 bool diverganceCandidate =
false;
355 double residFactor[3][4];
357 for (
int i = 0;
i < 3; ++
i) {
358 for (
int j = 0; j < 4; ++j) {
359 if (j < 3) {
weight[
i][j] = 0.; }
360 residFactor[
i][j] = 0.;
367 while (!converged &&
counter < maxIter)
374 double helpmatrix[4][3];
375 for (
int i = 0;
i < 4; ++
i) {
376 for (
int j = 0; j < 3; ++j) { helpmatrix[
i][j] = 0.; }
379 for (
int i = 0;
i < imeas;
i++) {
381 for (
int j = 0; j < ipar; j++) {
383 for (
int k = 0;
k < imeas;
k++) {
385 helpmatrix[ii][jj] +=
W[ii][
kk] *
A[
kk][jj];
389 for (
int i = 0;
i < ipar;
i++) {
391 for (
int j =
i; j < ipar; j++) {
394 for (
int k = 0;
k < imeas;
k++) {
408 double helpmatrix2[3][4];
409 for (
int i = 0;
i < 3; ++
i) {
410 for (
int j = 0; j < 4; ++j) { helpmatrix2[
i][j] = 0.; }
413 for (
int i = 0;
i < ipar;
i++) {
415 for (
int j = 0; j < imeas; j++) {
417 for (
int k = 0;
k < imeas;
k++) {
419 helpmatrix2[ii][jj] +=
A[
kk][ii] *
W[
kk][jj];
424 for (
int i = 0;
i < ipar;
i++) {
426 for (
int j = 0; j < imeas; j++) {
428 residFactor[ii][jj] = 0.;
429 for (
int k = 0;
k < ipar;
k++) {
431 residFactor[ii][jj] +=
weight[ii][
kk] * helpmatrix2[
kk][jj];
438 for (
int i = 0;
i < 3; ++
i) { paramDiff[
i] = 0.; }
440 for (
int i = 0;
i < ipar;
i++) {
444 for (
int j = 0; j < imeas; j++) {
446 paramDiff[ii] += residFactor[ii][jj] * (
m[jj][0] -
fp[jj][0]);
448 p0[ii][0] += paramDiff[ii];
450 std::cout <<
"##### " << p0[0][0] <<
" " << p0[1][0] <<
" " << p0[2][0] << std::endl;
454 if (peakingTime < -0.5 || peakingTime > 3.) p0[1][0] = initValues[1];
456 if (p0[0][0] < 0.) p0[0][0] = initValues[0];
457 double amplitudeChangeNew = std::abs(paramDiff[0]);
458 if (std::abs(paramDiff[0]) < fitTolerance0 && std::abs(paramDiff[1]) < fitTolerance1) {
465 for (
int i = 0;
i < imeas;
i++) {
471 double helpmatrixchi2[4][1];
472 for (
int i = 0;
i < 4; ++
i) { helpmatrixchi2[
i][0] = 0.; }
473 for (
int i = 0;
i < imeas;
i++) {
475 for (
int k = 0;
k < imeas;
k++) {
480 for (
int k = 0;
k < imeas;
k++) {
487 }
else if (
counter > 4 && (amplitudeChangeNew > 4. * amplitudeChangeOld)) {
488 if (diverganceCandidate) {
491 printf(
"%3.2f %3.2f %3.2f %3.2f\n ",
x[0],
x[1],
x[2],
x[3]);
492 printf(
"Diverging fit\n");
495 diverganceCandidate =
true;
506 if (p0[0][0] < 20.) {
508 fitTolerance1 = 0.05;
510 amplitudeChangeOld = amplitudeChangeNew;
527 if (
counter == maxIter)
return 3;