82 const string& mappingFilePlus,
83 const string& mappingFileMinus,
96 const string fMap[2] = {mappingFilePlus, mappingFileMinus};
97 const string fName[2] = {string(
"circle hough plus"), string(
"circle hough minus")};
99 for (
unsigned f = 0; f < 2; f++) {
100 const string fn = fMap[f];
101 ifstream infile(fn.c_str(), ios::in);
103 B2FATAL(
"Cannot open Hough mapping file " << fn);
109 while (!isdigit(infile.peek())) {
110 getline(infile, ignores);
119 infile >> nX >> nY >> Ymin >> Ymax;
132#ifdef TRGCDC_DISPLAY_HOUGH
134 H0 =
new TCDisplayHough(
"Plus");
140 H1 =
new TCDisplayHough(
"Minus");
151 unsigned axialSuperLayerId = 0;
152 for (
unsigned i = 0; i <
_cdc.nSegmentLayers(); i++) {
154 const unsigned nWires = l->
nCells();
156 if (! nWires)
continue;
157 if ((* l)[0]->stereo())
continue;
159 _plane[0]->preparePatterns(axialSuperLayerId, nWires);
160 _plane[1]->preparePatterns(axialSuperLayerId, nWires);
161 for (
unsigned j = 0; j < nWires; j++) {
162 const TCCell& w = * (* l)[j];
163 const float x = w.xyPosition().x();
164 const float y = w.xyPosition().y();
167 _plane[0]->vote(x, y, +1, axialSuperLayerId, 1);
168 _plane[0]->registerPattern(axialSuperLayerId, j);
171 _plane[1]->vote(x, y, -1, axialSuperLayerId, 1);
172 _plane[1]->registerPattern(axialSuperLayerId, j);
441 std::map<std::string, Belle2::TRGCDCJLUT* >& mLutStorage)
445 mSignalStorage[
"invPhiAxMin"] =
Belle2::TRGCDCJSignal(-M_PI / 2, mSignalStorage[
"phi_4"].getToReal(), commonData);
446 mSignalStorage[
"invPhiAxMax"] =
Belle2::TRGCDCJSignal(M_PI / 2, mSignalStorage[
"phi_4"].getToReal(), commonData);
449 for (
unsigned iSt = 0; iSt < 5; iSt++) {
450 string t_sininputName =
"phi_" + to_string(iSt);
451 string t_sinoutputName =
"sinPhi_" + to_string(iSt);
453 if (!mLutStorage.count(t_sinoutputName)) {
456 mLutStorage[t_sinoutputName]->setFloatFunction(
457 [ = ](
double aValue) ->
double{
return sin(aValue);},
458 mSignalStorage[t_sininputName],
459 mSignalStorage[
"invPhiAxMin"], mSignalStorage[
"invPhiAxMax"], mSignalStorage[t_sininputName].getToReal(),
463 mLutStorage[t_sinoutputName]->operate(mSignalStorage[t_sininputName], mSignalStorage[t_sinoutputName]);
468 std::map<std::string, Belle2::TRGCDCJLUT* >& mLutStorage)
471 for (
unsigned iSt = 0; iSt < 5; iSt++) {
472 mSignalStorage[
"cosPhiMul_" + to_string(iSt)] <= mSignalStorage[
"cosPhi_" + to_string(iSt)] * mSignalStorage[
"cosPhi_" + to_string(
476 for (
unsigned iSt = 0; iSt < 5; iSt++) {
477 mSignalStorage[
"sinPhiMul_" + to_string(iSt)] <= mSignalStorage[
"sinPhi_" + to_string(iSt)] * mSignalStorage[
"sinPhi_" + to_string(
481 for (
unsigned iSt = 0; iSt < 5; iSt++) {
482 mSignalStorage[
"cossinPhiMul_" + to_string(iSt)] <= mSignalStorage[
"cosPhi_" + to_string(iSt)] * mSignalStorage[
"sinPhi_" +
486 for (
unsigned iSt = 0; iSt < 5; iSt++) {
487 mSignalStorage[
"rcosPhiMul_" + to_string(iSt)] <= mSignalStorage[
"cosPhi_" + to_string(iSt)] * mSignalStorage[
"2Drr_" + to_string(
491 for (
unsigned iSt = 0; iSt < 5; iSt++) {
492 mSignalStorage[
"rsinPhiMul_" + to_string(iSt)] <= mSignalStorage[
"sinPhi_" + to_string(iSt)] * mSignalStorage[
"2Drr_" + to_string(
495 mSignalStorage[
"cossum_p1_0"] <= mSignalStorage[
"cosPhiMul_0"] + mSignalStorage[
"cosPhiMul_1"];
496 mSignalStorage[
"cossum_p1_1"] <= mSignalStorage[
"cosPhiMul_2"] + mSignalStorage[
"cosPhiMul_3"];
497 mSignalStorage[
"cossum_p1_2"] <= mSignalStorage[
"cosPhiMul_4"] ;
498 mSignalStorage[
"cossum_p2_0"] <= mSignalStorage[
"cossum_p1_0"] + mSignalStorage[
"cossum_p1_1"];
499 mSignalStorage[
"cossum_p2_1"] <= mSignalStorage[
"cossum_p1_2"] ;
500 mSignalStorage[
"cossum"] <= mSignalStorage[
"cossum_p2_0"] + mSignalStorage[
"cossum_p2_1"];
501 mSignalStorage[
"sinsum_p1_0"] <= mSignalStorage[
"sinPhiMul_0"] + mSignalStorage[
"sinPhiMul_1"];
502 mSignalStorage[
"sinsum_p1_1"] <= mSignalStorage[
"sinPhiMul_2"] + mSignalStorage[
"sinPhiMul_3"];
503 mSignalStorage[
"sinsum_p1_2"] <= mSignalStorage[
"sinPhiMul_4"] ;
504 mSignalStorage[
"sinsum_p2_0"] <= mSignalStorage[
"sinsum_p1_0"] + mSignalStorage[
"sinsum_p1_1"];
505 mSignalStorage[
"sinsum_p2_1"] <= mSignalStorage[
"sinsum_p1_2"] ;
506 mSignalStorage[
"sinsum"] <= mSignalStorage[
"sinsum_p2_0"] + mSignalStorage[
"sinsum_p2_1"];
507 mSignalStorage[
"cossinsum_p1_0"] <= mSignalStorage[
"cossinPhiMul_0"] + mSignalStorage[
"cossinPhiMul_1"];
508 mSignalStorage[
"cossinsum_p1_1"] <= mSignalStorage[
"cossinPhiMul_2"] + mSignalStorage[
"cossinPhiMul_3"];
509 mSignalStorage[
"cossinsum_p1_2"] <= mSignalStorage[
"cossinPhiMul_4"] ;
510 mSignalStorage[
"cossinsum_p2_0"] <= mSignalStorage[
"cossinsum_p1_0"] + mSignalStorage[
"cossinsum_p1_1"];
511 mSignalStorage[
"cossinsum_p2_1"] <= mSignalStorage[
"cossinsum_p1_2"] ;
512 mSignalStorage[
"cossinsum"] <= mSignalStorage[
"cossinsum_p2_0"] + mSignalStorage[
"cossinsum_p2_1"];
513 mSignalStorage[
"rcossum_p1_0"] <= mSignalStorage[
"rcosPhiMul_0"] + mSignalStorage[
"rcosPhiMul_1"];
514 mSignalStorage[
"rcossum_p1_1"] <= mSignalStorage[
"rcosPhiMul_2"] + mSignalStorage[
"rcosPhiMul_3"];
515 mSignalStorage[
"rcossum_p1_2"] <= mSignalStorage[
"rcosPhiMul_4"] ;
516 mSignalStorage[
"rcossum_p2_0"] <= mSignalStorage[
"rcossum_p1_0"] + mSignalStorage[
"rcossum_p1_1"];
517 mSignalStorage[
"rcossum_p2_1"] <= mSignalStorage[
"rcossum_p1_2"] ;
518 mSignalStorage[
"rcossum"] <= mSignalStorage[
"rcossum_p2_0"] + mSignalStorage[
"rcossum_p2_1"];
519 mSignalStorage[
"rsinsum_p1_0"] <= mSignalStorage[
"rsinPhiMul_0"] + mSignalStorage[
"rsinPhiMul_1"];
520 mSignalStorage[
"rsinsum_p1_1"] <= mSignalStorage[
"rsinPhiMul_2"] + mSignalStorage[
"rsinPhiMul_3"];
521 mSignalStorage[
"rsinsum_p1_2"] <= mSignalStorage[
"rsinPhiMul_4"] ;
522 mSignalStorage[
"rsinsum_p2_0"] <= mSignalStorage[
"rsinsum_p1_0"] + mSignalStorage[
"rsinsum_p1_1"];
523 mSignalStorage[
"rsinsum_p2_1"] <= mSignalStorage[
"rsinsum_p1_2"] ;
524 mSignalStorage[
"rsinsum"] <= mSignalStorage[
"rsinsum_p2_0"] + mSignalStorage[
"rsinsum_p2_1"];
525 mSignalStorage[
"hcx_p1_0"] <= mSignalStorage[
"rcossum"] * mSignalStorage[
"sinsum"];
526 mSignalStorage[
"hcx_p1_1"] <= mSignalStorage[
"rsinsum"] * mSignalStorage[
"cossinsum"];
527 mSignalStorage[
"hcx_p2"] <= mSignalStorage[
"hcx_p1_0"] - mSignalStorage[
"hcx_p1_1"];
528 mSignalStorage[
"hcy_p1_0"] <= mSignalStorage[
"rsinsum"] * mSignalStorage[
"cossum"];
529 mSignalStorage[
"hcy_p1_1"] <= mSignalStorage[
"rcossum"] * mSignalStorage[
"cossinsum"];
530 mSignalStorage[
"hcy_p2"] <= mSignalStorage[
"hcy_p1_0"] - mSignalStorage[
"hcy_p1_1"];
531 mSignalStorage[
"den_p1"] <= mSignalStorage[
"cossum"] * mSignalStorage[
"sinsum"];
532 mSignalStorage[
"den_p2"] <= mSignalStorage[
"cossinsum"] * mSignalStorage[
"cossinsum"];
533 mSignalStorage[
"den"] <= mSignalStorage[
"den_p1"] - mSignalStorage[
"den_p2"];
537 mSignalStorage[
"denMax"] =
Belle2::TRGCDCJSignal(1.332705, mSignalStorage[
"den"].getToReal(), commonData);
543 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
547 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
548 make_pair(&mSignalStorage[
"den_c"], mSignalStorage[
"denMax"])
551 t_data.push_back(make_pair(t_compare, t_assigns));
556 make_pair(&mSignalStorage[
"den_c"], mSignalStorage[
"den"].limit(mSignalStorage[
"denMin"], mSignalStorage[
"denMax"]))
559 t_data.push_back(make_pair(t_compare, t_assigns));
564 make_pair(&mSignalStorage[
"den_c"], mSignalStorage[
"denMin"])
567 t_data.push_back(make_pair(t_compare, t_assigns));
572 unsigned long long t_int = mSignalStorage[
"den_c"].getMaxInt();
573 double t_toReal = mSignalStorage[
"den_c"].getToReal();
574 double t_actual = mSignalStorage[
"den_c"].getMaxActual();
575 mSignalStorage[
"iDenMin"] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
576 t_int = mSignalStorage[
"den_c"].getMinInt();
577 t_actual = mSignalStorage[
"den_c"].getMinActual();
578 mSignalStorage[
"iDenMax"] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
581 if (!mLutStorage.count(
"iDen")) {
583 mLutStorage[
"iDen"]->setFloatFunction(
584 [ = ](
double aValue) ->
double{
return 0.5 / aValue;},
585 mSignalStorage[
"den_c"],
586 mSignalStorage[
"iDenMin"], mSignalStorage[
"iDenMax"], pow(1 / mSignalStorage[
"cossinsum"].getToReal(), 2),
591 mLutStorage[
"iDen"]->operate(mSignalStorage[
"den_c"], mSignalStorage[
"iDen"]);
593 mSignalStorage[
"hcx"] <= mSignalStorage[
"hcx_p2"] * mSignalStorage[
"iDen"];
594 mSignalStorage[
"hcy"] <= mSignalStorage[
"hcy_p2"] * mSignalStorage[
"iDen"];
596 mSignalStorage[
"hcx2"] <= mSignalStorage[
"hcx"] * mSignalStorage[
"hcx"];
597 mSignalStorage[
"hcy2"] <= mSignalStorage[
"hcy"] * mSignalStorage[
"hcy"];
598 mSignalStorage[
"sumhc"] <= mSignalStorage[
"hcx2"] + mSignalStorage[
"hcy2"];
600 mSignalStorage[
"sumhcMin"] =
Belle2::TRGCDCJSignal(4489, mSignalStorage[
"sumhc"].getToReal(), commonData);
601 mSignalStorage[
"sumhcMax"] =
Belle2::TRGCDCJSignal(2560000, mSignalStorage[
"sumhc"].getToReal(), commonData);
607 vector<pair<Belle2::TRGCDCJSignal, vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > > > t_data;
611 vector<pair<Belle2::TRGCDCJSignal*, Belle2::TRGCDCJSignal> > t_assigns = {
612 make_pair(&mSignalStorage[
"sumhc_c"], mSignalStorage[
"sumhcMax"])
615 t_data.push_back(make_pair(t_compare, t_assigns));
620 make_pair(&mSignalStorage[
"sumhc_c"], mSignalStorage[
"sumhc"].limit(mSignalStorage[
"sumhcMin"], mSignalStorage[
"sumhcMax"]))
623 t_data.push_back(make_pair(t_compare, t_assigns));
628 make_pair(&mSignalStorage[
"sumhc_c"], mSignalStorage[
"sumhcMin"])
631 t_data.push_back(make_pair(t_compare, t_assigns));
635 unsigned long long t_int = mSignalStorage[
"sumhc_c"].getMaxInt();
636 double t_toReal = mSignalStorage[
"sumhc_c"].getToReal();
637 double t_actual = mSignalStorage[
"sumhc_c"].getMaxActual();
638 mSignalStorage[
"iRhoMax"] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
639 t_int = mSignalStorage[
"sumhc_c"].getMinInt();
640 t_actual = mSignalStorage[
"sumhc_c"].getMinActual();
641 mSignalStorage[
"iRhoMin"] =
Belle2::TRGCDCJSignal(t_int, t_toReal, t_int, t_int, t_actual, t_actual, t_actual, -1, commonData);
644 if (!mLutStorage.count(
"iRho")) {
646 mLutStorage[
"iRho"]->setFloatFunction(
647 [ = ](
double aValue) ->
double{
return abs(
sqrt(aValue));},
648 mSignalStorage[
"sumhc_c"],
649 mSignalStorage[
"iRhoMin"], mSignalStorage[
"iRhoMax"], mSignalStorage[
"sumhc"].getToReal(),
653 mLutStorage[
"iRho"]->operate(mSignalStorage[
"sumhc_c"], mSignalStorage[
"iRho"]);
655 cout <<
"<<<iRho>>>" << endl;
656 mSignalStorage[
"iRho"].dump();
858 std::vector<TRGCDCTrack*>& trackList2DFitted)
861 const string sn =
"Hough Finder Fitting";
869 bool fEvtTime =
true;
871 double eventTime = fEvtTime ?
_cdc.getEventTime() : 0;
874 for (
unsigned int iTrack = 0; iTrack < trackList2D.size(); iTrack++) {
875 TCTrack& aTrack = *
new TCTrack(* trackList2D[iTrack]);
876 trackList2DFitted.push_back(& aTrack);
879 vector<double> nWires(9);
880 vector<double> rr(9);
882 vector<double> wirePhi2DError(5);
883 wirePhi2DError[0] = 0.0085106;
884 wirePhi2DError[1] = 0.0039841;
885 wirePhi2DError[2] = 0.0025806;
886 wirePhi2DError[3] = 0.0019084;
887 wirePhi2DError[4] = 0.001514;
888 vector<double> driftPhi2DError(5);
889 driftPhi2DError[0] = 0.0085106;
890 driftPhi2DError[1] = 0.0039841;
891 driftPhi2DError[2] = 0.0025806;
892 driftPhi2DError[3] = 0.0019084;
893 driftPhi2DError[4] = 0.001514;
896 for (
unsigned iSL = 0; iSL <
_cdc.nSuperLayers(); iSL = iSL + 2) {
898 const vector<TCLink*>& links = aTrack.links(iSL);
899 const unsigned nSegments = links.size();
903 << nSegments << endl;
907 bool priorityHitTS = 0;
908 for (
unsigned iTS = 0; iTS < nSegments; iTS++) {
909 const TCSegment* _segment =
dynamic_cast<const TCSegment*
>(& links[iTS]->hit()->cell());
910 if (_segment->center().hit() != 0) priorityHitTS = 1;
912 if (nSegments != 1) {
913 if (nSegments == 0) {
917 <<
"=> Not enough TS." << endl;
921 <<
"=> multiple TS are assigned." << endl;
924 if (priorityHitTS == 0) {
928 <<
"=> There are no priority hit TS" << endl;
932 if (trackFull == 0) {
934 CLHEP::HepVector helixParameters(5);
935 helixParameters = aTrack.helix().a();
937 aTrack.setHelix(helix);
941 for (
unsigned iSL = 0; iSL < 9; iSL++) {
942 unsigned _layerId =
_cdc.segment(iSL, 0).center().layerId();
946 rr2D = vector<double>({rr[0], rr[2], rr[4], rr[6], rr[8]});
949 vector<double>wirePhi(9);
950 vector<double>driftLength(9);
952 vector<double>lutLR(9);
953 vector<double>mcLR(9);
954 bool fmcLR =
false, fLRLUT =
true;
955 for (
unsigned iSL = 0; iSL < 9; iSL = iSL + 2) {
956 const vector<TCLink*>& links = aTrack.links(iSL);
957 const TCSegment* _segment =
dynamic_cast<const TCSegment*
>(& links[0]->hit()->cell());
958 wirePhi[iSL] = _segment->localId() / nWires[iSL] * 4 * M_PI;
959 lutLR[iSL] = _segment->LUT()->getValue(_segment->lutPattern());
960 mcLR[iSL] = _segment->hit()->mcLR();
961 driftLength[iSL] = _segment->hit()->drift();
963 if (fmcLR) LR[iSL] = mcLR[iSL];
965 else if (fLRLUT) LR[iSL] = lutLR[iSL];
971 vector<double>phi2DError(5);
972 for (
unsigned iAx = 0; iAx < 5; iAx++) {
973 if (LR[2 * iAx] != 2) phi2DError[iAx] = driftPhi2DError[iAx];
974 else phi2DError[iAx] = wirePhi2DError[iAx];
977 vector<double>phi2D(5);
978 for (
unsigned iAx = 0; iAx < 5; iAx++) {
980 driftLength[iAx * 2],
985 cout <<
TRGDebug::tab() <<
"eventTime: " << eventTime << endl;
986 for (
int i = 0 ; i < 5 ; i++) {
991 driftLength[i * 2] << endl;
997 double rho, phi0, pt, chi2;
1001 vector<double>phi2DInvError(5);
1002 for (
unsigned iAx = 0; iAx < 5; iAx++) {
1003 phi2DInvError[iAx] = 1 / phi2DError[iAx];
1008 pt = 0.3 * 1.5 * rho / 100;
1017 CLHEP::HepVector a(5);
1018 a = aTrack.helix().a();
1019 a[1] = (aTrack.charge() < 0) ? fmod(phi0 + M_PI, 2 * M_PI) : phi0;
1020 a[2] = 1 / pt * aTrack.charge();
1022 aTrack.setFitted(1);
1023 aTrack.setHelix(helix);
1024 aTrack.set2DFitChi2(chi2);
1030 double rhoMax = 1600;
1031 int phiBitSize = 12;
1032 int rhoBitSize = 12;
1033 vector<tuple<string, double, int, double, double, int> > t_values = {
1034 make_tuple(
"phi_0", phi2D[0], phiBitSize, -2 * M_PI, 2 * M_PI, 0),
1035 make_tuple(
"phi_1", phi2D[1], phiBitSize, -2 * M_PI, 2 * M_PI, 0),
1036 make_tuple(
"phi_2", phi2D[2], phiBitSize, -2 * M_PI, 2 * M_PI, 0),
1037 make_tuple(
"phi_3", phi2D[3], phiBitSize, -2 * M_PI, 2 * M_PI, 0),
1038 make_tuple(
"phi_4", phi2D[4], phiBitSize, -2 * M_PI, 2 * M_PI, 0),
1039 make_tuple(
"rho", rho, rhoBitSize, rhoMin, rhoMax, 0),
1040 make_tuple(
"2Drr_0", rr[0], 12, 18.8, 105.68, 0),
1041 make_tuple(
"2Drr_1", rr[2], 12, 18.8, 105.68, 0),
1042 make_tuple(
"2Drr_2", rr[4], 12, 18.8, 105.68, 0),
1043 make_tuple(
"2Drr_3", rr[6], 12, 18.8, 105.68, 0),
1044 make_tuple(
"2Drr_4", rr[8], 12, 18.8, 105.68, 0),
1052 bool updateSecondName =
false;
1055 (*it).second.setName((*it).first);
1057 updateSecondName =
true;
1060 if (updateSecondName) {
1075 it->second->makeCOE(it->first +
".coe");
1082#ifdef TRGCDC_DISPLAY_HOUGH
1083 vector<const TCTrack*> cc;
1084 cc.push_back(& aTrack);
1085 const string stg =
"doFitting : Kaiyu method";
1086 const string inf =
" ";
1089 D->information(inf);
1090 D->area().append(
_cdc.hits());
1091 D->area().append(
_cdc.segmentHits());
1092 D->area().append(cc, Gdk::Color(
"blue"));