341 unsigned int nstrip = sfits.size();
345 Muon::CscTimeStatus tstatus = (sfits[0].charge > sfits[1].charge) ? sfits[0].timeStatus : sfits[1].timeStatus;
347 }
else if (nstrip == 1) {
355 for (
unsigned int istrip = 0; istrip < nstrip; ++istrip) {
356 if (sfits[istrip].
strip ==
nullptr) {
358 results.emplace_back(2);
370 if (MuonDetMgr ==
nullptr) {
371 ATH_MSG_ERROR(
"Null pointer to the MuonDetectorManager conditions object");
376 bool measphi =
m_idHelperSvc->cscIdHelper().CscIdHelper::measuresPhi(idStrip0);
379 unsigned int strip0 =
m_idHelperSvc->cscIdHelper().strip(idStrip0) - 1;
380 int station =
m_idHelperSvc->cscIdHelper().stationName(idStrip0) - 49;
382 CscPlane plane = findPlane(station, measphi);
384 ATH_MSG_WARNING(
"Invalid CSC plane: station=" << station <<
"; measphi=" << measphi);
385 results.emplace_back(3);
391 for (
unsigned int istrip = 0; istrip < nstrip; ++istrip) {
392 Identifier id = sfits[istrip].strip->identify();
394 <<
m_idHelperSvc->cscIdHelper().strip(
id) <<
" " << sfits[istrip].charge);
398 unsigned int istrip_peak = 0;
400 for (
unsigned int istrip = 1; istrip < nstrip - 1; ++istrip) {
404 float qthis = sfit.
charge;
405 float qlast = sfits[istrip - 1].charge;
406 float qnext = sfits[istrip + 1].charge;
408 bool ispeak = qthis > qlast && qthis > qnext;
413 if (qthis == qnext) { ispeak = (qthis > qlast) && (istrip + 2 == nstrip || sfits[istrip + 2].
charge < qthis); }
419 if (qthis == qlast) {
420 ispeak = qthis > qnext;
430 istrip_peak = istrip;
433 ATH_MSG_VERBOSE(
" Peak is at " << istrip_peak <<
"th strip in cluster");
436 if (strip0 <= 0 || strip0 + nstrip > maxstrip) {
452 bool is_even = 2 * (nstrip / 2) == nstrip;
453 bool atcenter = istrip_peak == nstrip / 2 || (is_even && istrip_peak + 1 == nstrip / 2);
480 double savg = istrip_peak;
490 double q1 = sfits[istrip_peak - 1].charge;
491 double q0 = sfits[istrip_peak].charge;
492 double q2 = sfits[istrip_peak + 1].charge;
493 double qrat1 = q1 / q0;
494 double qrat2 = q2 / q0;
495 double dq1 = sfits[istrip_peak - 1].dcharge;
496 double dq0 = sfits[istrip_peak].dcharge;
497 double dq2 = sfits[istrip_peak + 1].dcharge;
501 double dscordqrat1 = 0.;
503 double dscordqrat2 = 0.;
506 if (posopt ==
"POLYNOMIAL") {
509 }
else if (posopt ==
"TABLE") {
511 const std::vector<double>* pcor =
nullptr;
520 results.emplace_back(8);
529 }
else if (posopt ==
"ATANH") {
543 results.emplace_back(8);
546 stat1 =
qrat_atanh(
a, b, c, x0, qrat1, scor1, dscordqrat1);
547 stat2 =
qrat_atanh(
a, b, c, x0, qrat2, scor2, dscordqrat2);
551 results.emplace_back(9);
554 if (stat1 || stat2) {
556 results.emplace_back(10);
560 ATH_MSG_VERBOSE(
" QRAT derivatives: " << dscordqrat1 <<
" " << dscordqrat2);
565 dscordqrat1 = -dscordqrat1;
570 if (erropt ==
"FIXED") {
571 double w1 = 1 / (dscordqrat1 * dscordqrat1);
572 double w2 = 1 / (dscordqrat2 * dscordqrat2);
573 scor = (w1 * scor1 + w2 * scor2) / (w1 + w2);
574 double scor_diff = std::abs(scor2 - scor1);
578 dmap[
"scor1"] = scor1;
579 dmap[
"scor2"] = scor2;
588 }
else if (erropt ==
"CHARGE") {
590 double x1 = dscordqrat1 * qrat1;
591 double x2 = dscordqrat2 * qrat2;
592 double dqq0 = dq0 / q0;
593 double dqq1 = dq1 / q1;
594 double dqq2 = dq2 / q2;
595 double rnum = (-x1 * x1 * dqq1 * dqq1 + x2 * x2 * dqq2 * dqq2 + (x2 * x2 - x1 * x1) * dqq0 * dqq0);
596 double rden = (x1 * x1 * dqq1 * dqq1 + x2 * x2 * dqq2 * dqq2 + (x2 - x1) * (x2 - x1) * dqq0 * dqq0);
597 double rfac = rnum / rden;
599 double dscor_diff = sqrt(rden);
600 double scor_diff = scor2 - scor1;
601 double scor_sig = std::abs(scor_diff) / dscor_diff;
603 double w1 = 0.5 * (1.0 + rfac);
604 double w2 = 0.5 * (1.0 - rfac);
605 scor = w1 * scor1 + w2 * scor2;
607 double ddscor1 = w1 * x1 * dqq1;
608 double ddscor2 = w2 * x2 * dqq2;
609 double ddscor0 = (w1 * x1 + w2 * x2) * dqq0;
610 double dscor = sqrt(ddscor1 * ddscor1 + ddscor2 * ddscor2 + ddscor0 * ddscor0);
611 dpos = pitch * dscor;
615 double dscor1 = std::abs(x1) * sqrt(dqq1 * dqq1 + dqq0 * dqq0);
616 double dscor2 = std::abs(x2) * sqrt(dqq2 * dqq2 + dqq0 * dqq0);
617 dmap[
"scor1"] = scor1;
618 dmap[
"dscor1"] = dscor1;
619 dmap[
"scor2"] = scor2;
620 dmap[
"dscor2"] = dscor2;
621 dmap[
"scordiff"] = scor_diff;
622 dmap[
"dscordiff"] = dscor_diff;
624 dmap[
"dscor"] = dscor;
628 ATH_MSG_VERBOSE(
" dq1, dq0, dq2: " << dq1 <<
" " << dq0 <<
" " << dq2);
650 savg += scor + strip0;
651 ATH_MSG_VERBOSE(
" QRAT corr " << splane(plane) <<
" nstrip=" << nstrip <<
" savg=" << savg <<
" qrat1=" << qrat1
652 <<
" qrat2=" << qrat2 <<
" scor1=" << scor1 <<
" scor2=" << scor2);
662 res.strip = istrip_peak;
663 res.position = pitch * (savg + 0.5 - 0.5 * maxstrip);
668 res.position -= offset;
670 res.dposition = sqrt(dpos * dpos + dpostht * dpostht);
673 res.lstrip = nstrip - 1;
674 res.time = sfits[istrip_peak].time;
675 res.time_beforeT0Corr = sfits[istrip_peak].time_beforeT0Corr;
676 res.time_beforeBPCorr = sfits[istrip_peak].time_beforeBPCorr;
677 res.timeStatus = sfits[istrip_peak].timeStatus;
688 res.charge_beforeBPCorr =
689 sfits[istrip_peak].charge_beforeBPCorr + sfits[istrip_peak - 1].charge_beforeBPCorr + sfits[istrip_peak + 1].charge_beforeBPCorr;
693 ATH_MSG_VERBOSE(
" Position :: pos=" <<
res.position <<
" dpos:dtht=" << dpos <<
":" << dpostht <<
" ==>" <<
res.dposition
694 <<
" at tanth=" << tantheta);
696 results.push_back(
res);