27 #define USE_CA_FIT //25.01.17
33 #define START_FROM_TARGET // how to fit
34 #elif defined(PANDA_STT) || defined(PANDA_FTS)
35 #define START_FROM_TARGET
36 #define USE_CA_FIT //14.02.17
46 #if !defined(PANDA_FTS)
50 #include "TStopwatch.h"
58 #include "Math/SMatrix.h"
86 fSliceTrackerTime( 0 ),
87 fSliceTrackerCpuTime( 0 ),
89 fTi(fNFindIterations),
91 fStatTi(fNFindIterations)
135 for (
int i = 0;
i < 20; ++
i ) {
173 const int NMCTracks = perf->GetMCTracks()->Size();
174 vector<vector<int> >
hits(NMCTracks+1);
178 int id =
fHits[iH].ID();
179 int trackId = perf->HitLabel(
id).fLab[0];
180 for(
int k = 1; k < 3 && trackId < 0; k++ )
181 trackId = perf->HitLabel(
id).fLab[k];
182 if ( trackId < 0 )
continue;
183 hits[trackId].push_back(iH);
186 int nTracks = NMCTracks;
198 for(
int iT=0; iT<NMCTracks; iT++)
202 int nFirstMC = (*perf->GetMCTracks())[iT].FirstMCPointID();
211 mcTrackParam.SetX(points[0].
X());
212 mcTrackParam.SetY(points[0].
Y());
213 mcTrackParam.SetTX(points[0].Px()/points[0].Pz());
214 mcTrackParam.SetTY(points[0].Py()/points[0].Pz());
215 mcTrackParam.SetQP(points[0].QP());
216 mcTrackParam.SetZ(points[0].
Z());
223 for(
unsigned int iH=0; iH<hits[iT].size(); iH++)
225 int iStation =
fHits[ hits[iT][iH] ].IRow();
226 if(iStation <= curStation)
continue;
232 curStation = iStation;
245 cout<<
"Fitting tracks \n";
246 for(
int iTr=0; iTr<
fNTracks; iTr+=uint_v::Size)
248 int nTracksVector = uint_v::Size;
250 if( iTr + uint_v::Size >= fNTracks)
251 nTracksVector = fNTracks - iTr;
256 uint_v::Memory nTrackHits;
257 uint_v::Memory memFirstHits;
264 for(
int iv=0; iv<nTracksVector; iv++)
272 endPoint[iv] = startPoint[iv];
279 uint_v nHitsDraw(nTrackHits);
281 for(
unsigned int ihit = 0; ihit<nHitsDraw.max(); ihit++)
283 for(
unsigned int iV=0; iV<nTracksVector; iV++)
285 if( ihit > nTrackHits[iV] - 1)
continue;
286 const unsigned int jhit = ihit;
288 #ifdef DRAW_FIT_LOCAL
290 float xLoc, yLoc, zLoc;
295 const int iMCP = perf->GetMCPoint( h );
296 if (iMCP < 0)
continue;
299 float xLoc, yLoc, zLoc;
311 foreach_bit(
unsigned int iV, mcmask){
312 if (mcmask[iV]==0)
continue;
315 const PndFTSPerformanceBase::PndFTSCAHitLabel &l = perf->HitLabel( hh.
ID() );
316 const int MCIndex = l.fLab[0];
320 for(
int iP = 0; iP < mc.
NMCPoints(); iP++ ) {
322 #ifdef DRAW_FIT_LOCAL
327 double mcX0 = mcPoint.
X();
328 double mcY0 = mcPoint.
Y();
329 double mcZ = mcPoint.
Z();
343 float_m active0 =
static_cast<float_m
>( uint_v( Vc::IndexesFromZero ) < nTracksVector );
345 uint_v firstHits(memFirstHits);
347 float_m fitted = float_m(
true);
348 fitted &=
static_cast<float_m
>(
static_cast<uint_v
>(nTrackHits) > 0);
359 for (
unsigned int i=0;
i<1;
i++){
360 vEndPoint = vStartPoint;
379 vEndPoint.SetDirection(
true);
385 fitted &=
FitTrackCA( vEndPoint, firstHits, nTrackHits, nTracksVector, active0, 0, init );
386 vStartPoint = vEndPoint;
408 vStartPoint.SetDirection(
false);
410 fitted &=
FitTrackCA( vStartPoint, firstHits, nTrackHits, nTracksVector,active0, 1 );
419 for(
int iTimes = 0; iTimes<1; iTimes++)
421 vEndPoint = vStartPoint;
423 fitted &=
FitTrack( vEndPoint, firstHits, nTrackHits, nTracksVector,active0, 0 );
429 for(
int ihit = 0; ihit<nHitsDraw.max(); ihit++)
431 for(
int iV=0; iV<nTracksVector; iV++)
433 if( ihit > nTrackHits[iV] - 1)
continue;
434 const int jhit = ihit;
436 #ifdef DRAW_FIT_LOCAL
437 float xLoc, yLoc, zLoc;
447 vStartPoint = vEndPoint;
449 fitted &=
FitTrack( vStartPoint, firstHits, nTrackHits, nTracksVector,active0, 1 );
455 for(
int ihit = 0; ihit<nHitsDraw.max(); ihit++)
457 for(
int iV=0; iV<nTracksVector; iV++)
459 if( ihit > nTrackHits[iV] - 1)
continue;
460 const int jhit = ihit;
462 #ifdef DRAW_FIT_LOCAL
463 float xLoc, yLoc, zLoc;
476 for(
int iV=0; iV < nTracksVector; iV++)
487 for(
int iV = 0; iV<nTracksVector; iV++)
501 uint_v::Memory &NTrackHits,
502 int &nTracksV, float_m active0,
bool dir,
bool init )
504 UNUSED_PARAM2(nTracksV, dir);
505 float_m active = active0;
507 uint_v NTHits(NTrackHits);
508 active &= NTHits >= 3;
510 if (active.isEmpty())
return active;
512 NTHits.setZero(static_cast<uint_m>(!active));
521 #if 1 // check tracks
522 const unsigned int NHitsMax = NTHits.max();
523 unsigned int FirstHit = 0;
525 #else // check tracklets
527 const unsigned int NHitsMax = 6;
528 const unsigned int FirstHit = 15;
529 const bool AddLastHit =
true;
533 if (active.isEmpty())
return active;
535 vector<FTSCAHitV>
hits( NHitsMax );
537 for (
unsigned int ihit = FirstHit; (ihit-FirstHit) < NHitsMax; ihit++ ) {
538 const uint_m valid = ihit < NTHits;
542 foreach_bit(
unsigned int iV, valid) {
544 id[iV] = firstHits[iV] + (NTHits[iV]-
static_cast<unsigned int>(1)) - ihit;
546 id[iV] = firstHits[iV] + ihit;
549 hits[ihit-FirstHit] =
FTSCAHitV( hs, uint_v(
id), static_cast<float_m>(valid) );
558 t.SetField(0, b2, z2);
559 t.SetField(1, b2, z2);
561 #if (defined(USE_MC_PV) && defined(STAR_HFT))
562 const double *pv = PndFTSCAPerformance::Instance().PV();
563 float xT = pv[0], yT = pv[1], zT = pv[2];
565 float xT = 0, yT = 0, zT = 0;
569 #if defined(PANDA_STT)
571 #elif defined(PANDA_FTS)
577 #ifdef START_FROM_TARGET // target + hit
599 float_v qp0 = t.QP();
601 for (
unsigned int ihit = 0; ihit < NHitsMax; ihit++ ) {
631 #else // start from hit + target
638 #endif // START_FROM_TARGET
640 active &= float_m(uint_v(ihit)<NTHits);
644 float_m bufactive(
false);
645 float_m flashback(
false);
650 if (((ista[0]==8 || ista[0]==16 || ista[0]==24 || ista[0]==32 || ista[0]==40) && !dir) || ((ista[0]==7 || ista[0]==15 || ista[0]==23 || ista[0]==31 || ista[0]==39) && dir))
652 flashback = (ista==8 || ista==16 || ista==24 || ista==32 || ista==40 ||ista==39 || ista==31 || ista==23 || ista==15 || ista==7);
668 if (((ista[0]==8 || ista[0]==16 || ista[0]==24 || ista[0]==32 || ista[0]==40) && !dir) || ((ista[0]==7 || ista[0]==15 || ista[0]==23 || ista[0]==31 || ista[0]==39) && dir))
670 flashback = (abs(t.Err2X())>20.
f || isnan(t.Err2X()));
673 t.SetQP(t.QP()/10.f, flashback);
679 float_v xGl, yGl, zGl;
681 foreach_bit(
unsigned int iV, flashback )
697 float_v xGl, yGl, zGl;
699 foreach_bit(
unsigned int iV, active )
703 #ifdef DRAW_FIT_LOCAL
705 cout << t.
X()[iV] <<
" " << t.
Y()[iV] <<
" " << t.
Z()[iV] << endl;
760 float_v xGl, yGl, zGl;
763 foreach_bit(
unsigned int iV, active )
768 #ifdef DRAW_FIT_LOCAL
772 cout << hit.
X0()[iV] <<
" " << hit.
X1()[iV] <<
" " << hit.
X2()[iV] <<
" " << t.
X()[iV] <<
" " << t.
Y()[iV] <<
" " << t.
Z()[iV] << endl;
814 #if !defined(PANDA_FTS)
820 float_m
ok = active0;
833 uint_v::Memory &NTrackHits,
834 int &nTracksV, float_m active0 )
838 uint_v
nHits(NTrackHits);
839 nHits.setZero(static_cast<uint_m>(!active0));
842 unsigned int nHitsMax = nHits.max();
850 float_v::Memory xH0, yH0, zH0, angle0;
851 for(
int iV=0; iV < nTracksV; iV++)
853 if( !(active0[iV]) )
continue;
859 angle0[iV] = h.
Angle();
864 const float_v angleV0(angle0);
865 float_v xV0, yV0, zV0(zH0);
868 vector<float_v> xV(nHitsMax), yV(nHitsMax), zV(nHitsMax);
870 for (
unsigned int ihit = 0; ihit < nHitsMax; ihit++ ) {
872 float_m active =
static_cast<float_m
>( ihit <
nHits );
873 if(active.isEmpty())
continue;
874 float_v::Memory xH, yH, zH;
876 for(
int iV=0; iV < nTracksV; iV++)
878 if( !(active[iV]) )
continue;
879 if( ihit > NTrackHits[iV] - 1)
continue;
963 for(
int ihit = 0; ihit < nHitsMax; ihit++)
965 float_m active =
static_cast<float_m
>( ihit <
nHits );
966 if(active.isEmpty())
continue;
980 xr2(active)+= lx*lr2;
981 yr2(active)+= ly*lr2;
982 r4(active) += lr2*lr2;
985 x /=
static_cast<float_v
>(
nHits);
986 y /=
static_cast<float_v
>(
nHits);
987 xy /=
static_cast<float_v
>(
nHits);
988 x2 /=
static_cast<float_v
>(
nHits);
989 y2 /=
static_cast<float_v
>(
nHits);
990 xr2 /=
static_cast<float_v
>(
nHits);
991 yr2 /=
static_cast<float_v
>(
nHits);
992 r2 /=
static_cast<float_v
>(
nHits);
993 r4 /=
static_cast<float_v
>(
nHits);
995 const float_v Cxx = x2 -
x*
x;
996 const float_v Cxy = xy - x*
y;
997 const float_v Cyy = y2 - y*
y;
998 const float_v Cxr2 = xr2 - x*
r2;
999 const float_v Cyr2 = yr2 - y*
r2;
1000 const float_v Cr2r2 = r4 - r2*
r2;
1002 const float_v Q1 = Cr2r2*Cxy - Cxr2*Cyr2;
1003 const float_v Q2 = Cr2r2*(Cxx-Cyy) - Cxr2*Cxr2 + Cyr2*Cyr2;
1007 const float_v Kappa = (SinPhi*Cxr2 - CosPhi*Cyr2)/Cr2r2;
1009 const float_v Delta = SinPhi*x - CosPhi*y - Kappa*
r2;
1021 const float_v sinPhi0 = -
X*kappa;
1022 const float_v cosPhi0 =
Y*kappa;
1025 for (
int ihit = 0; ihit < nHitsMax; ihit++ ) {
1027 float_m active =
static_cast<float_m
>( ihit <
nHits );
1028 if(active.isEmpty())
continue;
1030 lx(active) = xV[ihit]-xV0;
1031 ly(active) = yV[ihit]-yV0;
1033 const float_v ex = cosPhi0;
1034 const float_v ey = sinPhi0;
1035 const float_v
dx =
lx;
1037 float_v ey1 = kappa * dx + ey;
1041 float_v ex1 = 1.f - ey1 * ey1;
1047 const float_v ss = ey + ey1;
1048 const float_v cc = ex + ex1;
1050 float_v cci = 1.f / cc;
1052 float_v exi = 1.f / ex;
1054 float_v ex1i = 1.f / ex1;
1056 const float_v tg = ss * cci;
1066 dS2(active) += ds*ds;
1067 Z(active) += zV[ihit];
1068 dSZ(active) += ds*zV[ihit];
1071 float_v det =
Vc::One/(
static_cast<float_v
>(
nHits)*dS2 - dS*dS );
1073 Z0(good) = det*( dS2*
Z - dS*dSZ);
1074 dzds(good) = det*(
static_cast<float_v
>(
nHits)*dSZ -
Z*dS );
1083 #ifdef DRAW_FIT_LOCAL
1086 for(
unsigned int ihit = 0; ihit<nHitsMax; ihit++)
1088 for(
int iV=0; iV < nTracksV; iV++)
1090 float_m active =
static_cast<float_m
>( ihit <
nHits );
1091 if( !(active[iV]) )
continue;
1092 if( ihit > NTrackHits[iV] - 1)
continue;
1098 double xCL = (
X+xV0)[0];
1099 double yCL = (
Y+yV0)[0];
1100 double zCL = 0, xC=0, yC=0, zC=0;
1102 double rad =
fabs(R[0]);
1109 track.SetAngle(angleV0);
1110 track.SetSinPhi(-sinPhi0);
1111 track.SetSignCosPhi(-signCosPhi0);
1115 track.SetDzDs(-dzds);
1122 uint_v::Memory &NTrackHits,
1123 int &nTracksV, float_m active0,
bool dir )
1129 UNUSED_PARAM6( t, firstHits, NTrackHits, nTracksV, active0, dir );
1130 return float_m(
true);
1140 uint_v
nHits(NTrackHits);
1141 nHits.setZero(static_cast<uint_m>(!active0));
1143 int nHitsMax = nHits.max();
1145 for (
unsigned int ihit = 0; ihit < nHitsMax; ihit++ ) {
1147 float_m active = active0 &&
static_cast<float_m
>( ihit <
nHits );
1148 if(active.isEmpty())
continue;
1149 float_v::Memory xH, yH, zH, hitAlpha;
1150 float_v::Memory memXOverX0, memXTimesRho;
1152 float_v::Memory err2X1h, err2x2h, errX12h;
1153 int_v::Memory mHitNDF;
1155 float_v::Memory rh, isLeftH;
1158 for(
int iV=0; iV < nTracksV; iV++)
1160 if( !(active[iV]) )
continue;
1161 if( ihit > NTrackHits[iV] - 1)
continue;
1162 const unsigned int jhit = dir ? ( NTrackHits[iV] - 1 - ihit ) : ihit;
1165 hitAlpha[iV] = h.Angle();
1171 err2X1h[iV] = h.Err2X1();
1172 #ifdef PANDA_FTS // TODO why "-" ?
1173 errX12h[iV] = -h.ErrX12();
1175 errX12h[iV] = h.ErrX12();
1177 err2x2h[iV] = h.Err2X2();
1180 isLeftH[iV] = h.IsLeft() ? 1.f : 0.f;
1187 const float_v err2X1(err2X1h), err2x2(err2x2h), errX12(errX12h);
1189 const float_v isLeftF(isLeftH),
r(rh);
1190 const float_m isLeft = isLeftF > float_v(
Vc::Zero);
1192 const int_v hitNDF(mHitNDF);
1197 const float_v hitAlphaV(hitAlpha);
1198 const float_v xOverX0(memXOverX0);
1199 const float_v xTimesRho(memXTimesRho);
1202 #ifdef DRAW_FIT_LOCAL
1205 for(
int iV=0; iV<nTracksV; iV++)
1207 if(!active[iV])
continue;
1212 const float_m &rotated = t.
Rotate( -t.
Angle() + hitAlphaV, l, .999f, active);
1215 if(active.isEmpty())
continue;
1217 const float_v
x0 = xV,
y0 = yV;
1224 #ifdef DRAW_FIT_LOCAL
1227 float_v xL = t.
X(), yL = t.
Y(), zL = t.
Z(), xGl, yGl, zGl;
1230 for(
int iV=0; iV<nTracksV; iV++)
1232 if(!active[iV])
continue;
1238 active &= transported;
1239 if(active.isEmpty())
continue;
1257 t.
SetNDF( int_v(-5), static_cast<int_m>(active) );
1265 float_v sinPhi = t.
SinPhi();
1266 float_v xCorr = r - r/(
sqrt(1-sinPhi*sinPhi));
1267 x1(isLeft) += xCorr;
1268 x1(!isLeft) -= xCorr;
1270 const float_m &filtered = t.
FilterWithMaterial(x1, zV, err2X1, errX12, err2x2, 0.999
f, active, hitNDF);
1273 if(active.isEmpty())
continue;
1276 #ifdef DRAW_FIT_LOCAL
1279 xL = t.
X(); yL = t.
Y(); zL = t.
Z();
1282 for(
int iV=0; iV<nTracksV; iV++)
1284 if(!active[iV])
continue;
1293 float_m ok = active0;
1316 PndFTSCAPerformance::Instance().SetTracker(
this );
1324 #if defined(PANDA_STT) || defined(PANDA_FTS)
1352 #else // USE_IDEAL_TF
1355 #ifndef USE_CA_FIT // fitted in CATrackFinder
1359 #endif // USE_IDEAL_TF
1384 const int NHits2 = hits.size();
1391 for (
int iH = 0; iH < NHits2; iH++){
1392 fHits[iH] = hits[iH];
1406 ifstream ifile((prefix).data());
1407 if ( !ifile.is_open() )
return 0;
1431 fTrackHits =
new int[3000*PndFTSCAParameters::MaxNStations];
1438 for(
int iH = 0; iH <
fNHits; ++iH )
1446 float xT = 0, yT = 0, zT = 0;
1451 const float kCorr = 2.;
1452 const float kCorr2 = kCorr*kCorr;
1476 int maxCellLength = PndFTSCAParameters::MaxCellLength;
1489 int iMin = ( maxCellLength < PndFTSCAParameters::LastCellLength ) ? maxCellLength : PndFTSCAParameters::LastCellLength;
1522 const int NRTracks = tracks.size();
1524 for(
int iT=0; iT<NRTracks; iT++)
1526 const int NTHits = tracks[iT].NHits();
1537 for(
int iH=0; iH < NTHits; iH++)
1552 unsigned short fIHit;
1563 r.reserve(hs.size()/float_v::Size + 1);
1570 for(
unsigned int iH = 0; iH < hs.size(); iH += 1 )
1578 float_m valid =
static_cast<float_m
>(uint_v::IndexesFromZero() < uint_v(hs.size() - iH) );
1582 float_m active = hit.
IsValid();
1588 float_v r0(10.
f); float_v
r1(10.
f); float_v
r2(10.
f);
1589 r0(active) = hit.
X0() - target.
X0();
1590 r1(active) = hit.
X1() - target.
X1();
1591 r2(active) = hit.
X2() - target.
X2();
1606 if( active.isEmpty() )
continue;
1607 uint_v iHit = uint_v::IndexesFromZero() + iH;
1608 r.resize(r.size()+1);
1616 foreach_bit(
unsigned int iBit, active )
1618 hitRecord.
fIHit = iHit[iBit];
1619 nPlet.
fLastHit[iBit] = gTrackHitRecords.size();
1620 gTrackHitRecords.push_back(hitRecord);
1648 for(
int iLen=1; iLen<=cellLength; iLen++)
1650 if ( rCurr->size() <= 0 )
break;
1652 if ((rCurr->
HitsRef())->OnStationConst( iS ).size() == 0)
continue;
1674 if ( curr.size() <= 0 )
return;
1676 next.reserve(5*curr.size());
1684 for(
unsigned int iD1 = 0; iD1 < curr.size(); ++iD1 )
1687 float_m valid1G = D1.
IsValid();
1688 if( valid1G.isEmpty() )
continue;
1695 for(
unsigned int ih=0; ih<hits.size(); ih++ )
1698 float_m active = valid1G;
1704 if (param.Tx()[0] == 0.f)
1706 param.Tx() = (hit.
X1() - param.
X())/(hit.
X0() - param.
Z());
1714 if (param.
Cov(0)[0] < 0.f) param.
Cov(0)[0] = 0.2;
1716 if ( active.isEmpty() )
continue;
1718 const float_v dx1 = hit.
X1() - param.
X1();
1720 const float_v Pick_temp = float_v(10.0*10.0);
1723 float_v OOnne = float_v(1.0*1.0);
1724 float_v Correction2= param.Tx()*param.Tx() + OOnne;
1728 active &= dx1*dx1 < Pick_temp*((hit.R()*hit.R() + hit.Err2R())*Correction2 + hit.
Err2X1());
1732 active &= dx1*dx1 < coeff*Pick2*(param.
Err2X1() + hit.
Err2X1() + hit.Err2R()*Correction2);
1735 if ( active.isEmpty() )
continue;
1739 if ( active.isEmpty() )
continue;
1743 hitRecord.
fIHit = ih;
1748 foreach_bit(
unsigned int iBit, active )
1750 nPlet.
fLastHit[iBit] = gTrackHitRecords.size();
1752 gTrackHitRecords.push_back(hitRecord);
1762 next.push_back( nPlet );
1777 const int N = triplet.
N();
1781 vector<FTSCAHitV> thits( N );
1783 float_m active = triplet.
IsValid();
1784 for (
int ihit = 0; ihit < N; ihit++ ) {
1785 const TESV& index = triplet.
IHit(ihit);
1788 foreach_bit(
unsigned int iV, active) {
1789 hs[iV] = hits[index.
s[iV]][index.
e[iV]];
1821 for (
int ihit = 0; ihit < N; ihit++ )
1831 ndf(static_cast<int_m>(active)) = -4;
1836 for (
int ihit = N-2; ihit >= 0; ihit-- )
1850 for (
int ihit = 1; ihit < N; ihit++ )
1865 int start = (a.
N() < b.
N() ) ? 0 : a.
N() - b.
N();
1868 if ( a.
IHit(
i+StartStationShift) != b.
IHit(
i) )
1878 if (b.
ISta(b.
N()-1)==26)
1895 if ( chi2 > pick )
return false;
1907 for(
int iS = triplets.
NStations() - 1; iS >= 0; --iS )
1910 for(
unsigned int iT1 = 0; iT1 < ts1.size(); ++iT1 )
1915 if ( neighIStation >= triplets.
NStations() )
continue;
1931 vector< pair<float,unsigned int> > neighCands;
1932 for(
unsigned int iT2 = 0; iT2 < ts2.size(); ++iT2 )
1937 if ( maxLevel < t2.
Level() ) maxLevel = t2.
Level();
1938 if ( maxLevel == t2.
Level() ) neighCands.push_back(pair<float,unsigned int>(chi2 + t2.
Chi2Level(),iT2));
1940 t1.
Level() = maxLevel + 1;
1943 for(
unsigned int iN = 0; iN < neighCands.size(); ++iN )
1947 if ( maxLevel == t2.
Level() )
1959 const pair<float,unsigned int> tmp = t1.
Neighbours()[0];
1972 const int Nlast = PndFTSCAParameters::LastCellLength;
1977 for (
int ilev =
NStations()-Nlast; ilev >= min_level; ilev--)
1985 const unsigned char min_best_l = ilev + 3;
1987 for(
int istaF = 0; istaF <=
NStations()-Nlast-ilev; istaF++ )
1990 for(
unsigned int iTrip=0; iTrip < tsF.size(); iTrip++ )
1995 if ( tripF->
Level() == 0 )
continue;
1996 if ( tripF->
Level() < ilev )
continue;
1997 if ( (ilev == 0) && (tripF->
ISta(0) != 0) )
continue;
1999 if ( tripF->
Level() < min_best_l )
continue;
2003 bool isUsed =
false;
2004 for(
int i = 0;
i < tripF->
N();
i++ )
2006 if( triplets.
OnStation( tripF->
ISta(0) ).GetHit(
i, iTrip ).IsUsed() )
2013 if (isUsed)
continue;
2018 unsigned int nCalls = 0;
2019 FindBestCandidate(istaF, best_tr, iTrip, curr_tr, min_best_l, triplets, nCalls );
2021 if ( best_tr.
Level() < min_best_l )
continue;
2026 vtrackcandidate.push_back(best_tr);
2033 vtrackcandidate.SelectAndSaveTracks( tracks );
2043 unsigned char min_best_l,
2045 unsigned int& nCalls)
2051 const FTSCANPlet* curr_trip = &(trs[currITrip]);
2053 if (curr_trip->
Level() == 0)
2071 for (
int in = 0; in < NNeighs; in++)
2077 bool isUsed =
false;
2078 const int newTripLength = new_trip->
N();
2079 ASSERT( newTripLength - curr_trip->
N() >= -1, newTripLength <<
" - " << curr_trip->
N() );
2080 for(
int i = curr_trip->
N() - 1;
i < newTripLength;
i++ )
2082 if( triplets.
OnStation( new_trip->
ISta(0) ).GetHit(
i, newITrip ).IsUsed() )
2107 if( start<0 ) start = 0;
2108 for(
int i = start;
i < newTripLength;
i++ )
2113 const float qp1 = curr_trip->
QMomentum();
2114 const float qp2 = new_trip->
QMomentum();
2115 float dqp =
fabs(qp1 - qp2);
2119 nT.
Chi2() += dqp*dqp;
2129 const int NTracksS = tracks.size();
2130 vector< pair<PndFTSCATrackParam,PndFTSCATrackParam> > fittedTracks;
2131 fittedTracks.reserve(NTracksS);
2134 for (
int iT1 = 0; iT1 < NTracksS; iT1++ )
2140 if (abs(innerParam.Err2X())>20. || isnan(innerParam.Err2X()))
2143 innerParam = outerParam;
2144 innerParam.SetX((*tracks.
HitsRef())[t1.
IHits()[0]].X1());
2145 innerParam.SetY((*tracks.
HitsRef())[t1.
IHits()[0]].X2());
2146 innerParam.SetZ((*tracks.
HitsRef())[t1.
IHits()[0]].X0());
2147 innerParam.SetTX(innerParam.
X()/innerParam.
Z());
2148 innerParam.SetTY(innerParam.
Y()/innerParam.
Z());
2150 if (abs(outerParam.Err2X())>20. || isnan(outerParam.Err2X()))
2152 outerParam = innerParam;
2156 outerParam.SetTX(outerParam.
X()/outerParam.
Z());
2157 outerParam.SetTY(outerParam.
Y()/outerParam.
Z());
2159 fittedTracks.push_back(pair<PndFTSCATrackParam,PndFTSCATrackParam>(innerParam,outerParam));
2167 for (
int iT_middle = 0; iT_middle < NTracksS; iT_middle++ )
2171 if ( t_middle.
NHits() <= 0 )
continue;
2173 t_middleOuter = fittedTracks[iT_middle].second;
2175 for (
int iT_end = 0; iT_end < NTracksS; iT_end++ )
2179 if (( t_end.
NHits() <= 0 ) || (iT_middle==iT_end))
continue;
2180 const float xDiff1 = (*tracks.
HitsRef())[t_end.
IHits().front()].X0() - (*tracks.
HitsRef())[t_middle.
IHits().back()].X0();
2181 if (xDiff1<=0)
continue;
2186 float Xt_endInnerBuf = t_endInner.
X();
2187 float Xt_middleOuterBuf = t_middleOuter.
X();
2195 if (abs(t_middleOuter.Err2X())>20. || isnan(t_middleOuter.Err2X()))
2199 while ((abs(t_middleOuter.Err2X())>20. || isnan(t_middleOuter.Err2X())) && (counterX<5))
2201 t_middleOuter = buf_t_middle;
2202 t_middleOuter.SetQP(buf_t_middle.
QP()/coefQP);
2214 if (xDiff1>=1 && xDiff1<6)
2216 if (xDiff1>=6 && xDiff1<10)
2218 if (xDiff1>=10 && xDiff1<20)
2220 if (xDiff1>=20 && xDiff1<30)
2227 if ((
fabs(t_endInner.
X()-Xt_middleOuterBuf)<deltaX1*coef1) || (
fabs(t_middleOuter.
X()-Xt_endInnerBuf)<deltaX1*coef1))
2231 for (
int ih = 0; ih < t_end.
NHits(); ih++ )
2235 t_end.
IHits().clear();
2293 for (
int iT1 = 0; iT1 < NTracksS; iT1++ )
2296 if (t1.
NHits() != 0)
2297 tracks.push_back(t1);
2313 const float maxPVR = 0.1;
2314 const unsigned int N = 2*maxZ/0.01;
2316 vector<float> pvHist(N,0);
2319 for(
unsigned int i = 0;
i < s.size(); ++
i ) {
2321 foreach_bit(
int iV, h.
IsValid() ) {
2325 float r =
sqrt(gx*gx+gy*gy);
2327 for(
unsigned int i2 = 0; i2 < s2.size(); ++i2 ) {
2329 foreach_bit(
int iV2, h2.
IsValid() ) {
2330 float gx2, gy2, gz2;
2332 float r2 =
sqrt(gx2*gx2+gy2*gy2);
2334 float gz0 = -(gz2-gz)/(r2-r)*r + gz;
2335 float gx0 = -(gx2-gx)/(r2-r)*r + gx;
2336 float gy0 = -(gy2-gy)/(r2-r)*r + gy;
2337 if ( abs(gz0) < maxZ && abs(gx0) < maxPVR && abs(gy0) < maxPVR )
2338 pvHist[(gz0/maxZ+1)*N/2]++;
2346 const double *pv = PndFTSCAPerformance::Instance().PV();
2356 for(
unsigned int i = 0;
i < pvHist.size(); ++
i ) {
2357 if ( max < pvHist[
i] ) {
2363 zPV = (2.f*maxI/N-1)*maxZ;
2369 float d[5], uud, u[5][5];
2370 for(
int i=0;
i<5;
i++)
2373 for(
int j=0; j<5; j++)
2377 for(
int i=0;
i<5;
i++)
2380 for(
int j=0; j<
i; j++)
2381 uud += u[j][i]*u[j][i]*d[j];
2382 uud = a[i*(i+3)/2] - uud;
2384 if(
fabs(uud)<1.e-12) uud = 1.e-12;
2385 d[
i] = uud/
fabs(uud);
2388 for(
int j=i+1; j<5; j++)
2391 for(
int k=0; k<
i; k++)
2392 uud += u[k][i]*u[k][j]*d[k];
2393 uud = a[j*(j+1)/2+i] - uud;
2394 u[
i][j] = d[
i]/u[
i][
i]*uud;
2400 for(
int i=0;
i<5;
i++)
2403 u[
i][
i] = 1.f/u[
i][
i];
2405 for(
int i=0;
i<4;
i++)
2407 u[
i][
i+1] = - u[
i][
i+1]*u[
i][
i]*u[
i+1][
i+1];
2409 for(
int i=0;
i<3;
i++)
2411 u[
i][
i+2] = u[
i][
i+1]*u1[
i+1]*u[
i+1][
i+2]-u[
i][
i+2]*u[
i][
i]*u[
i+2][
i+2];
2413 for(
int i=0;
i<2;
i++)
2415 u[
i][
i+3] = u[
i][
i+2]*u1[
i+2]*u[
i+2][
i+3] - u[
i][
i+3]*u[
i][
i]*u[
i+3][
i+3];
2416 u[
i][
i+3] -= u[
i][
i+1]*u1[
i+1]*(u[
i+1][
i+2]*u1[
i+2]*u[
i+2][
i+3] - u[
i+1][
i+3]);
2418 u[0][4] = u[0][2]*u1[2]*u[2][4] - u[0][4]*u[0][0]*u[4][4];
2419 u[0][4] += u[0][1]*u1[1]*(u[1][4] - u[1][3]*u1[3]*u[3][4] - u[1][2]*u1[2]*u[2][4]);
2420 u[0][4] += u[3][4]*u1[3]*(u[0][3] - u1[2]*u[2][3]*(u[0][2] - u[0][1]*u1[1]*u[1][2]));
2422 for(
int i=0;
i<5;
i++)
2423 a[
i+10] = u[
i][4]*d[4]*u[4][4];
2424 for(
int i=0;
i<4;
i++)
2425 a[
i+6] = u[
i][3]*u[3][3]*d[3] + u[
i][4]*u[3][4]*d[4];
2426 for(
int i=0;
i<3;
i++)
2427 a[
i+3] = u[
i][2]*u[2][2]*d[2] + u[
i][3]*u[2][3]*d[3] + u[
i][4]*u[2][4]*d[4];
2428 for(
int i=0;
i<2;
i++)
2429 a[
i+1] = u[
i][1]*u[1][1]*d[1] + u[
i][2]*u[1][2]*d[2] + u[
i][3]*u[1][3]*d[3] + u[
i][4]*u[1][4]*d[4];
2430 a[0] = u[0][0]*u[0][0]*d[0] + u[0][1]*u[0][1]*d[1] + u[0][2]*u[0][2]*d[2] + u[0][3]*u[0][3]*d[3] + u[0][4]*u[0][4]*d[4];
2436 K[0][0] = C[0]*V[ 0] + C[1]*V[ 1] + C[3]*V[ 3] + C[6]*V[ 6] + C[10]*V[10];
2437 K[0][1] = C[0]*V[ 1] + C[1]*V[ 2] + C[3]*V[ 4] + C[6]*V[ 7] + C[10]*V[11];
2438 K[0][2] = C[0]*V[ 3] + C[1]*V[ 4] + C[3]*V[ 5] + C[6]*V[ 8] + C[10]*V[12];
2439 K[0][3] = C[0]*V[ 6] + C[1]*V[ 7] + C[3]*V[ 8] + C[6]*V[ 9] + C[10]*V[13];
2440 K[0][4] = C[0]*V[10] + C[1]*V[11] + C[3]*V[12] + C[6]*V[13] + C[10]*V[14];
2442 K[1][0] = C[1]*V[ 0] + C[2]*V[ 1] + C[4]*V[ 3] + C[7]*V[ 6] + C[11]*V[10];
2443 K[1][1] = C[1]*V[ 1] + C[2]*V[ 2] + C[4]*V[ 4] + C[7]*V[ 7] + C[11]*V[11];
2444 K[1][2] = C[1]*V[ 3] + C[2]*V[ 4] + C[4]*V[ 5] + C[7]*V[ 8] + C[11]*V[12];
2445 K[1][3] = C[1]*V[ 6] + C[2]*V[ 7] + C[4]*V[ 8] + C[7]*V[ 9] + C[11]*V[13];
2446 K[1][4] = C[1]*V[10] + C[2]*V[11] + C[4]*V[12] + C[7]*V[13] + C[11]*V[14];
2448 K[2][0] = C[3]*V[ 0] + C[4]*V[ 1] + C[5]*V[ 3] + C[8]*V[ 6] + C[12]*V[10];
2449 K[2][1] = C[3]*V[ 1] + C[4]*V[ 2] + C[5]*V[ 4] + C[8]*V[ 7] + C[12]*V[11];
2450 K[2][2] = C[3]*V[ 3] + C[4]*V[ 4] + C[5]*V[ 5] + C[8]*V[ 8] + C[12]*V[12];
2451 K[2][3] = C[3]*V[ 6] + C[4]*V[ 7] + C[5]*V[ 8] + C[8]*V[ 9] + C[12]*V[13];
2452 K[2][4] = C[3]*V[10] + C[4]*V[11] + C[5]*V[12] + C[8]*V[13] + C[12]*V[14];
2454 K[3][0] = C[6]*V[ 0] + C[7]*V[ 1] + C[8]*V[ 3] + C[9]*V[ 6] + C[13]*V[10];
2455 K[3][1] = C[6]*V[ 1] + C[7]*V[ 2] + C[8]*V[ 4] + C[9]*V[ 7] + C[13]*V[11];
2456 K[3][2] = C[6]*V[ 3] + C[7]*V[ 4] + C[8]*V[ 5] + C[9]*V[ 8] + C[13]*V[12];
2457 K[3][3] = C[6]*V[ 6] + C[7]*V[ 7] + C[8]*V[ 8] + C[9]*V[ 9] + C[13]*V[13];
2458 K[3][4] = C[6]*V[10] + C[7]*V[11] + C[8]*V[12] + C[9]*V[13] + C[13]*V[14];
2460 K[4][0] = C[10]*V[ 0] + C[11]*V[ 1] + C[12]*V[ 3] + C[13]*V[ 6] + C[14]*V[10];
2461 K[4][1] = C[10]*V[ 1] + C[11]*V[ 2] + C[12]*V[ 4] + C[13]*V[ 7] + C[14]*V[11];
2462 K[4][2] = C[10]*V[ 3] + C[11]*V[ 4] + C[12]*V[ 5] + C[13]*V[ 8] + C[14]*V[12];
2463 K[4][3] = C[10]*V[ 6] + C[11]*V[ 7] + C[12]*V[ 8] + C[13]*V[ 9] + C[14]*V[13];
2464 K[4][4] = C[10]*V[10] + C[11]*V[11] + C[12]*V[12] + C[13]*V[13] + C[14]*V[14];
2470 K[0] = C[0][0]*V[0] + C[0][1]*V[1] + C[0][2]*V[3] + C[0][3]*V[6] + C[0][4]*V[10];
2472 K[1] = C[1][0]*V[0] + C[1][1]*V[1] + C[1][2]*V[3] + C[1][3]*V[6] + C[1][4]*V[10];
2473 K[2] = C[1][0]*V[1] + C[1][1]*V[2] + C[1][2]*V[4] + C[1][3]*V[7] + C[1][4]*V[11];
2475 K[3] = C[2][0]*V[0] + C[2][1]*V[1] + C[2][2]*V[3] + C[2][3]*V[6] + C[2][4]*V[10];
2476 K[4] = C[2][0]*V[1] + C[2][1]*V[2] + C[2][2]*V[4] + C[2][3]*V[7] + C[2][4]*V[11];
2477 K[5] = C[2][0]*V[3] + C[2][1]*V[4] + C[2][2]*V[5] + C[2][3]*V[8] + C[2][4]*V[12];
2479 K[6] = C[3][0]*V[0] + C[3][1]*V[1] + C[3][2]*V[3] + C[3][3]*V[6] + C[3][4]*V[10];
2480 K[7] = C[3][0]*V[1] + C[3][1]*V[2] + C[3][2]*V[4] + C[3][3]*V[7] + C[3][4]*V[11];
2481 K[8] = C[3][0]*V[3] + C[3][1]*V[4] + C[3][2]*V[5] + C[3][3]*V[8] + C[3][4]*V[12];
2482 K[9] = C[3][0]*V[6] + C[3][1]*V[7] + C[3][2]*V[8] + C[3][3]*V[9] + C[3][4]*V[13];
2484 K[10] = C[4][0]*V[ 0] + C[4][1]*V[ 1] + C[4][2]*V[ 3] + C[4][3]*V[ 6] + C[4][4]*V[10];
2485 K[11] = C[4][0]*V[ 1] + C[4][1]*V[ 2] + C[4][2]*V[ 4] + C[4][3]*V[ 7] + C[4][4]*V[11];
2486 K[12] = C[4][0]*V[ 3] + C[4][1]*V[ 4] + C[4][2]*V[ 5] + C[4][3]*V[ 8] + C[4][4]*V[12];
2487 K[13] = C[4][0]*V[ 6] + C[4][1]*V[ 7] + C[4][2]*V[ 8] + C[4][3]*V[ 9] + C[4][4]*V[13];
2488 K[14] = C[4][0]*V[10] + C[4][1]*V[11] + C[4][2]*V[12] + C[4][3]*V[13] + C[4][4]*V[14];
2494 r_out[0] = r_in[0]*C[ 0] + r_in[1]*C[ 1] + r_in[2]*C[ 3] +r_in[3]*C[ 6] + r_in[4]*C[10];
2495 r_out[1] = r_in[0]*C[ 1] + r_in[1]*C[ 2] + r_in[2]*C[ 4] +r_in[3]*C[ 7] + r_in[4]*C[11];
2496 r_out[2] = r_in[0]*C[ 3] + r_in[1]*C[ 4] + r_in[2]*C[ 5] +r_in[3]*C[ 8] + r_in[4]*C[12];
2497 r_out[3] = r_in[0]*C[ 6] + r_in[1]*C[ 7] + r_in[2]*C[ 8] +r_in[3]*C[ 9] + r_in[4]*C[13];
2498 r_out[4] = r_in[0]*C[10] + r_in[1]*C[11] + r_in[2]*C[12] +r_in[3]*C[13] + r_in[4]*C[14];
2507 for(
int i=0;
i<15;
i++)
2512 for(
int i=0;
i<5;
i++)
2520 for(
int i=0;
i<5;
i++) dzeta[
i] = m[
i] - r[
i];
2523 for(
int i=0;
i< 15;
i++)
2527 for(
int i=0;
i<5;
i++)
2530 for(
int j=0; j<5; j++)
2531 kd += K[
i][j]*dzeta[j];
2536 chi2 = dzeta[0]*S_dzeta[0] + dzeta[1]*S_dzeta[1] + dzeta[2]*S_dzeta[2] + dzeta[3]*S_dzeta[3] + dzeta[4]*S_dzeta[4];
static T ASin(const T &x)
void Merge(FTSCATracks &tracks)
bool ReadSettingsFromFile(string prefix)
float QMomentumErr() const
PndFTSCAParam fParameters
PndFTSCAGBTrack * fTracks
void SetAngle(const float_v &v)
static bool Compare(const PndFTSCAGBHit &a, const PndFTSCAGBHit &b)
Hits reordering in accordance with the geometry and the track-finder needs: Hits are sorted by sector...
void SetZ(const float_v &v)
void SetQPt(const float_v &v)
void SetCov(int i, const float_v &v)
const TESV & IHit(int IH) const
void SetTPC(const PndFTSCAParam &tpcParam)
bool Transport(const FTSCAHit &hit, const PndFTSCAParam ¶m)
const float & Chi2Neighbours(int i) const
const int StartStationShift
void DrawRecoTrack(int itr, int color=-1, int width=-1)
const FTSCAStation & Station(short i) const
void DrawPVHisto(const vector< float > &pvHist, const PndFTSCAParam ¶m)
void InitByHit(const FTSCAHitV &hit, const PndFTSCAParam ¶m, const float_v &dQMom)
void SetY(const float_v &v)
float QMomentumErr2() const
void SetX(const float_v &v)
void InitialTrackApproximation(PndFTSCATrackParamVector &t, uint_v &firstHits, uint_v::Memory &NTrackHits, int &nTracksV, float_m active0)
float_m FitTrackCA(PndFTSCATrackParamVector &t, uint_v &firstHits, uint_v::Memory &NTrackHits, int &nTracksV, float_m active0, bool dir, bool init=false)
void FilterTracks(float const r[5], float const C[15], float const m[5], float const V[15], float R[5], float W[15], float &chi2) const
PndFTSResizableArray< FTSCAStrip > fBStrips
friend F32vec4 sqrt(const F32vec4 &a)
void MultiplyMS(float const C[5][5], float const V[15], float K[15]) const
const unsigned int & INeighbours(int i) const
static T Sqrt(const T &x)
void SetSignCosPhi(const float_v &v)
void SetFirstHitRef(int v)
void DrawGBPoint(float x, float y, float z, int Start=1, Size_t width=1)
void PickUpHits(FTSCAElementsOnStation< FTSCANPletV > &a, FTSCAElementsOnStation< FTSCANPletV > &r, int iS)
void InvertCholetsky(float a[15]) const
void ReadSettings(std::istream &in)
float GetX0(short iSt) const
void SetChi2(const float_v &v)
static PndFTSCADisplay & Instance()
friend F32vec4 max(const F32vec4 &a, const F32vec4 &b)
float GetXOverX0(short iSt) const
double fStatTime[fNTimers]
const FTSCAElementsOnStation< T > & OnStationConst(char i) const
void SetInnerParam(const PndFTSCATrackParam &v)
float_m Rotate(const float_v &alpha, PndFTSCATrackLinearisationVector &t0, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
void SetOuterParam(const PndFTSCATrackParam &v)
float_m Refit(FTSCANPletV &triplet, const FTSCAHits &hits)
float_m AddTarget(const FTSCATarget &target, const float_m &mask=float_m(true))
float_m FitTrack(PndFTSCATrackParamVector &t, uint_v &firstHits, uint_v::Memory &NTrackHits, int &nTracksV, float_m active0, bool dir)
L1CATFIterTimerInfo fStatGTi
PndFTSResizableArray< FTSCAStrip > fFStrips
PndFTSResizableArray< PndFTSCAGBHit > fHits
void EstimatePV(const FTSCAHitsV &hits, float &zPV)
void FindBestCandidate(int ista, FTSCATrack &best_tr, int currITrip, FTSCATrack &curr_tr, unsigned char min_best_l, const FTSCANPlets &triplets, unsigned int &nCalls)
const PndFTSCATrackParam Fit(const FTSCAHits &hits, const FTSCATarget &target, const PndFTSCAParam &caParam, bool dir=true, bool usePar=false, PndFTSCATrackParam outerParam=PndFTSCATrackParam())
FTSCAElementsOnStation< T > & OnStation(char i)
const FTSCAHits * fHitsRef
void SetGB(const PndFTSCAGBTracker *GBTracker)
float_m Transport(const int_v &ista, const PndFTSCAParam ¶m, const float_m &mask=float_m(true))
static void GlobalToCALocal(T x, T y, T angle, T &x0, T &x1)
friend class PndFTSCAPerformance
Try to group close hits in row formed by one track. After sort hits.
void InitDirection(float_v r0, float_v r1, float_v r2)
static T Min(const T &x, const T &y)
void SetHits(std::vector< PndFTSCAGBHit > &hits)
const PndFTSCAParam & GetParameters() const
static T ATan2(const T &y, const T &x)
void AddHit(char iS, int iH)
FTSCAElementsOnStation< T > & OnStation(char i)
void SaveCanvasToFile(TString fileName)
FTSCAElementsOnStation< T > & OnStation(char i)
void CalculateFitParameters(PndFTSCATrackFitParam &par, const float_v &mass=0.13957f)
vector< pair< float, unsigned int > > & Neighbours()
friend F32vec4 fabs(const F32vec4 &a)
void MultiplySS(float const C[15], float const V[15], float K[5][5]) const
double fSliceTrackerCpuTime
void DrawGBNPlets(const FTSCANPletsV &all)
const TES & IHit(int IH) const
float_m TransportToX0WithMaterial(const float_v &x, const float_v &XOverX0, const float_v &XThimesRho, const float_v &Bz, const float maxSinPhi=.999f)
const PndFTSCATrackParam & InnerParam() const
void Create1Plets(const FTSCATarget &target, const FTSCAHits &hits, FTSCAElementsOnStation< FTSCANPletV > &singlets, int iStation)
void CreateTracks(const FTSCANPlets &triplets, FTSCATracks &tracks)
void MultiplySR(float const C[15], float const r_in[5], float r_out[5]) const
float_m FilterWithMaterial(const float_v &y, const float_v &z, float_v err2Y, float_v errYZ, float_v err2Z, float maxSinPhi=0.999f, const float_m &mask=float_m(true), const int_v &hitNDF=int_v(2), const float_v &chi2Cut=10e10f)
unsigned int NNeighbours() const
const PndFTSCATrackParam & Param() const
float GetXTimesRho(short iSt) const
static T Max(const T &x, const T &y)
vector< TrackHitRecord > gTrackHitRecords
int hit(Int_t nEvents=0, TString inFile="sim.root", TString parFile="par.root", TString inDigi="digi.root", TString outFile="hit.root", Int_t timeBased=0)
const FTSCAHits * HitsRef() const
void GetGlobalCoor(int iV, float &x, float &y, float &z) const
static void CALocalToGlobal(T x0, T x1, T angle, T &x, T &y)
bool IsRightNeighbour(const FTSCANPlet &a, const FTSCANPlet &b, float pick, float &chi2)
const float_v & Cov(int i) const
void DrawArc(float x, float y, float r, int Start=1, Size_t width=1)
const float_v & Par(int i) const
void FindNeighbours(FTSCANPlets &triplets)
void InitByTarget(const FTSCATarget &target)
void CreateNPlets(const FTSCATarget &target, const FTSCAHitsV &hits, FTSCANPletsV &singlets)
static FiniteReturnTypeHelper< T >::R Finite(const T &x)
void SetTrackParam(const PndFTSCATrackParamVector ¶m, const float_m &m=float_m(true))
PndFTSCATrackParamVector & ParamRef()
const FTSCAHit & Hit(int iH, int iT) const
const PndFTSCATrackParamVector & Param() const
void ConvertTrackParamToVector(PndFTSCATrackParam t0[float_v::Size], int nTracksV)
void DrawGBHits(const FTSCAHitsV &all)
int FirstMCPointID() const
float_m Filter(const FTSCAHitV &hit, const PndFTSCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)
const char & IStation() const