LCOV - code coverage report
Current view: top level - HLT/TPCLib/merger-ca - AliHLTTPCGMSliceTrack.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 0 248 0.0 %
Date: 2016-06-14 17:26:59 Functions: 0 3 0.0 %

          Line data    Source code
       1             : // $Id: AliHLTTPCGMSliceTrack.cxx 41769 2010-06-16 13:58:00Z sgorbuno $
       2             : // **************************************************************************
       3             : // This file is property of and copyright by the ALICE HLT Project          *
       4             : // ALICE Experiment at CERN, All rights reserved.                           *
       5             : //                                                                          *
       6             : // Primary Authors: Sergey Gorbunov <sergey.gorbunov@kip.uni-heidelberg.de> *
       7             : //                  for The ALICE HLT Project.                              *
       8             : //                                                                          *
       9             : // Permission to use, copy, modify and distribute this software and its     *
      10             : // documentation strictly for non-commercial purposes is hereby granted     *
      11             : // without fee, provided that the above copyright notice appears in all     *
      12             : // copies and that both the copyright notice and this permission notice     *
      13             : // appear in the supporting documentation. The authors make no claims       *
      14             : // about the suitability of this software for any purpose. It is            *
      15             : // provided "as is" without express or implied warranty.                    *
      16             : //                                                                          *
      17             : //***************************************************************************
      18             : 
      19             : #include "AliHLTTPCGMSliceTrack.h"
      20             : #include "AliHLTTPCCAMath.h"
      21             : #include "AliHLTTPCGMBorderTrack.h"
      22             : #include "AliHLTTPCGMTrackLinearisation.h"
      23             : #include "Riostream.h"
      24             : #include "AliHLTTPCCAParam.h"
      25             : #include <cmath>
      26             : 
      27             : 
      28             : 
      29             : bool AliHLTTPCGMSliceTrack::FilterErrors( AliHLTTPCCAParam &param, float maxSinPhi )
      30             : {
      31           0 :   float lastX = fOrigTrack->Cluster(fOrigTrack->NClusters()-1 ).GetX();
      32             : 
      33             :   const int N = 3;
      34           0 :   const float *cy = param.GetParamS0Par(0,0);
      35           0 :   const float *cz = param.GetParamS0Par(1,0);
      36             : 
      37           0 :   float bz = -param.ConstBz();
      38             :   const float kZLength = 250.f - 0.275f;
      39             : 
      40           0 :   float trDzDs2 = fDzDs*fDzDs;
      41           0 :   float k  = fQPt*bz;               
      42           0 :   float dx = .33*(lastX - fX);  
      43           0 :   float kdx = k*dx;
      44           0 :   float dxBz = dx * bz;
      45           0 :   float kdx205 = 2.f+kdx*kdx*0.5f;
      46             : 
      47             :   {
      48           0 :     float secPhi2 = fSecPhi*fSecPhi;
      49           0 :     float zz = fabs( kZLength - fabs(fZ) );     
      50           0 :     float zz2 = zz*zz;
      51           0 :     float angleY2 = secPhi2 - 1.f; 
      52           0 :     float angleZ2 = trDzDs2 * secPhi2 ;
      53             :     
      54           0 :     float cy0 = cy[0] + cy[1]*zz + cy[3]*zz2;
      55           0 :     float cy1 = cy[2] + cy[5]*zz;
      56           0 :     float cy2 = cy[4];
      57           0 :     float cz0 = cz[0] + cz[1]*zz + cz[3]*zz2;
      58           0 :     float cz1 = cz[2] + cz[5]*zz;
      59           0 :     float cz2 = cz[4];
      60             :     
      61           0 :     fC0 = fabs( cy0 + angleY2 * ( cy1 + angleY2*cy2 ) );
      62           0 :     fC2 = fabs( cz0 + angleZ2 * ( cz1 + angleZ2*cz2 ) );    
      63             : 
      64           0 :     fC3 = 0;
      65           0 :     fC5 = 1;
      66           0 :     fC7 = 0;
      67           0 :     fC9 = 1;
      68           0 :     fC10 = 0;
      69           0 :     fC12 = 0;
      70           0 :     fC14 = 10;
      71             :   }
      72             : 
      73           0 :   for( int iStep=0; iStep<N; iStep++ ){    
      74             : 
      75             :     float err2Y, err2Z;
      76             : 
      77             :     { // transport block
      78             :  
      79           0 :       float ex = fCosPhi; 
      80           0 :       float ey = fSinPhi;
      81           0 :       float ey1 = kdx + ey;
      82           0 :       if( fabs( ey1 ) > maxSinPhi ) return 0;
      83             : 
      84           0 :       float ss = ey + ey1;      
      85           0 :       float ex1 = sqrt(1.f - ey1*ey1);
      86             :           
      87           0 :       float cc = ex + ex1;  
      88           0 :       float dxcci = dx / cc;
      89             :       
      90           0 :       float dy = dxcci * ss;
      91           0 :       float norm2 = 1.f + ey*ey1 + ex*ex1;
      92           0 :       float dl = dxcci * sqrt( norm2 + norm2 );
      93             :      
      94             :       float dS;   
      95             :       {
      96           0 :         float dSin = 0.5f*k*dl;
      97           0 :         float a = dSin*dSin;
      98             :         const float k2 = 1.f/6.f;
      99             :         const float k4 = 3.f/40.f;
     100           0 :         dS = dl + dl*a*(k2 + a*(k4 ));//+ k6*a) );
     101             :       }
     102             :  
     103           0 :       float dz = dS * fDzDs;      
     104           0 :       float ex1i =1.f/ex1;
     105           0 :       float z = fZ+ dz;
     106             :       { 
     107           0 :         float secPhi2 = ex1i*ex1i;
     108           0 :         float zz = fabs( kZLength - fabs(z) );  
     109           0 :         float zz2 = zz*zz;
     110           0 :         float angleY2 = secPhi2 - 1.f; 
     111           0 :         float angleZ2 = trDzDs2 * secPhi2 ;
     112             : 
     113           0 :         float cy0 = cy[0] + cy[1]*zz + cy[3]*zz2;
     114           0 :         float cy1 = cy[2] + cy[5]*zz;
     115           0 :         float cy2 = cy[4];
     116           0 :         float cz0 = cz[0] + cz[1]*zz + cz[3]*zz2;
     117           0 :         float cz1 = cz[2] + cz[5]*zz;
     118           0 :         float cz2 = cz[4];
     119             :         
     120           0 :         err2Y = fabs( cy0 + angleY2 * ( cy1 + angleY2*cy2 ) );
     121           0 :         err2Z = fabs( cz0 + angleZ2 * ( cz1 + angleZ2*cz2 ) );
     122             :       }
     123             : 
     124           0 :       float hh = kdx205 * dxcci*ex1i; 
     125           0 :       float h2 = hh * fSecPhi;
     126             : 
     127           0 :       fX+=dx;      
     128           0 :       fY+= dy;
     129           0 :       fZ+= dz;
     130           0 :       fSinPhi = ey1;
     131           0 :       fCosPhi = ex1;
     132           0 :       fSecPhi = ex1i;
     133             :     
     134           0 :       float h4 = bz*dxcci*hh;
     135             :       
     136           0 :       float c20 = fC3;
     137           0 :       float c22 = fC5;
     138           0 :       float c31 = fC7;
     139           0 :       float c33 = fC9;
     140           0 :       float c40 = fC10;
     141           0 :       float c42 = fC12;
     142           0 :       float c44 = fC14;
     143             :       
     144           0 :       float c20ph4c42 =  c20 + h4*c42;
     145           0 :       float h2c22 = h2*c22;
     146           0 :       float h4c44 = h4*c44;
     147           0 :       float n7 = c31 + dS*c33;
     148           0 :       float n10 = c40 + h2*c42 + h4c44;
     149           0 :       float n12 = c42 + dxBz*c44;
     150             :       
     151             :       
     152           0 :       fC0+= h2*h2c22 + h4*h4c44 + 2.f*( h2*c20ph4c42  + h4*c40 );
     153             :       
     154           0 :       fC3 = c20ph4c42 + h2c22  + dxBz*n10;
     155           0 :       fC10 = n10;
     156             :       
     157           0 :       fC5 = c22 + dxBz*( c42 + n12 );
     158           0 :       fC12 = n12;
     159             :       
     160           0 :       fC2+= dS*(c31 + n7);
     161           0 :       fC7 = n7; 
     162             :       
     163           0 :    } // end transport block 
     164             : 
     165             : 
     166             :     // Filter block
     167             : 
     168             :     float 
     169           0 :       c00 = fC0,
     170           0 :       c11 = fC2,
     171           0 :       c20 = fC3,
     172           0 :       c31 = fC7,
     173           0 :       c40 = fC10;
     174             :                     
     175           0 :     float mS0 = 1.f/(err2Y + c00);    
     176           0 :     float mS2 = 1.f/(err2Z + c11);
     177             :             
     178             :     // K = CHtS
     179             :     
     180             :     float k00, k11, k20, k31, k40;
     181             :     
     182           0 :     k00 = c00 * mS0;
     183           0 :     k20 = c20 * mS0;
     184           0 :     k40 = c40 * mS0;
     185             :     
     186           0 :     fC0 -= k00 * c00 ;
     187           0 :     fC5 -= k20 * c20 ;
     188           0 :     fC10 -= k00 * c40 ;
     189           0 :     fC12 -= k40 * c20 ;
     190           0 :     fC3 -= k20 * c00 ;
     191           0 :     fC14 -= k40 * c40 ;
     192             :         
     193           0 :     k11 = c11 * mS2;
     194           0 :     k31 = c31 * mS2;
     195             :     
     196           0 :     fC7 -= k31 * c11;
     197           0 :     fC2 -= k11 * c11;
     198           0 :     fC9 -= k31 * c31;   
     199           0 :   }
     200             : 
     201             :   //* Check that the track parameters and covariance matrix are reasonable
     202             : 
     203             :   bool ok = 1;
     204             :   
     205             :   const float *c = &fX;
     206           0 :   for ( int i = 0; i < 17; i++ ) ok = ok && finite( c[i] );
     207             : 
     208           0 :   if ( fC0 <= 0.f || fC2 <= 0.f || fC5 <= 0.f || fC9 <= 0.f || fC14 <= 0.f 
     209           0 :        || fC0 > 5.f || fC2 > 5.f || fC5 > 2.f || fC9 > 2.f             ) ok = 0;
     210             : 
     211           0 :   if( ok ){
     212           0 :     ok = ok 
     213           0 :       && ( fC3*fC3<=fC5*fC0 )
     214           0 :       && ( fC7*fC7<=fC9*fC2 )
     215           0 :       && ( fC10*fC10<=fC14*fC0 )
     216           0 :       && ( fC12*fC12<=fC14*fC5 );
     217           0 :   }
     218             :  
     219           0 :   return ok;
     220           0 : }
     221             : 
     222             : 
     223             : 
     224             : bool AliHLTTPCGMSliceTrack::TransportToX( float x, float Bz, AliHLTTPCGMBorderTrack &b, float maxSinPhi ) const 
     225             : {
     226           0 :   Bz = -Bz;
     227           0 :   float ex = fCosPhi;
     228           0 :   float ey = fSinPhi;
     229           0 :   float k  = fQPt*Bz;
     230           0 :   float dx = x - fX;
     231           0 :   float ey1 = k*dx + ey;
     232             :   
     233           0 :   if( fabs( ey1 ) > maxSinPhi ) return 0;
     234             : 
     235           0 :   float ex1 = sqrt( 1.f - ey1 * ey1 );
     236           0 :   float dxBz = dx * Bz;
     237             :     
     238           0 :   float ss = ey + ey1;
     239           0 :   float cc = ex + ex1;  
     240           0 :   float dxcci = dx / cc;
     241           0 :   float norm2 = 1.f + ey*ey1 + ex*ex1;
     242             : 
     243           0 :   float dy = dxcci * ss;
     244             : 
     245             :   float dS;    
     246             :   {
     247           0 :     float dl = dxcci * sqrt( norm2 + norm2 );
     248           0 :     float dSin = 0.5f*k*dl;
     249           0 :     float a = dSin*dSin;
     250             :     const float k2 = 1.f/6.f;
     251             :     const float k4 = 3.f/40.f;
     252             :     //const float k6 = 5.f/112.f;
     253           0 :     dS = dl + dl*a*(k2 + a*(k4 ));//+ k6*a) );
     254             :   }
     255             :   
     256           0 :   float ex1i = 1.f/ex1;
     257           0 :   float dz = dS * fDzDs;
     258             : 
     259           0 :   float hh = dxcci*ex1i*norm2; 
     260           0 :   float h2 = hh *fSecPhi;
     261           0 :   float h4 = Bz*dxcci*hh;
     262             :   
     263           0 :   float c20 = fC3;
     264           0 :   float c22 = fC5;  
     265           0 :   float c31 = fC7;  
     266           0 :   float c33 = fC9;
     267           0 :   float c40 = fC10;  
     268           0 :   float c42 = fC12;
     269           0 :   float c44 = fC14;
     270             : 
     271           0 :   float c20ph4c42 =  c20 + h4*c42;
     272           0 :   float h2c22 = h2*c22;
     273           0 :   float h4c44 = h4*c44;
     274           0 :   float n7 = c31 + dS*c33;
     275             :   
     276           0 :   b.SetPar(0, fY + dy );
     277           0 :   b.SetPar(1, fZ + dz );
     278           0 :   b.SetPar(2, ey1 );
     279           0 :   b.SetPar(3, fDzDs);
     280           0 :   b.SetPar(4, fQPt);
     281             : 
     282           0 :   b.SetCov(0, fC0 + h2*h2c22 + h4*h4c44 + 2.f*( h2*c20ph4c42  + h4*c40 ));
     283           0 :   b.SetCov(1, fC2+ dS*(c31 + n7) );
     284           0 :   b.SetCov(2, c22 + dxBz*( c42 + c42 + dxBz*c44 ));
     285           0 :   b.SetCov(3, c33);
     286           0 :   b.SetCov(4, c44);
     287           0 :   b.SetCovD(0, c20ph4c42 + h2c22  + dxBz*(c40 + h2*c42 + h4c44) );
     288           0 :   b.SetCovD(1, n7 );   
     289             :   return 1;
     290           0 : }
     291             : 
     292             : 
     293             : 
     294             : bool AliHLTTPCGMSliceTrack::TransportToXAlpha( float newX, float sinAlpha, float cosAlpha, float Bz, AliHLTTPCGMBorderTrack &b, float maxSinPhi ) const 
     295             : {
     296             :   //* 
     297             : 
     298           0 :   float c00 = fC0;
     299           0 :   float c11 = fC2;
     300           0 :   float c20 = fC3;
     301           0 :   float c22 = fC5;  
     302           0 :   float c31 = fC7;  
     303           0 :   float c33 = fC9;
     304           0 :   float c40 = fC10;  
     305           0 :   float c42 = fC12;
     306           0 :   float c44 = fC14;
     307             : 
     308             :   float x,y;
     309           0 :   float z = fZ;
     310           0 :   float sinPhi = fSinPhi;
     311           0 :   float cosPhi = fCosPhi;
     312           0 :   float secPhi = fSecPhi;
     313           0 :   float dzds = fDzDs;
     314           0 :   float qpt = fQPt;
     315             : 
     316             :   // Rotate the coordinate system in XY on the angle alpha
     317             :   {
     318             :     float sP = sinPhi, cP = cosPhi;
     319           0 :     cosPhi =  cP * cosAlpha + sP * sinAlpha;
     320           0 :     sinPhi = -cP * sinAlpha + sP * cosAlpha;
     321             :     
     322           0 :     if ( CAMath::Abs( sinPhi ) > .999 || CAMath::Abs( cP ) < 1.e-2  ) return 0;
     323             :     
     324           0 :     secPhi = 1./cosPhi;
     325           0 :     float j0 = cP *secPhi;
     326           0 :     float j2 = cosPhi / cP;    
     327           0 :     x =   fX*cosAlpha +  fY*sinAlpha ;
     328           0 :     y =  -fX*sinAlpha +  fY*cosAlpha ;    
     329             :     
     330           0 :     c00 *= j0 * j0;
     331           0 :     c40 *= j0;
     332             :     
     333           0 :     c22 *= j2 * j2;    
     334           0 :     c42 *= j2;    
     335           0 :     if( cosPhi < 0.f ){ // rotate to 180'
     336           0 :       cosPhi = -cosPhi;
     337           0 :       secPhi = -secPhi;
     338           0 :       sinPhi = -sinPhi;
     339           0 :       dzds = -dzds;
     340           0 :       qpt = -qpt;      
     341           0 :       c20 = -c20;
     342           0 :       c31 = -c31;
     343           0 :       c40 = -c40;
     344           0 :    }
     345           0 :   }
     346             : 
     347           0 :   Bz = -Bz;
     348             :   float ex = cosPhi;
     349             :   float ey = sinPhi;
     350           0 :   float k  = qpt*Bz;
     351           0 :   float dx = newX - x;
     352           0 :   float ey1 = k*dx + ey;
     353             :   
     354           0 :   if( fabs( ey1 ) > maxSinPhi ) return 0;
     355             : 
     356           0 :   float ex1 = sqrt( 1.f - ey1 * ey1 );
     357             : 
     358           0 :   float dxBz = dx * Bz;
     359             :     
     360           0 :   float ss = ey + ey1;
     361           0 :   float cc = ex + ex1;  
     362           0 :   float dxcci = dx / cc;
     363           0 :   float norm2 = 1.f + ey*ey1 + ex*ex1;
     364             : 
     365           0 :   float dy = dxcci * ss;
     366             : 
     367             :   float dS;    
     368             :   {
     369           0 :     float dl = dxcci * sqrt( norm2 + norm2 );
     370           0 :     float dSin = 0.5f*k*dl;
     371           0 :     float a = dSin*dSin;
     372             :     const float k2 = 1.f/6.f;
     373             :     const float k4 = 3.f/40.f;
     374             :     //const float k6 = 5.f/112.f;
     375           0 :     dS = dl + dl*a*(k2 + a*(k4 ));//+ k6*a) );
     376             :   }
     377             :   
     378           0 :   float ex1i = 1.f/ex1;
     379           0 :   float dz = dS * dzds;
     380             : 
     381           0 :   float hh = dxcci*ex1i*norm2; 
     382           0 :   float h2 = hh * secPhi;
     383           0 :   float h4 = Bz*dxcci*hh;  
     384             : 
     385           0 :   float c20ph4c42 =  c20 + h4*c42;
     386           0 :   float h2c22 = h2*c22;
     387           0 :   float h4c44 = h4*c44;
     388           0 :   float n7 = c31 + dS*c33;
     389             :   
     390           0 :   b.SetPar(0, y + dy );
     391           0 :   b.SetPar(1, z + dz );
     392           0 :   b.SetPar(2, ey1 );
     393           0 :   b.SetPar(3, dzds);
     394           0 :   b.SetPar(4, qpt);
     395             :   
     396           0 :   b.SetCov(0, c00 + h2*h2c22 + h4*h4c44 + 2.f*( h2*c20ph4c42  + h4*c40 ));
     397           0 :   b.SetCov(1, c11 + dS*(c31 + n7) );
     398           0 :   b.SetCov(2, c22 + dxBz*( c42 + c42 + dxBz*c44 ));
     399           0 :   b.SetCov(3, c33);
     400           0 :   b.SetCov(4, c44);
     401           0 :   b.SetCovD(0, c20ph4c42 + h2c22  + dxBz*(c40 + h2*c42 + h4c44) );
     402           0 :   b.SetCovD(1, n7 ); 
     403             : 
     404             :   return 1;
     405           0 : }

Generated by: LCOV version 1.11