]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCTrackHits.cxx
Adding AliTPCTracklet to the repository (M.Mager)
[u/mrichter/AliRoot.git] / TPC / AliTPCTrackHits.cxx
index 570be0ffc5ce89873a54801168d337c3c79516cf..6729f34a2504303afba5bdf75410b4a027f270ac 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.6  2002/10/14 14:57:43  hristov
-Merging the VirtualMC branch to the main development branch (HEAD)
-
-Revision 1.4.10.1  2002/08/28 15:06:52  alibrary
-Updating to v3-09-01
-
-Revision 1.5  2002/08/25 15:54:29  kowal2
-Protection against overflows in TMath::Nint.
-
-Revision 1.4  2001/01/10 09:35:27  kowal2
-Changes to obey the coding rules.
+/* $Id$ */
 
-Revision 1.3  2000/11/02 10:22:50  kowal2
-Logs added
-
-*/
 ///////////////////////////////////////////////////////////////////////////////
 //                                                                           //
 //  Time Projection Chamber  track hits object                                //
@@ -50,14 +34,12 @@ Logs added
 //                                                                          //
 ///////////////////////////////////////////////////////////////////////////////
 
-#include "TVector3.h"
-#include "TClonesArray.h"    
-#include "AliTPCTrackHits.h"
-#include "AliTPC.h"
-
-#include <Riostream.h>
-
+#include <TError.h>
 
+#include "AliTPC.h"
+#include "AliTPCTrackHits.h"
+//           Interface classes
+#include "AliTPCTrackHitsInterfaces.h"
 
 ClassImp(AliTPCTrackHits) 
 LClassImp(AliTrackHitsInfo) 
@@ -74,17 +56,12 @@ Int_t AliTPCTrackHits::fgCounter1 =0;
 Int_t AliTPCTrackHits::fgCounter2 =0;
 const Double_t AliTPCTrackHits::fgkPrecision=1e-6;  //precision 
 const Double_t AliTPCTrackHits::fgkPrecision2=1e-20;  //precision
