12 #ifndef PNDFTSCATRACKPARAM_H 
   13 #define PNDFTSCATRACKPARAM_H 
   37     : 
x( v.
X()[i] ), 
y( v.
Y()[i] ), tx( v.Tx()[i] ), ty( v.Ty()[i] ), qp( v.
QP()[i] ), 
z( v.
Z()[i] ), 
 
   58   float X0()
      const { 
return z; }
 
   59   float X1()
      const { 
return x; }
 
   60   float X2()
      const { 
return y; }
 
   61   float Tx1()
     const { 
return tx; }
 
   62   float Tx2()
     const { 
return ty; }
 
   64   float X()
      const { 
return x; }
 
   65   float Y()
      const { 
return y; }
 
   66   float Z()
      const { 
return z; }
 
   67   float Tx()
     const { 
return tx; }
 
   68   float Ty()
     const { 
return ty; }
 
   69   float QP()
          const { 
return qp; }
 
   71   float Chi2()
  const { 
return chi2; }
 
   72   int   NDF()
   const { 
return ndf; }
 
   77   float Err2X1()
      const { 
return Err2X(); }
 
   79   float Err2Tx1()
      const { 
return Err2Tx(); }
 
   80   float Err2Tx2()
      const { 
return Err2Ty(); }
 
   82   float Err2X()
      const { 
return C00; }
 
   83   float Err2Y()
      const { 
return C11; }
 
   84   float Err2Tx()
      const { 
return C22; }
 
   85   float Err2Ty()
      const { 
return C33; }
 
   86   float Err2QP()
          const { 
return C44; }
 
   89   float* 
Par()  { 
return &
x; }
 
   90   float* 
