9 #include "trg/cdc/Fitter3DUtility.h"
10 #include "trg/cdc/FpgaUtility.h"
11 #include "trg/cdc/JLUT.h"
12 #include "trg/cdc/JSignal.h"
13 #include "trg/cdc/JSignalData.h"
16 #include "Fitter3DUtility.h"
19 #include "JSignalData.h"
24 #include "TLorentzVector.h"
41 using std::make_tuple;
45 double Trg_PI = 3.141592653589793;
49 if ((phi2[0] - phi2[4]) > Trg_PI || (phi2[0] - phi2[4]) < -Trg_PI) {
50 if (phi2[0] > Trg_PI) {sign_phi[0] = phi2[0] - 2 * Trg_PI;}
51 else {sign_phi[0] = phi2[0];}
52 if (phi2[4] > Trg_PI) {sign_phi[1] = phi2[4] - 2 * Trg_PI;}
53 else {sign_phi[1] = phi2[4];}
55 sign_phi[0] = phi2[0];
56 sign_phi[1] = phi2[4];
58 if ((sign_phi[1] - sign_phi[0]) > 0) {mysign = 0;}
67 cout <<
"Fitter3DUtility::rPhiFit() will be deprecated. Please use Fitter3DUtility::rPhiFitter(). phierror was changed to inv phi error."
69 double invphierror[5];
70 for (
unsigned i = 0; i < 5; i++) {
71 invphierror[i] = 1 / phierror[i];
73 rPhiFitter(rr, phi2, invphierror, rho, myphi0);
80 rPhiFitter(rr, phi2, invphierror, rho, myphi0, chi2);
92 double Trg_PI = 3.141592653589793;
93 double A, B, C, D, E, hcx, hcy;
94 double invFiterror[5];
97 for (
unsigned i = 0; i < 5; i++) {
102 invFiterror[i] = invphierror[i] / rr[i];
106 A = 0, B = 0, C = 0, D = 0, E = 0, hcx = 0, hcy = 0;
108 for (
unsigned i = 0; i < 5; i++) {
109 A += cos(phi2[i]) * cos(phi2[i]) * (invFiterror[i] * invFiterror[i]);
110 B += sin(phi2[i]) * sin(phi2[i]) * (invFiterror[i] * invFiterror[i]);
111 C += cos(phi2[i]) * sin(phi2[i]) * (invFiterror[i] * invFiterror[i]);
112 D += rr[i] * cos(phi2[i]) * (invFiterror[i] * invFiterror[i]);
113 E += rr[i] * sin(phi2[i]) * (invFiterror[i] * invFiterror[i]);
117 hcx /= 2 * (A * B - C * C);
119 hcy /= 2 * (A * B - C * C);
120 rho = sqrt(hcx * hcx + hcy * hcy);
121 myphi0 = atan2(hcy, hcx);
122 if (myphi0 < 0) myphi0 += 2 * Trg_PI;
134 for (
unsigned iAx = 0; iAx < 5; iAx++) {
135 if (invphierror[iAx] != 0) nTSHits++;
139 for (
unsigned i = 0; i < 5; i++) {
140 chi2 += (2 * (hcx * cos(phi2[i]) + hcy * sin(phi2[i])) - rr[i]) * (2 * (hcx * cos(phi2[i]) + hcy * sin(phi2[i])) - rr[i]) /
141 (invFiterror[i] * invFiterror[i]);
150 double Trg_PI = 3.141592653589793;
151 vector<double> tsPhi(5);
152 vector<double> dPhi(5);
153 vector<double> dPhi_c(5);
154 vector<double> charge(5);
155 for (
unsigned iAx = 0; iAx < 5; iAx++) {
158 tsPhi[iAx] = tsIds[iAx] * 2 * Trg_PI / nTSs[iAx];
159 dPhi[iAx] = tsPhi[iAx] - phi0;
162 if (dPhi[iAx] < -Trg_PI) dPhi_c[iAx] = dPhi[iAx] + 2 * Trg_PI;
163 else if (dPhi[iAx] > Trg_PI) dPhi_c[iAx] = dPhi[iAx] - 2 * Trg_PI;
164 else dPhi_c[iAx] = dPhi[iAx];
167 if (tsHitmap[iAx] == 0) charge[iAx] = 0;
168 else if (dPhi_c[iAx] == 0) charge[iAx] = 0;
169 else if (dPhi_c[iAx] > 0) charge[iAx] = 1;
170 else charge[iAx] = -1;
174 double sumCharge = charge[0] + charge[1] + charge[2] + charge[3] + charge[4];
177 if (sumCharge == 0) foundCharge = inCharge;
178 else if (sumCharge > 0) foundCharge = 1;
179 else foundCharge = -1;
188 double Trg_PI = 3.141592653589793;
189 double A, B, C, D, E, hcx, hcy;
193 for (
int i = 0; i < nTS; i++) {
195 fiterror[i] = 1 + 0 * phierror[i];
199 A = 0, B = 0, C = 0, D = 0, E = 0, hcx = 0, hcy = 0;
201 for (
int i = 0; i < nTS; i++) {
202 A += cos(phi2[i]) * cos(phi2[i]) / (fiterror[i] * fiterror[i]);
203 B += sin(phi2[i]) * sin(phi2[i]) / (fiterror[i] * fiterror[i]);
204 C += cos(phi2[i]) * sin(phi2[i]) / (fiterror[i] * fiterror[i]);
205 D += rr[i] * cos(phi2[i]) / (fiterror[i] * fiterror[i]);
206 E += rr[i] * sin(phi2[i]) / (fiterror[i] * fiterror[i]);
210 hcx /= 2 * (A * B - C * C);
212 hcy /= 2 * (A * B - C * C);
213 rho = sqrt(hcx * hcx + hcy * hcy);
214 myphi0 = atan2(hcy, hcx);
215 if (myphi0 < 0) myphi0 += 2 * Trg_PI;
236 int tdcMax = pow(2, nBits) - 1;
239 if (resultTdc > tdcMax) resultTdc -= (tdcMax + 1);
240 else if (resultTdc < 0) resultTdc += (tdcMax + 1);
243 return (
unsigned) resultTdc;
249 double result = wirePhi;
252 double t_dPhi = driftLength;
256 t_dPhi = atan(t_dPhi / rr);
259 if (lr == 1) result -= t_dPhi;
260 else if (lr == 2) result += t_dPhi;
268 double t_driftLength = (driftTime - eventTime) * 1000 / 1017.774 * 2 * 40 / 1000 / 10;
269 return calPhi(wirePhi, t_driftLength, rr, lr);
274 double wirePhi = (double)localId / nWires * 4 * M_PI;
279 std::map<std::string, std::vector<double> >
const& mConstV, std::map<std::string, Belle2::TRGCDCJSignal>& mSignalStorage,
280 std::map<std::string, Belle2::TRGCDCJLUT* >& mLutStorage)
287 if (mSignalStorage.find(
"phiFactor_0") == mSignalStorage.end()) {
288 for (
unsigned iSt = 0; iSt < 4; iSt++) {
289 int nShiftBits = int(log(pow(2, 24) / 2 / mConstD.at(
"Trg_PI") * mConstV.at(
"nTSs")[2 * iSt + 1] *
290 mSignalStorage[
"phi0"].getToReal()) / log(2));
292 t_name =
"phiFactor_" + to_string(iSt);
293 mSignalStorage[t_name] =
Belle2::TRGCDCJSignal(2 * mConstD.at(
"Trg_PI") / mConstV.at(
"nTSs")[2 * iSt + 1],
294 mSignalStorage[
"phi0"].getToReal() / pow(2, nShiftBits), commonData);
299 for (
unsigned iSt = 0; iSt < 4;
300 iSt++) mSignalStorage[
"wirePhi_" + to_string(iSt)] <= mSignalStorage[
"tsId_" + to_string(iSt)] * mSignalStorage[
"phiFactor_" +
308 for (
unsigned iSt = 0; iSt < 4;
309 iSt++) mSignalStorage[
"driftTimeRaw_" + to_string(iSt)] <= mSignalStorage[
"tdc_" + to_string(iSt)] - mSignalStorage[
"eventTime"];
315 if (mSignalStorage.find(
"maxDriftTimeLow") == mSignalStorage.end()) {
316 int maxDriftTime = 287;
317 mSignalStorage[
"maxDriftTimeLow"] =
Belle2::TRGCDCJSignal(-512 + maxDriftTime + 1, mSignalStorage[
"eventTime"].getToReal(),
319 mSignalStorage[
"maxDriftTimeHigh"] =
Belle2::TRGCDCJSignal(maxDriftTime, mSignalStorage[
"eventTime"].getToReal(), commonData);
320 mSignalStorage[
"maxDriftTimeMax"] =
Belle2::TRGCDCJSignal(512, mSignalStorage[
"eventTime"].getToReal(), commonData);
322 for (
unsigned iSt = 0; iSt < 4; iSt++) {
323 string t_in1Name =
"driftTimeRaw_" + to_string(iSt);
324 string t_valueName =
"driftTime_c_" + to_string(iSt);
326 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
329 mSignalStorage[
"eventTimeValid"].getToReal(), commonData));
331 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
332 make_pair(&mSignalStorage[t_valueName],
Belle2::TRGCDCJSignal(0, mSignalStorage[
"eventTime"].getToReal(), commonData))
335 t_data.push_back(make_pair(t_compare, t_assigns));
340 make_pair(&mSignalStorage[t_valueName], (mSignalStorage[t_in1Name] + mSignalStorage[
"maxDriftTimeMax"]).limit(mSignalStorage[
"maxDriftTimeLow"], mSignalStorage[
"maxDriftTimeHigh"]))
343 t_data.push_back(make_pair(t_compare, t_assigns));
348 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_in1Name].limit(mSignalStorage[
"maxDriftTimeLow"], mSignalStorage[
"maxDriftTimeHigh"]))
351 t_data.push_back(make_pair(t_compare, t_assigns));
356 make_pair(&mSignalStorage[t_valueName], (mSignalStorage[t_in1Name] - mSignalStorage[
"maxDriftTimeMax"]).limit(mSignalStorage[
"maxDriftTimeLow"], mSignalStorage[
"maxDriftTimeHigh"]))
359 t_data.push_back(make_pair(t_compare, t_assigns));
374 if (mSignalStorage.find(
"minDriftTime") == mSignalStorage.end()) {
375 int minDriftTime = -8;
376 mSignalStorage[
"minDriftTime"] =
Belle2::TRGCDCJSignal(minDriftTime, mSignalStorage[
"eventTime"].getToReal(), commonData);
377 mSignalStorage[
"minDriftTimeLow"] =
Belle2::TRGCDCJSignal(0, mSignalStorage[
"eventTime"].getToReal(), commonData);
379 for (
unsigned iSt = 0; iSt < 4; iSt++) {
380 string t_in1Name =
"driftTime_c_" + to_string(iSt);
381 string t_valueName =
"driftTime_" + to_string(iSt);
382 string t_in2Name =
"invErrorRho_" + to_string(iSt);
383 string t_value2Name =
"iZError2_" + to_string(iSt);
384 string t_noneErrorName =
"iZNoneError2_" + to_string(iSt);
386 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
390 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
391 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_in1Name].limit(mSignalStorage[
"minDriftTimeLow"], mSignalStorage[
"maxDriftTimeHigh"])),
392 make_pair(&mSignalStorage[t_value2Name], mSignalStorage[t_in2Name])
395 t_data.push_back(make_pair(t_compare, t_assigns));
400 make_pair(&mSignalStorage[t_valueName], mSignalStorage[
"minDriftTimeLow"]),
401 make_pair(&mSignalStorage[t_value2Name], mSignalStorage[t_in2Name])
404 t_data.push_back(make_pair(t_compare, t_assigns));
409 make_pair(&mSignalStorage[t_valueName], mSignalStorage[
"minDriftTimeLow"]),
410 make_pair(&mSignalStorage[t_value2Name], mSignalStorage[t_noneErrorName])
413 t_data.push_back(make_pair(t_compare, t_assigns));
427 if (!mSignalStorage.count(
"invDriftPhiMin")) {
428 mSignalStorage[
"invDriftPhiMin"] =
Belle2::TRGCDCJSignal(0, mSignalStorage[
"driftTime_0"].getToReal(), commonData);
430 mSignalStorage[
"driftTime_0"].getToReal(), commonData);
435 for (
unsigned iSt = 0; iSt < 4; iSt++) {
436 string t_valueName =
"driftPhi_" + to_string(iSt);
437 string t_inName =
"driftTime_" + to_string(iSt);
438 if (!mLutStorage.count(t_valueName)) {
441 double t_parameter = mConstV.at(
"rr3D")[iSt];
442 mLutStorage[t_valueName]->setFloatFunction(
444 [ = ](
double aValue) ->
double{
return atan(mConstV.at(
"driftLengthTableSL" + to_string(2 * iSt + 1))[aValue] / t_parameter);},
445 mSignalStorage[t_inName],
446 mSignalStorage[
"invDriftPhiMin"], mSignalStorage[
"invDriftPhiMax"], mSignalStorage[
"phi0"].getToReal(),
447 (int)mConstD.at(
"driftPhiLUTInBitSize"), (int)mConstD.at(
"driftPhiLUTOutBitSize"));
453 for (
unsigned iSt = 0; iSt < 4; iSt++) {
456 mLutStorage[
"driftPhi_" + to_string(iSt)]->operate(mSignalStorage[
"driftTime_" + to_string(iSt)],
457 mSignalStorage[
"driftPhi_" + to_string(iSt)]);
463 for (
unsigned iSt = 0; iSt < 4; iSt++) {
464 string t_in1Name =
"lr_" + to_string(iSt);
465 string t_valueName =
"finePhi_" + to_string(iSt);
467 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
470 mSignalStorage[t_in1Name].getToReal(), commonData));
472 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
473 make_pair(&mSignalStorage[t_valueName], mSignalStorage[
"wirePhi_" + to_string(iSt)] - mSignalStorage[
"driftPhi_" + to_string(iSt)])
476 t_data.push_back(make_pair(t_compare, t_assigns));
479 mSignalStorage[t_in1Name].getToReal(), commonData));
482 make_pair(&mSignalStorage[t_valueName], mSignalStorage[
"wirePhi_" + to_string(iSt)] + mSignalStorage[
"driftPhi_" + to_string(iSt)])
485 t_data.push_back(make_pair(t_compare, t_assigns));
490 make_pair(&mSignalStorage[t_valueName], mSignalStorage[
"wirePhi_" + to_string(iSt)])
493 t_data.push_back(make_pair(t_compare, t_assigns));
500 if (mSignalStorage.find(
"phiMax_0") == mSignalStorage.end()) {
501 for (
unsigned iSt = 0; iSt < 4; iSt++) {
502 string t_valueName =
"finePhi_" + to_string(iSt);
503 string t_maxName =
"phiMax_" + to_string(iSt);
504 string t_minName =
"phiMin_" + to_string(iSt);
505 string t_2PiName =
"phi2Pi_" + to_string(iSt);
506 mSignalStorage[t_maxName] =
Belle2::TRGCDCJSignal(mConstD.at(
"Trg_PI"), mSignalStorage[t_valueName].getToReal(), commonData);
507 mSignalStorage[t_minName] =
Belle2::TRGCDCJSignal(-mConstD.at(
"Trg_PI"), mSignalStorage[t_valueName].getToReal(), commonData);
508 mSignalStorage[t_2PiName] =
Belle2::TRGCDCJSignal(2 * mConstD.at(
"Trg_PI"), mSignalStorage[t_valueName].getToReal(), commonData);
511 for (
unsigned iSt = 0; iSt < 4; iSt++) {
512 string t_in1Name =
"finePhi_" + to_string(iSt);
513 string t_valueName =
"phi_" + to_string(iSt);
514 string t_maxName =
"phiMax_" + to_string(iSt);
515 string t_minName =
"phiMin_" + to_string(iSt);
516 string t_2PiName =
"phi2Pi_" + to_string(iSt);
518 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
522 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
523 make_pair(&mSignalStorage[t_valueName], (mSignalStorage[t_in1Name] - mSignalStorage[t_2PiName]).limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
526 t_data.push_back(make_pair(t_compare, t_assigns));
531 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_in1Name].limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
534 t_data.push_back(make_pair(t_compare, t_assigns));
539 make_pair(&mSignalStorage[t_valueName], (mSignalStorage[t_in1Name] + mSignalStorage[t_2PiName]).limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
542 t_data.push_back(make_pair(t_compare, t_assigns));
552 for (
unsigned iSt = 0; iSt < stXts.size(); ++iSt) {
553 string filename = filePrefix +
".st" + to_string(iSt);
555 cout <<
"Fitter3DUtility::saveStereoXt() Saving xt file to " << filename << endl;
556 xtFile.open(filename);
557 for (
unsigned iTick = 0; iTick < stXts[iSt].size(); ++iTick) {
558 xtFile << stXts[iSt][iTick] << endl;
566 stXts = vector<vector<double> > (nFiles);
567 for (
unsigned iSt = 0; iSt < stXts.size(); ++iSt) {
568 string filename = filePrefix +
".st" + to_string(iSt);
570 xtFile.open(filename.c_str());
572 cout <<
"Fitter3DUtility::loadStereoXt() Cannot load " << filename << endl;
576 while (getline(xtFile, line)) {
577 stXts[iSt].push_back(std::stof(line));
585 return (
double)
id / stNWires[iSt] * 4 * M_PI;
591 int eventTime, vector<vector<int> >
const& rawStTSs, vector<double>& stTSs)
593 stTSs = vector<double> (4, 9999);
594 if (eventTimeValid == 0) {
595 for (
unsigned iSt = 0; iSt < 4; iSt++) {
596 stTSs[iSt] =
stereoIdToPhi(stGeometry[
"nWires"], iSt, rawStTSs[iSt][0]);
600 for (
unsigned iSt = 0; iSt < 4; iSt++) {
601 if (rawStTSs[iSt][1] != 0) {
603 int t = rawStTSs[iSt][2] - eventTime;
606 if (t > 511) t = 511;
607 double driftLength = stXts[iSt][t];
609 stGeometry[
"cdcRadius"][iSt], rawStTSs[iSt][1]);
618 double Trg_PI = 3.141592653589793;
619 double phiMin = -Trg_PI;
620 double phiMax = Trg_PI;
621 double result = value - refPhi;
623 while (rangeOK == 0) {
624 if (result > phiMax) result -= 2 * Trg_PI;
625 else if (result < phiMin) result += 2 * Trg_PI;
633 double refPhi = (double)refId / nTSs * 2 * M_PI;
639 int result = value - refId;
641 while (rangeOk == 0) {
642 if (result >= nTSs) result -= nTSs;
643 else if (result < 0) result += nTSs;
652 double Trg_PI = 3.141592653589793;
653 double phiMin = -Trg_PI;
654 double phiMax = Trg_PI;
656 while (rangeOK == 0) {
657 if (value > phiMax) value -= 2 * Trg_PI;
658 else if (value < phiMin) value += 2 * Trg_PI;
663 if (value > Trg_PI / 2) result = 2;
664 else if (value > 0) result = 1;
665 else if (value > -Trg_PI / 2) result = 4;
666 else if (value > -Trg_PI) result = 3;
673 std::vector<double>& invZError2)
675 vector<double> driftZError({0.7676, 0.9753, 1.029, 1.372});
676 vector<double> wireZError({0.7676, 0.9753, 1.029, 1.372});
677 vector<double> zError(4, 9999);
678 invZError2 = vector<double> (4, 0);
679 for (
unsigned iSt = 0; iSt < 4; ++iSt) {
680 if (rawStTSs[iSt][1] != 0) {
682 if (rawStTSs[iSt][1] != 3 && eventTimeValid != 0) zError[iSt] = driftZError[iSt];
683 else zError[iSt] = wireZError[iSt];
685 invZError2[iSt] = 1 / pow(zError[iSt], 2);
691 std::map<std::string, std::vector<double> >
const& mConstV, std::map<std::string, Belle2::TRGCDCJSignal>& mSignalStorage)
695 if (mSignalStorage.find(
"iZWireError2_0") == mSignalStorage.end()) {
696 for (
unsigned iSt = 0; iSt < 4; iSt++) {
698 t_name =
"iZWireError2_" + to_string(iSt);
699 mSignalStorage[t_name] =
Belle2::TRGCDCJSignal(mConstD.at(
"iError2BitSize"), 1 / pow(mConstV.at(
"wireZError")[iSt], 2), 0,
700 mConstD.at(
"iError2Max"), -1, commonData);
701 t_name =
"iZDriftError2_" + to_string(iSt);
702 mSignalStorage[t_name] =
Belle2::TRGCDCJSignal(mConstD.at(
"iError2BitSize"), 1 / pow(mConstV.at(
"driftZError")[iSt], 2), 0,
703 mConstD.at(
"iError2Max"), -1, commonData);
704 t_name =
"iZNoneError2_" + to_string(iSt);
705 mSignalStorage[t_name] =
Belle2::TRGCDCJSignal(mConstD.at(
"iError2BitSize"), 0, 0, mConstD.at(
"iError2Max"), -1, commonData);
714 for (
unsigned iSt = 0; iSt < 4; iSt++) {
715 string t_in1Name =
"lr_" + to_string(iSt);
716 string t_valueName =
"invErrorLR_" + to_string(iSt);
717 string t_noneErrorName =
"iZNoneError2_" + to_string(iSt);
718 string t_driftErrorName =
"iZDriftError2_" + to_string(iSt);
719 string t_wireErrorName =
"iZWireError2_" + to_string(iSt);
721 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
724 mSignalStorage[t_in1Name].getToReal(), commonData));
726 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
727 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_noneErrorName])
730 t_data.push_back(make_pair(t_compare, t_assigns));
733 mSignalStorage[t_in1Name].getToReal(), commonData));
736 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_wireErrorName])
739 t_data.push_back(make_pair(t_compare, t_assigns));
744 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_driftErrorName])
747 t_data.push_back(make_pair(t_compare, t_assigns));
754 if (mSignalStorage.find(
"halfRadius_0") == mSignalStorage.end()) {
755 for (
unsigned iSt = 0; iSt < 4; iSt++) {
757 t_name =
"halfRadius_" + to_string(iSt);
758 mSignalStorage[t_name] =
Belle2::TRGCDCJSignal(mConstV.at(
"rr")[iSt * 2 + 1] / 2, mSignalStorage[
"rho"].getToReal(), commonData);
764 for (
unsigned iSt = 0; iSt < 4; iSt++) {
765 string t_compareName =
"halfRadius_" + to_string(iSt);
767 string t_valueName =
"invErrorRho_" + to_string(iSt);
768 string t_noneErrorName =
"iZNoneError2_" + to_string(iSt);
769 string t_in1Name =
"invErrorLR_" + to_string(iSt);
771 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
775 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
776 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_noneErrorName])
779 t_data.push_back(make_pair(t_compare, t_assigns));
784 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_in1Name])
787 t_data.push_back(make_pair(t_compare, t_assigns));
796 if (
false) cout << anglest << ztostraw << endl;
798 double myphiz, acos_real;
799 double Trg_PI = 3.141592653589793;
802 if (rr > (2 * rho)) t_rho = rr / 2;
803 acos_real = acos(rr / (2 * t_rho));
805 myphiz = +acos_real + myphi0;
807 myphiz = -acos_real + myphi0;
809 if (myphiz > Trg_PI) myphiz -= 2 * Trg_PI;
810 if (myphiz < -Trg_PI) myphiz += 2 * Trg_PI;
817 if (
false) cout << anglest << ztostraw << endl;
819 double myphiz, acos_real;
820 double Trg_PI = 3.141592653589793;
823 if (rr > (2 * rho)) t_rho = rr / 2;
824 acos_real = acos(rr / (2 * t_rho));
826 myphiz = -acos_real - myphi0 + phi2;
828 myphiz = +acos_real - myphi0 + phi2;
830 if (myphiz > Trg_PI) myphiz -= 2 * Trg_PI;
831 if (myphiz < -Trg_PI) myphiz += 2 * Trg_PI;
837 std::map<std::string, Belle2::TRGCDCJSignal>& mSignalStorage)
841 if (mSignalStorage.find(
"rhoMin_0") == mSignalStorage.end()) {
842 for (
unsigned iSt = 0; iSt < 4; iSt++) {
844 string t_minName =
"rhoMin_" + to_string(iSt);
845 double t_actual = (mConstV.find(
"rr")->second)[2 * iSt + 1] / 2;
846 double t_toReal = mSignalStorage[
"rho"].getToReal();
849 if (mSignalStorage[t_minName].getRealInt() < t_actual) {
850 t_actual += 1 * t_toReal;
856 string t_maxName =
"rhoMax_" + to_string(iSt);
857 t_actual = mSignalStorage[
"rho"].getMaxActual();
866 for (
unsigned iSt = 0; iSt < 4; iSt++) {
867 string t_in1Name =
"rho";
868 string t_valueName =
"rho_c_" + to_string(iSt);
869 string t_maxName =
"rhoMax_" + to_string(iSt);
870 string t_minName =
"rhoMin_" + to_string(iSt);
872 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
876 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
877 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_maxName]),
880 t_data.push_back(make_pair(t_compare, t_assigns));
885 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_in1Name].limit(mSignalStorage[t_minName], mSignalStorage[t_maxName]))
888 t_data.push_back(make_pair(t_compare, t_assigns));
893 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_minName])
896 t_data.push_back(make_pair(t_compare, t_assigns));
903 double Fitter3DUtility::calZ(
int mysign,
double anglest,
double ztostraw,
double rr,
double phi2,
double rho,
double myphi0)
905 double myphiz = 0, acos_real = 0, dPhiAx = 0;
906 double Trg_PI = 3.141592653589793;
909 if (rr > (2 * rho)) t_rho = rr / 2;
910 acos_real = acos(rr / (2 * t_rho));
912 dPhiAx = -acos_real - myphi0;
914 dPhiAx = acos_real - myphi0;
916 myphiz = dPhiAx + phi2;
917 if (myphiz > Trg_PI) myphiz -= 2 * Trg_PI;
918 if (myphiz < -Trg_PI) myphiz += 2 * Trg_PI;
920 return (ztostraw - rr * 2 * sin(myphiz / 2) / anglest);
923 void Fitter3DUtility::calZ(std::map<std::string, double>
const& mConstD, std::map<std::string, std::vector<double> >
const& mConstV,
924 std::map<std::string, Belle2::TRGCDCJSignal>& mSignalStorage, std::map<std::string, Belle2::TRGCDCJLUT* >& mLutStorage)
928 if (mSignalStorage.find(
"invPhiAxMin_0") == mSignalStorage.end()) {
945 for (
unsigned iSt = 0; iSt < 4; iSt++) {
946 string t_invMinName =
"invPhiAxMin_" + to_string(iSt);
948 double t_actual = mSignalStorage[
"rho_c_" + to_string(iSt)].getMinActual();
949 double t_toReal = mSignalStorage[
"rho_c_" + to_string(iSt)].getToReal();
951 string t_invMaxName =
"invPhiAxMax_" + to_string(iSt);
952 t_actual = mSignalStorage[
"rho_c_" + to_string(iSt)].getMaxActual();
960 for (
unsigned iSt = 0; iSt < 4; iSt++) {
961 string t_valueName =
"phiAx_" + to_string(iSt);
962 string t_minName =
"phiAxMin_" + to_string(iSt);
963 string t_maxName =
"phiAxMax_" + to_string(iSt);
964 string t_invMinName =
"invPhiAxMin_" + to_string(iSt);
965 string t_invMaxName =
"invPhiAxMax_" + to_string(iSt);
966 if (!mLutStorage.count(t_valueName)) {
969 double t_parameter = mConstV.at(
"rr3D")[iSt];
970 mLutStorage[t_valueName]->setFloatFunction(
971 [ = ](
double aValue) ->
double{
return acos(t_parameter / 2 / aValue);},
973 mSignalStorage[
"rho_c_" + to_string(iSt)],
974 mSignalStorage[t_invMinName], mSignalStorage[t_invMaxName], mSignalStorage[
"phi0"].getToReal(),
975 (int)mConstD.at(
"acosLUTInBitSize"), (int)mConstD.at(
"acosLUTOutBitSize"));
981 for (
unsigned iSt = 0; iSt < 4; iSt++) {
983 string t_valueName =
"phiAx_" + to_string(iSt);
985 mLutStorage[t_valueName]->operate(mSignalStorage[
"rho_c_" + to_string(iSt)], mSignalStorage[t_valueName]);
993 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
996 commonData),
"=", mSignalStorage[
"charge"]);
998 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
999 make_pair(&mSignalStorage[
"dPhiAx_0"], -mSignalStorage[
"phiAx_0"] - mSignalStorage[
"phi0"]),
1000 make_pair(&mSignalStorage[
"dPhiAx_1"], -mSignalStorage[
"phiAx_1"] - mSignalStorage[
"phi0"]),
1001 make_pair(&mSignalStorage[
"dPhiAx_2"], -mSignalStorage[
"phiAx_2"] - mSignalStorage[
"phi0"]),
1002 make_pair(&mSignalStorage[
"dPhiAx_3"], -mSignalStorage[
"phiAx_3"] - mSignalStorage[
"phi0"])
1005 t_data.push_back(make_pair(t_compare, t_assigns));
1010 make_pair(&mSignalStorage[
"dPhiAx_0"], mSignalStorage[
"phiAx_0"] - mSignalStorage[
"phi0"]),
1011 make_pair(&mSignalStorage[
"dPhiAx_1"], mSignalStorage[
"phiAx_1"] - mSignalStorage[
"phi0"]),
1012 make_pair(&mSignalStorage[
"dPhiAx_2"], mSignalStorage[
"phiAx_2"] - mSignalStorage[
"phi0"]),
1013 make_pair(&mSignalStorage[
"dPhiAx_3"], mSignalStorage[
"phiAx_3"] - mSignalStorage[
"phi0"])
1016 t_data.push_back(make_pair(t_compare, t_assigns));
1023 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1024 mSignalStorage[
"dPhi_" + to_string(iSt)] <= mSignalStorage[
"dPhiAx_" + to_string(iSt)] + mSignalStorage[
"phi_" + to_string(iSt)];
1029 if (mSignalStorage.find(
"dPhiPiMax_0") == mSignalStorage.end()) {
1030 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1031 string t_valueName =
"dPhi_" + to_string(iSt);
1032 string t_maxName =
"dPhiPiMax_" + to_string(iSt);
1033 string t_minName =
"dPhiPiMin_" + to_string(iSt);
1034 string t_2PiName =
"dPhiPi2Pi_" + to_string(iSt);
1035 mSignalStorage[t_maxName] =
Belle2::TRGCDCJSignal(mConstD.at(
"Trg_PI"), mSignalStorage[t_valueName].getToReal(), commonData);
1036 mSignalStorage[t_minName] =
Belle2::TRGCDCJSignal(-mConstD.at(
"Trg_PI"), mSignalStorage[t_valueName].getToReal(), commonData);
1037 mSignalStorage[t_2PiName] =
Belle2::TRGCDCJSignal(2 * mConstD.at(
"Trg_PI"), mSignalStorage[t_valueName].getToReal(), commonData);
1040 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1041 string t_in1Name =
"dPhi_" + to_string(iSt);
1042 string t_valueName =
"dPhiPi_c_" + to_string(iSt);
1043 string t_maxName =
"dPhiPiMax_" + to_string(iSt);
1044 string t_minName =
"dPhiPiMin_" + to_string(iSt);
1045 string t_2PiName =
"dPhiPi2Pi_" + to_string(iSt);
1047 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1051 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1052 make_pair(&mSignalStorage[t_valueName], (mSignalStorage[t_in1Name] - mSignalStorage[t_2PiName]).limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
1055 t_data.push_back(make_pair(t_compare, t_assigns));
1060 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_in1Name].limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
1063 t_data.push_back(make_pair(t_compare, t_assigns));
1068 make_pair(&mSignalStorage[t_valueName], (mSignalStorage[t_in1Name] + mSignalStorage[t_2PiName]).limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
1071 t_data.push_back(make_pair(t_compare, t_assigns));
1078 if (mSignalStorage.find(
"dPhiMax_0") == mSignalStorage.end()) {
1079 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1080 string t_maxName =
"dPhiMax_" + to_string(iSt);
1081 string t_minName =
"dPhiMin_" + to_string(iSt);
1082 string t_valueName =
"dPhi_" + to_string(iSt);
1083 double t_value = 2 * mConstD.at(
"Trg_PI") * fabs(mConstV.at(
"nShift")[iSt]) / (mConstV.at(
"nWires")[2 * iSt + 1]);
1084 mSignalStorage[t_maxName] =
Belle2::TRGCDCJSignal(t_value, mSignalStorage[t_valueName].getToReal(), commonData);
1085 mSignalStorage[t_minName] =
Belle2::TRGCDCJSignal(0, mSignalStorage[t_valueName].getToReal(), commonData);
1089 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1090 string t_maxName =
"dPhiMax_" + to_string(iSt);
1091 string t_minName =
"dPhiMin_" + to_string(iSt);
1092 string t_valueName =
"dPhi_c_" + to_string(iSt);
1093 string t_in1Name =
"dPhiPi_c_" + to_string(iSt);
1097 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1100 mSignalStorage[t_in1Name].getToReal(), commonData));
1102 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1103 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_minName]),
1106 t_data.push_back(make_pair(t_compare, t_assigns));
1111 make_pair(&mSignalStorage[t_valueName],
Belle2::TRGCDCJSignal::absolute(mSignalStorage[t_in1Name]).limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
1114 t_data.push_back(make_pair(t_compare, t_assigns));
1119 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_maxName]),
1122 t_data.push_back(make_pair(t_compare, t_assigns));
1128 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1132 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1133 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_maxName]),
1136 t_data.push_back(make_pair(t_compare, t_assigns));
1139 mSignalStorage[t_in1Name].getToReal(), commonData));
1142 make_pair(&mSignalStorage[t_valueName],
Belle2::TRGCDCJSignal::absolute(mSignalStorage[t_in1Name]).limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
1145 t_data.push_back(make_pair(t_compare, t_assigns));
1150 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_minName]),
1153 t_data.push_back(make_pair(t_compare, t_assigns));
1163 if (mSignalStorage.find(
"invZMin_0") == mSignalStorage.end()) {
1164 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1165 string t_minName =
"invZMin_" + to_string(iSt);
1166 string t_maxName =
"invZMax_" + to_string(iSt);
1167 string t_valueName =
"dPhi_c_" + to_string(iSt);
1168 unsigned long long t_int = mSignalStorage[t_valueName].getMinInt();
1169 double t_toReal = mSignalStorage[t_valueName].getToReal();
1170 double t_actual = mSignalStorage[t_valueName].getMinActual();
1171 mSignalStorage[t_minName] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
1172 t_int = mSignalStorage[t_valueName].getMaxInt();
1173 t_actual = mSignalStorage[t_valueName].getMaxActual();
1174 mSignalStorage[t_maxName] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
1178 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1179 string t_inputName =
"dPhi_c_" + to_string(iSt);
1180 string t_outputName =
"zz_" + to_string(iSt);
1181 string t_invMinName =
"invZMin_" + to_string(iSt);
1182 string t_invMaxName =
"invZMax_" + to_string(iSt);
1184 if (!mLutStorage.count(t_outputName)) {
1187 double t_zToStraw = mConstV.at(
"zToStraw")[iSt];
1188 double t_rr3D = mConstV.at(
"rr3D")[iSt];
1189 double t_angleSt = mConstV.at(
"angleSt")[iSt];
1192 mLutStorage[t_outputName]->setFloatFunction(
1193 [ = ](
double aValue) ->
double{
return t_zToStraw + t_rr3D * 2 * sin(aValue / 2) / t_angleSt;},
1194 mSignalStorage[t_inputName],
1195 mSignalStorage[t_invMinName], mSignalStorage[t_invMaxName], mSignalStorage[
"rho"].getToReal(),
1196 (int) mConstD.at(
"zLUTInBitSize"), (int) mConstD.at(
"zLUTOutBitSize"));
1198 mLutStorage[t_outputName]->setFloatFunction(
1199 [ = ](
double aValue) ->
double{
return t_zToStraw - t_rr3D * 2 * sin(aValue / 2) / t_angleSt;},
1200 mSignalStorage[t_inputName],
1201 mSignalStorage[t_invMinName], mSignalStorage[t_invMaxName], mSignalStorage[
"rho"].getToReal(),
1202 (int) mConstD.at(
"zLUTInBitSize"), (int) mConstD.at(
"zLUTOutBitSize"));
1209 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1210 string t_outputName =
"zz_" + to_string(iSt);
1211 string t_inputName =
"dPhi_c_" + to_string(iSt);
1212 mLutStorage[t_outputName]->operate(mSignalStorage[t_inputName], mSignalStorage[t_outputName]);
1219 result = rho * 2 * asin(rr / 2 / rho);
1223 void Fitter3DUtility::calS(std::map<std::string, double>
const& mConstD, std::map<std::string, std::vector<double> >
const& mConstV,
1224 std::map<std::string, Belle2::TRGCDCJSignal>& mSignalStorage, std::map<std::string, Belle2::TRGCDCJLUT* >& mLutStorage)
1228 if (mSignalStorage.find(
"invArcSMin_0") == mSignalStorage.end()) {
1245 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1246 string t_invMinName =
"invArcSMin_" + to_string(iSt);
1248 double t_actual = mSignalStorage[
"rho_c_" + to_string(iSt)].getMaxActual();
1249 double t_toReal = mSignalStorage[
"rho_c_" + to_string(iSt)].getToReal();
1251 string t_invMaxName =
"invArcSMax_" + to_string(iSt);
1252 t_actual = mSignalStorage[
"rho_c_" + to_string(iSt)].getMinActual();
1260 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1261 string t_valueName =
"arcS_" + to_string(iSt);
1262 string t_invMinName =
"invArcSMin_" + to_string(iSt);
1263 string t_invMaxName =
"invArcSMax_" + to_string(iSt);
1264 if (!mLutStorage.count(t_valueName)) {
1267 double t_parameter = mConstV.at(
"rr3D")[iSt];
1268 mLutStorage[t_valueName]->setFloatFunction(
1269 [ = ](
double aValue) ->
double{
return 2 * aValue * asin(t_parameter / 2 / aValue);},
1271 mSignalStorage[
"rho_c_" + to_string(iSt)],
1272 mSignalStorage[t_invMinName], mSignalStorage[t_invMaxName], mSignalStorage[
"rho"].getToReal(),
1273 (int)mConstD.at(
"acosLUTInBitSize"), (int)mConstD.at(
"acosLUTOutBitSize"));
1279 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1281 string t_valueName =
"arcS_" + to_string(iSt);
1283 mLutStorage[t_valueName]->operate(mSignalStorage[
"rho_c_" + to_string(iSt)], mSignalStorage[t_valueName]);
1293 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1294 t_sum1 += pow(1 / zError[iSt], 2);
1295 t_sumSS += pow(arcS[iSt] / zError[iSt], 2);
1296 t_sumS += arcS[iSt] / pow(zError[iSt], 2);
1298 return t_sum1 * t_sumSS - pow(t_sumS, 2);
1306 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1307 t_sum1 += pow(iZError[iSt], 2);
1308 t_sumSS += pow(arcS[iSt] * iZError[iSt], 2);
1309 t_sumS += arcS[iSt] * pow(iZError[iSt], 2);
1311 return t_sum1 * t_sumSS - pow(t_sumS, 2);
1318 double ss = 0, sx = 0, sxx = 0, cotnum = 0, z0num = 0;
1319 double z0nump1[4], z0nump2[4];
1320 double z0den, iz0den;
1322 for (
unsigned i = 0; i < 4; i++) {
1324 sx += arcS[i] * iezz2[i];
1325 sxx += arcS[i] * arcS[i] * iezz2[i];
1328 for (
unsigned i = 0; i < 4; i++) {
1329 cotnum += (ss * arcS[i] - sx) * iezz2[i] * zz[i];
1330 z0nump1[i] = sxx - sx * arcS[i];
1331 z0nump2[i] = z0nump1[i] * iezz2[i] * zz[i];
1332 z0num += z0nump2[i];
1334 z0den = (ss * sxx) - (sx * sx);
1335 iz0den = 1. / z0den;
1343 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1344 if (iezz2[iSt] != 0) nTSHits++;
1348 for (
unsigned i = 0; i < 4; i++) {
1349 zchi2 += (zz[i] - z0 - cot * arcS[i]) * (zz[i] - z0 - cot * arcS[i]) * iezz2[i];
1351 zchi2 /= (nTSHits - 2);
1360 double ss = 0, sx = 0, sxx = 0, cotnum = 0, z0num = 0;
1361 double z0nump1[4], z0nump2[4];
1362 double z0den, iz0den;
1364 for (
unsigned i = 0; i < 4; i++) {
1367 sx += arcS[i] * iezz21[i];
1368 sxx += arcS[i] * arcS[i] * iezz21[i];
1371 sx += arcS[i] * iezz22[i];
1372 sxx += arcS[i] * arcS[i] * iezz22[i];
1376 for (
unsigned i = 0; i < 4; i++) {
1378 cotnum += (ss * arcS[i] - sx) * iezz21[i] * zz[i];
1379 z0nump1[i] = sxx - sx * arcS[i];
1380 z0nump2[i] = z0nump1[i] * iezz21[i] * zz[i];
1381 z0num += z0nump2[i];
1383 cotnum += (ss * arcS[i] - sx) * iezz22[i] * zz[i];
1384 z0nump1[i] = sxx - sx * arcS[i];
1385 z0nump2[i] = z0nump1[i] * iezz22[i] * zz[i];
1386 z0num += z0nump2[i];
1389 z0den = (ss * sxx) - (sx * sx);
1390 iz0den = 1. / z0den;
1398 for (
unsigned i = 0; i < 4; i++) {
1400 zchi2 += (zz[i] - z0 - cot * arcS[i]) * (zz[i] - z0 - cot * arcS[i]) * iezz21[i];
1402 zchi2 += (zz[i] - z0 - cot * arcS[i]) * (zz[i] - z0 - cot * arcS[i]) * iezz22[i];
1409 std::map<std::string, std::vector<double> >
const& mConstV, std::map<std::string, Belle2::TRGCDCJSignal>& mSignalStorage,
1410 std::map<std::string, Belle2::TRGCDCJLUT* >& mLutStorage)
1414 mSignalStorage[
"sum1_p1_0"] <= mSignalStorage[
"iZError2_0"] + mSignalStorage[
"iZError2_1"];
1416 mSignalStorage[
"sum1_p1_1"] <= mSignalStorage[
"iZError2_2"] + mSignalStorage[
"iZError2_3"];
1419 mSignalStorage[
"sum1"] <= mSignalStorage[
"sum1_p1_0"] + mSignalStorage[
"sum1_p1_1"];
1422 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1423 mSignalStorage[
"sumS_p1_" + to_string(iSt)] <= mSignalStorage[
"arcS_" + to_string(iSt)] * mSignalStorage[
"iZError2_" + to_string(
1427 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1428 mSignalStorage[
"sumSS_p1_" + to_string(iSt)] <= mSignalStorage[
"arcS_" + to_string(iSt)] * mSignalStorage[
"arcS_" + to_string(iSt)];
1431 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1432 mSignalStorage[
"cotNumS_p1_" + to_string(iSt)] <= mSignalStorage[
"sum1"] * mSignalStorage[
"arcS_" + to_string(iSt)];
1438 mSignalStorage[
"sumS_p2_0"] <= mSignalStorage[
"sumS_p1_0"] + mSignalStorage[
"sumS_p1_1"];
1440 mSignalStorage[
"sumS_p2_1"] <= mSignalStorage[
"sumS_p1_2"] + mSignalStorage[
"sumS_p1_3"];
1442 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1443 mSignalStorage[
"sumSS_p2_" + to_string(iSt)] <= mSignalStorage[
"sumSS_p1_" + to_string(iSt)] * mSignalStorage[
"iZError2_" +
1449 mSignalStorage[
"sumS"] <= mSignalStorage[
"sumS_p2_0"] + mSignalStorage[
"sumS_p2_1"];
1451 mSignalStorage[
"sumSS_p3_0"] <= mSignalStorage[
"sumSS_p2_0"] + mSignalStorage[
"sumSS_p2_1"];
1453 mSignalStorage[
"sumSS_p3_1"] <= mSignalStorage[
"sumSS_p2_2"] + mSignalStorage[
"sumSS_p2_3"];
1458 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1459 mSignalStorage[
"z0NumS_p1_" + to_string(iSt)] <= mSignalStorage[
"arcS_" + to_string(iSt)] * mSignalStorage[
"sumS"];
1462 mSignalStorage[
"den_p1"] <= mSignalStorage[
"sumS"] * mSignalStorage[
"sumS"];
1464 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1465 mSignalStorage[
"cotNumS_" + to_string(iSt)] <= mSignalStorage[
"cotNumS_p1_" + to_string(iSt)] - mSignalStorage[
"sumS"];
1468 mSignalStorage[
"sumSS"] <= mSignalStorage[
"sumSS_p3_0"] + mSignalStorage[
"sumSS_p3_1"];
1470 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1471 mSignalStorage[
"zxiZError_" + to_string(iSt)] <= mSignalStorage[
"zz_" + to_string(iSt)] * mSignalStorage[
"iZError2_" + to_string(
1480 mSignalStorage[
"den_p2"] <= mSignalStorage[
"sum1"] * mSignalStorage[
"sumSS"];
1482 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1483 mSignalStorage[
"z0NumS_" + to_string(iSt)] <= mSignalStorage[
"sumSS"] - mSignalStorage[
"z0NumS_p1_" + to_string(iSt)];
1488 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1489 mSignalStorage[
"cotNumSZ_" + to_string(iSt)] <= mSignalStorage[
"cotNumS_" + to_string(iSt)] * mSignalStorage[
"zxiZError_" +
1493 mSignalStorage[
"den"] <= mSignalStorage[
"den_p2"] - mSignalStorage[
"den_p1"];
1495 if (mSignalStorage.find(
"denMin") == mSignalStorage.end()) {
1497 double t_rr3D[4], t_wireZError[4];
1498 for (
int iSt = 0; iSt < 2; iSt++) {
1499 t_rr3D[iSt] = mConstV.at(
"rr3D")[iSt];
1500 t_wireZError[iSt] = 1 / mConstV.at(
"wireZError")[iSt];
1502 for (
int iSt = 2; iSt < 4; iSt++) {
1503 t_rr3D[iSt] = mConstV.at(
"rr3D")[iSt];
1504 t_wireZError[iSt] = 0;
1507 mSignalStorage[
"denMin"] =
Belle2::TRGCDCJSignal(t_denMin, mSignalStorage[
"den"].getToReal(), commonData);
1508 double t_arcSMax[4], t_driftZError[4];
1509 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1510 t_arcSMax[iSt] = mConstD.at(
"Trg_PI") * mConstV.at(
"rr3D")[iSt] / 2;
1511 t_driftZError[iSt] = 1 / mConstV.at(
"driftZError")[iSt];
1514 mSignalStorage[
"denMax"] =
Belle2::TRGCDCJSignal(t_denMax, mSignalStorage[
"den"].getToReal(), commonData);
1519 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1523 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1524 make_pair(&mSignalStorage[
"den_c"], mSignalStorage[
"denMax"])
1527 t_data.push_back(make_pair(t_compare, t_assigns));
1532 make_pair(&mSignalStorage[
"den_c"], mSignalStorage[
"den"].limit(mSignalStorage[
"denMin"], mSignalStorage[
"denMax"]))
1535 t_data.push_back(make_pair(t_compare, t_assigns));
1540 make_pair(&mSignalStorage[
"den_c"], mSignalStorage[
"denMin"])
1543 t_data.push_back(make_pair(t_compare, t_assigns));
1547 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1548 mSignalStorage[
"z0NumSZ_" + to_string(iSt)] <= mSignalStorage[
"z0NumS_" + to_string(iSt)] * mSignalStorage[
"zxiZError_" + to_string(
1559 mSignalStorage[
"cot_p1_0"] <= mSignalStorage[
"cotNumSZ_0"] + mSignalStorage[
"cotNumSZ_1"];
1561 mSignalStorage[
"cot_p1_1"] <= mSignalStorage[
"cotNumSZ_2"] + mSignalStorage[
"cotNumSZ_3"];
1563 mSignalStorage[
"z0_p1_0"] <= mSignalStorage[
"z0NumSZ_0"] + mSignalStorage[
"z0NumSZ_1"];
1565 mSignalStorage[
"z0_p1_1"] <= mSignalStorage[
"z0NumSZ_2"] + mSignalStorage[
"z0NumSZ_3"];
1570 if (mSignalStorage.find(
"invIDenMin") == mSignalStorage.end()) {
1571 unsigned long long t_int = mSignalStorage[
"den_c"].getMaxInt();
1572 double t_toReal = mSignalStorage[
"den_c"].getToReal();
1573 double t_actual = mSignalStorage[
"den_c"].getMaxActual();
1574 mSignalStorage[
"invIDenMin"] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
1575 t_int = mSignalStorage[
"den_c"].getMinInt();
1576 t_actual = mSignalStorage[
"den_c"].getMinActual();
1577 mSignalStorage[
"invIDenMax"] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
1582 if (!mLutStorage.count(
"iDen")) {
1584 mLutStorage[
"iDen"]->setFloatFunction(
1585 [ = ](
double aValue) ->
double{
return 1 / aValue;},
1586 mSignalStorage[
"den_c"],
1587 mSignalStorage[
"invIDenMin"], mSignalStorage[
"invIDenMax"],
1588 pow(1 / mSignalStorage[
"rho"].getToReal() / mSignalStorage[
"iZError2_0"].getToReal(), 2),
1589 (int)mConstD.at(
"iDenLUTInBitSize"), (int)mConstD.at(
"iDenLUTOutBitSize"));
1593 mLutStorage[
"iDen"]->operate(mSignalStorage[
"den_c"], mSignalStorage[
"iDen"]);
1601 mSignalStorage[
"cot_p2"] <= mSignalStorage[
"cot_p1_0"] + mSignalStorage[
"cot_p1_1"];
1603 mSignalStorage[
"z0_p2"] <= mSignalStorage[
"z0_p1_0"] + mSignalStorage[
"z0_p1_1"];
1607 mSignalStorage[
"cot"] <= mSignalStorage[
"cot_p2"] * mSignalStorage[
"iDen"];
1609 mSignalStorage[
"z0"] <= mSignalStorage[
"z0_p2"] * mSignalStorage[
"iDen"];
1610 if (mConstD.at(
"JB") == 1) {
1611 cout <<
"<<<cot>>>" << endl; mSignalStorage[
"cot"].dump();
1612 cout <<
"<<<z0>>>" << endl; mSignalStorage[
"z0"].dump();
1621 if (!mSignalStorage.count(
"z0Min")) {
1622 mSignalStorage[
"z0Min"] =
Belle2::TRGCDCJSignal(z0Min, mSignalStorage[
"z0"].getToReal(), commonData);
1623 mSignalStorage[
"z0Max"] =
Belle2::TRGCDCJSignal(z0Max, mSignalStorage[
"z0"].getToReal(), commonData);
1627 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1631 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1632 make_pair(&mSignalStorage[
"z0_c"], mSignalStorage[
"z0Max"])
1635 t_data.push_back(make_pair(t_compare, t_assigns));
1640 make_pair(&mSignalStorage[
"z0_c"], mSignalStorage[
"z0"].limit(mSignalStorage[
"z0Min"], mSignalStorage[
"z0Max"]))
1643 t_data.push_back(make_pair(t_compare, t_assigns));
1648 make_pair(&mSignalStorage[
"z0_c"], mSignalStorage[
"z0Min"])
1651 t_data.push_back(make_pair(t_compare, t_assigns));
1658 double cotMin = cos(127 * mConstD.at(
"Trg_PI") / 180) / sin(127 * mConstD.at(
"Trg_PI") / 180);
1659 double cotMax = cos(35 * mConstD.at(
"Trg_PI") / 180) / sin(35 * mConstD.at(
"Trg_PI") / 180);
1660 if (!mSignalStorage.count(
"cotMin")) {
1661 mSignalStorage[
"cotMin"] =
Belle2::TRGCDCJSignal(cotMin, mSignalStorage[
"cot"].getToReal(), commonData);
1662 mSignalStorage[
"cotMax"] =
Belle2::TRGCDCJSignal(cotMax, mSignalStorage[
"cot"].getToReal(), commonData);
1666 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1670 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1671 make_pair(&mSignalStorage[
"cot_c"], mSignalStorage[
"cotMax"])
1674 t_data.push_back(make_pair(t_compare, t_assigns));
1679 make_pair(&mSignalStorage[
"cot_c"], mSignalStorage[
"cot"].limit(mSignalStorage[
"cotMin"], mSignalStorage[
"cotMax"]))
1682 t_data.push_back(make_pair(t_compare, t_assigns));
1687 make_pair(&mSignalStorage[
"cot_c"], mSignalStorage[
"cotMin"])
1690 t_data.push_back(make_pair(t_compare, t_assigns));
1702 int z0Shift = mSignalStorage[
"z0_c"].getBitsize() - z0Bits;
1703 mSignalStorage[
"z0_r"] <= mSignalStorage[
"z0_c"].shift(z0Shift, 0);
1704 int cotShift = mSignalStorage[
"cot_c"].getBitsize() - cotBits;
1705 mSignalStorage[
"cot_r"] <= mSignalStorage[
"cot_c"].shift(cotShift, 0);
1714 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1715 mSignalStorage[
"fitDistFromZ0_" + to_string(iSt)] <= mSignalStorage[
"cot"] * mSignalStorage[
"arcS_" + to_string(iSt)];
1718 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1719 mSignalStorage[
"distFromZ0_" + to_string(iSt)] <= mSignalStorage[
"zz_" + to_string(iSt)] - mSignalStorage[
"z0"];
1724 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1725 mSignalStorage[
"chiNum_" + to_string(iSt)] <= mSignalStorage[
"distFromZ0_" + to_string(iSt)] - mSignalStorage[
"fitDistFromZ0_" +
1730 if (mSignalStorage.find(
"chiNumMax_0") == mSignalStorage.end()) {
1731 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1732 string t_maxName =
"chiNumMax_" + to_string(iSt);
1733 string t_minName =
"chiNumMin_" + to_string(iSt);
1734 string t_valueName =
"chiNum_" + to_string(iSt);
1735 double t_maxValue = 2 * mConstV.at(
"zToOppositeStraw")[iSt];
1736 double t_minValue = 2 * mConstV.at(
"zToStraw")[iSt];
1737 mSignalStorage[t_maxName] =
Belle2::TRGCDCJSignal(t_maxValue, mSignalStorage[t_valueName].getToReal(), commonData);
1738 mSignalStorage[t_minName] =
Belle2::TRGCDCJSignal(t_minValue, mSignalStorage[t_valueName].getToReal(), commonData);
1742 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1743 string t_maxName =
"chiNumMax_" + to_string(iSt);
1744 string t_minName =
"chiNumMin_" + to_string(iSt);
1745 string t_valueName =
"chiNum_c_" + to_string(iSt);
1746 string t_in1Name =
"chiNum_" + to_string(iSt);
1748 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1752 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1753 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_maxName]),
1756 t_data.push_back(make_pair(t_compare, t_assigns));
1761 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_in1Name].limit(mSignalStorage[t_minName], mSignalStorage[t_maxName])),
1764 t_data.push_back(make_pair(t_compare, t_assigns));
1769 make_pair(&mSignalStorage[t_valueName], mSignalStorage[t_minName]),
1772 t_data.push_back(make_pair(t_compare, t_assigns));
1780 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1781 mSignalStorage[
"chi2_p1_" + to_string(iSt)] <= mSignalStorage[
"chiNum_c_" + to_string(iSt)] * mSignalStorage[
"chiNum_c_" +
1786 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1787 mSignalStorage[
"chi2_" + to_string(iSt)] <= mSignalStorage[
"chi2_p1_" + to_string(iSt)] * mSignalStorage[
"iZError2_" + to_string(
1792 mSignalStorage[
"chi2Sum_p1_0"] <= mSignalStorage[
"chi2_0"] + mSignalStorage[
"chi2_1"];
1794 mSignalStorage[
"chi2Sum_p1_1"] <= mSignalStorage[
"chi2_2"] + mSignalStorage[
"chi2_3"];
1798 mSignalStorage[
"zChi2"] <= (mSignalStorage[
"chi2Sum_p1_0"] + mSignalStorage[
"chi2Sum_p1_1"]).shift(1);
1799 if (mConstD.at(
"JB") == 1) {cout <<
"<<<zChi2>>>" << endl; mSignalStorage[
"zChi2"].dump();}
1803 double zChi2Min = 0;
1805 double zChi2Max = 100;
1809 if (!mSignalStorage.count(
"zChi2Min")) {
1810 mSignalStorage[
"zChi2Min"] =
Belle2::TRGCDCJSignal(zChi2Min, mSignalStorage[
"zChi2"].getToReal(), commonData);
1811 mSignalStorage[
"zChi2Max"] =
Belle2::TRGCDCJSignal(zChi2Max, mSignalStorage[
"zChi2"].getToReal(), commonData);
1815 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
1819 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
1820 make_pair(&mSignalStorage[
"zChi2_c"], mSignalStorage[
"zChi2Max"])
1823 t_data.push_back(make_pair(t_compare, t_assigns));
1828 make_pair(&mSignalStorage[
"zChi2_c"], mSignalStorage[
"zChi2"].limit(mSignalStorage[
"zChi2Min"], mSignalStorage[
"zChi2Max"]))
1831 t_data.push_back(make_pair(t_compare, t_assigns));
1836 make_pair(&mSignalStorage[
"zChi2_c"], mSignalStorage[
"zChi2Min"])
1839 t_data.push_back(make_pair(t_compare, t_assigns));
1846 int zChi2Shift = mSignalStorage[
"zChi2_c"].getBitsize() - zChi2Bits;
1847 mSignalStorage[
"zChi2_r"] <= mSignalStorage[
"zChi2_c"].shift(zChi2Shift, 0);
1855 std::vector<std::vector<double> >
const& stXts,
1856 int eventTimeValid,
int eventTime,
1857 std::vector<std::vector<int> >
const& rawStTSs,
1858 int charge,
double radius,
double phi_c,
double& z0,
double& cot,
double& chi2)
1861 vector<double> arcS;
1862 vector<double> invZError2;
1863 fitter3D(stGeometry, stXts, eventTimeValid, eventTime, rawStTSs, charge, radius, phi_c, z0, cot, chi2, arcS, zz, invZError2);
1867 std::vector<std::vector<double> >
const& stXts,
1868 int eventTimeValid,
int eventTime,
1869 std::vector<std::vector<int> >
const& rawStTSs,
1870 int charge,
double radius,
double phi_c,
double& z0,
double& cot,
double& chi2, vector<double>& arcS, vector<double>& zz,
1871 vector<double>& invZError2)
1873 vector<double> stTSs(4);
1876 zz = vector<double> (4, 0);
1877 arcS = vector<double> (4, 0);
1878 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1879 if (rawStTSs[iSt][1] != 0) {
1881 stGeometry[
"cdcRadius"][iSt], stTSs[iSt], radius, phi_c);
1889 const std::map<std::string, std::vector<double> >& mConstV,
1890 int eventTimeValid,
int eventTime,
1891 std::vector<std::vector<int> >
const& rawStTSs,
1892 int charge,
double radius,
double phi_c,
1894 std::map<std::string, Belle2::TRGCDCJLUT*>& mLutStorage)
1898 vector<tuple<string, double, int, double, double, int> > t_values = {
1899 make_tuple(
"phi0", phi_c, mConstD[
"phiBitSize"], mConstD[
"phiMin"], mConstD[
"phiMax"], 0),
1900 make_tuple(
"rho", radius, mConstD[
"rhoBitSize"], mConstD[
"rhoMin"], mConstD[
"rhoMax"], 0),
1901 make_tuple(
"charge", (
int)(charge == 1 ? 1 : 0), 1, 0, 1.5, 0),
1902 make_tuple(
"lr_0", rawStTSs[0][1], 2, 0, 3.5, 0),
1903 make_tuple(
"lr_1", rawStTSs[1][1], 2, 0, 3.5, 0),
1904 make_tuple(
"lr_2", rawStTSs[2][1], 2, 0, 3.5, 0),
1905 make_tuple(
"lr_3", rawStTSs[3][1], 2, 0, 3.5, 0),
1906 make_tuple(
"tsId_0", rawStTSs[0][0], ceil(log(mConstV.at(
"nTSs")[1]) / log(2)), 0, pow(2, ceil(log(mConstV.at(
"nTSs")[1]) / log(2))) - 0.5, 0),
1907 make_tuple(
"tsId_1", rawStTSs[1][0], ceil(log(mConstV.at(
"nTSs")[3]) / log(2)), 0, pow(2, ceil(log(mConstV.at(
"nTSs")[3]) / log(2))) - 0.5, 0),
1908 make_tuple(
"tsId_2", rawStTSs[2][0], ceil(log(mConstV.at(
"nTSs")[5]) / log(2)), 0, pow(2, ceil(log(mConstV.at(
"nTSs")[5]) / log(2))) - 0.5, 0),
1909 make_tuple(
"tsId_3", rawStTSs[3][0], ceil(log(mConstV.at(
"nTSs")[7]) / log(2)), 0, pow(2, ceil(log(mConstV.at(
"nTSs")[7]) / log(2))) - 0.5, 0),
1910 make_tuple(
"tdc_0", rawStTSs[0][2], mConstD[
"tdcBitSize"], 0, pow(2, mConstD[
"tdcBitSize"]) - 0.5, 0),
1911 make_tuple(
"tdc_1", rawStTSs[1][2], mConstD[
"tdcBitSize"], 0, pow(2, mConstD[
"tdcBitSize"]) - 0.5, 0),
1912 make_tuple(
"tdc_2", rawStTSs[2][2], mConstD[
"tdcBitSize"], 0, pow(2, mConstD[
"tdcBitSize"]) - 0.5, 0),
1913 make_tuple(
"tdc_3", rawStTSs[3][2], mConstD[
"tdcBitSize"], 0, pow(2, mConstD[
"tdcBitSize"]) - 0.5, 0),
1914 make_tuple(
"eventTime", eventTime, mConstD[
"tdcBitSize"], 0, pow(2, mConstD[
"tdcBitSize"]) - 0.5, 0),
1915 make_tuple(
"eventTimeValid", eventTimeValid, 1, 0, 1.5, 0),
1927 if ((*mSignalStorage.begin()).second.getName() ==
"") {
1928 for (
auto it = mSignalStorage.begin(); it != mSignalStorage.end(); ++it) {
1929 (*it).second.setName((*it).first);
1935 TVector3& impactPosition)
1945 double rho = sqrt(pow(mcMomentum->Px(), 2) + pow(mcMomentum->Py(), 2)) / 0.3 / 1.5 * 100;
1946 double hcx = mcPosition->X() + rho * cos(atan2(mcMomentum->Py(), mcMomentum->Px()) - charge * TMath::Pi() / 2);
1947 double hcy = mcPosition->Y() + rho * sin(atan2(mcMomentum->Py(), mcMomentum->Px()) - charge * TMath::Pi() / 2);
1948 helixCenter.Set(hcx, hcy);
1949 double impactX = (helixCenter.Mod() - rho) / helixCenter.Mod() * helixCenter.X();
1950 double impactY = (helixCenter.Mod() - rho) / helixCenter.Mod() * helixCenter.Y();
1952 if (atan2(impactY, impactX) < atan2(mcPosition->Y(), mcPosition->X())) signdS = -1;
1954 double dS = 2 * rho * asin(sqrt(pow(impactX - mcPosition->X(), 2) + pow(impactY - mcPosition->Y(), 2)) / 2 / rho);
1955 double impactZ = mcMomentum->Pz() / mcMomentum->Pt() * dS * signdS + mcPosition->Z();
1956 impactPosition.SetXYZ(impactX, impactY, impactZ);
1962 double Trg_PI = 3.141592653589793;
1964 double t_alpha = 1 / 0.3 / 1.5 * 100;
1965 double t_pT = momentum.Perp();
1966 double t_R = t_pT * t_alpha;
1967 helixParameters.Clear();
1968 helixParameters.ResizeTo(5);
1969 helixParameters[2] = t_alpha / t_R;
1970 helixParameters[1] = atan2(position.Y() - t_R * momentum.X() / t_pT * charge, position.X() + t_R * momentum.Y() / t_pT * charge);
1971 helixParameters[0] = (position.X() + t_R * momentum.Y() / t_pT * charge) / cos(helixParameters[1]) - t_R;
1972 double t_phi = atan2(-momentum.X() * charge, momentum.Y() * charge) - helixParameters[1];
1973 if (t_phi > Trg_PI) t_phi -= 2 * Trg_PI;
1974 if (t_phi < -Trg_PI) t_phi += 2 * Trg_PI;
1975 helixParameters[4] = momentum.Z() / t_pT * charge;
1976 helixParameters[3] = position.Z() + helixParameters[4] * t_R * t_phi;
1982 double t_alpha = 1 / 0.3 / 1.5 * 100;
1983 double t_R = t_alpha / helixParameters[2];
1984 double t_pT = t_R / t_alpha;
1985 double t_phi = -1 * charge * acos((-pow(cdcRadius, 2) + pow(t_R + helixParameters[0], 2) + pow(t_R,
1986 2)) / (2 * t_R * (t_R + helixParameters[0])));
1987 double t_X = (helixParameters[0] + t_R) * cos(helixParameters[1]) - t_R * cos(helixParameters[1] + t_phi);
1988 double t_Y = (helixParameters[0] + t_R) * sin(helixParameters[1]) - t_R * sin(helixParameters[1] + t_phi);
1989 double t_Z = helixParameters[3] - helixParameters[4] * t_R * t_phi;
1990 double t_Px = -t_pT * sin(helixParameters[1] + t_phi) * charge;
1991 double t_Py = t_pT * cos(helixParameters[1] + t_phi) * charge;
1992 double t_Pz = t_pT * helixParameters[4] * charge;
1993 position.SetXYZ(t_X, t_Y, t_Z);
1994 momentum.SetXYZ(t_Px, t_Py, t_Pz);
2001 for (
int i = 0; i < numberBits - 1; i++) {
2005 }
else if (mode == 0) {
2006 for (
int i = 0; i < numberBits; i++) {
2021 double range = maxValue - minValue;
2022 double convert = (
bitSize - 0.5) / range;
2033 double range = maxValue - minValue;
2034 double convert = (
bitSize - 0.5) / range;
2035 real = (integer / convert) + minValue;
2041 if (value > m_max) m_max = value;
2042 if (value < m_min) m_min = value;
A class to use LUTs for TRGCDC.
A class to hold common data for JSignals.
A class to use Signals for TRGCDC 3D tracker.
static void loadStereoXt(std::string const &filePrefix, int nFiles, std::vector< std::vector< double > > &stXts)
Load stereo Xt file.
static double rotatePhi(double value, double refPhi)
Rotates to range [-pi, pi].
static double calStAxPhi(int charge, double anglest, double ztostraw, double rr, double rho, double phi0)
Calculates the fitted axial phi for the stereo super layer.
static void changeReal(double &real, int integer, double minValue, double maxValue, int bitSize)
Changes integer to float value.
static int findQuadrant(double value)
Finds quadrant of angle. Angle is in rad.
static int bitSize(int numberBits, int mode)
Firmware convert functions.
static void fitter3DFirm(std::map< std::string, double > &mConstD, const std::map< std::string, std::vector< double > > &mConstV, int eventTimeValid, int eventTime, std::vector< std::vector< int > > const &rawStTSs, int charge, double radius, double phi_c, Belle2::TRGCDCJSignalData *commonData, std::map< std::string, Belle2::TRGCDCJSignal > &mSignalStorage, std::map< std::string, Belle2::TRGCDCJLUT * > &mLutStorage)
Combines several functions for fitter3D firmware.
static void rPhiFitter(double *rr, double *phi2, double *invphierror, double &rho, double &myphi0)
A circle fitter with invPhiError without fit chi2 output.
static void changeInteger(int &integer, double real, double minValue, double maxValue, int bitSize)
Changes float to integer value.
static double calZ(int charge, double anglest, double ztostraw, double rr, double phi, double rho, double phi0)
Calculates z.
static double calDenWithIZError(double *arcS, double *iZError)
Calculates the denominator for fitting z and arc s.
static void setError(std::map< std::string, double > const &mConstD, std::map< std::string, std::vector< double > > const &mConstV, std::map< std::string, Belle2::TRGCDCJSignal > &mSignalStorage)
Sets error using JSignal class.
static void setErrorFast(std::vector< std::vector< int > > const &rawStTSs, int eventTimeValid, std::vector< double > &invZError2)
Sets error for fitting.
static void calPhiFast(std::map< std::string, std::vector< double > > &stGeometry, std::vector< std::vector< double > > const &stXts, int eventTimeValid, int eventTime, std::vector< std::vector< int > > const &rawStTSs, std::vector< double > &stTSs)
Calculates phi with fast simulation.
static double calDeltaPhi(int charge, double anglest, double ztostraw, double rr, double phi, double rho, double phi0)
Calculates the phi difference between fitted axial phi and stereo phi.
static double calS(double rho, double rr)
Calculates arc length.
static double stereoIdToPhi(std::vector< double > &stNWires, int iSt, int id)
Converts stereo ts id to phi.
static void fitter3D(std::map< std::string, std::vector< double > > &stGeometry, std::vector< std::vector< double > > const &stXts, int eventTimeValid, int eventTime, std::vector< std::vector< int > > const &rawStTSs, int charge, double radius, double phi_c, double &z0, double &cot, double &chi2)
Combines several functions for fitter3D.
static void calVectorsAtR(const TVectorD &helixParameters, int charge, double radius, TVector3 &position, TVector3 &momentum)
Calculates position and momentum at a certain radius.
static int findSign(double *phi2)
2D fitter functions
static void calHelixParameters(TVector3 position, TVector3 momentum, int charge, TVectorD &helixParameters)
HelixParameters: dR, phi0, keppa, dz, tanLambda Calculates the helix parameters of track.
static double calPhi(double wirePhi, double driftLength, double rr, int lr)
Pre 3D fitter functions. rr is in cm scale. driftLength is in cm scale.
static void chargeFinder(double *nTSs, double *tsIds, double *tsHitmap, double phi0, double inCharge, double &outCharge)
Charge finder using circle fitter output and axial TSs.
static int rotateTsId(int value, int refId, int nTSs)
Rotates to range [0, nTSs-1].
static void saveStereoXt(std::vector< std::vector< double > > &stXts, std::string const &filePrefix)
Saves stereo Xt to file.
static void rPhiFit(double *rr, double *phi2, double *phierror, double &rho, double &myphi0)
A circle fitter.
static void rSFit2(double *iezz21, double *iezz22, double *arcS, double *zz, int *lutv, double &z0, double &cot, double &zchi2)
Fits z and arc S. (Will be deprecated.)
static unsigned toUnsignedTdc(int tdc, int nBits)
Changes tdc and event time to unsigned value that has # bits.
static void rSFit(double *iezz2, double *arcS, double *zz, double &z0, double &cot, double &zchi2)
3D fitter functions Fits z and arc S.
static double calDen(double *arcS, double *zError)
Calculates the denominator for fitting z and arc s.
static void rPhiFit2(double *rr, double *phi2, double *phierror, double &rho, double &myphi0, int nTS)
A circle fitter.
static void findImpactPosition(TVector3 *mcPosition, TLorentzVector *mcMomentum, int charge, TVector2 &helixCenter, TVector3 &impactPosition)
MC calculation functions Calculates the impact position of track.
static void findExtreme(double &m_max, double &m_min, double value)
Finds maximum and minium values.
static void constrainRPerStSl(std::map< std::string, std::vector< double > > const &mConstV, std::map< std::string, Belle2::TRGCDCJSignal > &mSignalStorage)
Constrains R for each SL differently using JSignal and multiple constants.
static double roundInt(double value)
Round double value.
static void valuesToMapSignals(std::vector< std::tuple< std::string, double, int, double, double, int > > const &inValues, Belle2::TRGCDCJSignalData *inCommonData, std::map< std::string, Belle2::TRGCDCJSignal > &outMap)
Values => [name, value, bitwidth, min, max, clock] Changes values to signals.
static void ifElse(std::vector< std::pair< TRGCDCJSignal, std::vector< std::pair< TRGCDCJSignal *, TRGCDCJSignal > > > > &data, int targetClock)
If else implementation with target clock.
static TRGCDCJSignal const absolute(TRGCDCJSignal const &first)
Absolute TRGCDCJSignal. Removes 1 bit if signed or minus unsigned.
static TRGCDCJSignal comp(TRGCDCJSignal const &lhs, const std::string &operate, TRGCDCJSignal const &rhs)
Compare two signals.