X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=TPC%2FAliTPCTrackHitsV2.cxx;h=7a5a1e435131390ca5f192cf93a1f8a89d71d054;hb=8f74ae7702881266ff16ec6f5544917d08304fdd;hp=4d44aaa6bf4e67ca049e766ef79269a9698bd485;hpb=595c3700ddcadf9a4696f8d36463ceee236accb1;p=u%2Fmrichter%2FAliRoot.git diff --git a/TPC/AliTPCTrackHitsV2.cxx b/TPC/AliTPCTrackHitsV2.cxx index 4d44aaa6bf4..7a5a1e43513 100644 --- a/TPC/AliTPCTrackHitsV2.cxx +++ b/TPC/AliTPCTrackHitsV2.cxx @@ -13,12 +13,8 @@ * 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,14 @@ New track hits using root containers. // // // // /////////////////////////////////////////////////////////////////////////////// +// -//#include "TVector3.h" -#include "AliTPCTrackHitsV2.h" +#include +#include -#include "TClonesArray.h" +#include "AliTPCTrackHitsV2.h" #include "AliTPC.h" -#include - ClassImp(AliTPCTrackHitsV2) @@ -78,35 +73,56 @@ 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}; +class AliTPCTempHitInfoV2 { +public: 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); + void SetHit(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time); + UInt_t GetStackIndex() const {return fStackIndex;} + void SetStackIndex(UInt_t i) {fStackIndex=i;} + UInt_t GetParamIndex() const {return fParamIndex;} + void SetParamIndex(UInt_t i) {fParamIndex=i;} + Float_t GetTimeStack(Int_t i) const {return fTimeStack[i];} + const Float_t* GetTimeStackP(Int_t i) const {return &fTimeStack[i];} + UInt_t GetQStack(Int_t i) const {return fQStack[i];} + const UInt_t* GetQStackP(Int_t i) const {return &fQStack[i];} Double_t * GetPosition(Int_t index){return &fPositionStack[index*3];} - void UpdateParam(Double_t maxdelta); //recal + Double_t GetOldR() const {return fOldR;} + void SetOldR(Double_t r) {fOldR=r;} + + + AliTrackHitsParamV2 * GetParam() const {return fParam;} + void SetParam(AliTrackHitsParamV2 * p) {fParam=p;} + void UpdateParam(Double_t maxdelta); //recal + void NewParam(Double_t r, Double_t z, Double_t fi, Int_t q, Float_t time); + enum {kStackSize = 10000}; + +protected: + AliTPCTempHitInfoV2(const AliTPCTempHitInfoV2 &hit); + AliTPCTempHitInfoV2& operator = (const AliTPCTempHitInfoV2 &hit); void 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); 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 @@ -116,9 +132,25 @@ struct AliTPCTempHitInfoV2 { AliTPCTempHitInfoV2::AliTPCTempHitInfoV2() + :fSumDr(0.), + fSumDr2(0.), + fSumDr3(0.), + fSumDr4(0.), + fSumDFi(0.), + fSumDFiDr(0.), + fSumDFiDr2(0.), + fSumDZ(0.), + fSumDZDr(0.), + fSumDZDr2(0.), + fOldR(0.), + fStackIndex(0), + fParamIndex(0), + fParam(0) { // - //set to default value + // Standard constructor + // set to default value + // fSumDr=fSumDr2=fSumDr3=fSumDr4= fSumDFi=fSumDFiDr=fSumDFiDr2= fSumDZ=fSumDZDr=fSumDZDr2=0; @@ -128,27 +160,28 @@ 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; fStackIndex=0; - fParam->fR = r; + fParam->SetR(r); fOldR = r; - fParam->fZ = z; - fParam->fFi = fi; - fParam->fAn = 0.; - fParam->fAd = 0.; - fParam->fTheta =0.; - fParam->fThetaD =0.; - SetHit(r,z,fi,q); + fParam->SetZ(z); + fParam->SetFi(fi); + fParam->SetAn(0.); + fParam->SetAd(0.); + fParam->SetTheta(0.); + fParam->SetThetaD(0.); + 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,11 +191,12 @@ 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)fFi; - Double_t dz = z -fParam->fZ; + Double_t dr = (r-fParam->GetR()); + if (TMath::Abs(dr)GetFi(); + Double_t dz = z -fParam->GetZ(); Double_t dr2 =dr*dr; Double_t dr3 =dr2*dr; Double_t dr4 =dr3*dr; @@ -180,57 +214,62 @@ void AliTPCTempHitInfoV2::SetHit(Double_t r, Double_t z, Double_t fi, Int_t q) //update fit parameters // Double_t det = fSumDr2*fSumDr4-fSumDr3*fSumDr3; - if (TMath::Abs(det)1 ) ){ - fParam->fAn = (fSumDr4*fSumDFiDr-fSumDr3*fSumDFiDr2)/det; - fParam->fAd = (fSumDr2*fSumDFiDr2-fSumDr3*fSumDFiDr)/det; + fParam->SetAn((fSumDr4*fSumDFiDr-fSumDr3*fSumDFiDr2)/det); + fParam->SetAd((fSumDr2*fSumDFiDr2-fSumDr3*fSumDFiDr)/det); } else - fParam->fAn = fSumDFiDr/fSumDr2; + fParam->SetAn(fSumDFiDr/fSumDr2); if ( ( fStackIndex>1 ) ){ - fParam->fTheta = (fSumDr4*fSumDZDr-fSumDr3*fSumDZDr2)/det; - fParam->fThetaD= (fSumDr2*fSumDZDr2-fSumDr3*fSumDZDr)/det; + fParam->SetTheta((fSumDr4*fSumDZDr-fSumDr3*fSumDZDr2)/det); + fParam->SetThetaD((fSumDr2*fSumDZDr2-fSumDr3*fSumDZDr)/det); } else - fParam->fTheta = fSumDZDr/fSumDr2; + fParam->SetTheta(fSumDZDr/fSumDr2); } 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; Fit2(fSumDFi, fSumDFiDr, fSumDFiDr2, fSumDr,fSumDr2,fSumDr3,fSumDr4, fStackIndex, a,b,c); if (TMath::Abs(a)fFi +=a/fParam->fR; - fParam->fAn = b; - fParam->fAd = c; + fParam->SetFi(fParam->GetFi()+a/fParam->GetR()); + fParam->SetAn(b); + fParam->SetAd(c); } Fit2(fSumDZ, fSumDZDr, fSumDZDr2, fSumDr,fSumDr2,fSumDr3,fSumDr4, fStackIndex, a,b,c) ; if (TMath::Abs(a)fZ +=a; - fParam->fTheta = b; - fParam->fThetaD = c; + fParam->SetZ(fParam->GetZ()+a); + fParam->SetTheta(b); + fParam->SetThetaD(c); } } } + 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)+ fSumX2* (fSumX*fSumX3-fSumX2*fSumX2); - if (TMath::Abs(det)> AliTPCTrackHitsV2::fgkPrecision) { + if (TMath::Abs(det)> AliTPCTrackHitsV2::GetKPrecision()) { a = (fSumY * (fSumX2*fSumX4-fSumX3*fSumX3)- fSumX *(fSumYX*fSumX4-fSumYX2*fSumX3)+ @@ -248,34 +287,52 @@ 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 - Double_t dx2 = (GetPosition(fStackIndex))[0]-fParam->fR; + // result stored in new param + // + Double_t dx2 = (GetPosition(fStackIndex))[0]-fParam->GetR(); Double_t det = fSumDr4+dx2*fSumDr2-2*dx2*fSumDr3; - if ( (TMath::Abs(det)> AliTPCTrackHitsV2::fgkPrecision) && - ((TMath::Abs(dx2)> AliTPCTrackHitsV2::fgkPrecision))){ - Double_t dfi2 = (GetPosition(fStackIndex))[1]-fParam->fFi; - param->fAd = (fSumDFiDr2+dfi2*fSumDr-dx2*fSumDFiDr-dfi2*fSumDr3/dx2)/det; - param->fAn = (dfi2-param->fAd*dx2*dx2)/dx2; + if ( (TMath::Abs(det)> AliTPCTrackHitsV2::GetKPrecision()) && + ((TMath::Abs(dx2)> AliTPCTrackHitsV2::GetKPrecision()))){ + Double_t dfi2 = (GetPosition(fStackIndex))[1]-fParam->GetFi(); + param->SetAd((fSumDFiDr2+dfi2*fSumDr-dx2*fSumDFiDr-dfi2*fSumDr3/dx2)/det); + param->SetAn((dfi2-param->GetAd()*dx2*dx2)/dx2); - Double_t dz2 = (GetPosition(fStackIndex))[1]-fParam->fZ; - param->fTheta = (fSumDZDr2+dz2*fSumDr-dx2*fSumDZDr-dz2*fSumDr3/dx2)/det; - param->fTheta = (dz2-param->fAd*dx2*dx2)/dx2; + Double_t dz2 = (GetPosition(fStackIndex))[1]-fParam->GetZ(); + param->SetTheta((fSumDZDr2+dz2*fSumDr-dx2*fSumDZDr-dz2*fSumDr3/dx2)/det); + param->SetTheta((dz2-param->GetAd()*dx2*dx2)/dx2); } } -AliTrackHitsParamV2::AliTrackHitsParamV2() +AliTrackHitsParamV2::AliTrackHitsParamV2():TObject(), + fTrackID(0), + fVolumeID(0), + fR(0.), + fZ(0.), + fFi(0.), + fAn(0.), + fAd(0.), + fTheta(0.), + fThetaD(0.), + fNHits(0), + fHitDistance(0), + fCharge(0), + fTime(0) { - //default constructor + // + // default constructor + // fgCounter1++; fgCounter2++; - fHitDistance=0; - fCharge=0; - fNHits=0; } + AliTrackHitsParamV2::~AliTrackHitsParamV2() { + // + // Standard destructor + // fgCounter1--; if (fHitDistance) { delete[]fHitDistance; @@ -285,10 +342,32 @@ AliTrackHitsParamV2::~AliTrackHitsParamV2() delete[]fCharge; fCharge =0; } + if (fTime){ + delete[]fTime; + fTime =0; + } +} + +Float_t AliTrackHitsParamV2::Eta() const +{ + Float_t ctg = fZ / fR; + Float_t eta = -TMath::Log(TMath::Hypot(1,ctg)-TMath::Abs(ctg)); + if(ctg < 0) eta = -eta; + return eta; } -AliTPCTrackHitsV2::AliTPCTrackHitsV2() +AliTPCTrackHitsV2::AliTPCTrackHitsV2():TObject(), + fArray(0), + fSize(0), + fPrecision(0.), + fStep(0.), + fMaxDistance(0), + fNVolumes(0), + fVolumes(0), + fTempInfo(0), + fCurrentHit(0), + fHit(0) { // //default constructor @@ -300,16 +379,12 @@ AliTPCTrackHitsV2::AliTPCTrackHitsV2() fPrecision=kHitPrecision; //precision in cm fStep = kStep; //step size fMaxDistance = kMaxDistance; //maximum distance - fTempInfo =0; - fSize=0; + //fTrackHitsInfo = new AliObjectArray("AliTrackHitsInfo"); //fTrackHitsParam = new AliObjectArray("AliTrackHitsParamV2"); //fHitsPosAndQ = new TArrayOfArrayVStack("AliHitInfo"); fArray = new TClonesArray("AliTrackHitsParamV2"); fCurrentHit = new AliTPCCurrentHitV2; - fVolumes =0; - fNVolumes =0; - fHit =0; fgCounter1++; fgCounter2++; @@ -340,10 +415,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;iGetEntriesFast();i++){ AliTrackHitsParamV2 * par = (AliTrackHitsParamV2 *)fArray->UncheckedAt(i); @@ -366,65 +443,68 @@ 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; if (!fTempInfo) { //initialisation of track - initialisation of parameters fTempInfo = new AliTPCTempHitInfoV2; - fTempInfo->fParam = new((*fArray)[0]) AliTrackHitsParamV2; - fTempInfo->fParam->fVolumeID = volumeID; - fTempInfo->fParam->fTrackID = trackID; + fTempInfo->SetParam(new((*fArray)[0]) AliTrackHitsParamV2); + fTempInfo->GetParam()->SetVolumeID(volumeID); + fTempInfo->GetParam()->SetTrackID(trackID); AddVolume(volumeID); // - fTempInfo->fParamIndex = 0; - fTempInfo->NewParam(r,z,fi,q); + fTempInfo->SetParamIndex(0); + fTempInfo->NewParam(r,z,fi,q,time); return; } // if new volume or new trackID - if ( (volumeID!=fTempInfo->fParam->fVolumeID) || - (trackID!=fTempInfo->fParam->fTrackID)){ - if (volumeID!=fTempInfo->fParam->fVolumeID) AddVolume(volumeID); + if ( (volumeID!=fTempInfo->GetParam()->GetVolumeID()) || + (trackID!=fTempInfo->GetParam()->GetTrackID())){ + if (volumeID!=fTempInfo->GetParam()->GetVolumeID()) AddVolume(volumeID); diff=kTRUE; FlushHitStack(kTRUE); - fTempInfo->fParamIndex++; - fTempInfo->fParam = new((*fArray)[fTempInfo->fParamIndex]) AliTrackHitsParamV2; - fTempInfo->fParam->fVolumeID = volumeID; - fTempInfo->fParam->fTrackID = trackID; - fTempInfo->NewParam(r,z,fi,q); + fTempInfo->SetParamIndex(fTempInfo->GetParamIndex()+1); + fTempInfo->SetParam(new((*fArray)[fTempInfo->GetParamIndex()]) AliTrackHitsParamV2); + fTempInfo->GetParam()->SetVolumeID(volumeID); + fTempInfo->GetParam()->SetTrackID(trackID); + fTempInfo->NewParam(r,z,fi,q,time); return; } //calculate current fit precission to next point - AliTrackHitsParamV2 ¶m = *(fTempInfo->fParam); + AliTrackHitsParamV2 ¶m = *(fTempInfo->GetParam()); Double_t dd=0; Double_t dl=0; Double_t ratio=0; Double_t dr,dz,dfi,ddz,ddfi; Double_t drhit,ddl; dr=dz=dfi=ddz=ddfi=0; - drhit = r-fTempInfo->fOldR; + drhit = r-fTempInfo->GetOldR(); { //Double_t dfi2 = param.fAn+2*param.fAd*(r-param.fR); - Double_t dfi2 = param.fAn; - dfi2*=dfi2*fTempInfo->fOldR*fTempInfo->fOldR; + Double_t dfi2 = param.GetAn(); + dfi2*=dfi2*fTempInfo->GetOldR()*fTempInfo->GetOldR(); //Double_t ddz2 = param.fTheta+2*param.fThetaD*(r-param.fR); - Double_t ddz2 = param.fTheta; + Double_t ddz2 = param.GetTheta(); ddz2*=ddz2; ratio = TMath::Sqrt(1.+ dfi2+ ddz2); } @@ -435,74 +515,77 @@ void AliTPCTrackHitsV2::AddHit(Int_t volumeID, Int_t trackID, dl = fStep * Short_t(TMath::Nint(dl)); // ddl = dl - drhit*ratio; - fTempInfo->fOldR += dl/ratio; - - if (fTempInfo->fStackIndex>2){ - dr = r-param.fR; - dz = z-param.fZ; - dfi = fi-param.fFi; - ddz = dr*param.fTheta+dr*dr*param.fThetaD-dz; - ddfi= dr*param.fAn+dr*dr*param.fAd-dfi; + fTempInfo->SetOldR(fTempInfo->GetOldR()+dl/ratio); + + if (fTempInfo->GetStackIndex()>2){ + dr = r-param.GetR(); + dz = z-param.GetZ(); + dfi = fi-param.GetFi(); + ddz = dr*param.GetTheta()+dr*dr*param.GetThetaD()-dz; + ddfi= dr*param.GetAn()+dr*dr*param.GetAd()-dfi; dd = TMath::Sqrt(ddz*ddz+r*r*ddfi*ddfi+ddl*ddl); // } //safety factor 1.25 if ( ( (dd*1.25>fPrecision) ) || - (fTempInfo->fStackIndex+4>fTempInfo->fkStackSize) || + (fTempInfo->GetStackIndex()+4>fTempInfo->kStackSize) || (TMath::Abs(dl/fStep)>fMaxDistance) ) diff=kTRUE; else{ // if precision OK - fTempInfo->fStackIndex++; - fTempInfo->SetHit(r,z,fi,q); + fTempInfo->SetStackIndex(fTempInfo->GetStackIndex()+1); + fTempInfo->SetHit(r,z,fi,q,time); return; } //if parameter changed if (FlushHitStack(kFALSE)){ //if full buffer flushed - fTempInfo->fParamIndex++; - fTempInfo->fParam = new((*fArray)[fTempInfo->fParamIndex]) AliTrackHitsParamV2; - fTempInfo->fParam->fVolumeID = volumeID; - fTempInfo->fParam->fTrackID = trackID; - fTempInfo->NewParam(r,z,fi,q); + fTempInfo->SetParamIndex(fTempInfo->GetParamIndex()+1); + fTempInfo->SetParam(new((*fArray)[fTempInfo->GetParamIndex()]) AliTrackHitsParamV2); + fTempInfo->GetParam()->SetVolumeID(volumeID); + fTempInfo->GetParam()->SetTrackID(trackID); + fTempInfo->NewParam(r,z,fi,q,time); } else{ - fTempInfo->fStackIndex++; - fTempInfo->SetHit(r,z,fi,q); + fTempInfo->SetStackIndex(fTempInfo->GetStackIndex()+1); + 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); + AliTrackHitsParamV2 & param = *(fTempInfo->GetParam()); //recalculate track parameter not fixing first point fTempInfo->UpdateParam(fStep/4.); //fTempInfo->Fit(fTempInfo->fParam); //- fixing the first and the last point - Double_t oldr = param.fR; + Double_t oldr = param.GetR(); UInt_t i; Double_t dd; - param.fNHits = fTempInfo->fStackIndex+1; - if (param.fHitDistance) delete []param.fHitDistance; - if (param.fCharge) delete []param.fCharge; - param.fHitDistance = new Short_t[param.fNHits]; - param.fCharge = new Short_t[param.fNHits]; + param.SetNHits(fTempInfo->GetStackIndex()+1); + // if (param.fHitDistance) delete []param.fHitDistance; + // if (param.fCharge) delete []param.fCharge; + // if (param.fTime) delete []param.fTime; + param.SetHitDistance(param.GetNHits()); + param.SetCharge(param.GetNHits()); + param.SetTime(param.GetNHits()); - for (i=0; i <= fTempInfo->fStackIndex; i++){ + for (i=0; i <= fTempInfo->GetStackIndex(); i++){ Double_t * position = fTempInfo->GetPosition(i); Double_t dr = position[0]-oldr; Double_t ratio; { //Double_t dfi2 = param.fAn+2*param.fAd*(position[0]-param.fR); - Double_t dfi2 = param.fAn; + Double_t dfi2 = param.GetAn(); dfi2*=dfi2*oldr*oldr; //Double_t ddz2 = param.fTheta+2*param.fThetaD*(position[0]-param.fR); - Double_t ddz2 = param.fTheta; + Double_t ddz2 = param.GetTheta(); ddz2*=ddz2; ratio = TMath::Sqrt(1.+ dfi2+ ddz2); } @@ -515,28 +598,28 @@ Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force) dr = dl/ratio; oldr+=dr; //calculate precission - AliTrackHitsParamV2 ¶m = *(fTempInfo->fParam); + AliTrackHitsParamV2 ¶m = *(fTempInfo->GetParam()); //real deltas - Double_t dr1= position[0]-param.fR; - Double_t dz = position[1]-param.fZ; - Double_t dfi = position[2]-param.fFi; + Double_t dr1= position[0]-param.GetR(); + Double_t dz = position[1]-param.GetZ(); + Double_t dfi = position[2]-param.GetFi(); //extrapolated deltas - Double_t dr2 = oldr-param.fR; + Double_t dr2 = oldr-param.GetR(); Double_t ddr = dr2-dr1; - Double_t ddz = dr2*param.fTheta+dr2*dr2*param.fThetaD-dz; - Double_t ddfi= dr2*param.fAn+dr2*dr2*param.fAd-dfi; + Double_t ddz = dr2*param.GetTheta()+dr2*dr2*param.GetThetaD()-dz; + Double_t ddfi= dr2*param.GetAn()+dr2*dr2*param.GetAd()-dfi; dd = TMath::Sqrt(ddz*ddz+oldr*oldr*ddfi*ddfi+ddr*ddr); if ( (dd>fPrecision) ){ //if ( (dd<0) ){ if (i==0){ - param.fAn = 0; - param.fAd = 0; - param.fTheta =0; - param.fThetaD =0; - Double_t ddz = dr2*param.fTheta+dr2*dr2*param.fThetaD-dz; - Double_t ddfi= dr2*param.fAn+dr2*dr2*param.fAd-dfi; + param.SetAn(0); + param.SetAd(0); + param.SetTheta(0); + param.SetThetaD(0); + Double_t ddz = dr2*param.GetTheta()+dr2*dr2*param.GetThetaD()-dz; + Double_t ddfi= dr2*param.GetAn()+dr2*dr2*param.GetAd()-dfi; dl = 0; dd = TMath::Sqrt(ddz*ddz+oldr*oldr*ddfi*ddfi+ddr*ddr); } @@ -544,30 +627,35 @@ Bool_t AliTPCTrackHitsV2::FlushHitStack(Bool_t force) break; } - param.fHitDistance[i]= Short_t(TMath::Nint(dl/fStep)); - param.fCharge[i]= Short_t(fTempInfo->fQStack[i]); + param.HitDistance(i)= Short_t(TMath::Nint(dl/fStep)); + param.Charge(i)= Short_t(fTempInfo->GetQStack(i)); + param.Time(i)= Short_t(fTempInfo->GetTimeStack(i)/AliTPCTrackHitsV2::fgkTimePrecision); } - if (i<=fTempInfo->fStackIndex){ //if previous iteration not succesfull - Short_t * charge = new Short_t[i]; - Short_t * hitDistance= new Short_t[i]; - memcpy(charge, param.fCharge,sizeof(Short_t)*i); - memcpy(hitDistance, param.fHitDistance,sizeof(Short_t)*i); - delete [] param.fCharge; - delete [] param.fHitDistance; - param.fNHits= i; - param.fCharge = charge; - param.fHitDistance = hitDistance; + if (i<=fTempInfo->GetStackIndex()){ //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.SetNHits(i); + param.ResizeCharge(i); + param.ResizeTime(i); + param.ResizeHitDistance(i); // - Int_t volumeID = fTempInfo->fParam->fVolumeID; - Int_t trackID =fTempInfo->fParam->fTrackID; - fTempInfo->fParamIndex++; - fTempInfo->fParam = new((*fArray)[fTempInfo->fParamIndex]) AliTrackHitsParamV2; + Int_t volumeID = fTempInfo->GetParam()->GetVolumeID(); + Int_t trackID =fTempInfo->GetParam()->GetTrackID(); + fTempInfo->SetParamIndex(fTempInfo->GetParamIndex()+1); + fTempInfo->SetParam(new((*fArray)[fTempInfo->GetParamIndex()]) AliTrackHitsParamV2); Double_t * p = fTempInfo->GetPosition(i); - UInt_t index2 = fTempInfo->fStackIndex; - fTempInfo->NewParam(p[0],p[1],p[2],fTempInfo->fQStack[i]); - fTempInfo->fParam->fVolumeID= volumeID; - fTempInfo->fParam->fTrackID= trackID; + UInt_t index2 = fTempInfo->GetStackIndex(); + fTempInfo->NewParam(p[0],p[1],p[2],fTempInfo->GetQStack(i),fTempInfo->GetTimeStack(i)); + fTempInfo->GetParam()->SetVolumeID(volumeID); + fTempInfo->GetParam()->SetTrackID(trackID); if (i+1<=index2) FlushHitStack2(i+1,index2); if (force) return FlushHitStack(kTRUE); @@ -581,19 +669,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]; - memcpy(positionstack, &fTempInfo->fPositionStack[3*index1], + Float_t * timestack = new Float_t[index2-index1+1]; + memcpy(positionstack, fTempInfo->GetPosition(index1), (3*(index2-index1+1))*sizeof(Double_t)); - memcpy(qstack, &fTempInfo->fQStack[index1],(index2-index1+1)*sizeof(UInt_t)); + memcpy(qstack, fTempInfo->GetQStackP(index1),(index2-index1+1)*sizeof(UInt_t)); + memcpy(timestack, fTempInfo->GetTimeStackP(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->SetStackIndex(fTempInfo->GetStackIndex()+1); + fTempInfo->SetHit(p[3*j+0],p[3*j+1],p[3*j+2],qstack[j],timestack[j]); } delete []positionstack; delete []qstack; + delete []timestack; } @@ -601,8 +693,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; @@ -610,31 +703,35 @@ void AliTPCTrackHitsV2::AddVolume(Int_t volume) } - - - Bool_t AliTPCTrackHitsV2::First() { // //set Current hit for the first hit // + + if (fArray->GetSize()<=0) { + fCurrentHit->SetStatus(kFALSE); + return kFALSE; + } + AliTrackHitsParamV2 *param = (AliTrackHitsParamV2 *)fArray->At(0); if (!fHit) fHit = new AliTPChit; if (!(param) ) { - fCurrentHit->fStatus = kFALSE; + fCurrentHit->SetStatus(kFALSE); return kFALSE; } // - fCurrentHit->fParamIndex = 0; - fCurrentHit->fStackIndex = 0; + fCurrentHit->SetParamIndex(0); + fCurrentHit->SetStackIndex(0); // // - ((AliTPChit*)fHit)->fSector = param->fVolumeID; - ((AliTPChit*)fHit)->SetTrack(param->fTrackID); - ((AliTPChit*)fHit)->SetX(param->fR*TMath::Cos(param->fFi)); - ((AliTPChit*)fHit)->SetY(param->fR*TMath::Sin(param->fFi)); - ((AliTPChit*)fHit)->SetZ(param->fZ); - ((AliTPChit*)fHit)->fQ = param->fCharge[0]; + ((AliTPChit*)fHit)->fSector = param->GetVolumeID(); + ((AliTPChit*)fHit)->SetTrack(param->GetTrackID()); + ((AliTPChit*)fHit)->SetX(param->GetR()*TMath::Cos(param->GetFi())); + ((AliTPChit*)fHit)->SetY(param->GetR()*TMath::Sin(param->GetFi())); + ((AliTPChit*)fHit)->SetZ(param->GetZ()); + ((AliTPChit*)fHit)->fQ = param->Charge(0); + ((AliTPChit*)fHit)->fTime = (Float_t)(param->Time(0)*AliTPCTrackHitsV2::fgkTimePrecision); /* fCurrentHit->fHit.fSector = param->fVolumeID; fCurrentHit->fHit.SetTrack(param->fTrackID); @@ -642,31 +739,34 @@ 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; + fCurrentHit->SetR(param->GetR()); - return fCurrentHit->fStatus = kTRUE; + fCurrentHit->SetStatus(kTRUE); + return fCurrentHit->GetStatus(); } Bool_t AliTPCTrackHitsV2::Next() { // - // - if (!(fCurrentHit->fStatus)) + // Hit iterator + // + if (!(fCurrentHit->GetStatus())) return kFALSE; - fCurrentHit->fStackIndex++; + fCurrentHit->SetStackIndex(fCurrentHit->GetStackIndex()+1); - AliTrackHitsParamV2 *param = (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->fParamIndex); - if (fCurrentHit->fStackIndex>=param->fNHits){ - fCurrentHit->fParamIndex++; - if (fCurrentHit->fParamIndex>=fArray->GetEntriesFast()){ - fCurrentHit->fStatus=kFALSE; + AliTrackHitsParamV2 *param = (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->GetParamIndex()); + if (fCurrentHit->GetStackIndex()>=param->GetNHits()){ + fCurrentHit->SetParamIndex(fCurrentHit->GetParamIndex()+1); + if (fCurrentHit->GetParamIndex()>=fArray->GetEntriesFast()){ + fCurrentHit->SetStatus(kFALSE); return kFALSE; } - param = (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->fParamIndex); - fCurrentHit->fStackIndex=0; - fCurrentHit->fR = param->fR; + param = (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->GetParamIndex()); + fCurrentHit->SetStackIndex(0); + fCurrentHit->SetR(param->GetR()); } @@ -674,46 +774,55 @@ Bool_t AliTPCTrackHitsV2::Next() 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 dfi2 = param->GetAn(); + dfi2*=dfi2*fCurrentHit->GetR()*fCurrentHit->GetR(); // Double_t ddz2 = param->fTheta+2*param->fThetaD*(fCurrentHit->fR-param->fR); - Double_t ddz2 = param->fTheta; + Double_t ddz2 = param->GetTheta(); ddz2*=ddz2; ratio = TMath::Sqrt(1.+ dfi2+ ddz2); } - fCurrentHit->fR += fStep*param->fHitDistance[fCurrentHit->fStackIndex]/ratio; + fCurrentHit->SetR(fCurrentHit->GetR()+fStep*param->HitDistance(fCurrentHit->GetStackIndex())/ratio); - Double_t dR = fCurrentHit->fR - param->fR; - Double_t fi = param->fFi + (param->fAn*dR+param->fAd*dR*dR); - Double_t z = param->fZ + (param->fTheta*dR+param->fThetaD*dR*dR); + Double_t dR = fCurrentHit->GetR() - param->GetR(); + Double_t fi = param->GetFi() + (param->GetAn()*dR+param->GetAd()*dR*dR); + Double_t z = param->GetZ() + (param->GetTheta()*dR+param->GetThetaD()*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); fCurrentHit->fHit.fSector = param->fVolumeID; fCurrentHit->fHit.SetTrack(param->fTrackID); */ - ((AliTPChit*)fHit)->fQ = param->fCharge[fCurrentHit->fStackIndex]; - ((AliTPChit*)fHit)->SetX(fCurrentHit->fR*TMath::Cos(fi)); - ((AliTPChit*)fHit)->SetY(fCurrentHit->fR*TMath::Sin(fi)); + ((AliTPChit*)fHit)->fQ = param->Charge(fCurrentHit->GetStackIndex()); + ((AliTPChit*)fHit)->fTime = (Float_t)(param->Time(fCurrentHit->GetStackIndex())*AliTPCTrackHitsV2::fgkTimePrecision); + ((AliTPChit*)fHit)->SetX(fCurrentHit->GetR()*TMath::Cos(fi)); + ((AliTPChit*)fHit)->SetY(fCurrentHit->GetR()*TMath::Sin(fi)); ((AliTPChit*)fHit)->SetZ(z); - ((AliTPChit*)fHit)->fSector = param->fVolumeID; - ((AliTPChit*)fHit)->SetTrack(param->fTrackID); + ((AliTPChit*)fHit)->fSector = param->GetVolumeID(); + ((AliTPChit*)fHit)->SetTrack(param->GetTrackID()); return kTRUE; } -AliHit * AliTPCTrackHitsV2::GetHit() +AliHit * AliTPCTrackHitsV2::GetHit() const { // - return (fCurrentHit->fStatus)? fHit:0; + // Return one hit + // + return (fCurrentHit->GetStatus())? fHit:0; //return &fCurrentHit->fHit; } AliTrackHitsParamV2 * AliTPCTrackHitsV2::GetParam() { - return (fCurrentHit->fStatus)? (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->fParamIndex):0; + // + // Return current parameters + // + return (fCurrentHit->GetStatus())? + (AliTrackHitsParamV2 *)fArray->At(fCurrentHit->GetParamIndex()):0; } +