20 m_minDeltaRadius(10.0),
30 const double radLen = 0.036;
32 const double ptCoeff = 0.29997*1.9972/2.0;
59 for(std::vector<TrigSiSpacePointBase>::const_iterator
it = vSP.begin();
it != vSP.end();++
it) {
60 int layerId = (*it).layer();
65 bool updateTauRange =
false;
80 updateTauRange = LUT.
getValidRange(cluster_width, minTau, maxTau);
89 else if (phiIdx < 0) {
129 for(
int layerI=1;layerI<nLayers;layerI++) {
132 if(
S.m_nSP==0)
continue;
138 for(
auto spm :
S.m_phiSlices[phiI]) {
140 float zm = spm->m_pSP->z();
141 float rm = spm->m_pSP->r();
149 for(
int layerJ=0;layerJ<nLayers;layerJ++) {
154 if(checkPSS)
continue;
156 if((!isSct) && (!isPixel2)) {
165 const std::vector<const INDEXED_SP*>& spVec =
m_pStore->
m_layers[layerJ].m_phiThreeSlices.at(phiI);
167 if(spVec.empty())
continue;
185 std::vector<TrigInDetTriplet> tripletVec;
205 if(vZv.empty())
return;
210 float roiZMinus = -225;
211 float roiZPlus = 225;
216 for(
int layerI=1;layerI<nLayers;layerI++) {
219 if(
S.m_nSP==0)
continue;
228 for(
auto spm :
S.m_phiSlices[phiI]) {
230 float zm = spm->m_pSP->z();
231 float rm = spm->m_pSP->r();
234 float maxTau = 100.0;
241 std::vector<TrigInDetTriplet> tripletVec;
243 for(
const auto zVertex : vZv) {
253 for(
int layerJ=0;layerJ<nLayers;layerJ++) {
258 if(isSct && isPixel2)
continue;
259 if((!isSct) && (!isPixel2))
continue;
267 const std::vector<const INDEXED_SP*>& spVec =
m_pStore->
m_layers[layerJ].m_phiThreeSlices.at(phiI);
269 if(spVec.empty())
continue;
293 const float deltaRefCoord = 5.0;
295 if(layerJ==layerI)
return false;
307 if((typeI!=0) && (typeJ!=0) && refCoordI*refCoordJ<0.0)
return false;
340 if(maxB<=rm)
return false;
347 float zMax = (zm*maxB-rm*refCoordJ)/(maxB-rm);
350 float zMin = (zm*minB-rm*refCoordJ)/(minB-rm);
366 if(minB == rm)
return false;
367 float zMax = (zm*minB-rm*refCoordJ)/(minB-rm);
370 float zMin = (zm*maxB-rm*refCoordJ)/(maxB-rm);
385 float zMin = (zm*maxB-rm*refCoordJ)/(maxB-rm);
388 float zMax = (zm*minB-rm*refCoordJ)/(minB-rm);
402 if(minB == rm)
return false;
403 float zMin = (zm*minB-rm*refCoordJ)/(minB-rm);
406 float zMax = (zm*maxB-rm*refCoordJ)/(maxB-rm);
420 if(maxBoundJ<m_minCoord || minBoundJ>
m_maxCoord)
return false;
431 float minSpCoord = (
isBarrel) ? (*spVec.begin())->m_pSP->z() : (*spVec.begin())->m_pSP->r();
432 float maxSpCoord = (
isBarrel) ? (*spVec.rbegin())->m_pSP->z() : (*spVec.rbegin())->m_pSP->r();
435 float tmp = minSpCoord;minSpCoord = maxSpCoord;maxSpCoord =
tmp;
443 std::vector<const INDEXED_SP*>::const_iterator
it1 = spVec.end();
444 std::vector<const INDEXED_SP*>::const_iterator it2 = spVec.end();
463 delta.first =
it1;delta.second = it2;
475 float rm = spm->
m_pSP->
r();
476 float zm = spm->
m_pSP->
z();
478 float dZ = refCoord-zm;
479 float dR_i =
isBarrel ? 1.0/(refCoord-rm) : 1.0;
483 for(std::vector<const INDEXED_SP*>::const_iterator spIt=delta.first; spIt!=delta.second; ++spIt) {
485 float zsp = (*spIt)->m_pSP->z();
486 float rsp = (*spIt)->m_pSP->r();
493 if(isPixel && !(*spIt)->m_pSP->isPixel()) {
502 if (
dr<0 && checkPSS)
continue;
506 float ftau = std::fabs(tau);
507 if (ftau > 7.41)
continue;
509 if(isPixel && SeedML > 0) {
514 float z0 = zm - rm*tau;
522 if(
isBarrel && (*spIt)->m_pSP->isPixel()) {
523 if(SeedML == 3 || SeedML == 4) {
524 if(ftau <
m_minTau[(*spIt)->m_idx] || ftau >
m_maxTau[(*spIt)->m_idx])
continue;
532 if(
isBarrel && (*spIt)->m_pSP->isPixel()) {
533 if(SeedML == 2 || SeedML == 4) {
534 if(ftau <
m_minTau[(*spIt)->m_idx] || ftau >
m_maxTau[(*spIt)->m_idx])
continue;
551 float rm = spm->
m_pSP->
r();
552 float zm = spm->
m_pSP->
z();
556 for(std::vector<const INDEXED_SP*>::const_iterator spIt=delta.first; spIt!=delta.second; ++spIt) {
558 float rsp = (*spIt)->m_pSP->r();
559 float zsp = (*spIt)->m_pSP->z();
567 if (
dr<0 && checkPSS)
continue;
571 float ftau = std::fabs(tau);
573 if (ftau > 7.41)
continue;
576 if(ftau < minTau || ftau > maxTau)
continue;
580 if((*spIt)->m_pSP->isPixel()) {
581 if(SeedML == 3 || SeedML == 4) {
582 if(ftau <
m_minTau[(*spIt)->m_idx] || ftau >
m_maxTau[(*spIt)->m_idx])
continue;
588 if((*spIt)->m_pSP->isPixel()) {
589 if(SeedML == 2 || SeedML == 4) {
590 if(ftau <
m_minTau[(*spIt)->m_idx] || ftau >
m_maxTau[(*spIt)->m_idx])
continue;
605 if(nInner==0 || nOuter==0)
return;
613 int nSP = nInner + nOuter;
615 const double pS_r = pS->
r();
616 const double pS_x = pS->
x();
617 const double pS_y = pS->
y();
618 const double pS_dr = pS->
dr();
619 const double pS_dz = pS->
dz();
620 const double cosA = pS_x/pS_r;
621 const double sinA = pS_y/pS_r;
622 const double covZ = pS_dz*pS_dz;
623 const double covR = pS_dr*pS_dr;
624 const bool isPixel = pS->
isPixel();
632 const double dx = pSP->
x() - pS_x;
633 const double dy = pSP->
y() - pS_y;
634 const double R2inv = 1.0/(
dx*
dx+
dy*
dy);
635 const double Rinv = std::sqrt(R2inv);
636 const double xn =
dx*cosA +
dy*sinA;
637 const double yn =-
dx*sinA +
dy*cosA;
638 const double dz = pSP->
z() - pS->
z();
639 const double t = Rinv*dz;
649 const double covZP = pSP->
dz()*pSP->
dz();
650 const double covRP = pSP->
dr()*pSP->
dr();
656 for(
int k=0;
k<nOuter;
k++,
idx++) {
661 const double dx = pSP->
x() - pS_x;
662 const double dy = pSP->
y() - pS_y;
663 const double R2inv = 1.0/(
dx*
dx+
dy*
dy);
664 const double Rinv = std::sqrt(R2inv);
665 const double xn =
dx*cosA +
dy*sinA;
666 const double yn =-
dx*sinA +
dy*cosA;
667 const double dz = -pSP->
z() + pS->
z();
668 const double t = Rinv*dz;
678 const double covZP = pSP->
dz()*pSP->
dz();
679 const double covRP = pSP->
dr()*pSP->
dr();
687 for(
int innIdx=0;innIdx<nInner;innIdx++) {
691 const double r_inn =
m_SoA.
m_r[innIdx];
692 const double t_inn =
m_SoA.
m_t[innIdx];
693 const double v_inn =
m_SoA.
m_v[innIdx];
694 const double u_inn =
m_SoA.
m_u[innIdx];
696 const double dCov =
m_CovMS*(1+t_inn*t_inn);
699 for(
int outIdx=nInner;outIdx<nSP;outIdx++) {
702 const double t_out =
m_SoA.
m_t[outIdx];
706 const double dt2 =
std::pow((t_inn - t_out), 2)*(1.0/9.0);
709 double covdt = (t_inn*t_out*covR + covZ);
713 if(dt2 > covdt+dCov)
continue;
717 const double du =
m_SoA.
m_u[outIdx] - u_inn;
718 if(du==0.0)
continue;
719 const double A = (
m_SoA.
m_v[outIdx] - v_inn)/du;
720 const double B = v_inn -
A*u_inn;
721 const double R_squ = (1 +
A*
A)/(
B*
B);
728 if(dt2 > covdt+
frac*dCov)
continue;
732 const double fabs_d0 = std::fabs(pS_r*(
B*pS_r -
A));
743 const double uc = 2*
B*pS_r -
A;
744 const double phi0 = atan2(sinA - uc*cosA, cosA + uc*sinA);
762 return A.Q() > B.Q();
767 if( Q >= (*it).Q()) {
781 if(nInner==0 || nOuter==0)
return;
787 int nSP = nInner + nOuter;
825 for(
int k=0;
k<nL;
k++) {
836 double min_el=1000.0;
838 for(
int k=0;
k<nL;
k++) {
839 if(nleft[
k]==0)
continue;
849 int i_min = iter[k_min];
861 iter[k_min] +=
dirs[k_min];
863 if(nleft[k_min]==0) {
870 const double pS_r = pS->
r();
871 const double pS_x = pS->
x();
872 const double pS_y = pS->
y();
874 const double pS_dr = pS->
dr();
875 const double pS_dz = pS->
dz();
876 const double cosA = pS_x/pS_r;
877 const double sinA = pS_y/pS_r;
878 const double covZ = pS_dz*pS_dz;
879 const double covR = pS_dr*pS_dr;
880 const bool isPixel = pS->
isPixel();
888 const double dx = pSP->
x() - pS_x;
889 const double dy = pSP->
y() - pS_y;
890 const double R2inv = 1.0/(
dx*
dx+
dy*
dy);
891 const double Rinv = std::sqrt(R2inv);
892 const double xn =
dx*cosA +
dy*sinA;
893 const double yn =-
dx*sinA +
dy*cosA;
896 const double t = Rinv*dz;
906 const double covZP = pSP->
dz()*pSP->
dz();
907 const double covRP = pSP->
dr()*pSP->
dr();
925 const double r_inn =
m_SoA.
m_r[iter1];
926 const double t_inn =
m_SoA.
m_t[iter1];
927 const double v_inn =
m_SoA.
m_v[iter1];
928 const double u_inn =
m_SoA.
m_u[iter1];
930 const double dCov =
m_CovMS*(1+t_inn*t_inn);
932 for(
int iter2=iter1+1;iter2<nSP;iter2++) {
939 const double t_out =
m_SoA.
m_t[iter2];
941 const double dt2 =
std::pow((t_inn - t_out), 2)*(1.0/9.0);
943 double covdt = (t_inn*t_out*covR + covZ);
947 if(dt2 > covdt+dCov)
continue;
951 const double du =
m_SoA.
m_u[iter2] - u_inn;
952 if(du==0.0)
continue;
954 const double A = (
m_SoA.
m_v[iter2] - v_inn)/du;
956 const double B = (1-type1)*(v_inn -
A*u_inn) + type1*(
m_SoA.
m_v[iter2] -
A*
m_SoA.
m_u[iter2]);
957 const double R_squ = (1 +
A*
A)/(
B*
B);
964 if(dt2 > covdt+
frac*dCov)
continue;
967 const double B_pS_r =
B*pS_r;
968 const double fabs_d0 = std::fabs(pS_r*(B_pS_r -
A));
975 if (isSCT && isPixel) {
983 double uc = 2*B_pS_r -
A;
985 const double phi0 = atan2(sinA - uc*cosA, cosA + uc*sinA);
994 const double Q = fabs_d0*fabs_d0;
999 return A.Q() > B.Q();
1004 if( Q >= (*it).Q()) {
1014 output.emplace_back(*pSPI, *pS, *pSPO, Q);
1029 ProtoSeed(
const ProtoSeed& ps) : m_sp(ps.m_sp), m_curv(ps.m_curv), m_Q(ps.m_Q), m_confirmed(ps.m_confirmed) {};
1035 if(nInner==0 || nOuter==0)
return;
1041 int nSP = nInner + nOuter;
1043 const double pS_r = pS->
r();
1044 const double pS_x = pS->
x();
1045 const double pS_y = pS->
y();
1046 const double pS_dr = pS->
dr();
1047 const double pS_dz = pS->
dz();
1048 const double cosA = pS_x/pS_r;
1049 const double sinA = pS_y/pS_r;
1050 const double covZ = pS_dz*pS_dz;
1051 const double covR = pS_dr*pS_dr;
1052 const bool isPixel = pS->
isPixel();
1064 const double dx = pSP->
x() - pS_x;
1065 const double dy = pSP->
y() - pS_y;
1066 const double R2inv = 1.0/(
dx*
dx+
dy*
dy);
1067 const double Rinv = std::sqrt(R2inv);
1068 const double xn =
dx*cosA +
dy*sinA;
1069 const double yn =-
dx*sinA +
dy*cosA;
1070 const double dz = pSP->
z() - pS->
z();
1071 const double t = Rinv*dz;
1081 const double covZP = pSP->
dz()*pSP->
dz();
1082 const double covRP = pSP->
dr()*pSP->
dr();
1088 for(
int k=0;
k<nOuter;
k++,
idx++) {
1093 const double dx = pSP->
x() - pS_x;
1094 const double dy = pSP->
y() - pS_y;
1095 const double R2inv = 1.0/(
dx*
dx+
dy*
dy);
1096 const double Rinv = std::sqrt(R2inv);
1097 const double xn =
dx*cosA +
dy*sinA;
1098 const double yn =-
dx*sinA +
dy*cosA;
1099 const double dz = -pSP->
z() + pS->
z();
1100 const double t = Rinv*dz;
1110 const double covZP = pSP->
dz()*pSP->
dz();
1111 const double covRP = pSP->
dr()*pSP->
dr();
1119 for(
int innIdx=0;innIdx<nInner;innIdx++) {
1123 const double r_inn =
m_SoA.
m_r[innIdx];
1124 const double t_inn =
m_SoA.
m_t[innIdx];
1125 const double v_inn =
m_SoA.
m_v[innIdx];
1126 const double u_inn =
m_SoA.
m_u[innIdx];
1128 const double dCov =
m_CovMS*(1+t_inn*t_inn);
1130 std::vector<ProtoSeed> vPro;
1133 for(
int outIdx=nInner;outIdx<nSP;outIdx++) {
1136 const double t_out =
m_SoA.
m_t[outIdx];
1138 const double dt2 =
std::pow((t_inn - t_out), 2)*(1.0/9.0);
1141 double covdt = (t_inn*t_out*covR + covZ);
1142 covdt *= 2*r_inn*
m_SoA.
m_r[outIdx];
1145 if(dt2 > covdt+dCov)
continue;
1149 const double du =
m_SoA.
m_u[outIdx] - u_inn;
1150 if(du==0.0)
continue;
1151 const double A = (
m_SoA.
m_v[outIdx] - v_inn)/du;
1152 const double B = v_inn -
A*u_inn;
1153 const double R_squ = (1 +
A*
A)/(
B*
B);
1161 if(dt2 > covdt+
frac*dCov)
continue;
1165 const double fabs_d0 = std::fabs(pS_r*(
B*pS_r -
A));
1180 if (isOuterPixel && (bestQ < Q))
continue;
1186 const double uc = 2*
B*pS_r -
A;
1187 const double phi0 = atan2(sinA - uc*cosA, cosA + uc*sinA);
1196 const double Curv =
B/std::sqrt(1+
A*
A);
1199 bool isConfirmed =
false;
1201 for(
auto& ps : vPro) {
1202 double diffC = 1 - Curv/ps.m_curv;
1204 ps.m_confirmed =
true;
1213 vPro.emplace_back(ProtoSeed(
m_SoA.
m_spo[outIdx-nInner], Curv, Q, isConfirmed));
1217 for(
const auto& ps : vPro) {
1218 if(!ps.m_confirmed)
continue;
1227 return A.Q() < B.Q();
1230 double QL =
output.back().Q();
1250 float newQ = (*it).Q();
1254 newQ += (*it).s1().isSCT() ? 1000.0 : 10000.0;
1265 return A.Q() < B.Q();