Cov()  { 
return &C00; }
 
   92   float Par( 
int i )
 const {
 
  100     assert(0); 
return -1;
 
  103   float Cov( 
int i )
 const {
 
  121     assert(0); 
return -1;
 
  124   void SetCov( 
int i, 
float v ) {
 
  126       case 0: C00 = 
v; 
break;
 
  127       case 1: C10 = 
v; 
break;
 
  128       case 2: C11 = 
v; 
break;
 
  129       case 3: C20 = 
v; 
break;
 
  130       case 4: C21 = 
v; 
break;
 
  131       case 5: C22 = 
v; 
break;
 
  132       case 6: C30 = 
v; 
break;
 
  133       case 7: C31 = 
v; 
break;
 
  134       case 8: C32 = 
v; 
break;
 
  135       case 9: C33 = 
v; 
break;
 
  136       case 10: C40 = 
v; 
break;
 
  137       case 11: C41 = 
v; 
break;
 
  138       case 12: C42 = 
v; 
break;
 
  139       case 13: C43 = 
v; 
break;
 
  140       case 14: C44 = 
v; 
break;
 
  144   void SetX( 
float v )     {  
x = 
v; }
 
  145   void SetY( 
float v )     {  
y = 
v; }
 
  146   void SetZ( 
float v )     {  
z = 
v; }
 
  148   void SetTX( 
float v )     {  tx = 
v; }
 
  149   void SetTY( 
float v )     {  ty = 
v; }
 
  150   void SetQP( 
float v )     {  qp = 
v; }
 
  152   void SetChi2( 
float v )  {  chi2 = 
v; }
 
  153   void SetNDF( 
int v )   { ndf = 
v; }
 
  160     return TransportToX0Line( x_ );
 
  167     const float_m &mask = v.
Transport( hit, param );
 
  176     const float_m &mask = v.
Filter( hit, param );
 
  186       C40= C41= C42= C43= C44=0.f;
 
  190   bool TransportToX0Line( 
float x0 );
 
  192   bool IsValid()
 const { 
return chi2 != -1; }
 
  195   bool Rotate( 
float ){ 
return 1; };
 
  200   float x,
y,tx,ty,qp,
z,
 
  205                                  C40, C41, C42, C43, C44;
 
  213 inline bool PndFTSCATrackParam::TransportToX0Line( 
float x0_out )
 
  215   float dz = (x0_out - 
z);
 
  221   const float dzC32_in = dz * C32;  
 
  224   C10 += dz * (  C21 + C30 );
 
  226   const float C20_in = C20;
 
  229   C00 += dz * ( C20 + C20_in );
 
  231   const float C31_in = C31;
 
  234   C11 += dz * ( C31 + C31_in );
 
  259     for ( 
int j = 0; j <  5; ++j ) 
fP[j] = v.
Par()[j][
i];
 
  260     for ( 
int j = 0; j < 15; ++j ) 
fC[j] = v.
Cov()[j][
i];
 
  263   float X0()
      const { 
return fX; }
 
  264   float X1()
      const { 
return Y(); }
 
  265   float X2()
      const { 
return Z(); }
 
  267   float X()
      const { 
return fX;    }
 
  268   float Y()
      const { 
return fP[0]; }
 
  269   float Z()
      const { 
return fP[1]; }
 
  291   float Kappa( 
float Bz )
 const { 
return fP[4]*Bz; }
 
  296   const float *
Par()
 const { 
return fP; }
 
  297   const float *
Cov()
 const { 
return fC; }
 
  299   bool GetXYZPxPyPzQ( 
float& 
x, 
float& 
y, 
float& 
z, 
float& px, 
float& py, 
float& 
pz, 
int& q, 
float cov[21] ) 
const;
 
  304                     float &px, 
float &py, 
float &
pz, 
float Bz  ) 
const;
 
  309   bool Rotate( 
float alpha, 
float maxSinPhi = .999 );
 
  320     for(
int i=0; i < 5; i++) 
fP[i] = 0;
 
  321     for(
int i=0; i < 15; i++) 
fC[i] = 0;
 
  325   float S( 
float x, 
float y, 
float Bz  ) 
const;
 
  345   const float ex = 
CosPhi();
 
  346   const float ey = 
SinPhi();
 
  347   const float k  = 
QPt() * Bz;
 
  348   const float dx = x - 
X();
 
  350   const float ey1 = k * dx + ey;
 
  357   if ( ex < 0 ) ex1 = -ex1;
 
  359   const float dx2 = dx * 
dx;
 
  360   const float ss = ey + ey1;
 
  361   const float cc = ex + ex1;
 
  365   const float cci = 1.f / cc;
 
  366   const float exi = 1.f / ex;
 
  367   const float ex1i = 1.f / ex1;
 
  369   const float tg = ss * cci; 
 
  371   const float dy = dx * tg;
 
  374   if ( cc < 0 ) dl = -dl;
 
  375   float dSin = dl * k * 0.5;
 
  376   if ( dSin > 1.
f ) dSin = 1.f;
 
  377   if ( dSin < -1.
f ) dSin = -1.f;
 
  379   const float dz = dS * 
DzDs();
 
  388   const float h2 = dx * ( 1.f + ey * ey1 + ex * ex1 ) * exi * ex1i * cci;
 
  389   const float h4 = dx2 * ( cc + ss * ey1 * ex1i ) * cci * cci * Bz;
 
  390   const float dxBz = dx * Bz;
 
  398   const float c00 = 
fC[0];
 
  399   const float c10 = 
fC[1];
 
  400   const float c11 = 
fC[2];
 
  401   const float c20 = 
fC[3];
 
  402   const float c21 = 
fC[4];
 
  403   const float c22 = 
fC[5];
 
  404   const float c30 = 
fC[6];
 
  405   const float c31 = 
fC[7];
 
  406   const float c32 = 
fC[8];
 
  407   const float c33 = 
fC[9];
 
  408   const float c40 = 
fC[10];
 
  409   const float c41 = 
fC[11];
 
  410   const float c42 = 
fC[12];
 
  411   const float c43 = 
fC[13];
 
  412   const float c44 = 
fC[14];
 
  414   fC[0] = ( c00  + h2 * h2 * c22 + h4 * h4 * c44
 
  415           + 2.f * ( h2 * c20 + h4 * c40 + h2 * h4 * c42 )  );
 
  417   fC[1] = c10 + h2 * c21 + h4 * c41 + dS * ( c30 + h2 * c32 + h4 * c43 );
 
  418   fC[2] = c11 + 2.f * dS * c31 + dS * dS * c33;
 
  420   fC[3] = c20 + h2 * c22 + h4 * c42 + dxBz * ( c40 + h2 * c42 + h4 * c44 );
 
  421   fC[4] = c21 + dS * c32 + dxBz * ( c41 + dS * c43 );
 
  422   fC[5] = c22 + 2.f * dxBz * c42 + dxBz * dxBz * c44;
 
  424   fC[6] = c30 + h2 * c32 + h4 * c43;
 
  425   fC[7] = c31 + dS * c33;
 
  426   fC[8] = c32 + dxBz * c43;
 
  429   fC[10] = c40 + h2 * c42 + h4 * c44;
 
  430   fC[11] = c41 + dS * c43;
 
  431   fC[12] = c42 + dxBz * c44;
 
  435   fC[0] = ( fC[0]  + h2 * h2 * fC[5] + h4 * h4 * fC[14]
 
  436           + 2 * ( h2 * fC[3] + h4 * fC[10] + h2 * h4 * fC[12] )  );
 
  438   fC[1] = fC[1] + h2 * fC[4] + h4 * fC[11] + dS * ( fC[6] + h2 * fC[8] + h4 * fC[13] );
 
  439   fC[2] = fC[2] + 2 * dS * fC[7] + dS * dS * fC[9];
 
  441   fC[3] = fC[3] + h2 * fC[5] + h4 * fC[12] + dxBz * ( fC[10] + h2 * fC[12] + h4 * fC[14] );
 
  442   fC[4] = fC[4] + dS * fC[8] + dxBz * ( fC[11] + dS * fC[13] );
 
  443   fC[5] = fC[5] + 2 * dxBz * fC[12] + dxBz * dxBz * fC[14];
 
  445   fC[6] = fC[6] + h2 * fC[8] + h4 * fC[13];
 
  446   fC[7] = fC[7] + dS * fC[9];
 
  447   fC[8] = fC[8] + dxBz * fC[13];
 
  450   fC[10] = fC[10] + h2 * fC[12] + h4 * fC[14];
 
  451   fC[11] = fC[11] + dS * fC[13];
 
  452   fC[12] = fC[12] + dxBz * fC[14];
 
static T ASin(const T &x)
const float_v & Cov(int i) const 
bool Transport(const FTSCAHit &hit, const PndFTSCAParam ¶m)
void GetDCAPoint(float x, float y, float z, float &px, float &py, float &pz, float Bz) const 
bool Rotate(float alpha, float maxSinPhi=.999)
friend F32vec4 sqrt(const F32vec4 &a)
static T Sqrt(const T &x)
const float * Par() const 
std::ostream & operator<<(std::ostream &out, const PndFTSCATrackParam &ot)
friend std::istream & operator>>(std::istream &, PndFTSCATrackParam &)
friend std::ostream & operator<<(std::ostream &, const PndFTSCATrackParam &)
PndFTSCATrackParam(const TrackParamVector &v, int i)
const float * Cov() const 
float_m Transport(const int_v &ista, const PndFTSCAParam ¶m, const float_m &mask=float_m(true))
bool GetXYZPxPyPzQ(float &x, float &y, float &z, float &px, float &py, float &pz, int &q, float cov[21]) const 
PndFTSCATrackParam TrackParam
bool TransportToX0(float x, float Bz, float maxSinPhi=.999)
float Err2QMomentum() 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)
const float_v & Par(int i) const 
float S(float x, float y, float Bz) const 
std::istream & operator>>(std::istream &in, PndFTSCATrackParam &ot)
void ConvertTrackParamToVector(PndFTSCATrackParam t0[float_v::Size], int nTracksV)
float Kappa(float Bz) const 
float_m Filter(const FTSCAHitV &hit, const PndFTSCAParam ¶m, const float_m &mask=float_m(true), const float_v &chi2Cut=10e10f)