+const Double_t AliTPCTrackHits::fgkTimePrecision=20.e-9;  //hit time precision 
 
 
-/************************************************************/
-//           Interface classes                              // 
-#include "AliTPCTrackHitsInterfaces.h"
-
-
-
-
-struct AliTPCCurrentHit {
-  AliTPChit fHit;
+class AliTPCCurrentHit {
+private:
+  AliTPChit fHit;     //   - hit in "standard" representation
   UInt_t   fInfoIndex;//   - current info pointer 
   UInt_t   fParamIndex;//  - current param pointer
   UInt_t   fStackIndex; // - current hit stack index
@@ -93,11 +70,17 @@ struct AliTPCCurrentHit {
 };   
 
 
-struct  AliTPCTempHitInfo {
-  enum    { fkStackSize = 10000};
-  AliTPCTempHitInfo();   
-  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);
+class  AliTPCTempHitInfo {
+private:
+  enum    { kStackSize = 100};
+  AliTPCTempHitInfo(); 
+  AliTPCTempHitInfo(const AliTPCTempHitInfo &)
+    {::Fatal("copy ctor","Not implemented\n");}
+  AliTPCTempHitInfo & operator = (const AliTPCTempHitInfo &)
+    {::Fatal("= operator","Not implemented\n");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,
@@ -105,19 +88,20 @@ struct  AliTPCTempHitInfo {
            Double_t fSumX4, Int_t n,
              Double_t &a, Double_t &b, Double_t &c);
   void  Fit(AliTrackHitsParam * 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;    //fSumDr
+  Double_t fSumDr2;   //fSumDr2
+  Double_t fSumDr3;   //  fSumDr3
+  Double_t fSumDr4;   //fSumDr4
+  Double_t fSumDFi;  //fSumDFi
+  Double_t fSumDFiDr; // fSumDFiDr 
+  Double_t fSumDFiDr2;//fSumDFiDr2
+  Double_t fSumDZ;     //fSumDZ
+  Double_t fSumDZDr;  //fSumDZDr
+  Double_t fSumDZDr2;  //fSumDZDr2
   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
@@ -139,7 +123,7 @@ AliTPCTempHitInfo::AliTPCTempHitInfo()
 }
 
 
-void AliTPCTempHitInfo::NewParam(Double_t r, Double_t z, Double_t fi, Int_t q)
+void AliTPCTempHitInfo::NewParam(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
 {
   //
   //reset stack and sum parameters
@@ -156,10 +140,10 @@ void AliTPCTempHitInfo::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 AliTPCTempHitInfo::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q)
+void AliTPCTempHitInfo::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time)
 {
   //
   //add hit to the stack
@@ -169,6 +153,7 @@ void AliTPCTempHitInfo::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)<AliTPCTrackHits::fgkPrecision) dr =AliTPCTrackHits::fgkPrecision;
@@ -276,7 +261,35 @@ void   AliTPCTempHitInfo::Fit(AliTrackHitsParam * param)
   
 }
 
+//______________________________________________________________________
+AliTrackHitsInfo::AliTrackHitsInfo() : 
+  fTrackID(0),
+  fVolumeID(0),
+  fHitParamIndex(0)
+{
+  //
+  // Default constructor
+  //
+  fgCounter1++;
+  fgCounter2++;
+}
 
+//______________________________________________________________________
+AliTrackHitsParam::AliTrackHitsParam() :
+  fR(0),
+  fZ(0),
+  fFi(0),
+  fAn(0),
+  fAd(0),
+  fTheta(0),
+  fThetaD(0)
+{
+  //
+  // Default constructor
+  //
+  fgCounter1++;
+  fgCounter2++;
+}
 
 
 AliTPCTrackHits::AliTPCTrackHits()
@@ -301,6 +314,16 @@ AliTPCTrackHits::AliTPCTrackHits()
 
 } 
 
+AliTPCTrackHits::AliTPCTrackHits(const AliTPCTrackHits& r) : TObject(r)
+{
+  //dummy
+}
+AliTPCTrackHits &AliTPCTrackHits::operator=(const AliTPCTrackHits& /* r */)
+{
+  //dummy
+  return *this;
+}
+
 AliTPCTrackHits::~AliTPCTrackHits()
 {
   //
@@ -332,16 +355,17 @@ void AliTPCTrackHits::Clear()
 
 
 void AliTPCTrackHits::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 hits (cartesian)
   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 AliTPCTrackHits::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)
 {
   //
   Bool_t diff=kFALSE;
@@ -364,7 +388,7 @@ void AliTPCTrackHits::AddHit(Int_t volumeID, Int_t trackID,
     fTempInfo->fParam = 
       (AliTrackHitsParam*) (fTrackHitsParam->At(0));
     fTempInfo->fParamIndex = 0;
-    fTempInfo->NewParam(r,z,fi,q);
+    fTempInfo->NewParam(r,z,fi,q,time);
     return;
   }
   
@@ -375,7 +399,7 @@ void AliTPCTrackHits::AddHit(Int_t volumeID, Int_t trackID,
       fTrackHitsParam->Resize(fTempInfo->fParamIndex+1);    
     fTempInfo->fParam = 
       (AliTrackHitsParam*) (fTrackHitsParam->At(fTempInfo->fParamIndex));  
-    fTempInfo->NewParam(r,z,fi,q);
+    fTempInfo->NewParam(r,z,fi,q,time);
     return;
   }
   
@@ -402,7 +426,7 @@ void AliTPCTrackHits::AddHit(Int_t volumeID, Int_t trackID,
       fTrackHitsParam->Resize(fTempInfo->fParamIndex+1);    
     fTempInfo->fParam = 
       (AliTrackHitsParam*) (fTrackHitsParam->At(fTempInfo->fParamIndex));  
-    fTempInfo->NewParam(r,z,fi,q);
+    fTempInfo->NewParam(r,z,fi,q,time);
     return;
   }
      
@@ -442,12 +466,12 @@ void AliTPCTrackHits::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{
     fTempInfo->fStackIndex++;   
-    fTempInfo->SetHit(r,z,fi,q);
+    fTempInfo->SetHit(r,z,fi,q,time);
     return;
   }  
   //if parameter changed 
@@ -457,11 +481,11 @@ void AliTPCTrackHits::AddHit(Int_t volumeID, Int_t trackID,
       fTrackHitsParam->Resize(fTempInfo->fParamIndex+1);    
     fTempInfo->fParam = 
       (AliTrackHitsParam*) (fTrackHitsParam->At(fTempInfo->fParamIndex));  
-    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);              
   }
 }   
 
