LCOV - code coverage report
Current view: top level - TPC/TPCsim - AliTPCTrackHitsV2.cxx (source / functions) Hit Total Coverage
Test: coverage.info Lines: 413 434 95.2 %
Date: 2016-06-14 17:26:59 Functions: 40 43 93.0 %

          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             : /* $Id$ */
      17             : 
      18             : ///////////////////////////////////////////////////////////////////////////////
      19             : //                                                                           //
      20             : //  Time Projection Chamber  track hits object                                //
      21             : //
      22             : //  Origin: Marian Ivanov , GSI Darmstadt
      23             : //
      24             : // AliTPCTrackHitsV2
      25             : //   Container for Track Hits - based on standard TClonesArray -
      26             : //   fArray of AliTPCTrackHitsParamV2 
      27             : //   In AliTPCTrackHitsParamV2 - parameterization of the track segment  is stored 
      28             : //   for each of the track segment - relative position ( distance between  hits) and
      29             : //   charge of the hits is stored - comparing to classical TClonesArray of AliTPChit -
      30             : //   comperssion factor of 5-7 (depending on the required precision) -
      31             : //   In future release AliTPCTrackHitsV2 - will replace old AliTPCTrackHits - which were not
      32             : //   based on standard ROOT containers
      33             : //   Basic function:
      34             : //      // during building Container
      35             : //   AddHitKartez(Int_t volumeID, Int_t trackID, Double_t x, Double_t y, Double_t z,Int_t q)
      36             : //   void SetHitPrecision(Double_t prec) {fPrecision=prec;}
      37             : //   void SetStepPrecision(Double_t prec) {fStep=prec;}   
      38             : //   Bool_t  FlushHitStack(Bool_t force=kTRUE);    
      39             : //      //at the end necessary to have Container in consistent state
      40             : //    
      41             : //     // looping over Container
      42             : //   Bool_t  First(), Bool_t Next() - iterators - return status of the operation
      43             : //   AliTPChit * GetHit(); - return current hit   
      44             : 
      45             : 
      46             : //Begin_Html
      47             : /*
      48             : <img src="gif/AliTPCTrackHitsV2.gif">
      49             : */
      50             : //End_Html
      51             : //                                                                           //
      52             : //                                                                          //
      53             : ///////////////////////////////////////////////////////////////////////////////
      54             : //
      55             : 
      56             : #include <TClonesArray.h>
      57             : #include <TMath.h>
      58             : 
      59             : #include "AliTPCTrackHitsV2.h"
      60             : #include "AliTPC.h"
      61             : 
      62             : 
      63             : 
      64          12 : ClassImp(AliTPCTrackHitsV2) 
      65          12 : ClassImp(AliTrackHitsParamV2)  
      66             : 
      67             :   //
      68             : Int_t AliTrackHitsParamV2::fgCounter1 =0;
      69             : Int_t AliTrackHitsParamV2::fgCounter2 =0;
      70             : //
      71             : Int_t AliTPCTrackHitsV2::fgCounter1 =0;
      72             : Int_t AliTPCTrackHitsV2::fgCounter2 =0;
      73             : //
      74             : const Double_t AliTPCTrackHitsV2::fgkPrecision=1e-6;  //precision 
      75             : const Double_t AliTPCTrackHitsV2::fgkPrecision2=1e-20;  //precision
      76             : const Double_t AliTPCTrackHitsV2::fgkTimePrecision=20.e-9;  //hit time precision 
      77             : 
      78             : 
      79             : 
      80             : 
      81             : class AliTPCTempHitInfoV2 {
      82             : public:
      83             :   AliTPCTempHitInfoV2();   
      84             :   void     SetHit(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time);
      85     9170704 :   UInt_t   GetStackIndex() const {return fStackIndex;}
      86     4307844 :   void     SetStackIndex(UInt_t i) {fStackIndex=i;}
      87      281640 :   UInt_t   GetParamIndex() const {return fParamIndex;}
      88      140942 :   void     SetParamIndex(UInt_t i) {fParamIndex=i;}
      89     1588828 :   Float_t  GetTimeStack(Int_t i) const {return fTimeStack[i];}
      90      107110 :   const Float_t* GetTimeStackP(Int_t i) const {return &fTimeStack[i];}
      91     1588828 :   UInt_t   GetQStack(Int_t i) const {return fQStack[i];}
      92      107110 :   const UInt_t*  GetQStackP(Int_t i) const {return &fQStack[i];}
      93     6253364 :   Double_t * GetPosition(Int_t index){return &fPositionStack[index*3];}
      94     5915944 :   Double_t GetOldR() const {return fOldR;}
      95     1478986 :   void     SetOldR(Double_t r) {fOldR=r;}
      96             : 
      97             : 
      98     6668536 :   AliTrackHitsParamV2 * GetParam() const {return fParam;}
      99      140942 :   void  SetParam(AliTrackHitsParamV2 * p) {fParam=p;}
     100             :   void  UpdateParam(Double_t maxdelta); //recal
     101             :   void  NewParam(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time);
     102             :   enum    {kStackSize = 10000};
     103             : 
     104             : protected:
     105             :   AliTPCTempHitInfoV2(const AliTPCTempHitInfoV2 &hit);
     106             :   AliTPCTempHitInfoV2& operator = (const AliTPCTempHitInfoV2 &hit);
     107             :   void   Fit2(Double_t fSumY, Double_t fSumYX, Double_t fSumYX2,
     108             :             Double_t fSumX,  Double_t fSumX2, Double_t fSumX3, 
     109             :             Double_t fSumX4, Int_t n,
     110             :               Double_t &a, Double_t &b, Double_t &c);
     111             :   void  Fit(AliTrackHitsParamV2 * param);
     112             :   Double_t fSumDr;    // Sum of Dr
     113             :   Double_t fSumDr2;   // Square of sum of Dr
     114             :   Double_t fSumDr3;   // Cube of sum of Dr
     115             :   Double_t fSumDr4;   // Fourth power of sum of Dr
     116             :   Double_t fSumDFi;  //  Sum of DFi
     117             :   Double_t fSumDFiDr; //  Sum of DFiDr
     118             :   Double_t fSumDFiDr2;//  Sum of square of DFiDr
     119             :   Double_t fSumDZ;     // Sum of DZ
     120             :   Double_t fSumDZDr;  //  Sum of DZDr
     121             :   Double_t fSumDZDr2;  // Sum of square of DZDr
     122             :   Double_t fOldR;     //previos r
     123             :   Double_t fPositionStack[3*kStackSize];  //position stack 
     124             :   UInt_t   fQStack[kStackSize];           //Q stack
     125             :   Float_t  fTimeStack[kStackSize];        //time stack
     126             :   UInt_t fStackIndex;   //current stack index 
     127             :   //  UInt_t fInfoIndex;    //current track info index
     128             :   UInt_t fParamIndex;   //current track parameters index
     129             :   //  AliTrackHitsInfo  * fInfo; //current track info
     130             :   AliTrackHitsParamV2 * fParam; //current track param
     131             : };
     132             : 
     133             : 
     134             : AliTPCTempHitInfoV2::AliTPCTempHitInfoV2()
     135         122 :   :fSumDr(0.),
     136          61 :    fSumDr2(0.),
     137          61 :    fSumDr3(0.),
     138          61 :    fSumDr4(0.),
     139          61 :    fSumDFi(0.),
     140          61 :    fSumDFiDr(0.),
     141          61 :    fSumDFiDr2(0.),
     142          61 :    fSumDZ(0.),
     143          61 :    fSumDZDr(0.),
     144          61 :    fSumDZDr2(0.),
     145          61 :    fOldR(0.),
     146          61 :    fStackIndex(0),
     147          61 :    fParamIndex(0),
     148          61 :    fParam(0)
     149         122 : {
     150             :   //
     151             :   // Standard constructor
     152             :   // set to default value
     153             :   //
     154          61 :   fSumDr=fSumDr2=fSumDr3=fSumDr4=
     155          61 :     fSumDFi=fSumDFiDr=fSumDFiDr2=
     156          61 :     fSumDZ=fSumDZDr=fSumDZDr2=0;  
     157          61 :   fStackIndex = 0;
     158             :   //  fInfoIndex  = 0;
     159          61 :   fParamIndex = 0;
     160     3660122 :   for(Int_t i=0;i<3*kStackSize;i++) fPositionStack[i]=0.;
     161     1220122 :   for(Int_t i=0;i<kStackSize;i++){
     162      610000 :     fQStack[i]=0;
     163      610000 :     fTimeStack[i]=0.;
     164             :   }
     165         122 : }
     166             : 
     167             : 
     168             : void AliTPCTempHitInfoV2::NewParam(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
     169             : {
     170             :   //
     171             :   //reset stack and sum parameters
     172             :   //store line initial point
     173             :   //
     174       70471 :   fSumDr=fSumDr2=fSumDr3=fSumDr4=
     175       70471 :     fSumDFi=fSumDFiDr=fSumDFiDr2=
     176      140942 :     fSumDZ=fSumDZDr=fSumDZDr2=0;  
     177       70471 :   fStackIndex=0;
     178       70471 :   fParam->SetR(r);
     179       70471 :   fOldR = r;
     180       70471 :   fParam->SetZ(z);
     181       70471 :   fParam->SetFi(fi);
     182       70471 :   fParam->SetAn(0.);
     183       70471 :   fParam->SetAd(0.);
     184       70471 :   fParam->SetTheta(0.);
     185       70471 :   fParam->SetThetaD(0.);
     186       70471 :   SetHit(r,z,fi,q,time);
     187       70471 : }
     188             : 
     189             : void AliTPCTempHitInfoV2::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
     190             : {
     191             :   //
     192             :   //add hit to the stack
     193             :   //recalculate new estimete of line parameters
     194     4448786 :   Double_t *f = GetPosition(fStackIndex);  
     195     2224393 :   f[0] = r;
     196     2224393 :   f[1] = z;
     197     2224393 :   f[2] = fi;
     198     2224393 :   fQStack[fStackIndex]=q;
     199     2224393 :   fTimeStack[fStackIndex]=time;
     200     2294864 :   if (fStackIndex==0) return;
     201     2153922 :   Double_t dr  = (r-fParam->GetR());
     202     2154341 :   if (TMath::Abs(dr)<AliTPCTrackHitsV2::GetKPrecision()) dr =AliTPCTrackHitsV2::GetKPrecision();
     203     2153922 :   Double_t dfi = fi-fParam->GetFi();
     204     2153922 :   Double_t dz  = z -fParam->GetZ(); 
     205     2153922 :   Double_t dr2 =dr*dr;
     206     2153922 :   Double_t dr3 =dr2*dr;
     207     2153922 :   Double_t dr4 =dr3*dr;
     208     2153922 :   fSumDr +=dr;
     209     2153922 :   fSumDr2+=dr2;
     210     2153922 :   fSumDr3+=dr3;
     211     2153922 :   fSumDr4+=dr4;
     212     2153922 :   fSumDFi +=dfi;
     213     2153922 :   fSumDFiDr+=dfi*dr;
     214     2153922 :   fSumDFiDr2+=dfi*dr2;
     215     2153922 :   fSumDZ +=dz;
     216     2153922 :   fSumDZDr+=dz*dr;
     217     2153922 :   fSumDZDr2+=dz*dr2;
     218             :   
     219             :   //update fit parameters
     220             :   //
     221     2153922 :   Double_t det = fSumDr2*fSumDr4-fSumDr3*fSumDr3;
     222     2303429 :   if (TMath::Abs(det)<AliTPCTrackHitsV2::GetKPrecision2()) return;
     223     4008830 :   if ( ( fStackIndex>1 )  ){
     224     4008798 :     fParam->SetAn((fSumDr4*fSumDFiDr-fSumDr3*fSumDFiDr2)/det);
     225     2004383 :     fParam->SetAd((fSumDr2*fSumDFiDr2-fSumDr3*fSumDFiDr)/det);
     226     2004383 :   }
     227             :   else
     228          32 :     fParam->SetAn(fSumDFiDr/fSumDr2);
     229     4008830 :   if ( ( fStackIndex>1 )  ){
     230     4008798 :     fParam->SetTheta((fSumDr4*fSumDZDr-fSumDr3*fSumDZDr2)/det);
     231     2004383 :     fParam->SetThetaD((fSumDr2*fSumDZDr2-fSumDr3*fSumDZDr)/det);
     232     2004383 :   }
     233             :   else
     234          32 :     fParam->SetTheta(fSumDZDr/fSumDr2); 
     235     4228808 : }
     236             : 
     237             : 
     238             : void   AliTPCTempHitInfoV2::UpdateParam(Double_t maxdelta)
     239             : {
     240             :   //
     241             :   // recalc parameters not fixing origin point
     242             :   //
     243      140942 :   if (fStackIndex>5){ 
     244       60900 :     Double_t a,b,c;
     245       60900 :     a=b=c=0;
     246      121800 :     Fit2(fSumDFi, fSumDFiDr, fSumDFiDr2, fSumDr,fSumDr2,fSumDr3,fSumDr4,
     247       60900 :          fStackIndex, a,b,c);
     248       60900 :     if (TMath::Abs(a)<maxdelta){
     249       60884 :       fParam->SetFi(fParam->GetFi()+a/fParam->GetR());    
     250       60884 :       fParam->SetAn(b);    
     251       60884 :       fParam->SetAd(c);                  
     252       60884 :     }
     253      121800 :     Fit2(fSumDZ, fSumDZDr, fSumDZDr2, fSumDr,fSumDr2,fSumDr3,fSumDr4,
     254       60900 :          fStackIndex, a,b,c) ;   
     255       60900 :     if (TMath::Abs(a)<maxdelta){
     256       54084 :       fParam->SetZ(fParam->GetZ()+a);    
     257       54084 :       fParam->SetTheta(b);    
     258       54084 :       fParam->SetThetaD(c);   
     259       54084 :     }                         
     260       60900 :   }
     261             :       
     262       70471 : }
     263             : 
     264             : void   AliTPCTempHitInfoV2::Fit2(Double_t fSumY, Double_t fSumYX, Double_t fSumYX2,
     265             :             Double_t fSumX,  Double_t fSumX2, Double_t fSumX3, 
     266             :             Double_t fSumX4, Int_t n,
     267             :             Double_t &a, Double_t &b, Double_t &c)
     268             : {
     269             :   //
     270             :   // fit of second order
     271             :   //
     272             :   Double_t det = 
     273      365400 :     n* (fSumX2*fSumX4-fSumX3*fSumX3) -
     274      243600 :     fSumX*      (fSumX*fSumX4-fSumX3*fSumX2)+
     275      121800 :     fSumX2*     (fSumX*fSumX3-fSumX2*fSumX2);
     276             :     
     277      121800 :   if (TMath::Abs(det)> AliTPCTrackHitsV2::GetKPrecision()) {    
     278       25286 :     a = 
     279       50572 :       (fSumY * (fSumX2*fSumX4-fSumX3*fSumX3)-
     280       50572 :        fSumX *(fSumYX*fSumX4-fSumYX2*fSumX3)+
     281       50572 :        fSumX2*(fSumYX*fSumX3-fSumYX2*fSumX2))/det; 
     282       25286 :     b=
     283       50572 :       (n*(fSumYX*fSumX4-fSumX3*fSumYX2)-
     284       50572 :       fSumY*(fSumX*fSumX4-fSumX3*fSumX2)+
     285       50572 :       fSumX2*(fSumX*fSumYX2-fSumYX*fSumX2))/det;
     286       25286 :     c=
     287       50572 :       (n*(fSumX2*fSumYX2-fSumYX*fSumX3)-
     288       50572 :        fSumX*(fSumX*fSumYX2-fSumYX*fSumX2)+
     289       50572 :        fSumY*(fSumX*fSumX3-fSumX2*fSumX2))/det;  
     290       25286 :   }
     291      121800 : }
     292             : 
     293             : void   AliTPCTempHitInfoV2::Fit(AliTrackHitsParamV2 * param)
     294             : {
     295             :   //
     296             :   // fit fixing first and the last point 
     297             :   // result stored in new param
     298             :   //
     299           0 :   Double_t dx2  = (GetPosition(fStackIndex))[0]-fParam->GetR();
     300           0 :   Double_t det = fSumDr4+dx2*fSumDr2-2*dx2*fSumDr3;
     301           0 :   if ( (TMath::Abs(det)> AliTPCTrackHitsV2::GetKPrecision()) &&
     302           0 :        ((TMath::Abs(dx2)> AliTPCTrackHitsV2::GetKPrecision()))){
     303           0 :     Double_t dfi2 = (GetPosition(fStackIndex))[1]-fParam->GetFi();
     304           0 :     param->SetAd((fSumDFiDr2+dfi2*fSumDr-dx2*fSumDFiDr-dfi2*fSumDr3/dx2)/det);
     305           0 :     param->SetAn((dfi2-param->GetAd()*dx2*dx2)/dx2);
     306             :     
     307           0 :     Double_t dz2 = (GetPosition(fStackIndex))[1]-fParam->GetZ();
     308           0 :     param->SetTheta((fSumDZDr2+dz2*fSumDr-dx2*fSumDZDr-dz2*fSumDr3/dx2)/det);
     309           0 :     param->SetTheta((dz2-param->GetAd()*dx2*dx2)/dx2);
     310           0 :   }
     311             :   
     312           0 : }
     313             : 
     314      758310 : AliTrackHitsParamV2::AliTrackHitsParamV2():TObject(),
     315      758310 :    fTrackID(0), 
     316      758310 :    fVolumeID(0),
     317      758310 :    fR(0.),  
     318      758310 :    fZ(0.),  
     319      758310 :    fFi(0.), 
     320      758310 :    fAn(0.), 
     321      758310 :    fAd(0.), 
     322      758310 :    fTheta(0.), 
     323      758310 :    fThetaD(0.), 
     324      758310 :    fNHits(0), 
     325      758310 :    fHitDistance(0), 
     326      758310 :    fCharge(0),
     327      758310 :    fTime(0)
     328     3791550 : {
     329             :   //
     330             :   // default constructor
     331             :   //
     332      758310 :   fgCounter1++;
     333      758310 :   fgCounter2++;
     334     1516620 : }
     335             : 
     336             : AliTrackHitsParamV2::~AliTrackHitsParamV2()
     337     3076508 : {
     338             :   //
     339             :   // Standard destructor
     340             :   //
     341      758310 :   fgCounter1--;
     342      758310 :   if (fHitDistance) {
     343     1516618 :     delete[]fHitDistance;  
     344      758309 :     fHitDistance=0;
     345      758309 :   }
     346      758310 :   if (fCharge){
     347     1516618 :     delete[]fCharge;  
     348      758309 :     fCharge =0;
     349      758309 :   }
     350      758310 :   if (fTime){
     351     1516618 :     delete[]fTime;  
     352      758309 :     fTime =0;
     353      758309 :   }
     354     1538254 : }
     355             : 
     356             : Float_t AliTrackHitsParamV2::Eta() const
     357             : {
     358           0 :   Float_t ctg = fZ / fR;
     359           0 :   Float_t eta = -TMath::Log(TMath::Hypot(1,ctg)-TMath::Abs(ctg));
     360           0 :   if(ctg < 0) eta = -eta;
     361           0 :   return eta;
     362             : }
     363             : 
     364             : 
     365           3 : AliTPCTrackHitsV2::AliTPCTrackHitsV2():TObject(),
     366           3 :   fArray(0),  
     367           3 :   fSize(0),           
     368           3 :   fPrecision(0.),  
     369           3 :   fStep(0.),       
     370           3 :   fMaxDistance(0),   
     371           3 :   fNVolumes(0),        
     372           3 :   fVolumes(0),   
     373           3 :   fTempInfo(0), 
     374           3 :   fCurrentHit(0),  
     375           3 :   fHit(0)  
     376          15 : {
     377             :   //
     378             :   //default constructor
     379             :   //
     380             :   const Float_t kHitPrecision=0.002; //default precision for hit position in cm
     381             :   const Float_t kStep =0.003;  //30 mum step 
     382             :   const UShort_t kMaxDistance =100;  //maximum distance 100  
     383             : 
     384           3 :   fPrecision=kHitPrecision; //precision in cm
     385           3 :   fStep = kStep; //step size
     386           3 :   fMaxDistance = kMaxDistance; //maximum distance
     387             : 
     388             :   //fTrackHitsInfo = new AliObjectArray("AliTrackHitsInfo"); 
     389             :   //fTrackHitsParam = new AliObjectArray("AliTrackHitsParamV2");
     390             :   //fHitsPosAndQ = new TArrayOfArrayVStack("AliHitInfo");
     391           9 :   fArray  = new TClonesArray("AliTrackHitsParamV2");
     392           6 :   fCurrentHit = new AliTPCCurrentHitV2;
     393           3 :   fgCounter1++;
     394           3 :   fgCounter2++;
     395             : 
     396           6 : } 
     397             : 
     398             : AliTPCTrackHitsV2::~AliTPCTrackHitsV2()
     399          18 : {
     400             :   //
     401             :   //default destructor
     402             :   //
     403             :   //  if (fTrackHitsInfo) delete fTrackHitsInfo;
     404           3 :   if (fArray) {
     405           6 :     delete fArray;
     406           3 :     fArray =0;
     407           3 :   }
     408             :   //if (fHitsPosAndQ) delete fHitsPosAndQ;
     409           9 :   if (fCurrentHit) delete fCurrentHit;
     410           5 :   if (fTempInfo) delete fTempInfo;
     411           3 :   if (fVolumes) {
     412           6 :     delete [] fVolumes;
     413           3 :     fVolumes =0;
     414           3 :     fNVolumes=0;
     415           3 :   }
     416           3 :   if (fHit){
     417           4 :     delete fHit;
     418           2 :     fHit=0;
     419           2 :   }
     420           3 :   fgCounter1--;
     421           9 : }
     422             : 
     423             : void AliTPCTrackHitsV2::Clear(Option_t * /*option*/)
     424             : {
     425             :   //
     426             :   // clear object  
     427             :   //
     428       16360 :   fSize = 0;
     429        8180 :   if (fArray){
     430     1489712 :     for (Int_t i=0;i<fArray->GetEntriesFast();i++){
     431      736676 :       AliTrackHitsParamV2 * par = (AliTrackHitsParamV2 *)fArray->UncheckedAt(i);
     432      736676 :       par->~AliTrackHitsParamV2();  // delete object
     433             :     }
     434        8180 :     fArray->Clear();  
     435        8180 :   }
     436        8180 :   if (fTempInfo){
     437         120 :     delete fTempInfo; 
     438          60 :     delete fHit;
     439          60 :     fHit =0;
     440          60 :     fTempInfo =0;
     441          60 :   } 
     442        8180 :   if (fVolumes){
     443        8902 :     delete [] fVolumes;
     444        4451 :     fVolumes=0;
     445        4451 :     fNVolumes=0;
     446        4451 :   }
     447        8180 : }
     448             : 
     449             : 
     450             : void AliTPCTrackHitsV2::AddHitKartez(Int_t volumeID, Int_t trackID, Double_t x, 
     451             :               Double_t y, Double_t z,Int_t q, Float_t time)
     452             : {
     453             :   //
     454             :   // add hit to the container - it add hit at the end - input in global coordinata
     455             :   //
     456     1480188 :   Double_t r = TMath::Sqrt(x*x+y*y);
     457      740094 :   Double_t fi = TMath::ACos(x/r);
     458      964609 :   if (y<0) fi*=-1.;
     459      740094 :     AddHit(volumeID,trackID,r,z,fi,q,time);
     460      740094 : }
     461             : 
     462             : 
     463             : void AliTPCTrackHitsV2::AddHit(Int_t volumeID, Int_t trackID, 
     464             :                              Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
     465             : {
     466             :   //
     467             :   // Adding one hit
     468             :   //
     469     1480188 :   fSize++;
     470             :   Bool_t diff=kFALSE;
     471      740094 :   if (!fTempInfo) { //initialisation of track  - initialisation of parameters
     472          61 :     fTempInfo = new AliTPCTempHitInfoV2;
     473         122 :     fTempInfo->SetParam(new((*fArray)[0]) AliTrackHitsParamV2);
     474          61 :     fTempInfo->GetParam()->SetVolumeID(volumeID);
     475          61 :     fTempInfo->GetParam()->SetTrackID(trackID);
     476          61 :     AddVolume(volumeID);
     477             :     //
     478          61 :     fTempInfo->SetParamIndex(0);
     479          61 :     fTempInfo->NewParam(r,z,fi,q,time);
     480          61 :     return;
     481             :   }
     482             :     
     483             :   // if new volume or new trackID  
     484     1479768 :   if ( (volumeID!=fTempInfo->GetParam()->GetVolumeID()) || 
     485      739735 :        (trackID!=fTempInfo->GetParam()->GetTrackID())){
     486         838 :     if (volumeID!=fTempInfo->GetParam()->GetVolumeID()) AddVolume(volumeID);
     487             :     diff=kTRUE;
     488         540 :     FlushHitStack(kTRUE);        
     489             : 
     490         540 :     fTempInfo->SetParamIndex(fTempInfo->GetParamIndex()+1);   
     491        1080 :     fTempInfo->SetParam(new((*fArray)[fTempInfo->GetParamIndex()]) AliTrackHitsParamV2);   
     492         540 :     fTempInfo->GetParam()->SetVolumeID(volumeID);
     493         540 :     fTempInfo->GetParam()->SetTrackID(trackID);   
     494         540 :     fTempInfo->NewParam(r,z,fi,q,time);
     495         540 :     return;
     496             :   }
     497             :      
     498             :   //calculate current fit precission to next point
     499      739493 :   AliTrackHitsParamV2 &param = *(fTempInfo->GetParam());
     500             :   Double_t dd=0;
     501             :   Double_t dl=0;
     502             :   Double_t ratio=0;
     503             :   Double_t dr,dz,dfi,ddz,ddfi;
     504             :   Double_t drhit,ddl;
     505             :   dr=dz=dfi=ddz=ddfi=0;
     506      739493 :   drhit = r-fTempInfo->GetOldR();
     507             :   { 
     508             :     //Double_t dfi2 = param.fAn+2*param.fAd*(r-param.fR); 
     509      739493 :     Double_t dfi2 = param.GetAn();
     510      739493 :     dfi2*=dfi2*fTempInfo->GetOldR()*fTempInfo->GetOldR();
     511             :     //Double_t ddz2 =  param.fTheta+2*param.fThetaD*(r-param.fR);
     512      739493 :     Double_t ddz2 =  param.GetTheta();
     513      739493 :     ddz2*=ddz2;
     514      739493 :     ratio = TMath::Sqrt(1.+ dfi2+ ddz2);  
     515             :   }
     516             :   //
     517             :   //  dl = fStep * Short_t(TMath::Nint(drhit*ratio/fStep));   // MI change - range check
     518      739493 :   dl = drhit*ratio/fStep;
     519      739555 :   if (TMath::Abs(dl)>32765) dl =0;
     520      739493 :   dl = fStep * Short_t(TMath::Nint(dl));
     521             :   //
     522      739493 :   ddl = dl - drhit*ratio; 
     523      739493 :   fTempInfo->SetOldR(fTempInfo->GetOldR()+dl/ratio); 
     524             : 
     525      739493 :   if (fTempInfo->GetStackIndex()>2){     
     526      688609 :     dr = r-param.GetR();        
     527      688609 :     dz =  z-param.GetZ();  
     528      688609 :     dfi = fi-param.GetFi();
     529      688609 :     ddz = dr*param.GetTheta()+dr*dr*param.GetThetaD()-dz;
     530      688609 :     ddfi= dr*param.GetAn()+dr*dr*param.GetAd()-dfi;    
     531      688609 :     dd  = TMath::Sqrt(ddz*ddz+r*r*ddfi*ddfi+ddl*ddl); 
     532             :     //
     533      688609 :   }        
     534             :   //safety factor 1.25
     535     1425603 :   if ( ( (dd*1.25>fPrecision) ) ||  
     536      686110 :        (fTempInfo->GetStackIndex()+4>fTempInfo->kStackSize) || 
     537      686110 :        (TMath::Abs(dl/fStep)>fMaxDistance)  ) 
     538             :     diff=kTRUE;
     539             :   else{  // if precision OK
     540      670300 :     fTempInfo->SetStackIndex(fTempInfo->GetStackIndex()+1);   
     541      670300 :     fTempInfo->SetHit(r,z,fi,q,time);
     542      670300 :     return;
     543             :   }  
     544             : 
     545             : 
     546             :   //if parameter changed 
     547      138386 :   if (FlushHitStack(kFALSE)){   //if full buffer flushed
     548       84743 :     fTempInfo->SetParamIndex(fTempInfo->GetParamIndex()+1);
     549       31100 :     fTempInfo->SetParam(new((*fArray)[fTempInfo->GetParamIndex()]) AliTrackHitsParamV2);   
     550       15550 :     fTempInfo->GetParam()->SetVolumeID(volumeID);
     551       15550 :     fTempInfo->GetParam()->SetTrackID(trackID);   
     552       15550 :     fTempInfo->NewParam(r,z,fi,q,time);
     553       15550 :   }
     554             :   else{
     555       53643 :     fTempInfo->SetStackIndex(fTempInfo->GetStackIndex()+1);
     556       53643 :     fTempInfo->SetHit(r,z,fi,q,time);              
     557             :   }
     558      809287 : }   
     559             : 
     560             : Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force)
     561             : {
     562             :   //
     563             :   // write fHitsPosAndQ information from the stack to te arrays
     564             :   //
     565       70573 :   if (!fTempInfo) return kFALSE; 
     566             :  
     567       70471 :   AliTrackHitsParamV2 & param = *(fTempInfo->GetParam());
     568             :   //recalculate track parameter not fixing first point
     569       70471 :   fTempInfo->UpdateParam(fStep/4.);
     570             :   //fTempInfo->Fit(fTempInfo->fParam);  //- fixing the first and the last point
     571             : 
     572       70471 :   Double_t oldr = param.GetR(); 
     573             :   UInt_t i;
     574             :   Double_t dd;
     575       70471 :   param.SetNHits(fTempInfo->GetStackIndex()+1);
     576             :   //  if (param.fHitDistance) delete []param.fHitDistance;
     577             :   //  if (param.fCharge) delete []param.fCharge;
     578             :   //  if (param.fTime) delete []param.fTime;
     579       70471 :   param.SetHitDistance(param.GetNHits());
     580       70471 :   param.SetCharge(param.GetNHits());
     581       70471 :   param.SetTime(param.GetNHits());
     582             : 
     583             :    
     584     1621130 :   for (i=0; i <= fTempInfo->GetStackIndex(); i++){
     585      794414 :     Double_t * position = fTempInfo->GetPosition(i);
     586      794414 :     Double_t   dr = position[0]-oldr;
     587             :     Double_t   ratio; 
     588             :     { 
     589             :       //Double_t dfi2 = param.fAn+2*param.fAd*(position[0]-param.fR);
     590      794414 :       Double_t dfi2 = param.GetAn();
     591      794414 :       dfi2*=dfi2*oldr*oldr;
     592             :       //Double_t ddz2 =  param.fTheta+2*param.fThetaD*(position[0]-param.fR);
     593      794414 :       Double_t ddz2 =  param.GetTheta();
     594      794414 :       ddz2*=ddz2;
     595      794414 :       ratio = TMath::Sqrt(1.+ dfi2+ ddz2);  
     596             :     }
     597             : 
     598             :     //    Double_t dl = fStep*(Short_t)TMath::Nint(dr*ratio/fStep);   //MI change 
     599      794414 :     Double_t dl = dr*ratio/fStep;
     600      794417 :     if (TMath::Abs(dl)>32765) dl =0;
     601      794414 :     dl = fStep * Short_t(TMath::Nint(dl));
     602             : 
     603      794414 :     dr = dl/ratio; 
     604      794414 :     oldr+=dr;
     605             :     //calculate precission
     606      794414 :     AliTrackHitsParamV2 &paraml = *(fTempInfo->GetParam());    
     607             :     //real deltas
     608      794414 :     Double_t dr1=  position[0]-paraml.GetR();
     609      794414 :     Double_t dz =  position[1]-paraml.GetZ();
     610      794414 :     Double_t dfi = position[2]-paraml.GetFi();
     611             :     //extrapolated deltas
     612      794414 :     Double_t dr2 = oldr-paraml.GetR(); 
     613      794414 :     Double_t ddr = dr2-dr1;
     614      794414 :     Double_t ddz = dr2*paraml.GetTheta()+dr2*dr2*paraml.GetThetaD()-dz;
     615      794414 :     Double_t ddfi= dr2*paraml.GetAn()+dr2*dr2*paraml.GetAd()-dfi;    
     616      794414 :     dd = TMath::Sqrt(ddz*ddz+oldr*oldr*ddfi*ddfi+ddr*ddr); 
     617             : 
     618             : 
     619      794414 :     if ( (dd>fPrecision) ){ 
     620             :       //if ( (dd<0) ){ 
     621       54321 :       if (i==0){
     622           1 :         paraml.SetAn(0);
     623           1 :         paraml.SetAd(0);
     624           1 :         paraml.SetTheta(0);
     625           1 :         paraml.SetThetaD(0);
     626           1 :         Double_t ddz1 = dr2*paraml.GetTheta()+dr2*dr2*paraml.GetThetaD()-dz;
     627           1 :         Double_t ddfi1= dr2*paraml.GetAn()+dr2*dr2*paraml.GetAd()-dfi;    
     628             :         dl = 0;
     629           1 :         dd = TMath::Sqrt(ddz1*ddz1+oldr*oldr*ddfi1*ddfi1+ddr*ddr); 
     630             :       }
     631             :       else
     632       54320 :         break;
     633           1 :     }
     634             : 
     635      740094 :     paraml.HitDistance(i)= Short_t(TMath::Nint(dl/fStep));
     636      740094 :     paraml.Charge(i)= Short_t(fTempInfo->GetQStack(i));
     637      740094 :     paraml.Time(i)= Short_t(fTempInfo->GetTimeStack(i)/AliTPCTrackHitsV2::fgkTimePrecision);
     638      740094 :   }    
     639             :   
     640       70471 :   if (i<=fTempInfo->GetStackIndex()){ //if previous iteration not succesfull 
     641             :     //    Short_t * charge = new Short_t[i];
     642             :     //    Short_t * time = new Short_t[i];
     643             :     //    Short_t * hitDistance= new Short_t[i];
     644             :     //    memcpy(charge, param.fCharge,sizeof(Short_t)*i);
     645             :     //    memcpy(time, param.fTime,sizeof(Short_t)*i);
     646             :     //    memcpy(hitDistance, param.fHitDistance,sizeof(Short_t)*i);
     647             :     //    delete [] param.fCharge;
     648             :     //    delete [] param.fTime;
     649             :     //    delete [] param.fHitDistance;
     650       54320 :     param.SetNHits(i);
     651       54320 :     param.ResizeCharge(i);
     652       54320 :     param.ResizeTime(i);
     653       54320 :     param.ResizeHitDistance(i);
     654             :     //
     655       54320 :     Int_t volumeID = fTempInfo->GetParam()->GetVolumeID();
     656       54320 :     Int_t  trackID =fTempInfo->GetParam()->GetTrackID();   
     657       54320 :     fTempInfo->SetParamIndex(fTempInfo->GetParamIndex()+1);
     658      108640 :     fTempInfo->SetParam(new((*fArray)[fTempInfo->GetParamIndex()]) AliTrackHitsParamV2); 
     659       54320 :     Double_t * p = fTempInfo->GetPosition(i);
     660       54320 :     UInt_t index2 = fTempInfo->GetStackIndex();
     661       54320 :     fTempInfo->NewParam(p[0],p[1],p[2],fTempInfo->GetQStack(i),fTempInfo->GetTimeStack(i));
     662       54320 :     fTempInfo->GetParam()->SetVolumeID(volumeID);
     663       54320 :     fTempInfo->GetParam()->SetTrackID(trackID);
     664      107875 :     if (i+1<=index2) FlushHitStack2(i+1,index2);
     665             : 
     666       54997 :     if (force) return      FlushHitStack(kTRUE);      
     667       53643 :     return kFALSE;
     668             :   }  
     669       16151 :   return kTRUE;
     670       70522 : } 
     671             :  
     672             : 
     673             : void AliTPCTrackHitsV2::FlushHitStack2(Int_t index1, Int_t index2)
     674             : {
     675             :   //
     676             :   // second iteration flush stack
     677             :   // call only for hits where first iteration were not succesfully interpolated
     678             :   //
     679      107110 :   Double_t * positionstack = new Double_t[3*(index2-index1+1)];
     680       53555 :   UInt_t   * qstack        = new UInt_t[index2-index1+1];
     681       53555 :   Float_t  * timestack     = new Float_t[index2-index1+1];
     682      107110 :   memcpy(positionstack, fTempInfo->GetPosition(index1),
     683       53555 :          (3*(index2-index1+1))*sizeof(Double_t));
     684       53555 :   memcpy(qstack, fTempInfo->GetQStackP(index1),(index2-index1+1)*sizeof(UInt_t));
     685       53555 :   memcpy(timestack, fTempInfo->GetTimeStackP(index1),(index2-index1+1)*sizeof(Float_t));
     686             :   Double_t *p = positionstack;
     687     2967068 :   for (Int_t j=0; j<=index2-index1;j++){ 
     688     1429979 :     fTempInfo->SetStackIndex(fTempInfo->GetStackIndex()+1);
     689     1429979 :     fTempInfo->SetHit(p[3*j+0],p[3*j+1],p[3*j+2],qstack[j],timestack[j]);
     690             :   }  
     691      107110 :   delete []positionstack;
     692      107110 :   delete []qstack;
     693      107110 :   delete []timestack;
     694       53555 : }
     695             : 
     696             : 
     697             : void AliTPCTrackHitsV2::AddVolume(Int_t volume)
     698             : {
     699             :   //
     700             :   //add volumes to tthe list of volumes
     701             :   //
     702         718 :   Int_t * volumes = new Int_t[fNVolumes+1];
     703         657 :   if (fVolumes) memcpy(volumes,fVolumes,(fNVolumes)*sizeof(Int_t));
     704         359 :   volumes[fNVolumes]=volume;
     705         359 :   fNVolumes++;
     706         955 :   if (fVolumes) delete []fVolumes;
     707         359 :   fVolumes = volumes;  
     708         359 : }
     709             : 
     710             : 
     711             : Bool_t AliTPCTrackHitsV2::First()
     712             : {
     713             :   //
     714             :   //set Current hit for the first hit
     715             :   //
     716             : 
     717         642 :   if (fArray->GetSize()<=0) {
     718           0 :     fCurrentHit->SetStatus(kFALSE);
     719           0 :     return kFALSE;
     720             :   }
     721             : 
     722         321 :   AliTrackHitsParamV2 *param = (AliTrackHitsParamV2 *)fArray->At(0);
     723         325 :   if (!fHit) fHit = new AliTPChit;
     724         642 :   if (!(param) ) {
     725          51 :     fCurrentHit->SetStatus(kFALSE);
     726          51 :     return kFALSE;
     727             :   }
     728             :   //
     729         591 :   fCurrentHit->SetParamIndex(0);
     730         270 :   fCurrentHit->SetStackIndex(0);
     731             :   //
     732             :   //
     733         270 :   ((AliTPChit*)fHit)->fSector = param->GetVolumeID();
     734         270 :   ((AliTPChit*)fHit)->SetTrack(param->GetTrackID());
     735         270 :   ((AliTPChit*)fHit)->SetX(param->GetR()*TMath::Cos(param->GetFi()));
     736         270 :   ((AliTPChit*)fHit)->SetY(param->GetR()*TMath::Sin(param->GetFi()));
     737         270 :   ((AliTPChit*)fHit)->SetZ(param->GetZ()); 
     738         270 :   ((AliTPChit*)fHit)->fQ = param->Charge(0);     
     739         270 :   ((AliTPChit*)fHit)->fTime = (Float_t)(param->Time(0)*AliTPCTrackHitsV2::fgkTimePrecision);     
     740             :   /*
     741             :     fCurrentHit->fHit.fSector = param->fVolumeID;
     742             :     fCurrentHit->fHit.SetTrack(param->fTrackID);
     743             :     fCurrentHit->fHit.SetX(param->fR*TMath::Cos(param->fFi));
     744             :     fCurrentHit->fHit.SetY(param->fR*TMath::Sin(param->fFi));
     745             :     fCurrentHit->fHit.SetZ(param->fZ); 
     746             :     fCurrentHit->fHit.fQ = param->fCharge[0];   
     747             :     fCurrentHit->fHit.fTime = (Float_t)(param->fTime[0]*AliTPCTrackHitsV2::fgkTimePrecision);   
     748             :   */
     749         270 :   fCurrentHit->SetR(param->GetR());
     750             :   
     751         270 :   fCurrentHit->SetStatus(kTRUE);
     752         270 :   return fCurrentHit->GetStatus();
     753         321 : }
     754             : 
     755             : Bool_t AliTPCTrackHitsV2::Next()
     756             : {
     757             :   //
     758             :   // Hit iterator  
     759             :   //
     760    14999712 :   if (!(fCurrentHit->GetStatus())) 
     761           0 :     return kFALSE;
     762             : 
     763     7499856 :   fCurrentHit->SetStackIndex(fCurrentHit->GetStackIndex()+1);
     764             : 
     765     7499856 :   AliTrackHitsParamV2 *param =  (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->GetParamIndex());
     766     7499856 :   if (fCurrentHit->GetStackIndex()>=param->GetNHits()){
     767      736732 :     fCurrentHit->SetParamIndex(fCurrentHit->GetParamIndex()+1);
     768      736732 :     if (fCurrentHit->GetParamIndex()>=fArray->GetEntriesFast()){
     769         270 :       fCurrentHit->SetStatus(kFALSE);
     770         270 :       return kFALSE;
     771             :     }
     772      736462 :     param =  (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->GetParamIndex());
     773      736462 :     fCurrentHit->SetStackIndex(0); 
     774      736462 :     fCurrentHit->SetR(param->GetR());
     775      736462 :   }
     776             : 
     777             : 
     778             : 
     779             :   Double_t ratio;
     780             :   { 
     781             :     //    Double_t dfi2 = param->fAn+2*param->fAd*(fCurrentHit->fR-param->fR);
     782     7499586 :     Double_t dfi2 = param->GetAn();
     783     7499586 :     dfi2*=dfi2*fCurrentHit->GetR()*fCurrentHit->GetR();
     784             :     //    Double_t ddz2 = param->fTheta+2*param->fThetaD*(fCurrentHit->fR-param->fR);
     785     7499586 :     Double_t ddz2 =  param->GetTheta();
     786     7499586 :     ddz2*=ddz2;
     787     7499586 :     ratio = TMath::Sqrt(1.+ dfi2+ ddz2);  
     788             :   }
     789             : 
     790     7499586 :   fCurrentHit->SetR(fCurrentHit->GetR()+fStep*param->HitDistance(fCurrentHit->GetStackIndex())/ratio);
     791             : 
     792     7499586 :   Double_t dR = fCurrentHit->GetR() - param->GetR();
     793     7499586 :   Double_t fi = param->GetFi() + (param->GetAn()*dR+param->GetAd()*dR*dR);
     794     7499586 :   Double_t z  = param->GetZ() + (param->GetTheta()*dR+param->GetThetaD()*dR*dR);
     795             :   /*
     796             :   fCurrentHit->fHit.fQ = param->fCharge[fCurrentHit->fStackIndex];  
     797             :   fCurrentHit->fHit.fTime = (Float_t)(param->fTime[fCurrentHit->fStackIndex]*AliTPCTrackHitsV2::fgkTimePrecision);  
     798             :   fCurrentHit->fHit.SetX(fCurrentHit->fR*TMath::Cos(fi));
     799             :   fCurrentHit->fHit.SetY(fCurrentHit->fR*TMath::Sin(fi));
     800             :   fCurrentHit->fHit.SetZ(z);   
     801             :   fCurrentHit->fHit.fSector = param->fVolumeID;
     802             :   fCurrentHit->fHit.SetTrack(param->fTrackID);
     803             :   */
     804     7499586 :   ((AliTPChit*)fHit)->fQ = param->Charge(fCurrentHit->GetStackIndex());  
     805     7499586 :   ((AliTPChit*)fHit)->fTime = (Float_t)(param->Time(fCurrentHit->GetStackIndex())*AliTPCTrackHitsV2::fgkTimePrecision);  
     806     7499586 :   ((AliTPChit*)fHit)->SetX(fCurrentHit->GetR()*TMath::Cos(fi));
     807     7499586 :   ((AliTPChit*)fHit)->SetY(fCurrentHit->GetR()*TMath::Sin(fi));
     808     7499586 :   ((AliTPChit*)fHit)->SetZ(z);   
     809     7499586 :   ((AliTPChit*)fHit)->fSector = param->GetVolumeID();
     810     7499586 :   ((AliTPChit*)fHit)->SetTrack(param->GetTrackID());
     811             : 
     812             :   return kTRUE;
     813     7499856 : }
     814             :   
     815             : AliHit * AliTPCTrackHitsV2::GetHit() const
     816             : {
     817             :   //
     818             :   // Return one hit
     819             :   //
     820    30000387 :    return (fCurrentHit->GetStatus())? fHit:0;
     821             :   //return &fCurrentHit->fHit;
     822             : 
     823             : } 
     824             :  
     825             : AliTrackHitsParamV2 * AliTPCTrackHitsV2::GetParam()
     826             : {
     827             :   //
     828             :   // Return current parameters
     829             :   //
     830           0 :   return (fCurrentHit->GetStatus())? 
     831           0 :     (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->GetParamIndex()):0;
     832             : }
     833             : 

Generated by: LCOV version 1.11