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
PndCATrackParamVector param
void InitByTarget(const PndCATarget &target)
const PndCAHits * HitsRef() const 
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)
const char & IStation() const 
PndCATFIterTimerInfo fGTi
const PndCAHits * fHitsRef
const PndCAStation & Station(short i) const 
PndCAElementsOnStation< T > & OnStation(char i)
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 
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 
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)
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)
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)