@@ -538,6 +562,7 @@ Bool_t AliTPCTrackHits::FlushHitStack(Bool_t force)
     info = (AliHitInfo*)(fHitsPosAndQ->At(fTempInfo->fParamIndex,i));
     info->fHitDistance = (TMath::Abs(dl/fStep)<32000) ?Short_t(TMath::Nint(dl/fStep)):0;
     info->fCharge = Short_t(fTempInfo->fQStack[i]);
+    info->fTime = TMath::Nint(fTempInfo->fTimeStack[i]/AliTPCTrackHits::fgkTimePrecision);
     /*
     cout<<"C2";
     cout<<" "<<fTempInfo->fStackIndex<<" \t";
@@ -561,7 +586,7 @@ Bool_t AliTPCTrackHits::FlushHitStack(Bool_t force)
        (AliTrackHitsParam*) (fTrackHitsParam->At(fTempInfo->fParamIndex));    
     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]);        
     if (i+1<=index2) FlushHitStack2(i+1,index2);
 
     if (force) return      FlushHitStack(kTRUE);      
@@ -578,16 +603,19 @@ void AliTPCTrackHits::FlushHitStack2(Int_t index1, Int_t index2)
   // 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;
 }
 
 
@@ -621,13 +649,16 @@ Bool_t AliTPCTrackHits::First()
   fCurrentHit->fHit.SetX(param->fR*TMath::Cos(param->fFi));
   fCurrentHit->fHit.SetY(param->fR*TMath::Sin(param->fFi));
   fCurrentHit->fHit.SetZ(param->fZ); 
-  fCurrentHit->fHit.fQ = hinfo->fCharge;
+  fCurrentHit->fHit.fQ = (Float_t)(hinfo->fCharge*AliTPCTrackHits::fgkTimePrecision);
+  fCurrentHit->fHit.fTime = hinfo->fTime;
    
   fCurrentHit->fR = param->fR;
   
   return fCurrentHit->fStatus = kTRUE;
 }
 
+
+/*
 Bool_t AliTPCTrackHits::Next()
 {
   //
@@ -676,6 +707,7 @@ Bool_t AliTPCTrackHits::Next()
   }
 
   fCurrentHit->fHit.fQ = hinfo->fCharge;
+  fCurrentHit->fHit.fTime = (Float_t)(hinfo->fTime*AliTPCTrackHits::fgkTimePrecision);
   fCurrentHit->fR += fStep*hinfo->fHitDistance/ratio;
   Double_t dR = fCurrentHit->fR - param->fR;
   //Double_t dR =0;
@@ -687,8 +719,9 @@ Bool_t AliTPCTrackHits::Next()
   fCurrentHit->fHit.SetZ(z);  
   return kTRUE;
 }
-  
-AliTPChit * AliTPCTrackHits::GetHit()
+
+*/  
+AliTPChit * AliTPCTrackHits::GetHit() const
 {
   //
    return (fCurrentHit->fStatus)? &fCurrentHit->fHit:0;
@@ -696,6 +729,105 @@ AliTPChit * AliTPCTrackHits::GetHit()
 
 }  
 
