34 #include "TStopwatch.h"
52 #ifdef CATRACKER_DISPLAY
67 for(
int iS = 0; iS <
NStations(); ++iS ) {
73 tOnSta.reserve(ts.size()*float_v::Size);
74 for(
unsigned int iT = 0; iT < ts.size(); iT++ ) {
76 foreach_bit(
unsigned int iV, t.
IsValid() ) {
80 if( irec<0 )
continue;
83 nPlet.
fIHit.resize(nHits);
84 for(
int i=nHits-1;
i>=0;
i--){
86 cout<<
"CA tracker: something wrong with hit links!!!"<<endl;
110 fSliceTrackerTime( 0 ),
111 fSliceTrackerCpuTime( 0 ),
158 for (
int i = 0;
i < 20; ++
i ) {
190 float_v::Memory tmpFloat;
191 int_v::Memory tmpShort;
193 for(
int iV=0; iV < nTracksV; iV++) tmpFloat[iV] =
t0[iV].
X();
194 tmpVec.load( tmpFloat );
196 for(
int iV=0; iV < nTracksV; iV++) tmpFloat[iV] =
t0[iV].SignCosPhi();
197 tmpVec.load( tmpFloat );
200 for(
int iP=0; iP<5; iP++)
202 for(
int iV=0; iV < nTracksV; iV++) tmpFloat[iV] =
t0[iV].
Par()[iP];
203 tmpVec.load( tmpFloat );
206 for(
int iC=0; iC<15; iC++)
208 for(
int iV=0; iV < nTracksV; iV++) tmpFloat[iV] =
t0[iV].Cov()[iC];
209 tmpVec.load( tmpFloat );
212 for(
int iV=0; iV < nTracksV; iV++) tmpFloat[iV] =
t0[iV].
Chi2();
213 tmpVec.load( tmpFloat );
215 for(
int iV=0; iV < nTracksV; iV++) tmpShort[iV] =
t0[iV].NDF();
216 tmpVecShort.load( tmpShort );
230 #ifdef CATRACKER_DISPLAY
231 PndCADisplay &disp = PndCADisplay::Instance();
238 disp.DrawGBHits( *
this );
249 for (
int i = 0;
i < 20; ++
i ) {
258 #ifdef USE_DBG_TIMERS
263 #ifdef USE_DBG_TIMERS
270 #ifdef USE_DBG_TIMERS
276 #ifdef USE_DBG_TIMERS
294 fTime += timer1.RealTime();
296 #ifdef USE_DBG_TIMERS
297 static int stat_N = 0;
300 cout << endl <<
" --- Timers, ms --- " << endl;
311 #ifdef CATRACKER_DISPLAY
313 disp.DrawRecoTrack(
i);
340 int written = std::fwrite( &nHits,
sizeof(
int ), 1, file );
341 assert( written == 1 );
343 assert( written == nHits );
345 UNUSED_PARAM1(written);
352 ofstream
out((prefix+
"tracks.data").data());
353 if ( !out.is_open() )
return 0;
358 for (
int itr = 0; itr <
fNTracks; itr++ ) {
397 const int NHits2 = hits.size();
401 fHits.reserve(NHits2);
403 for (
int iH = 0; iH < NHits2; iH++){
422 ofstream ofile((prefix+
"hits.data").data(),
std::ios::out|std::ios::app);
423 const int Size =
fHits.size();
424 ofile << Size << std::endl;
425 for (
unsigned int i = 0;
i <
fHits.size();
i++){
441 ifstream ifile((prefix+
"hits.data").data());
442 if ( !ifile.is_open() )
return 0;
449 for (
int i = 0;
i < Size;
i++){
452 if(
fabs(l.Angle())>10 ){
479 #ifdef USE_DBG_TIMERS
502 const float errT = 0.02/k;
506 const double C11 = errN*errN;
507 const double C22 = h.
Err2X2();
508 const double s =
sin(beta);
509 const double c =
cos(beta);
520 for(
int iH = 0; iH <
fNHits; ++iH ) {
541 const float sb = station.
f.
sin;
542 const float cb = station.
f.
cos;
545 for(
unsigned int ih=0; ih<stHits.size(); ih++ ){
548 hit.
fU = cb*hit.
X1() + sb*hit.
X2();
551 double ang = hit.
Angle();
561 cout<<
"CA tracker: Wrong hit sector "<<hit.
fISec<<endl;
569 for(
int ista=0; ista<
NStations(); ista++){
579 for(
unsigned int ih=0; ih<stHits.size(); ih++ ){
591 for(
unsigned int ih=0; ih<sta.
fHits1D.size(); ih++ ){
593 int iSec = hit.
fISec;
594 if( iSec > lastSec ){
604 float xT = 0, yT = 0, zT = 0;
606 #ifdef USE_DBG_TIMERS
615 const float kCorr = 1;
616 const float kCorr2 = kCorr*kCorr;
634 #ifdef USE_DBG_TIMERS
636 fTi[0][
"init "] = itimer;
644 #ifdef USE_DBG_TIMERS
646 fTi[0][
"0plet "] = itimer;
662 #ifdef USE_DBG_TIMERS
664 std::stringstream ss;
666 fTi[0][ss.str()] = itimer;
673 #ifdef USE_DBG_TIMERS
675 fTi[0][
"convrt"] = itimer;
677 fTi[0][
"plets "] = ptimer;
685 #ifdef USE_DBG_TIMERS
687 fTi[0][
"nghbrs"] = itimer;
695 #ifdef USE_DBG_TIMERS
697 fTi[0][
"tracks"] = itimer;
703 #ifdef USE_DBG_TIMERS
705 fTi[0][
"merger"] = itimer;
715 const int NRTracks = tracks.size();
717 for(
int iT=0; iT<NRTracks; iT++)
719 const int NTHits = tracks[iT].NHits();
728 for(
int iH=0; iH < NTHits; iH++)
739 #ifdef USE_DBG_TIMERS
741 fTi[0][
"finish"] = itimer;
745 #ifdef USE_DBG_TIMERS
756 int start = (a.
N() < b.
N() ) ? 0 : a.
N() - b.
N();
763 if ( chi2 > pick )
return false;
772 for(
int iS = triplets.
NStations() - 1; iS >= 0; --iS ) {
775 for(
unsigned int iT1 = 0; iT1 < ts1.size(); ++iT1 ) {
780 if ( neighIStation >= triplets.
NStations() )
continue;
784 vector< pair<float,unsigned int> > neighCands;
785 for(
unsigned int iT2 = 0; iT2 < ts2.size(); ++iT2 ) {
790 if ( maxLevel < t2.
Level() ) maxLevel = t2.
Level();
791 if ( maxLevel == t2.
Level() ) neighCands.push_back(pair<float,unsigned int>(chi2 + t2.
Chi2Level(),iT2));
793 t1.
Level() = maxLevel + 1;
796 for(
unsigned int iN = 0; iN < neighCands.size(); ++iN ) {
799 if ( maxLevel == t2.
Level() ) {
806 const pair<float,unsigned int> tmp = t1.
Neighbours()[0];
823 for (
int ilev =
NStations()-Nlast; ilev >= min_level; ilev--){
827 const unsigned char min_best_l = (ilev > min_level) ? ilev-1 : min_level;
831 for(
int istaF = 0; istaF <=
NStations()-Nlast-ilev; istaF++ ){
833 for(
unsigned int iTrip=0; iTrip < tsF.size(); iTrip++ ){
837 if ( tripF->
Level() == 0 )
continue;
838 if ( tripF->
Level() < ilev )
continue;
839 if ( (ilev == 0) && (tripF->
ISta(0) != 0) )
continue;
842 if ( tripF->
Level() < min_best_l )
continue;
847 for(
int i = 0;
i < tripF->
N();
i++ ) {
848 if( triplets.
OnStation( tripF->
ISta(0) ).GetHit(
i, iTrip ).IsUsed() ) {
854 if (isUsed)
continue;
859 unsigned int nCalls = 0;
860 FindBestCandidate(istaF, best_tr, iTrip, curr_tr, min_best_l, triplets, nCalls );
862 if ( best_tr.
Level() < min_best_l )
continue;
867 vtrackcandidate.push_back(best_tr);
874 vtrackcandidate.SelectAndSaveTracks( tracks );
884 float d[5], uud, u[5][5];
885 for(
int i=0;
i<5;
i++)
888 for(
int j=0; j<5; j++)
892 for(
int i=0;
i<5;
i++)
895 for(
int j=0; j<
i; j++)
896 uud += u[j][i]*u[j][i]*d[j];
897 uud = a[i*(i+3)/2] - uud;
899 if(
fabs(uud)<1.e-12) uud = 1.e-12;
900 d[
i] = uud/
fabs(uud);
903 for(
int j=i+1; j<5; j++)
906 for(
int k=0; k<
i; k++)
907 uud += u[k][i]*u[k][j]*d[k];
908 uud = a[j*(j+1)/2+i] - uud;
909 u[
i][j] = d[
i]/u[
i][
i]*uud;
915 for(
int i=0;
i<5;
i++)
918 u[
i][
i] = 1.f/u[
i][
i];
920 for(
int i=0;
i<4;
i++)
922 u[
i][
i+1] = - u[
i][
i+1]*u[
i][
i]*u[
i+1][
i+1];
924 for(
int i=0;
i<3;
i++)
926 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];
928 for(
int i=0;
i<2;
i++)
930 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];
931 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]);
933 u[0][4] = u[0][2]*u1[2]*u[2][4] - u[0][4]*u[0][0]*u[4][4];
934 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]);
935 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]));
937 for(
int i=0;
i<5;
i++)
938 a[
i+10] = u[
i][4]*d[4]*u[4][4];
939 for(
int i=0;
i<4;
i++)
940 a[
i+6] = u[
i][3]*u[3][3]*d[3] + u[
i][4]*u[3][4]*d[4];
941 for(
int i=0;
i<3;
i++)
942 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];
943 for(
int i=0;
i<2;
i++)
944 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];
945 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];
951 K[0][0] = C[0]*V[ 0] + C[1]*V[ 1] + C[3]*V[ 3] + C[6]*V[ 6] + C[10]*V[10];
952 K[0][1] = C[0]*V[ 1] + C[1]*V[ 2] + C[3]*V[ 4] + C[6]*V[ 7] + C[10]*V[11];
953 K[0][2] = C[0]*V[ 3] + C[1]*V[ 4] + C[3]*V[ 5] + C[6]*V[ 8] + C[10]*V[12];
954 K[0][3] = C[0]*V[ 6] + C[1]*V[ 7] + C[3]*V[ 8] + C[6]*V[ 9] + C[10]*V[13];
955 K[0][4] = C[0]*V[10] + C[1]*V[11] + C[3]*V[12] + C[6]*V[13] + C[10]*V[14];
957 K[1][0] = C[1]*V[ 0] + C[2]*V[ 1] + C[4]*V[ 3] + C[7]*V[ 6] + C[11]*V[10];
958 K[1][1] = C[1]*V[ 1] + C[2]*V[ 2] + C[4]*V[ 4] + C[7]*V[ 7] + C[11]*V[11];
959 K[1][2] = C[1]*V[ 3] + C[2]*V[ 4] + C[4]*V[ 5] + C[7]*V[ 8] + C[11]*V[12];
960 K[1][3] = C[1]*V[ 6] + C[2]*V[ 7] + C[4]*V[ 8] + C[7]*V[ 9] + C[11]*V[13];
961 K[1][4] = C[1]*V[10] + C[2]*V[11] + C[4]*V[12] + C[7]*V[13] + C[11]*V[14];
963 K[2][0] = C[3]*V[ 0] + C[4]*V[ 1] + C[5]*V[ 3] + C[8]*V[ 6] + C[12]*V[10];
964 K[2][1] = C[3]*V[ 1] + C[4]*V[ 2] + C[5]*V[ 4] + C[8]*V[ 7] + C[12]*V[11];
965 K[2][2] = C[3]*V[ 3] + C[4]*V[ 4] + C[5]*V[ 5] + C[8]*V[ 8] + C[12]*V[12];
966 K[2][3] = C[3]*V[ 6] + C[4]*V[ 7] + C[5]*V[ 8] + C[8]*V[ 9] + C[12]*V[13];
967 K[2][4] = C[3]*V[10] + C[4]*V[11] + C[5]*V[12] + C[8]*V[13] + C[12]*V[14];
969 K[3][0] = C[6]*V[ 0] + C[7]*V[ 1] + C[8]*V[ 3] + C[9]*V[ 6] + C[13]*V[10];
970 K[3][1] = C[6]*V[ 1] + C[7]*V[ 2] + C[8]*V[ 4] + C[9]*V[ 7] + C[13]*V[11];
971 K[3][2] = C[6]*V[ 3] + C[7]*V[ 4] + C[8]*V[ 5] + C[9]*V[ 8] + C[13]*V[12];
972 K[3][3] = C[6]*V[ 6] + C[7]*V[ 7] + C[8]*V[ 8] + C[9]*V[ 9] + C[13]*V[13];
973 K[3][4] = C[6]*V[10] + C[7]*V[11] + C[8]*V[12] + C[9]*V[13] + C[13]*V[14];
975 K[4][0] = C[10]*V[ 0] + C[11]*V[ 1] + C[12]*V[ 3] + C[13]*V[ 6] + C[14]*V[10];
976 K[4][1] = C[10]*V[ 1] + C[11]*V[ 2] + C[12]*V[ 4] + C[13]*V[ 7] + C[14]*V[11];
977 K[4][2] = C[10]*V[ 3] + C[11]*V[ 4] + C[12]*V[ 5] + C[13]*V[ 8] + C[14]*V[12];
978 K[4][3] = C[10]*V[ 6] + C[11]*V[ 7] + C[12]*V[ 8] + C[13]*V[ 9] + C[14]*V[13];
979 K[4][4] = C[10]*V[10] + C[11]*V[11] + C[12]*V[12] + C[13]*V[13] + C[14]*V[14];
985 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];
987 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];
988 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];
990 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];
991 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];
992 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];
994 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];
995 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];
996 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];
997 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];
999 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];
1000 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];
1001 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];
1002 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];
1003 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];
1009 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];
1010 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];
1011 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];
1012 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];
1013 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];
1019 for(
int i=0;
i<15;
i++)
1024 for(
int i=0;
i<5;
i++)
1032 for(
int i=0;
i<5;
i++) dzeta[
i] = m[
i] - r[
i];
1035 for(
int i=0;
i< 15;
i++)
1039 for(
int i=0;
i<5;
i++)
1042 for(
int j=0; j<5; j++)
1043 kd += K[
i][j]*dzeta[j];
1048 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];
1053 const int NTracksS = tracks.size();
1054 vector< vector< pair<float,int> > > InNeighbour(NTracksS);
1055 vector< vector< pair<float,int> > > OutNeighbour(NTracksS);
1057 vector<PndCATrackParam> fittedTracks;
1058 fittedTracks.reserve(NTracksS);
1059 for (
int iT1 = 0; iT1 < NTracksS; iT1++ ) {
1063 fittedTracks.push_back(p1);
1066 for (
int iT1 = 0; iT1 < NTracksS; iT1++ ) {
1068 if ( t1.
NHits() <= 0 )
continue;
1072 for (
int iT2 = 0; iT2 < NTracksS; iT2++ ) {
1074 if ( t2.
NHits() <= 0 )
continue;
1076 const int nStaDiff = t2.
IHits().front().s - t1.
IHits().back().s;
1077 if ( nStaDiff <= 0 )
continue;
1085 float C[15],
r[5], chi2(0);
1088 if ( chi2 > 20 )
continue;
1089 chi2 += 10*nStaDiff;
1090 OutNeighbour[iT1].push_back( pair<float,int>( chi2, iT2 ) );
1091 InNeighbour[iT2].push_back( pair<float,int>( chi2, iT1 ) );
1096 for (
int iT1 = 0; iT1 < NTracksS; iT1++ ) {
1097 sort( InNeighbour[iT1].begin(), InNeighbour[iT1].end() );
1098 sort( OutNeighbour[iT1].begin(), OutNeighbour[iT1].end() );
1102 bool allPairsFound =
false;
1103 while( !allPairsFound ) {
1104 allPairsFound =
true;
1118 for (
int iT1 = 0; iT1 < NTracksS; iT1++ ) {
1120 if ( t1.
NHits() <= 0 )
continue;
1124 for(
unsigned int iN = 0; iN < OutNeighbour[iT1].size(); iN++ ) {
1125 iT2 = OutNeighbour[iT1][iN].second;
1130 if (iT2 < 0)
continue;
1134 for(
unsigned int iN = 0; iN < InNeighbour[iT2].size(); iN++ ) {
1135 iT21 = InNeighbour[iT2][iN].second;
1142 if ( iT1 != iT21 ) {
1143 allPairsFound =
false;
1149 for (
int ih = 0; ih < t2.
NHits(); ih++ ) {
1155 for(
unsigned int iN = 0; iN < OutNeighbour[iT1].size(); iN++ ) {
1156 const int iT22 = OutNeighbour[iT1][iN].second;
1157 if ( iT22 < 0 )
continue;
1158 for(
unsigned int iN2 = 0; iN2 < InNeighbour[iT22].size(); iN2++ ) {
1159 if( InNeighbour[iT22][iN2].second == iT1 ) {
1160 InNeighbour[iT22][iN2].second = -1;
1165 for(
unsigned int iN = 0; iN < InNeighbour[iT2].size(); iN++ ) {
1166 const int iT22 = InNeighbour[iT2][iN].second;
1167 if ( iT22 < 0 )
continue;
1168 for(
unsigned int iN2 = 0; iN2 < OutNeighbour[iT22].size(); iN2++ ) {
1169 if( OutNeighbour[iT22][iN2].second == iT2 ) {
1170 OutNeighbour[iT22][iN2].second = -1;
1175 for(
unsigned int iN = 0; iN < OutNeighbour[iT2].size(); iN++ ) {
1176 const int iT22 = OutNeighbour[iT2][iN].second;
1177 if ( iT22 < 0 )
continue;
1178 for(
unsigned int iN2 = 0; iN2 < InNeighbour[iT22].size(); iN2++ ) {
1179 if( InNeighbour[iT22][iN2].second == iT2 ) {
1180 InNeighbour[iT22][iN2].second = iT1;
1185 OutNeighbour[iT1] = OutNeighbour[iT2];
1186 InNeighbour[iT2].clear();
1187 OutNeighbour[iT2].clear();
1197 for (
int iT1 = 0; iT1 < NTracksS; iT1++ ) {
1199 if (t1.
NHits() != 0)
1200 tracks.push_back(t1);
1211 unsigned char min_best_l,
1213 unsigned int& nCalls)
1219 const PndCANPlet* curr_trip = &(trs[currITrip]);
1221 if (curr_trip->
Level() == 0){
1237 for (
int in = 0; in < NNeighs; in++) {
1242 bool isUsed =
false;
1243 const int newTripLength = new_trip->
N();
1244 ASSERT( newTripLength - curr_trip->
N() >= -1, newTripLength <<
" - " << curr_trip->
N() );
1245 for(
int i = curr_trip->
N() - 1;
i < newTripLength;
i++ ) {
1246 if( triplets.
OnStation( new_trip->
ISta(0) ).GetHit(
i, newITrip ).IsUsed() ) {
1268 if( start<0 ) start = 0;
1269 for(
int i = start;
i < newTripLength;
i++ ) {
1273 const float qp1 = curr_trip->
QMomentum();
1274 const float qp2 = new_trip->
QMomentum();
1275 float dqp =
fabs(qp1 - qp2);
1279 nT.
Chi2() += dqp*dqp;
1297 r.reserve(hs.size()/float_v::Size + 1);
1303 for(
unsigned int iH = 0; iH < hs.size(); iH += float_v::Size ) {
1304 float_m valid =
static_cast<float_m
>(uint_v::IndexesFromZero() < uint_v(hs.size() - iH) );
1308 float_m active = hit.
IsValid();
1332 if( active.isEmpty() )
continue;
1333 uint_v iHit = uint_v::IndexesFromZero() + iH;
1334 r.resize(r.size()+1);
1340 foreach_bit(
unsigned int iBit, active ) {
1341 hitRecord.
fIHit = iHit[iBit];
1365 for(
int iLen=1; iLen<=cellLength; iLen++){
1366 if ( rCurr->size() <= 0 )
break;
1387 vector<FitStore>
store(3000);
1398 if ( a.size() <= 0 )
return;
1400 r.reserve(5*a.size());
1403 const float_v Pick2 = float_v(10.0*10.0);
1416 if ( station.
NDF == 1 ) {
1418 const float_v sb = stationMy.
fSin;
1419 const float_v cb = stationMy.
fCos;
1423 unsigned int vN = 0, vM=0;
1425 for(
unsigned int iD1 = 0; iD1 < a.size(); ++iD1 ) {
1427 float_m valid1G = D1.
IsValid();
1428 if( valid1G.isEmpty() )
continue;
1431 float_v secAngle = p12+p6*param.
ISec();
1432 valid1G &= param.
Rotate( -param.
Angle() + secAngle, .999f, valid1G );
1435 if( valid1G.isEmpty() )
continue;
1439 const float_v& c00 = param.
fC[0];
1440 const float_v&
c10 = param.
fC[1];
1441 const float_v&
c11 = param.
fC[2];
1442 const float_v&
c20 = param.
fC[3];
1443 const float_v&
c21 = param.
fC[4];
1446 const float_v F0 = cb*c00 + sb*
c10;
1447 const float_v F1 = cb*c10 + sb*
c11;
1448 const float_v F2 = cb*c20 + sb*
c21;
1449 const float_v HCH = ( F0*cb + F1*sb );
1450 const float_v err2U = ( HCH + err2R);
1451 const float_v pickUp2 = Pick2*err2U;
1452 float_v trSinPhiU = cb*param.
SinPhi() + sb*param.
DzDs();
1453 float_v trU = cb*param.
Y() + sb*param.
Z();
1454 float_v trUCorr = -
rsqrt(float_v(1.
f) - trSinPhiU*trSinPhiU );
1456 int secMin = param.
fISec.min(valid1G);
1457 int secMax = param.
fISec.max(valid1G);
1459 for(
int iSec=secMin; iSec<=secMax; iSec++){
1461 int_m sectorOK = valid1G & ( int_v(iSec) == param.
ISec() );
1462 if( sectorOK.isEmpty() )
continue;
1467 for(
int jh=0; jh<sector.
fNHits; jh++ ){
1470 float_v hitU = h1d.
fU + h1d.
fDR*trUCorr;
1471 const float_v du = trU - hitU;
1473 float_m active = sectorOK;
1474 active &= ( du*du <= pickUp2 );
1475 if ( active.isEmpty() )
continue;
1480 foreach_bit(
unsigned int iBit, active ) {
1481 if( vM==float_v::Size ){
1487 s.
F0[vM] = F0[iBit];
1488 s.
F1[vM] = F1[iBit];
1489 s.
F2[vM] = F2[iBit];
1491 s.
du[vM] = du[iBit];
1492 s.
err2U[vM] = err2U[iBit];
1503 for(
unsigned int i=0;
i<=vN;
i++ ){
1504 if(
i==vN && vM==0 )
break;
1508 r.resize( r.size()+1 );
1513 unsigned int nBit = (
i<vN) ?( (
unsigned int)float_v::Size ) :vM;
1515 nPlet.
fIsValid = (uint_v::IndexesFromZero()<nBit);
1517 for(
unsigned int iBit=0; iBit<nBit; iBit++ ){
1525 const float_v& c30 = p.
fC[6];
1526 const float_v& c31 = p.
fC[7];
1527 const float_v& c40 = p.
fC[10];
1528 const float_v& c41 = p.
fC[11];
1530 const float_v zeta = s.
du;
1531 const float_v wi = float_v(1.
f)/s.
err2U;
1532 const float_v zetawi = zeta * wi;
1534 const float_v F0 = s.
F0;
1535 const float_v F1 = s.
F1;
1536 const float_v F2 = s.
F2;
1537 const float_v F3 = cb*c30 + sb*c31;
1538 const float_v F4 = cb*c40 + sb*c41;
1540 const float_v K0 = F0*wi;
1541 const float_v K1 = F1*wi;
1542 const float_v K2 = F2*wi;
1543 const float_v K3 = F3*wi;
1544 const float_v K4 = F4*wi;
1547 p.
fChi2 += zeta * zetawi;
1549 p.
fP[ 0] += - F0*zetawi;
1550 p.
fP[ 1] += - F1*zetawi;
1551 p.
fP[ 2] += - F2*zetawi;
1552 p.
fP[ 3] += - F3*zetawi;
1553 p.
fP[ 4] += - F4*zetawi;
1578 for(
unsigned int iD1 = 0; iD1 < a.size(); ++iD1 ) {
1580 float_m valid1G = D1.
IsValid();
1581 if( valid1G.isEmpty() )
continue;
1586 for(
unsigned int ih=0; ih<hits.size(); ih++ ){
1588 float_m active = valid1G;
1592 if ( active.isEmpty() )
continue;
1593 const float_v dx1 = hit.
X1() - param.
X1();
1594 active &= dx1*dx1 < Pick2*(param.
Err2X1() + hit.
Err2X1());
1595 const float_v dx2 = hit.
X2() - param.
X2();
1596 active &= dx2*dx2 < Pick2*(param.
Err2X2() + hit.
Err2X2());
1597 if ( active.isEmpty() )
continue;
1599 if ( active.isEmpty() )
continue;
1602 if ( active.isEmpty() )
continue;
1606 hitRecord.
fIHit = ih;
1610 foreach_bit(
unsigned int iBit, active ) {
1615 r.push_back( nPlet );
const PndCAHit & Hit(int iH, int iT) const
void MultiplyMS(float const C[5][5], float const V[15], float K[15]) const
const unsigned int & INeighbours(int i) const
friend F32vec4 cos(const F32vec4 &a)
const int StartStationShift
cout<<"the track theta is "<< trackthe<< endl;mc_x[j]=vecmc.X();mc_y[j]=vecmc.Y();mc_z[j]=vecmc.Z()-1110;r_mc[j]=TMath::Sqrt(mc_x[j]*mc_x[j]+mc_y[j]*mc_y[j]);std::cout<<"the r_mc[j] is "<< r_mc[j]<< std::endl;std::cout<<"the mc_z[j] is "<< mc_z[j]<< std::endl;r_mc_err[j]=0;z_mc_err[j]=0;rc_x[j]=vecrc.X();rc_y[j]=vecrc.Y();rc_z[j]=vecrc.Z()-1110;r_rc[j]=TMath::Sqrt(rc_x[j]*rc_x[j]+rc_y[j]*rc_y[j]);std::cout<<"the r_rc[j] is "<< r_rc[j]<< std::endl;std::cout<<"the rc_z[j] is "<< rc_z[j]<< std::endl;r_rc_err[j]=0;z_rc_err[j]=0;double tempmc=TMath::Sqrt(mc_x[0]*mc_x[0]+mc_y[0]*mc_y[0]);mcfirstthe=TMath::ATan(tempmc/(mc_z[0]+1110));cout<<"the first hit theta is "<< mcfirstthe<< endl;}TGraphErrors *mctrack=new TGraphErrors(4, mc_z, r_mc, z_mc_err, r_mc_err);mctrack-> Fit("trackFit","ONF")
PndCATrackParamVector param
void InitByTarget(const PndCATarget &target)
bool Transport(const PndCAHit &hit, float Bz)
float_m Rotate(const float_v &alpha, PndCATrackLinearisationVector &t0, const float maxSinPhi=.999f, const float_m &mask=float_m(true))
float_m Transport0ToX(const float_v &x, const float_v &Bz, const float_m &mask)
unsigned int NNeighbours() const
PndCATFIterTimerInfo fStatGTi
void SetAngle(const float_v &v)
void SetSignCosPhi(const float_v &v)
double fStatTime[fNTimers]
friend F32vec4 sqrt(const F32vec4 &a)
bool IsRightNeighbour(const PndCANPlet &a, const PndCANPlet &b, float pick, float &chi2)
void SetChi2(const float_v &v)
const float * Par() const
friend F32vec4 sin(const F32vec4 &a)
PndCATFIterTimerInfo fGTi
const PndCAStation & Station(short i) const
PndCAElementsOnStation< T > & OnStation(char i)
const char & IStation() const
void MultiplySR(float const C[15], float const r_in[5], float r_out[5]) const
void MultiplySS(float const C[15], float const V[15], float K[5][5]) const
const PndCAHits * fHitsRef
void SetISec(const int_v &v)
PndCANPlets(int nSta, const PndCAHits *hits)
float_m Filter(const PndCAHitV &hit, const PndCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)
void FindBestCandidate(int ista, PndCATrack &best_tr, int currITrip, PndCATrack &curr_tr, unsigned char min_best_l, const PndCANPlets &triplets, unsigned int &nCalls)
void SetTrackParam(const PndCATrackParamVector ¶m, const float_m &m=float_m(true))
void Create1Plets(const PndCATarget &target, const PndCAHits &hits, PndCAElementsOnStation< PndCANPletV > &singlets, int iStation)
float_m Transport0(const int_v &ista, const PndCAParam ¶m, const float_m &mask=float_m(true))
float_m Accept(const PndCAHit &hit, const PndCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f) const
void PickUpHits(PndCAElementsOnStation< PndCANPletV > &a, PndCAElementsOnStation< PndCANPletV > &r, int iS)
const PndCATrackParamVector & Param() const
PndCATrackParamVector fParam
const PndCAElementsOnStation< T > & OnStationConst(char i) const
PndCAElementsOnStation< PndCANPlet > & OnStation(char i)
void SetCov(int i, const float_v &v)
bool ReadHitsFromFile(string prefix)
friend F32vec4 rsqrt(const F32vec4 &a)
const float * Cov() const
void SetInnerParam(const PndCATrackParam &v)
void InitDirection(float_v r0, float_v r1, float_v r2)
void WriteSettings(std::ostream &out) const
vector< PndCAGBHit > fHits
bool SaveTracksInFile(string prefix) const
vector< FitStore > store(3000)
friend F32vec4 fabs(const F32vec4 &a)
const float & Chi2Neighbours(int i) const
void SetHits(std::vector< PndCAGBHit > &hits)
void Merge(PndCATracks &tracks)
void FindNeighbours(PndCANPlets &triplets)
vector< PndCAHitSTT > fHits1D
vector< TrackHitRecord > gTrackHitRecords
void ConvertTrackParamToVector(PndCATrackParam t0[uint_v::Size], PndCATrackParamVector &t, int &nTracksV)
float QMomentumErr2() const
void CreateTracks(const PndCANPlets &triplets, PndCATracks &tracks)
vector< pair< float, unsigned int > > & Neighbours()
vector< PndCATES > & IHits()
void InvertCholetsky(float a[15]) const
float QMomentumErr() const
void SetX(const float_v &v)
void WriteEvent(FILE *out) const
PndCATrackParamVector & ParamRef()
PndCAStationSTT fStations[50]
double Chi2(const double *xx)
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
const PndCATrackParam Fit(const PndCAHits &hits, const PndCATarget &target, const PndCAParam &caParam, bool dir=true)
void SetPar(int i, const float_v &v)
void SetOuterParam(const PndCATrackParam &v)
void CreateNPlets(const PndCATarget &target, const PndCAHits &hits, PndCAElementsOnStation< PndCANPletV > &triplets, int iStation, int cellLength)
const PndCAHits * HitsRef() const
double fSliceTrackerCpuTime
PndPidEmcAssociatorTask * ts
const PndCATrackParam & Param() const
void SetFirstHitRef(int v)
const PndCAParam & GetParameters() const
void AddHit(char iS, int iH)
void SaveHitsInFile(string prefix) const
const PndCATES & IHit(int IH) const
PndCAStationSTTSector fSectors[fgNSectors]
void ReadSettings(std::istringstream &in)