]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCTrackHitsV2.cxx
GetClusterFast function implemented (No getter before) (Marian)
[u/mrichter/AliRoot.git] / TPC / AliTPCTrackHitsV2.cxx
index b8011380a5e200325c41611c84e7597e76bc83b2..b874db82d8747deb93c6f34cbdc1d582c827811b 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.1  2002/01/21 17:14:21  kowal2
-New track hits using root containers.
+/* $Id$ */
 
-*/
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 //  Time Projection Chamber  track hits object                                //
@@ -55,15 +51,12 @@ New track hits using root containers.
 //                                                                           //
 //                                                                          //
 ///////////////////////////////////////////////////////////////////////////////
+//
 
-//#include "TVector3.h"
 #include "AliTPCTrackHitsV2.h"
-
 #include "TClonesArray.h"    
 #include "AliTPC.h"
 
-#include <iostream.h>
-
 
 
 ClassImp(AliTPCTrackHitsV2) 
@@ -78,15 +71,22 @@ Int_t AliTPCTrackHitsV2::fgCounter2 =0;
 //
 const Double_t AliTPCTrackHitsV2::fgkPrecision=1e-6;  //precision 
 const Double_t AliTPCTrackHitsV2::fgkPrecision2=1e-20;  //precision
+const Double_t AliTPCTrackHitsV2::fgkTimePrecision=20.e-9;  //hit time precision 
 
 
 
 
 struct  AliTPCTempHitInfoV2 {
-  enum    { fkStackSize = 10000};
+  friend class AliTPCTrackHitsV2;
+protected:
+  enum    { kStackSize = 10000};
   AliTPCTempHitInfoV2();   
-  void     NewParam(Double_t r, Double_t z, Double_t fi, Int_t q);
-  void     SetHit(Double_t r, Double_t z, Double_t fi, Int_t q);
+  AliTPCTempHitInfoV2(const AliTPCTempHitInfoV2 &hit)
+    {hit.Copy(*this);}
+  AliTPCTempHitInfoV2& operator = (const AliTPCTempHitInfoV2 &hit)
+     {hit.Copy(*this); return (*this);}
+  void     NewParam(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time);
+  void     SetHit(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time);
   Double_t * GetPosition(Int_t index){return &fPositionStack[index*3];}
   void    UpdateParam(Double_t maxdelta); //recal
   void   Fit2(Double_t fSumY, Double_t fSumYX, Double_t fSumYX2,
@@ -94,31 +94,37 @@ struct  AliTPCTempHitInfoV2 {
            Double_t fSumX4, Int_t n,
              Double_t &a, Double_t &b, Double_t &c);
   void  Fit(AliTrackHitsParamV2 * param);
-  Double_t fSumDr;    //
-  Double_t fSumDr2;   //
-  Double_t fSumDr3;   //  
-  Double_t fSumDr4;   //
-  Double_t fSumDFi;  //
-  Double_t fSumDFiDr; //  
-  Double_t fSumDFiDr2;//
-  Double_t fSumDZ;     //
-  Double_t fSumDZDr;  //
-  Double_t fSumDZDr2;  //
+  Double_t fSumDr;    // Sum of Dr
+  Double_t fSumDr2;   // Square of sum of Dr
+  Double_t fSumDr3;   // Cube of sum of Dr
+  Double_t fSumDr4;   // Fourth power of sum of Dr
+  Double_t fSumDFi;  //  Sum of DFi
+  Double_t fSumDFiDr; //  Sum of DFiDr
+  Double_t fSumDFiDr2;//  Sum of square of DFiDr
+  Double_t fSumDZ;     // Sum of DZ
+  Double_t fSumDZDr;  //  Sum of DZDr
+  Double_t fSumDZDr2;  // Sum of square of DZDr
   Double_t fOldR;     //previos r
-  Double_t fPositionStack[3*fkStackSize];  //position stack 
-  UInt_t   fQStack[fkStackSize];           //Q stack
+  Double_t fPositionStack[3*kStackSize];  //position stack 
+  UInt_t   fQStack[kStackSize];           //Q stack
+  Float_t  fTimeStack[kStackSize];        //time stack
   UInt_t fStackIndex;   //current stack index 
   //  UInt_t fInfoIndex;    //current track info index
   UInt_t fParamIndex;   //current track parameters index
   //  AliTrackHitsInfo  * fInfo; //current track info
   AliTrackHitsParamV2 * fParam; //current track param
+private:
+  void Copy(AliTPCTempHitInfoV2 &) const
+  {printf("Not Implemented\n"); exit(1);}
 };
 
 
 AliTPCTempHitInfoV2::AliTPCTempHitInfoV2()
 {
   //
-  //set to default value
+  // Standard constructor
+  // set to default value
+  //
   fSumDr=fSumDr2=fSumDr3=fSumDr4=
     fSumDFi=fSumDFiDr=fSumDFiDr2=
     fSumDZ=fSumDZDr=fSumDZDr2=0;  
@@ -128,11 +134,12 @@ AliTPCTempHitInfoV2::AliTPCTempHitInfoV2()
 }
 
 
-void AliTPCTempHitInfoV2::NewParam(Double_t r, Double_t z, Double_t fi, Int_t q)
+void AliTPCTempHitInfoV2::NewParam(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
 {
   //
   //reset stack and sum parameters
   //store line initial point
+  //
   fSumDr=fSumDr2=fSumDr3=fSumDr4=
     fSumDFi=fSumDFiDr=fSumDFiDr2=
     fSumDZ=fSumDZDr=fSumDZDr2=0;  
@@ -145,10 +152,10 @@ void AliTPCTempHitInfoV2::NewParam(Double_t r, Double_t z, Double_t fi, Int_t q)
   fParam->fAd = 0.;
   fParam->fTheta =0.;
   fParam->fThetaD =0.;
-  SetHit(r,z,fi,q);
+  SetHit(r,z,fi,q,time);
 }
 
-void AliTPCTempHitInfoV2::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q)
+void AliTPCTempHitInfoV2::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
 {
   //
   //add hit to the stack
@@ -158,6 +165,7 @@ void AliTPCTempHitInfoV2::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q)
   f[1] = z;
   f[2] = fi;
   fQStack[fStackIndex]=q;
+  fTimeStack[fStackIndex]=time;
   if (fStackIndex==0) return;
   Double_t dr  = (r-fParam->fR);
   if (TMath::Abs(dr)<AliTPCTrackHitsV2::fgkPrecision) dr =AliTPCTrackHitsV2::fgkPrecision;
@@ -198,7 +206,9 @@ void AliTPCTempHitInfoV2::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q)
 
 void   AliTPCTempHitInfoV2::UpdateParam(Double_t maxdelta)
 {
-  //recalc parameters not fixing origin point
+  //
+  // recalc parameters not fixing origin point
+  //
   if (fStackIndex>5){ 
     Double_t a,b,c;
     a=b=c=0;
@@ -219,12 +229,15 @@ void   AliTPCTempHitInfoV2::UpdateParam(Double_t maxdelta)
   }
       
 }
