LCOV - code coverage report
Current view: top level - TPC/TPCrec - AliTPCpolyTrack.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 152 0.7 %
Date: 2016-06-14 17:26:59 Functions: 1 11 9.1 %

          Line data    Source code
       1             : /**************************************************************************
       2             :  * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
       3             :  *                                                                        *
       4             :  * Author: The ALICE Off-line Project.                                    *
       5             :  * Contributors are mentioned in the code where appropriate.              *
       6             :  *                                                                        *
       7             :  * Permission to use, copy, modify and distribute this software and its   *
       8             :  * documentation strictly for non-commercial purposes is hereby granted   *
       9             :  * without fee, provided that the above copyright notice appears in all   *
      10             :  * copies and that both the copyright notice and this permission notice   *
      11             :  * appear in the supporting documentation. The authors make no claims     *
      12             :  * about the suitability of this software for any purpose. It is          *
      13             :  * provided "as is" without express or implied warranty.                  *
      14             :  **************************************************************************/
      15             : //------------------------------------------------------------------
      16             : // this class is used for a simple
      17             : // track fitting using the polynom
      18             : // bending in both directions are allowed
      19             : //-----------------------------------------------------------------
      20             : 
      21             : 
      22             : #include "AliTPCpolyTrack.h"
      23             : #include "TMath.h"
      24             : 
      25          16 : ClassImp(AliTPCpolyTrack)
      26             : 
      27             : 
      28             : AliTPCpolyTrack::AliTPCpolyTrack()
      29           0 :   :TObject(),
      30           0 :    fA(0), 
      31           0 :    fB(0), 
      32           0 :    fC(0), 
      33           0 :    fD(0), 
      34           0 :    fE(0), 
      35           0 :    fF(0), 
      36           0 :    fMaxX(0), 
      37           0 :    fMinX(0), 
      38           0 :    fSumW(0),    
      39           0 :    fSumX(0),    
      40           0 :    fSumX2(0),   
      41           0 :    fSumX3(0),    
      42           0 :    fSumX4(0),   
      43           0 :    fSumY(0),    
      44           0 :    fSumYX(0),   
      45           0 :    fSumYX2(0),  
      46           0 :    fSumZ(0),     
      47           0 :    fSumZX(0),   
      48           0 :    fSumZX2(0), 
      49           0 :    fNPoints(0)
      50           0 : {
      51           0 :   Reset();
      52             :   //
      53           0 :   for(Int_t i=0;i<200;i++){
      54           0 :     fX[i]=0.;
      55           0 :     fY[i]=0.;
      56           0 :     fSY[i]=0.;
      57           0 :     fZ[i]=0.;
      58           0 :     fSZ[i]=0.;
      59             :   }
      60           0 : }
      61             : 
      62             : void   AliTPCpolyTrack::Reset()
      63             : {
      64             :   //
      65             :   // reset track
      66           0 :   fSumX = fSumX2= fSumX3=fSumX4 = fSumY=fSumYX=fSumYX2=fSumZ=fSumZX=fSumZX2=fSumW =0;
      67           0 :   fNPoints = 0;
      68           0 : }
      69             : 
      70             : void AliTPCpolyTrack::AddPoint(Double_t x, Double_t y, Double_t z,Double_t sy, Double_t sz)
      71             : {
      72             :   //
      73             :   //
      74           0 :   if (fNPoints==0){
      75           0 :     fMaxX = x;
      76           0 :     fMinX = x;
      77           0 :   }else{
      78           0 :     if (x>fMaxX) fMaxX=x;
      79           0 :     if (x<fMinX) fMinX=x;
      80             :   }
      81             : 
      82           0 :   Double_t x2 = x*x; 
      83           0 :   Double_t w = 2./(sy+sz);
      84           0 :   fSumW += w;
      85             :   //
      86           0 :   fSumX       += x*w;
      87           0 :   fSumX2      += x2*w;
      88           0 :   fSumX3      += x2*x*w;
      89           0 :   fSumX4      += x2*x2*w;
      90             :   //
      91           0 :   fSumY       +=y*w;
      92           0 :   fSumYX      +=y*x*w;
      93           0 :   fSumYX2     +=y*x2*w;
      94             :   //
      95           0 :   fSumZ       +=z*w;
      96           0 :   fSumZX      +=z*x*w;
      97           0 :   fSumZX2     +=z*x2*w;
      98             :   //
      99           0 :   fX[fNPoints] = x;
     100           0 :   fY[fNPoints] = y;
     101           0 :   fZ[fNPoints] = z;  
     102           0 :   fSY[fNPoints] = sy;
     103           0 :   fSZ[fNPoints] = sz;  
     104             : 
     105           0 :   fNPoints++;
     106             :   
     107           0 : }
     108             : 
     109             : void  AliTPCpolyTrack::UpdateParameters()
     110             : {
     111             :   //
     112             :   //
     113             :   //Update fit parameters
     114           0 :   if (fNPoints>4){
     115           0 :     Fit2(fA,fB,fC);
     116             :     //    Fit2(fSumZ,fSumZX,fSumZX2,fSumX,fSumX2,fSumX3,fSumX4,fNPoints,fD,fE,fF);
     117           0 :     Fit1(fD,fE,fF);
     118           0 :   }
     119             :   else
     120             :     {
     121           0 :       Fit1(fA,fB,fC);
     122           0 :       Fit1(fD,fE,fF);
     123             :     }
     124           0 : }
     125             : 
     126             : void  AliTPCpolyTrack::UpdateParameters(Int_t ny, Int_t nz)
     127             : {
     128             :   //
     129             :   //
     130             :   //Update fit parameters
     131           0 :   if (ny>1){
     132           0 :     Fit2(fA,fB,fC);
     133           0 :   }
     134             :   else{ 
     135           0 :     Fit1(fA,fB,fC);
     136             :   }
     137           0 :   if (nz>1){
     138           0 :     Fit2(fD,fE,fF);
     139           0 :   }
     140             :   else{
     141           0 :     Fit1(fD,fE,fF);
     142             :   }
     143           0 : }
     144             : 
     145             : 
     146             : 
     147             : void  AliTPCpolyTrack::Fit2(
     148             :             Double_t &a, Double_t &b, Double_t &c)
     149             : {
     150             :   //fit of second order
     151             :   Double_t det = 
     152           0 :     fSumW* (fSumX2*fSumX4-fSumX3*fSumX3) -
     153           0 :     fSumX*      (fSumX*fSumX4-fSumX3*fSumX2)+
     154           0 :     fSumX2*     (fSumX*fSumX3-fSumX2*fSumX2);
     155             :     
     156           0 :   if (TMath::Abs(det)> 0.000000000000001) {    
     157           0 :     a = 
     158           0 :       (fSumY * (fSumX2*fSumX4-fSumX3*fSumX3)-
     159           0 :        fSumX *(fSumYX*fSumX4-fSumYX2*fSumX3)+
     160           0 :        fSumX2*(fSumYX*fSumX3-fSumYX2*fSumX2))/det; 
     161           0 :     b=
     162           0 :       (fSumW*(fSumYX*fSumX4-fSumX3*fSumYX2)-
     163           0 :       fSumY*(fSumX*fSumX4-fSumX3*fSumX2)+
     164           0 :       fSumX2*(fSumX*fSumYX2-fSumYX*fSumX2))/det;
     165           0 :     c=
     166           0 :       (fSumW*(fSumX2*fSumYX2-fSumYX*fSumX3)-
     167           0 :        fSumX*(fSumX*fSumYX2-fSumYX*fSumX2)+
     168           0 :        fSumY*(fSumX*fSumX3-fSumX2*fSumX2))/det;  
     169           0 :   }
     170           0 : }
     171             : 
     172             : void  AliTPCpolyTrack::Fit1( Double_t &a, Double_t &b, Double_t &c)
     173             : {
     174             :   //
     175             :   //
     176             :   //
     177           0 :   Double_t det = fSumW*fSumX2-fSumX*fSumX;
     178           0 :   if (TMath::Abs(det)> 0.000000000000001) { 
     179           0 :     b = (fSumW*fSumYX-fSumX*fSumY)/det;
     180           0 :     a = (fSumX2*fSumY-fSumX*fSumYX)/det;
     181           0 :     c = 0;
     182           0 :   }else{
     183           0 :     a =fSumYX/fSumX;
     184           0 :     b =0;
     185           0 :     c =0;
     186             :   }
     187             : 
     188           0 : }
     189             : 
     190             : void AliTPCpolyTrack::Refit(AliTPCpolyTrack &track, Double_t deltay, Double_t deltaz)
     191             : {
     192             :   //
     193             :   // refit with cut on distortion
     194             :   //
     195           0 :   track.Reset();
     196             :   //first refit to temporary
     197           0 :   AliTPCpolyTrack track0;
     198           0 :   track0.Reset();
     199           0 :   for (Int_t i=0;i<fNPoints;i++){
     200           0 :     Double_t y,z;
     201           0 :     GetFitPoint(fX[i],y,z);
     202           0 :     if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
     203           0 :       track0.AddPoint(fX[i],y,z);
     204           0 :     }
     205           0 :   }
     206           0 :   if (track0.GetN()>2) 
     207           0 :     track0.UpdateParameters();
     208             :   else 
     209           0 :     return;
     210             :   //
     211           0 :   for (Int_t i=0;i<fNPoints;i++){
     212           0 :     Double_t y,z;
     213           0 :     track0.GetFitPoint(fX[i],y,z);
     214           0 :     if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
     215           0 :       track.AddPoint(fX[i],y,z);
     216           0 :     }
     217           0 :   }
     218           0 :   if (track.GetN()>2) 
     219           0 :     track.UpdateParameters();
     220             : 
     221           0 : }
     222             : 
     223             : void AliTPCpolyTrack::Refit(AliTPCpolyTrack &track, Double_t deltay, Double_t deltaz, Int_t nfirst, Int_t ny, Int_t nz)
     224             : {
     225             :   //
     226             :   // refit with cut on distortion
     227             :   //
     228           0 :   track.Reset();
     229             :   //first refit to temporary
     230           0 :   AliTPCpolyTrack track0;
     231           0 :   track0.Reset();
     232           0 :   for (Int_t i=0;i<fNPoints;i++){
     233           0 :     Double_t y,z;
     234           0 :     GetFitPoint(fX[i],y,z);
     235           0 :     if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
     236           0 :       track0.AddPoint(fX[i],y,z);
     237           0 :     }    
     238           0 :   }
     239           0 :   if (track0.GetN()>2){ 
     240           0 :     if (track0.GetN()>nfirst)
     241           0 :       track0.UpdateParameters(ny,nz);
     242             :     else 
     243           0 :       track0.UpdateParameters(1,1);
     244             :   }
     245             :   else 
     246           0 :     return;
     247             :   //
     248           0 :   for (Int_t i=0;i<fNPoints;i++){
     249           0 :     Double_t y,z;
     250           0 :     track0.GetFitPoint(fX[i],y,z);
     251           0 :     if ( (TMath::Abs(y-fY[i])<deltay)&&(TMath::Abs(z-fZ[i])<deltaz)){
     252           0 :       track.AddPoint(fX[i],y,z);
     253           0 :     }
     254           0 :   }
     255           0 :   if (track.GetN()>2) 
     256           0 :     track.UpdateParameters(ny,nz);
     257             : 
     258           0 : }
     259             : 

Generated by: LCOV version 1.11