+
+
+Bool_t AliTPCTrackHits::Next(Int_t id)
+{
+  //
+  //  
+  if (!(fCurrentHit->fStatus)) 
+    return kFALSE;
+
+  //  fCurrentHit->fStackIndex++;
+  AliHitInfo * hinfo = (AliHitInfo *)fHitsPosAndQ->At(fCurrentHit->fParamIndex,
+                                                     fCurrentHit->fStackIndex);
+  AliTrackHitsInfo *info = (AliTrackHitsInfo *)fTrackHitsInfo->At(fCurrentHit->fInfoIndex);
+  if (!info) {
+    fCurrentHit->fStatus = kFALSE;
+    return kFALSE; 
+  }
+  AliTrackHitsParam *param =  (AliTrackHitsParam *)fTrackHitsParam->At(fCurrentHit->fParamIndex);
+
+  if ( (id>=0) && (info!=0) && (info->fVolumeID!=id)){
+    fCurrentHit->fInfoIndex++;
+    info = (AliTrackHitsInfo *)fTrackHitsInfo->At(fCurrentHit->fInfoIndex);
+    if (!info) {
+      fCurrentHit->fStatus = kFALSE;
+      return kFALSE;
+    }
+    fCurrentHit->fParamIndex = info->fHitParamIndex;
+    param =  (AliTrackHitsParam *)fTrackHitsParam->At(fCurrentHit->fParamIndex);
+    fCurrentHit->fStackIndex =0;    
+    fCurrentHit->fR = param->fR;
+    return Next(id);
+  }
+  if (!info) {
+    fCurrentHit->fStatus = kFALSE;
+    return kFALSE; 
+  }
+  if (!hinfo) {
+    hinfo = (AliHitInfo *)fHitsPosAndQ->At(fCurrentHit->fParamIndex+1, 0);
+    if (!hinfo){ 
+      fCurrentHit->fStatus = kFALSE;
+      return kFALSE;
+    }
+    if (hinfo){ 
+      fCurrentHit->fParamIndex++;
+      fCurrentHit->fStackIndex = 0;
+      param = (AliTrackHitsParam *)fTrackHitsParam->At(fCurrentHit->fParamIndex);
+      if (!param){ 
+       fCurrentHit->fStatus = kFALSE;
+       return kFALSE;     
+      }
+      fCurrentHit->fR = param->fR;
+
+      if ((fCurrentHit->fInfoIndex+1<fTrackHitsInfo->GetSize())
+       &&((info+1)->fHitParamIndex<=fCurrentHit->fParamIndex)){
+       fCurrentHit->fInfoIndex++;
+       info = (AliTrackHitsInfo *)fTrackHitsInfo->At(fCurrentHit->fInfoIndex);
+       if (!info){ 
+         fCurrentHit->fStatus = kFALSE;
+         return kFALSE;
+       }
+       if ( (id>=0) && (info!=0) && (info->fVolumeID!=id)){
+         return Next(id);
+       }
+       fCurrentHit->fHit.fSector = info->fVolumeID;
+       fCurrentHit->fHit.SetTrack(info->fTrackID);
+      }
+    }  
+  } 
+  Double_t ratio;
+  { 
+    //    Double_t dfi2 = param->fAn+2*param->fAd*(fCurrentHit->fR-param->fR);
+    Double_t dfi2 = param->fAn;
+    dfi2*=dfi2*fCurrentHit->fR*fCurrentHit->fR;
+    //    Double_t ddz2 = param->fTheta+2*param->fThetaD*(fCurrentHit->fR-param->fR);
+    Double_t ddz2 =  param->fTheta;
+    ddz2*=ddz2;
+    ratio = TMath::Sqrt(1.+ dfi2+ ddz2);  
+  }
+
+  fCurrentHit->fHit.fQ = hinfo->fCharge;
+  fCurrentHit->fHit.fTime = (Float_t)(hinfo->fTime*AliTPCTrackHits::fgkTimePrecision);
+  fCurrentHit->fR += fStep*hinfo->fHitDistance/ratio;
+  Double_t dR = fCurrentHit->fR - param->fR;
+  //Double_t dR =0;
+  Double_t fi = param->fFi + (param->fAn*dR+param->fAd*dR*dR);
+  Double_t z  = param->fZ + (param->fTheta*dR+param->fThetaD*dR*dR);
+  
+  fCurrentHit->fHit.SetX(fCurrentHit->fR*TMath::Cos(fi));
+  fCurrentHit->fHit.SetY(fCurrentHit->fR*TMath::Sin(fi));
+  fCurrentHit->fHit.SetZ(z);  
+  fCurrentHit->fHit.fSector = info->fVolumeID;
+  fCurrentHit->fHit.SetTrack(info->fTrackID);
+  //
+  fCurrentHit->fStatus = kTRUE;
+  fCurrentHit->fStackIndex++;
+  return kTRUE;
+}
+  
+
 AliTrackHitsParam * AliTPCTrackHits::GetParam()
 {
   //