+
 void   AliTPCTempHitInfoV2::Fit2(Double_t fSumY, Double_t fSumYX, Double_t fSumYX2,
            Double_t fSumX,  Double_t fSumX2, Double_t fSumX3, 
            Double_t fSumX4, Int_t n,
            Double_t &a, Double_t &b, Double_t &c)
 {
-  //fit of second order
+  //
+  // fit of second order
+  //
   Double_t det = 
     n* (fSumX2*fSumX4-fSumX3*fSumX3) -
     fSumX*      (fSumX*fSumX4-fSumX3*fSumX2)+
@@ -248,8 +261,10 @@ void   AliTPCTempHitInfoV2::Fit2(Double_t fSumY, Double_t fSumYX, Double_t fSumY
 
 void   AliTPCTempHitInfoV2::Fit(AliTrackHitsParamV2 * param)
 {
+  //
   // fit fixing first and the last point 
-  //result stored in new param
+  // result stored in new param
+  //
   Double_t dx2  = (GetPosition(fStackIndex))[0]-fParam->fR;
   Double_t det = fSumDr4+dx2*fSumDr2-2*dx2*fSumDr3;
   if ( (TMath::Abs(det)> AliTPCTrackHitsV2::fgkPrecision) &&
@@ -267,15 +282,22 @@ void   AliTPCTempHitInfoV2::Fit(AliTrackHitsParamV2 * param)
 
 AliTrackHitsParamV2::AliTrackHitsParamV2()
 {
-  //default constructor
+  //
+  // default constructor
+  //
   fgCounter1++;
   fgCounter2++;
   fHitDistance=0;
   fCharge=0;
+  fTime=0;
   fNHits=0;
 }
+
 AliTrackHitsParamV2::~AliTrackHitsParamV2()
 {
+  //
+  // Standard destructor
+  //
   fgCounter1--;
   if (fHitDistance) {
     delete[]fHitDistance;  
@@ -285,6 +307,10 @@ AliTrackHitsParamV2::~AliTrackHitsParamV2()
     delete[]fCharge;  
     fCharge =0;
   }
+  if (fTime){
+    delete[]fTime;  
+    fTime =0;
+  }
 }
 
 
@@ -340,10 +366,12 @@ AliTPCTrackHitsV2::~AliTPCTrackHitsV2()
   fgCounter1--;
 }
 
-void AliTPCTrackHitsV2::Clear()
+void AliTPCTrackHitsV2::Clear(Option_t * /*option*/)
 {
   //
-  //clear object  
+  // clear object  
+  //
+  fSize = 0;
   if (fArray){
     for (Int_t i=0;i<fArray->GetEntriesFast();i++){
       AliTrackHitsParamV2 * par = (AliTrackHitsParamV2 *)fArray->UncheckedAt(i);
@@ -366,20 +394,23 @@ void AliTPCTrackHitsV2::Clear()
 
 
 void AliTPCTrackHitsV2::AddHitKartez(Int_t volumeID, Int_t trackID, Double_t x, 
-             Double_t y, Double_t z,Int_t q)
+             Double_t y, Double_t z,Int_t q, Float_t time)
 {
   //
-  //add hit to the container - it add hit at the end - input in global coordinata
+  // add hit to the container - it add hit at the end - input in global coordinata
+  //
   Double_t r = TMath::Sqrt(x*x+y*y);
   Double_t fi = TMath::ACos(x/r);
   if (y<0) fi*=-1.;
-    AddHit(volumeID,trackID,r,z,fi,q);
+    AddHit(volumeID,trackID,r,z,fi,q,time);
 }
 
 
 void AliTPCTrackHitsV2::AddHit(Int_t volumeID, Int_t trackID, 
-                            Double_t r, Double_t z, Double_t fi, Int_t q)
+                            Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
 {
+  //
+  // Adding one hit
   //
   fSize++;
   Bool_t diff=kFALSE;
@@ -391,7 +422,7 @@ void AliTPCTrackHitsV2::AddHit(Int_t volumeID, Int_t trackID,
     AddVolume(volumeID);
     //
     fTempInfo->fParamIndex = 0;
-    fTempInfo->NewParam(r,z,fi,q);
+    fTempInfo->NewParam(r,z,fi,q,time);
     return;
   }
     
@@ -406,7 +437,7 @@ void AliTPCTrackHitsV2::AddHit(Int_t volumeID, Int_t trackID,
     fTempInfo->fParam =  new((*fArray)[fTempInfo->fParamIndex]) AliTrackHitsParamV2;   
     fTempInfo->fParam->fVolumeID = volumeID;
     fTempInfo->fParam->fTrackID = trackID;   
-    fTempInfo->NewParam(r,z,fi,q);
+    fTempInfo->NewParam(r,z,fi,q,time);
     return;
   }
      
@@ -448,12 +479,12 @@ void AliTPCTrackHitsV2::AddHit(Int_t volumeID, Int_t trackID,
   }        
   //safety factor 1.25
   if ( ( (dd*1.25>fPrecision) ) ||  
-       (fTempInfo->fStackIndex+4>fTempInfo->fkStackSize) || 
+       (fTempInfo->fStackIndex+4>fTempInfo->kStackSize) || 
        (TMath::Abs(dl/fStep)>fMaxDistance)  ) 
     diff=kTRUE;
   else{  // if precision OK
     fTempInfo->fStackIndex++;   
-    fTempInfo->SetHit(r,z,fi,q);
+    fTempInfo->SetHit(r,z,fi,q,time);
     return;
   }  
 
@@ -464,18 +495,19 @@ void AliTPCTrackHitsV2::AddHit(Int_t volumeID, Int_t trackID,
     fTempInfo->fParam =  new((*fArray)[fTempInfo->fParamIndex]) AliTrackHitsParamV2;   
     fTempInfo->fParam->fVolumeID = volumeID;
     fTempInfo->fParam->fTrackID = trackID;   
-    fTempInfo->NewParam(r,z,fi,q);
+    fTempInfo->NewParam(r,z,fi,q,time);
   }
   else{
     fTempInfo->fStackIndex++;
-    fTempInfo->SetHit(r,z,fi,q);              
+    fTempInfo->SetHit(r,z,fi,q,time);              
   }
 }   
 
 Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force)
 {
   //
-  //write fHitsPosAndQ information from the stack to te arrays
+  // write fHitsPosAndQ information from the stack to te arrays
+  //
   if (!fTempInfo) return kFALSE; 
  
   AliTrackHitsParamV2 & param = *(fTempInfo->fParam);
@@ -489,8 +521,10 @@ Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force)
   param.fNHits = fTempInfo->fStackIndex+1;
   if (param.fHitDistance) delete []param.fHitDistance;
   if (param.fCharge) delete []param.fCharge;
+  if (param.fTime) delete []param.fTime;
   param.fHitDistance = new Short_t[param.fNHits];
   param.fCharge = new Short_t[param.fNHits];
+  param.fTime = new Short_t[param.fNHits];
 
    
   for (i=0; i <= fTempInfo->fStackIndex; i++){
@@ -507,7 +541,11 @@ Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force)
       ratio = TMath::Sqrt(1.+ dfi2+ ddz2);  
     }
 
-    Double_t dl = fStep*(Short_t)TMath::Nint(dr*ratio/fStep);  
+    //    Double_t dl = fStep*(Short_t)TMath::Nint(dr*ratio/fStep);   //MI change 
+    Double_t dl = dr*ratio/fStep;
+    if (TMath::Abs(dl)>32765) dl =0;
+    dl = fStep * Short_t(TMath::Nint(dl));
+
     dr = dl/ratio; 
     oldr+=dr;
     //calculate precission
@@ -542,17 +580,22 @@ Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force)
 
     param.fHitDistance[i]= Short_t(TMath::Nint(dl/fStep));
     param.fCharge[i]= Short_t(fTempInfo->fQStack[i]);
+    param.fTime[i]= Short_t(fTempInfo->fTimeStack[i]/AliTPCTrackHitsV2::fgkTimePrecision);
   }    
   
   if (i<=fTempInfo->fStackIndex){ //if previous iteration not succesfull 
     Short_t * charge = new Short_t[i];
+    Short_t * time = new Short_t[i];
     Short_t * hitDistance= new Short_t[i];
     memcpy(charge, param.fCharge,sizeof(Short_t)*i);
+    memcpy(time, param.fTime,sizeof(Short_t)*i);
     memcpy(hitDistance, param.fHitDistance,sizeof(Short_t)*i);
     delete [] param.fCharge;
+    delete [] param.fTime;
     delete [] param.fHitDistance;
     param.fNHits= i;
     param.fCharge = charge;
+    param.fTime = time;
     param.fHitDistance = hitDistance;
     //
     Int_t volumeID = fTempInfo->fParam->fVolumeID;
@@ -561,7 +604,7 @@ Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force)
     fTempInfo->fParam = new((*fArray)[fTempInfo->fParamIndex]) AliTrackHitsParamV2; 
     Double_t * p = fTempInfo->GetPosition(i);
     UInt_t index2 = fTempInfo->fStackIndex;
-    fTempInfo->NewParam(p[0],p[1],p[2],fTempInfo->fQStack[i]);
+    fTempInfo->NewParam(p[0],p[1],p[2],fTempInfo->fQStack[i],fTempInfo->fTimeStack[i]);
     fTempInfo->fParam->fVolumeID= volumeID;
     fTempInfo->fParam->fTrackID= trackID;
     if (i+1<=index2) FlushHitStack2(i+1,index2);
@@ -577,19 +620,23 @@ void AliTPCTrackHitsV2::FlushHitStack2(Int_t index1, Int_t index2)
 {
   //
   // second iteration flush stack
-  // call only for hits where first iteration were not succesfully interpolated  
+  // call only for hits where first iteration were not succesfully interpolated
+  //
   Double_t * positionstack = new Double_t[3*(index2-index1+1)];
   UInt_t   * qstack        = new UInt_t[index2-index1+1];
+  Float_t  * timestack     = new Float_t[index2-index1+1];
   memcpy(positionstack, &fTempInfo->fPositionStack[3*index1],
         (3*(index2-index1+1))*sizeof(Double_t));
   memcpy(qstack, &fTempInfo->fQStack[index1],(index2-index1+1)*sizeof(UInt_t));
+  memcpy(timestack, &fTempInfo->fTimeStack[index1],(index2-index1+1)*sizeof(Float_t));
   Double_t *p = positionstack;
   for (Int_t j=0; j<=index2-index1;j++){ 
     fTempInfo->fStackIndex++;
-    fTempInfo->SetHit(p[3*j+0],p[3*j+1],p[3*j+2],qstack[j]);
+    fTempInfo->SetHit(p[3*j+0],p[3*j+1],p[3*j+2],qstack[j],timestack[j]);
   }  
   delete []positionstack;
   delete []qstack;
+  delete []timestack;
 }
 
 
@@ -597,8 +644,9 @@ void AliTPCTrackHitsV2::AddVolume(Int_t volume)
 {
   //
   //add volumes to tthe list of volumes
+  //
   Int_t * volumes = new Int_t[fNVolumes+1];
-  if (fVolumes) memcpy(volumes,fVolumes,(fNVolumes+1)*sizeof(Int_t));
+  if (fVolumes) memcpy(volumes,fVolumes,(fNVolumes)*sizeof(Int_t));
   volumes[fNVolumes]=volume;
   fNVolumes++;
   if (fVolumes) delete []fVolumes;
@@ -606,14 +654,17 @@ void AliTPCTrackHitsV2::AddVolume(Int_t volume)
 }
 
 
-
-  
-
 Bool_t AliTPCTrackHitsV2::First()
 {
   //
   //set Current hit for the first hit
   //
+
+  if (fArray->GetSize()<=0) {
+    fCurrentHit->fStatus = kFALSE;
+    return kFALSE;
+  }
+
   AliTrackHitsParamV2 *param = (AliTrackHitsParamV2 *)fArray->At(0);
   if (!fHit) fHit = new AliTPChit;
   if (!(param) ) {
@@ -631,6 +682,7 @@ Bool_t AliTPCTrackHitsV2::First()
   ((AliTPChit*)fHit)->SetY(param->fR*TMath::Sin(param->fFi));
   ((AliTPChit*)fHit)->SetZ(param->fZ); 
   ((AliTPChit*)fHit)->fQ = param->fCharge[0];     
+  ((AliTPChit*)fHit)->fTime = (Float_t)(param->fTime[0]*AliTPCTrackHitsV2::fgkTimePrecision);     
   /*
     fCurrentHit->fHit.fSector = param->fVolumeID;
     fCurrentHit->fHit.SetTrack(param->fTrackID);
@@ -638,6 +690,7 @@ Bool_t AliTPCTrackHitsV2::First()
     fCurrentHit->fHit.SetY(param->fR*TMath::Sin(param->fFi));
     fCurrentHit->fHit.SetZ(param->fZ); 
     fCurrentHit->fHit.fQ = param->fCharge[0];   
+    fCurrentHit->fHit.fTime = (Float_t)(param->fTime[0]*AliTPCTrackHitsV2::fgkTimePrecision);   
   */
   fCurrentHit->fR = param->fR;
   
@@ -647,7 +700,8 @@ Bool_t AliTPCTrackHitsV2::First()
 Bool_t AliTPCTrackHitsV2::Next()
 {
   //
-  //  
+  // Hit iterator  
+  //
   if (!(fCurrentHit->fStatus)) 
     return kFALSE;
 
@@ -685,6 +739,7 @@ Bool_t AliTPCTrackHitsV2::Next()
   Double_t z  = param->fZ + (param->fTheta*dR+param->fThetaD*dR*dR);
   /*
   fCurrentHit->fHit.fQ = param->fCharge[fCurrentHit->fStackIndex];  
+  fCurrentHit->fHit.fTime = (Float_t)(param->fTime[fCurrentHit->fStackIndex]*AliTPCTrackHitsV2::fgkTimePrecision);  
   fCurrentHit->fHit.SetX(fCurrentHit->fR*TMath::Cos(fi));
   fCurrentHit->fHit.SetY(fCurrentHit->fR*TMath::Sin(fi));
   fCurrentHit->fHit.SetZ(z);   
@@ -692,6 +747,7 @@ Bool_t AliTPCTrackHitsV2::Next()
   fCurrentHit->fHit.SetTrack(param->fTrackID);
   */
   ((AliTPChit*)fHit)->fQ = param->fCharge[fCurrentHit->fStackIndex];  
+  ((AliTPChit*)fHit)->fTime = (Float_t)(param->fTime[fCurrentHit->fStackIndex]*AliTPCTrackHitsV2::fgkTimePrecision);  
   ((AliTPChit*)fHit)->SetX(fCurrentHit->fR*TMath::Cos(fi));
   ((AliTPChit*)fHit)->SetY(fCurrentHit->fR*TMath::Sin(fi));
   ((AliTPChit*)fHit)->SetZ(z);   
@@ -701,8 +757,10 @@ Bool_t AliTPCTrackHitsV2::Next()
   return kTRUE;
 }
   
-AliHit * AliTPCTrackHitsV2::GetHit()
+AliHit * AliTPCTrackHitsV2::GetHit() const
 {
+  //
+  // Return one hit
   //
    return (fCurrentHit->fStatus)? fHit:0;
   //return &fCurrentHit->fHit;
@@ -711,5 +769,10 @@ AliHit * AliTPCTrackHitsV2::GetHit()
  
 AliTrackHitsParamV2 * AliTPCTrackHitsV2::GetParam()
 {
-  return (fCurrentHit->fStatus)? (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->fParamIndex):0;
+  //
+  // Return current parameters
+  //
+  return (fCurrentHit->fStatus)? 
+    (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->fParamIndex):0;
 }
+