329 const vector<double>& tsArcS,
330 const vector<vector<double> >& tsZ)
333 int charge = (int)trackVariables[0];
334 double rho = trackVariables[1];
335 double fitPhi0 = trackVariables[2];
340 for (
int k = 0; k < 4; k++) {
350 double tempZ0Start, tempZ0End;
351 double tempZ01, tempZ02;
353 double actualCot, actualZ0;
358 for (
int cotStep = 0; cotStep <
m_nCotSteps; cotStep++) {
365 for (
unsigned iLayer = 0; iLayer < 4; iLayer++) {
366 for (
unsigned iTS = 0; iTS < stTSs[iLayer].size(); iTS++) {
368 tempZ01 = -tsArcS[iLayer] * tempCotStart + tsZ[iLayer][iTS];
369 tempZ02 = -tsArcS[iLayer] * tempCotEnd + tsZ[iLayer][iTS];
372 if (tempZ01 < tempZ02) {
373 tempZ0Start = tempZ01;
376 tempZ0Start = tempZ02;
383 if (tempZ0Start > 0) {
403 for (
int z0Step =
int(tempZ0Start); z0Step <= int(tempZ0End); z0Step++) {
407 cout <<
"cutoff because z0step is bigger or smaller than z0 limit ";
414 }
else { tempHoughZ0 = z0Step; }
424 m_minDiffHough = abs(actualCot * tsArcS[iLayer] + actualZ0 - tsZ[iLayer][iTS]);
435 for (
int houghCot = 0; houghCot <
m_nCotSteps; houghCot++) {
436 for (
int houghZ0 = 0; houghZ0 <
m_nZ0Steps; houghZ0++) {
447 for (
int layer = 0; layer < 4; layer++) {
458 for (
int houghCot = 0; houghCot <
m_nCotSteps; houghCot++) {
459 for (
int houghZ0 = 0; houghZ0 <
m_nZ0Steps; houghZ0++) {
463 }
else { tempHoughZ0 = houghZ0;}
498 for (
int i = 0; i < 4; i++) {
508 double minDiff[4] = {999, 999, 999, 999};
509 for (
unsigned iLayer = 0; iLayer < 4; iLayer++) {
510 for (
unsigned iTS = 0; iTS < stTSs[iLayer].size(); iTS++) {
511 if (minDiff[iLayer] > abs(
m_foundPhiSt[iLayer] - stTSs[iLayer][iTS])) {
512 minDiff[iLayer] = abs(
m_foundPhiSt[iLayer] - stTSs[iLayer][iTS]);
513 m_bestTS[iLayer] = stTSs[iLayer][iTS];
523 const std::vector<std::vector<int> >& stTSDrift)
527 for (
int iLayer = 0; iLayer < 4; iLayer++) {
528 (*m_geoCandidatesIndex)[iLayer].clear();
529 (*m_geoCandidatesPhi)[iLayer].clear();
530 (*m_geoCandidatesDiffStWires)[iLayer].clear();
533 int charge = (int)trackVariables[0];
534 double rho = trackVariables[1];
535 double fitPhi0 = trackVariables[2];
539 for (
int iLayer = 0; iLayer < 4; iLayer++) {
543 for (
unsigned iTS = 0; iTS < stTSs[iLayer].size(); iTS++) {
546 int t_priorityPosition = (stTSDrift[iLayer][iTS] & 3);
550 if (t_priorityPosition != 3)
continue;
552 tsDiffSt =
m_stAxPhi[iLayer] - stTSs[iLayer][iTS];
553 if (tsDiffSt > M_PI) tsDiffSt -= 2 * M_PI;
554 if (tsDiffSt < -M_PI) tsDiffSt += 2 * M_PI;
555 tsDiffSt = tsDiffSt / 2 / M_PI *
m_nWires[iLayer] / 2;
558 if (iLayer % 2 == 0) {
559 if (tsDiffSt > 0 && tsDiffSt <= 10) {
560 (*m_geoCandidatesIndex)[iLayer].push_back(iTS);
561 (*m_geoCandidatesPhi)[iLayer].push_back(stTSs[iLayer][iTS]);
562 (*m_geoCandidatesDiffStWires)[iLayer].push_back(tsDiffSt);
565 if (tsDiffSt < 0 && tsDiffSt >= -10) {
566 (*m_geoCandidatesIndex)[iLayer].push_back(iTS);
567 (*m_geoCandidatesPhi)[iLayer].push_back(stTSs[iLayer][iTS]);
568 (*m_geoCandidatesDiffStWires)[iLayer].push_back(tsDiffSt);
589 const double meanWireDiff[4] = { 3.68186, 3.3542, 3.9099, 4.48263 };
590 for (
int iLayer = 0; iLayer < 4; iLayer++) {
596 double bestDiff = 999;
598 tsDiffSt =
m_stAxPhi[iLayer] - stTSs[iLayer][(*m_geoCandidatesIndex)[iLayer][iTS]];
599 if (tsDiffSt > M_PI) tsDiffSt -= 2 * M_PI;
600 if (tsDiffSt < -M_PI) tsDiffSt += 2 * M_PI;
601 tsDiffSt = tsDiffSt / 2 / M_PI *
m_nWires[iLayer] / 2;
604 if (abs(abs(tsDiffSt) - meanWireDiff[iLayer]) < bestDiff) {
606 bestDiff = abs(abs(tsDiffSt) - meanWireDiff[iLayer]);
607 m_bestTS[iLayer] = stTSs[iLayer][(*m_geoCandidatesIndex)[iLayer][iTS]];
608 m_bestTSIndex[iLayer] = (*m_geoCandidatesIndex)[iLayer][iTS];
624 const vector<vector<int> >& stTSDrift)
627 int m_verboseFlag =
m_mBool[
"fVerbose"];
629 if (m_verboseFlag) cout <<
"####geoFinder start####" << endl;
632 for (
int iLayer = 0; iLayer < 4; iLayer++) {
633 (*m_geoCandidatesPhi)[iLayer].clear();
634 (*m_geoCandidatesIndex)[iLayer].clear();
635 (*m_geoCandidatesDiffStWires)[iLayer].clear();
638 for (
int iLayer = 0; iLayer < 4; iLayer++) {
639 for (
int iTS = 0; iTS <
m_nWires[iLayer] / 2; iTS++) {
644 for (
int iSt = 0; iSt < 4; iSt++) {
645 for (
int iTS = 0; iTS <
m_nWires[iSt] / 2; iTS++) {
651 int charge = (int)trackVariables[0];
652 double rho = trackVariables[1];
653 double fitPhi0 = trackVariables[2];
658 for (
unsigned iLayer = 0; iLayer < 4; iLayer++) {
660 for (
unsigned iTS = 0; iTS < stTSs[iLayer].size(); iTS++) {
661 iHitTS = int(stTSs[iLayer][iTS] *
m_nWires[iLayer] / 2 / 2 / M_PI + 0.5);
662 driftInfo = stTSDrift[iLayer][iTS];
663 if (m_verboseFlag) cout <<
"[" << iLayer <<
"] TSId: " << iHitTS <<
" stTSs: " << stTSs[iLayer][iTS] <<
" driftInfo:" << driftInfo
664 <<
" priorityPosition:" << (driftInfo & 3) << endl;
706 std::map<std::string, std::vector<double> > mConstV;
707 std::map<std::string, double > mConstD;
708 std::map<std::string, double > mDouble;
715 double phiMax = M_PI;
717 double phiMin = -M_PI;
722 double rhoMax = 2500;
726 mConstV[
"rr"] = vector<double> (9);
727 mConstV[
"rr3D"] = vector<double> (4);
728 mConstV[
"nTSs"] = vector<double> (9);
729 for (
unsigned iSt = 0; iSt < 4; iSt++) {
731 mConstV[
"rr"][2 * iSt + 1] =
m_rr[iSt] * 100;
732 mConstV[
"rr3D"][iSt] =
m_rr[iSt] * 100;
733 mConstV[
"nTSs"][2 * iSt + 1] =
m_nWires[iSt] / 2;
735 mConstD[
"acosLUTInBitSize"] = rhoBitSize;
736 mConstD[
"acosLUTOutBitSize"] = phiBitSize - 1;
737 mConstD[
"Trg_PI"] = M_PI;
741 mDouble[
"rho"] = rho * 100;
742 if (mDouble[
"rho"] > rhoMax) {
743 mDouble[
"rho"] = rhoMax;
744 mDouble[
"pt"] = rhoMax * 0.3 * 1.5 * 0.01;
749 mDouble[
"phi0"] = fitPhi0;
752 if (mDouble[
"phi0"] > mConstD[
"Trg_PI"]) mDouble[
"phi0"] -= 2 * mConstD[
"Trg_PI"];
753 else if (mDouble[
"phi0"] < -mConstD[
"Trg_PI"]) mDouble[
"phi0"] += 2 * mConstD[
"Trg_PI"];
760 vector<tuple<string, double, int, double, double, int> > t_values = {
761 make_tuple(
"phi0", mDouble[
"phi0"], phiBitSize, phiMin, phiMax, 0),
762 make_tuple(
"rho", mDouble[
"rho"], rhoBitSize, rhoMin, rhoMax, 0),
763 make_tuple(
"charge", (
int)(charge == 1 ? 1 : 0), 1, 0, 1.5, 0),
776 for (
unsigned iSt = 0; iSt < 4; iSt++) {
777 string t_invMinName =
"invPhiAxMin_" + to_string(iSt);
778 double t_actual =
m_mSignalStorage[
"rho_c_" + to_string(iSt)].getMinActual();
781 string t_invMaxName =
"invPhiAxMax_" + to_string(iSt);
789 for (
unsigned iSt = 0; iSt < 4; iSt++) {
790 string t_valueName =
"phiAx_" + to_string(iSt);
791 string t_minName =
"phiAxMin_" + to_string(iSt);
792 string t_maxName =
"phiAxMax_" + to_string(iSt);
793 string t_invMinName =
"invPhiAxMin_" + to_string(iSt);
794 string t_invMaxName =
"invPhiAxMax_" + to_string(iSt);
798 double t_parameter = mConstV.at(
"rr3D")[iSt];
800 [ = ](
double aValue) ->
double{
return acos(t_parameter / 2 / aValue);},
803 (
int)mConstD.at(
"acosLUTInBitSize"), (
int)mConstD.at(
"acosLUTOutBitSize"));
809 for (
unsigned iSt = 0; iSt < 4; iSt++) {
811 string t_valueName =
"phiAx_" + to_string(iSt);
818 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
823 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
830 t_data.push_back(make_pair(t_compare, t_assigns));
841 t_data.push_back(make_pair(t_compare, t_assigns));
864 for (
unsigned iSt = 0; iSt < 4; iSt++) {
865 string t_valueName =
"dPhiAx_" + to_string(iSt);
867 string t_maxName =
"dPhiAxMax_" + to_string(iSt);
868 string t_minName =
"dPhiAxMin_" + to_string(iSt);
869 string t_2PiName =
"dPhiAx2Pi_" + to_string(iSt);
877 for (
unsigned iSt = 0; iSt < 4; iSt++) {
878 string t_in1Name =
"dPhiAx_" + to_string(iSt);
880 string t_valueName =
"dPhiAx_c_" + to_string(iSt);
881 string t_maxName =
"dPhiAxMax_" + to_string(iSt);
882 string t_minName =
"dPhiAxMin_" + to_string(iSt);
883 string t_2PiName =
"dPhiAx2Pi_" + to_string(iSt);
885 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
889 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
893 t_data.push_back(make_pair(t_compare, t_assigns));
901 t_data.push_back(make_pair(t_compare, t_assigns));
909 t_data.push_back(make_pair(t_compare, t_assigns));
920 for (
unsigned iSt = 0; iSt < 4; iSt++) {
921 int nShiftBits = int(log(pow(2, 24) * 2 * mConstD.at(
"Trg_PI") / mConstV.at(
"nTSs")[2 * iSt + 1] /
924 t_name =
"wireFactor_" + to_string(iSt);
932 for (
unsigned iSt = 0; iSt < 4; iSt++) {
934 iSt)].getToReal()) / log(2);
936 iSt)] *
m_mSignalStorage[
"wireFactor_" + to_string(iSt)]).shift(nShiftBits, 0);
940 vector< int > nCandidates = { 10, 10, 10, 13 };
942 vector<vector<bool> > t_stCandHitmap(4);
943 for (
unsigned iSt = 0; iSt < 4; iSt++) t_stCandHitmap[iSt] = vector<bool> (nCandidates[iSt]);
945 vector<vector<int> > t_stCandDriftmap(4);
946 for (
unsigned iSt = 0; iSt < 4; iSt++) t_stCandDriftmap[iSt] = vector<int> (nCandidates[iSt] + 1);
948 vector<tuple<string, double, int, double, double, int> > resultValues;
950 vector<pair<string, int> > t_chooseSignals = {
951 make_pair(
"wireDPhiAx_0", 1), make_pair(
"wireDPhiAx_1", 1), make_pair(
"wireDPhiAx_2", 1), make_pair(
"wireDPhiAx_3", 1)
955 vector<double> t_wireDPhiAx = {std::get<1>(resultValues[0]), std::get<1>(resultValues[1]), std::get<1>(resultValues[2]), std::get<1>(resultValues[3])};
958 for (
int iSt = 0; iSt < 4; iSt++) {
959 int indexTS = t_wireDPhiAx[iSt];
960 for (
int iTS = 0; iTS < nCandidates[iSt]; iTS++) {
962 t_stCandHitmap[iSt][iTS] =
m_hitMap[iSt][indexTS];
963 t_stCandDriftmap[iSt][iTS] =
m_driftMap[iSt][indexTS];
968 if (indexTS < 0) indexTS =
m_nWires[iSt] / 2 - 1;
972 if (indexTS >=
m_nWires[iSt] / 2) indexTS = 0;
978 for (
unsigned iLayer = 0; iLayer < 4; iLayer++) {
979 cout <<
"iSt:" << iLayer <<
" t_wireDPhiAx:" << t_wireDPhiAx[iLayer];
981 if (iLayer % 2 == 0) t_endTSId = t_wireDPhiAx[iLayer] - (nCandidates[iLayer] - 1);
982 else t_endTSId = t_wireDPhiAx[iLayer] + (nCandidates[iLayer] - 1);
983 if (t_endTSId < 0) t_endTSId += mConstV[
"nTSs"][2 * iLayer + 1];
984 else if (t_endTSId >= mConstV[
"nTSs"][2 * iLayer + 1]) t_endTSId -= mConstV[
"nTSs"][2 * iLayer + 1];
986 cout <<
" t_stCandHitmap[" << iLayer <<
"]: " << t_endTSId <<
"=> ";
987 for (
int iTS = nCandidates[iLayer] - 1; iTS >= 0; iTS--) {
988 cout << t_stCandHitmap[iLayer][iTS];
990 cout <<
" <= " << t_wireDPhiAx[iLayer] << endl;
999 vector<double> t_targetWirePosition = { 3, 2, 3, 3};
1001 vector<int> t_bestRelTSId(4);
1002 for (
unsigned iSt = 0; iSt < 4; iSt++) t_bestRelTSId[iSt] = nCandidates[iSt];
1003 vector<int> t_bestDiff = {16, 16, 16, 16};
1005 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1006 for (
int iTS = 0; iTS < nCandidates[iSt]; iTS++) {
1007 int t_priorityPosition = (t_stCandDriftmap[iSt][iTS] & 3);
1009 if (t_stCandHitmap[iSt][iTS] == 0)
continue;
1010 if (t_priorityPosition != 3)
continue;
1011 double tsDiffTarget = fabs(t_targetWirePosition[iSt] - iTS);
1012 if (t_bestDiff[iSt] > tsDiffTarget) {
1013 t_bestDiff[iSt] = tsDiffTarget;
1014 t_bestRelTSId[iSt] = iTS;
1019 if (m_verboseFlag) {
1020 for (
unsigned iSt = 0; iSt < 4;
1021 iSt++) cout <<
"iSt:" << iSt <<
" bestRelTS:" << t_bestRelTSId[iSt] <<
" diff:" << t_bestDiff[iSt] << endl;
1024 vector<double> t_bestTSId(4);
1025 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1026 if (iSt % 2 == 0) t_bestTSId[iSt] = t_wireDPhiAx[iSt] - t_bestRelTSId[iSt];
1027 else t_bestTSId[iSt] = t_wireDPhiAx[iSt] + t_bestRelTSId[iSt];
1030 vector<double> t_bestDriftInfo(4);
1031 for (
unsigned iSt = 0; iSt < 4; iSt++) t_bestDriftInfo[iSt] = t_stCandDriftmap[iSt][t_bestRelTSId[iSt]];
1035 if (m_verboseFlag) {
1036 for (
unsigned iSt = 0; iSt < 4; iSt++)cout <<
"iSt:" << iSt <<
" bestDriftInfo:" << t_bestDriftInfo[iSt] << endl;
1040 vector<double> t_bestTSId_c(4);
1041 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1042 if (t_bestTSId[iSt] >= mConstV[
"nTSs"][2 * iSt + 1]) t_bestTSId_c[iSt] = t_bestTSId[iSt] - mConstV[
"nTSs"][2 * iSt + 1];
1043 else if (t_bestTSId[iSt] < 0) t_bestTSId_c[iSt] = t_bestTSId[iSt] + mConstV[
"nTSs"][2 * iSt + 1];
1044 else t_bestTSId_c[iSt] = t_bestTSId[iSt];
1047 if (m_verboseFlag) {
1048 for (
unsigned iSt = 0; iSt < 4; iSt++)cout <<
"iSt:" << iSt <<
" bestTS_c:" << t_bestTSId_c[iSt] << endl;
1052 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1053 if (t_bestDriftInfo[iSt] != 0)
m_bestTS[iSt] = t_bestTSId_c[iSt] * 2 * mConstD[
"Trg_PI"] / mConstV[
"nTSs"][2 * iSt + 1] ;
1060 for (
unsigned iSt = 0; iSt < 4; iSt++) {
1061 if (t_bestDriftInfo[iSt] == 0) {
1064 for (
unsigned iTS = 0; iTS < stTSs[iSt].size(); iTS++) {
1065 if (fabs(
m_bestTS[iSt] - stTSs[iSt][iTS]) < 0.0001) {
1080 (*it).second.setName((*it).first);
1129 for (
unsigned iSt = 0; iSt < 4;
1136 if (m_verboseFlag) cout <<
"####geoFinder end####" << endl;